/opt/canhelp/apps/web/.next/cache/webpack/server-production
NameSizeModeActions
0.pack925145390644editdlrm
1.pack12673790644editdlrm
2.pack43735990644editdlrm
3.pack7451990644editdlrm
4.pack65204660644editdlrm
5.pack259717610644editdlrm
6.pack7518430644editdlrm
7.pack46388840644editdlrm
8.pack48452960644editdlrm
9.pack97020644editdlrm
10.pack27038500644editdlrm
11.pack1361530644editdlrm
12.pack24060644editdlrm
13.pack4277340644editdlrm
14.pack6358240644editdlrm
15.pack19769150644editdlrm
16.pack85740644editdlrm
17.pack24591570644editdlrm
18.pack119171890644editdlrm
19.pack768050644editdlrm
20.pack31443360644editdlrm
21.pack60115380644editdlrm
22.pack10241010644editdlrm
index.pack77214480644editdlrm
index.pack.old84399530644editdlrm
Edit: /opt/canhelp/apps/web/.next/cache/webpack/server-production/20.pack (3144336B)
wpc/webpack/lib/cache/PackFileCacheStrategyPackContentItems Compilation/assets|chunk244MinifierWebpackPlugin|244.jswebpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource  webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSource`7webpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceHexports.id = 244; exports.ids = [244]; exports.modules = { /***/ 1241: webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource/***/ (() => { /* (ignored) */  /***/ }) buffersourcesizemapshash)/***/ (() => { /* (ignored) */ /***/ }) {"finalSource":true}mapbufferedMap ConcatSourceRawSource/***/ (() => {  RawSource/* (ignored) */ /***/ }), /***/ 1697:  webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocationProvider: () => (/* binding */ LocationProvider) /* harmony export */ }); /* unused harmony export useLocation */ /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const LocationProvider = registerClientReference( function() { throw new Error("Attempted to call LocationProvider() from the server but LocationProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/location.tsx", "LocationProvider", );export const useLocation = registerClientReference( function() { throw new Error("Attempted to call useLocation() from the server but useLocation is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/location.tsx", "useLocation", ); `=H4J(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)buffersourcesizemapshash/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocationProvider: () => (/* binding */ LocationProvider) /* harmony export */ }); /* unused harmony export useLocation */ /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const LocationProvider = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call LocationProvider() from the server but LocationProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/location.tsx", "LocationProvider", );const useLocation = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call useLocation() from the server but useLocation is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/location.tsx", "useLocation", ); {"finalSource":true}mapbufferedMap ConcatSourceRawSource /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocationProvider: () => (/* binding */ LocationProvider) /* harmony export */ }); /* unused harmony export useLocation */ /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); ReplaceSourceRawSource// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const LocationProvider = registerClientReference( function() { throw new Error("Attempted to call LocationProvider() from the server but LocationProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/location.tsx", "LocationProvider", );export const useLocation = registerClientReference( function() { throw new Error("Attempted to call useLocation() from the server but useLocation is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/location.tsx", "useLocation", );61134undefined136142undefined168190(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined537543undefined564586(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined /***/ }) 2/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocationProvider: () => (/* binding */ LocationProvider) /* harmony export */ }); /* unused harmony export useLocation */ /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const LocationProvider = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call LocationProvider() from the server but LocationProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/location.tsx", "LocationProvider", );const useLocation = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call useLocation() from the server but useLocation is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/location.tsx", "useLocation", ); /***/ })   _/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict";  /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocationProvider: () => (/* binding */ LocationProvider) /* harmony export */ }); /* unused harmony export useLocation */ /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); ReplaceSourceRawSource// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const LocationProvider = registerClientReference( function() { throw new Error("Attempted to call LocationProvider() from the server but LocationProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/location.tsx", "LocationProvider", );export const useLocation = registerClientReference( function() { throw new Error("Attempted to call useLocation() from the server but useLocation is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/location.tsx", "useLocation", );61134undefined136142undefined168190(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined537543undefined564586(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined, /***/ 12998:   webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource <webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $: () => (/* binding */ getTranslations), /* harmony export */ YZ: () => (/* binding */ LOCALES) /* harmony export */ }); /* unused harmony export translations */ webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource:export const LOCALES = [ { code: 'el', label: 'Ελληνικά', flag: '🇬🇷' }, { code: 'en', label: 'English', flag: '🇬🇧' }, { code: 'ru', label: 'Русский', flag: '🇷🇺' } ]; export const translations = { el: { 'footer.slogan': 'Η εργασία σου — η φροντίδα μας! Λύνουμε κάθε ζήτημα γρήγορα και εύκολα.', 'footer.links': 'Σύνδεσμοι', 'footer.socials': 'Στα κοινωνικά δίκτυα', // Nav 'nav.home': 'Αρχική', 'nav.tasks': 'Εργασίες', 'nav.post': '+ Δημοσίευση', 'nav.dashboard': 'Πίνακας', 'nav.chat': 'Μηνύματα', 'nav.notifications': 'Ειδοποιήσεις', 'nav.profile': 'Προφίλ', 'nav.admin': 'Διαχείριση', 'nav.specialists': 'Ειδικοί', 'nav.new_task': 'Νέα εργασία', 'nav.login': 'Σύνδεση', 'nav.register': 'Εγγραφή', 'nav.logout': 'Έξοδος', // Hero 'hero.title': 'Βρες ειδικό για κάθε δουλειά', 'hero.subtitle': 'Δημοσίευσε εργασία, λάβε προσφορές και επίλεξε τον καλύτερο επαγγελματία', 'hero.cta.post': 'Δημοσίευσε εργασία', 'hero.cta.browse': 'Βρες εργασία', 'hero.search.placeholder': 'Τι χρειάζεσαι; π.χ. ηλεκτρολόγος, καθαρισμός...', 'stats.specialists': 'ειδικοί', 'stats.tasks': 'εργασίες', 'stats.categories': 'κατηγορίες', 'stats.free': 'δωρεάν εγγραφή', // Sections 'section.categories': 'Δημιούργησε εργασία σε οποιαδήποτε κατηγορία', 'section.how': 'Πώς λειτουργεί', 'section.recent': 'Πρόσφατες εργασίες', 'section.all': 'Δες όλες →', 'section.more': 'ακόμα', 'section.cities': 'Πόλεις & Περιοχές', 'section.community': 'Ένα κοινοτικό έργο για όλους', 'community.subtitle': 'Το CanHelp δεν είναι απλώς μια αγορά — είναι μια κοινότητα αμοιβαίας βοήθειας. Οποιοσδήποτε έχει γνώση ή δεξιότητα μπορεί να βρει έναν πελάτη. Οποιοσδήποτε έχει ένα πρόβλημα μπορεί να βρει έναν ειδικό.', 'community.point1.title': 'Είσαι ειδικός σε κάτι;', 'community.point1.desc': 'Επισκευές, μαθήματα, σχεδιασμός, μεταφράσεις, φροντίδα — κάθε δεξιότητα αξίζει. Δημιούργησε προφίλ και βρες πελάτες κοντά σου.', 'community.point2.title': 'Χρειάζεσαι βοήθεια;', 'community.point2.desc': 'Δημοσίευσε εργασία σε λιγότερο από ένα λεπτό και λάβε προσφορές από επαληθευμένους ειδικούς στην πόλη σου.', 'community.point3.title': 'Βοήθησε το έργο να αναπτυχθεί', 'community.point3.desc': 'Το CanHelp αναπτύσσεται χάρη στις κοινότητες. Μοιράσου το σύνδεσμο με φίλους και γνωστούς — μαζί χτίζουμε κάτι χρήσιμο για όλους.', 'community.share': 'Μοιράσου με φίλους', 'community.share.copied': 'Σύνδεσμος αντιγράφηκε!', // Referral section on home page 'section.referral': 'Πρόγραμμα παραπομπών', 'referral.home.subtitle': 'Μοιράσου τον σύνδεσμό σου — κάθε νέος χρήστης που εγγράφεται μέσα από αυτόν σου αποφέρει ανταμοιβή.', 'referral.home.step1.title': 'Εγγραφείσε και λάβε σύνδεσμο', 'referral.home.step1.desc': 'Δημιούργησε λογαριασμό και βρες τον μοναδικό σου σύνδεσμο παραπομπής στο προφίλ σου.', 'referral.home.step2.title': 'Μοιράσου με φίλους', 'referral.home.step2.desc': 'Στείλε τον σύνδεσμο σε φίλους, γνωστούς ή δημοσίευσέ τον στα social media.', 'referral.home.step3.title': 'Κέρδισε ανταμοιβές', 'referral.home.step3.desc': 'Μόλις ο φίλος σου επαληθεύσει το email του, λαμβάνεις αυτόματα την ανταμοιβή σου.', 'referral.home.cta': 'Πάρε τον σύνδεσμό σου', 'referral.home.badge': 'Πρόγραμμα παραπομπών', // FAQ section 'section.faq': 'Συχνές Ερωτήσεις', 'faq.q1': 'Πώς λειτουργεί το CanHelp;', 'faq.a1': 'Δημοσίευσε μια εργασία, λάβε προσφορές από ειδικούς, επέλεξε τον καλύτερο και ξεκίνα τη συνεργασία. Είναι γρήγορο, απλό και δωρεάν για πελάτες.', 'faq.q2': 'Πόσο κοστίζει η χρήση της πλατφόρμας;', 'faq.a2': 'Η εγγραφή και η δημοσίευση εργασιών είναι εντελώς δωρεάν για πελάτες. Οι ειδικοί έχουν στη διάθεσή τους δωρεάν πλάνο καθώς και premium επιλογές.', 'faq.q3': 'Πώς μπορώ να γίνω ειδικός;', 'faq.a3': 'Κάνε εγγραφή, πήγαινε στο «Γίνε Ειδικός», συμπλήρωσε το προφίλ σου με δεξιότητες και κατηγορίες και αρχίνισε να λαμβάνεις εργασίες.', 'faq.q4': 'Πώς επιλέγω τον κατάλληλο ειδικό;', 'faq.a4': 'Δες τις αξιολογήσεις, την εμπειρία, τις δεξιότητες και το χαρτοφυλάκιο κάθε ειδικού. Επικοινώνησε μαζί του μέσω chat και συζήτα τις λεπτομέρειες πριν αποφασίσεις.', 'faq.q5': 'Τι γίνεται αν δεν είμαι ικανοποιημένος;', 'faq.a5': 'Μπορείς να αφήσεις αξιολόγηση για τον ειδικό και να τον βαθμολογήσεις από 1 έως 5 αστέρια. Οι αξιολογήσεις βοηθούν άλλους χρήστες να επιλέξουν έμπιστους επαγγελματίες.', 'faq.q6': 'Μπορώ να επικοινωνήσω με τον ειδικό πριν την αποδοχή;', 'faq.a6': 'Ναι. Μόλις λάβεις μια προσφορά, μπορείς να ανοίξεις chat με τον ειδικό, να κάνεις ερωτήσεις και να συντονίσεις τις λεπτομέρειες πριν αποφασίσεις.', 'faq.q7': 'Πόσος χρόνος χρειάζεται για να λάβω προσφορές;', 'faq.a7': 'Συνήθως μέσα σε λίγες ώρες. Οι ειδικοί λαμβάνουν ειδοποίηση για νέες εργασίες και μπορούν να απαντήσουν γρήγορα.', 'faq.q8': 'Μπορώ να δημοσιεύσω εργασία σε οποιαδήποτε πόλη της Ελλάδας;', 'faq.a8': 'Ναι! Το CanHelp καλύπτει όλη την Ελλάδα. Μπορείς να βρεις ειδικούς στην Αθήνα, στη Θεσσαλονίκη, στην Πάτρα και αλλού.', 'faq.q9': 'Τι είδη εργασιών μπορώ να βρω στο CanHelp;', 'faq.a9': 'Επισκευές, καθαρισμό, ηλεκτρολόγους, μαθήματα, σχεδιασμό, IT, μετακομίσεις, ομορφιά και πολλά άλλα. Οι κατηγορίες αυξάνονται συνεχώς.', 'faq.q10': 'Υπάρχει εφαρμογή για κινητό;', 'faq.a10': 'Ναι! Το CanHelp διατίθεται για Android και iOS. Κατέβασε την εφαρμογή και διαχειρίσου τα πάντα από το τηλέφωνό σου.', // How it works 'how.step1.title': 'Δημοσίευσε εργασία', 'how.step1.desc': 'Περίγραψε τι χρειάζεσαι και ορίζε τον προϋπολογισμό σου', 'how.step2.title': 'Λάβε προσφορές', 'how.step2.desc': 'Ειδικοί θα σου στείλουν προσφορές με τιμή και χρόνο', 'how.step3.title': 'Επίλεξε & ξεκίνα', 'how.step3.desc': 'Επέλεξε τον καλύτερο επαγγελματία και ξεκίνα τη συνεργασία', // Tasks page 'tasks.title': 'εργασίες', 'tasks.filters': 'Φίλτρα', 'tasks.search': 'Αναζήτηση', 'tasks.search.placeholder': 'Τίτλος ή λέξη κλειδί...', 'tasks.search.btn': 'Αναζήτηση', 'tasks.publish': 'Δημοσίευση', 'tasks.category.all': 'Όλες', 'tasks.category.all_in': 'Όλα στην', 'tasks.category.label': 'Κατηγορία', 'tasks.location.label': 'Πόλη', 'tasks.location.placeholder': 'π.χ. Αθήνα', 'tasks.empty': 'Δεν βρέθηκαν εργασίες', 'tasks.empty.cta': 'Δημοσίευσε την πρώτη', // Task detail 'task.status.open': 'Ανοιχτή', 'task.status.in_progress': 'Σε εξέλιξη', 'task.status.completed': 'Ολοκληρωμένη', 'task.status.cancelled': 'Ακυρωμένη', 'task.status.draft': 'Πρόχειρο', 'task.budget': 'Προϋπολογισμός', 'task.location': 'Τοποθεσία', 'task.deadline': 'Ημερομηνία έναρξης', 'task.created_at': 'Δημιουργήθηκε', 'task.customer': 'Πελάτης', 'task.offer.btn': 'Υποβολή προσφοράς', 'task.invite.banner_title': 'Σας προσκαλούν σε αυτήν την εργασία', 'task.invite.banner_hint': 'Ο πελάτης σας πρόσκαλεσε προσωπικά', 'task.invite.accept': 'Αποστολή προσφοράς', 'task.invite.decline': 'Άρνηση', 'offer.accept': 'Αποδοχή', 'offer.decline': 'Απόρριψη', 'task.complete': 'Ολοκλήρωση εργασίας', 'task.complete.confirm': 'Να ολοκληρωθεί η εργασία;', 'task.edit': 'Επεξεργασία', 'task.status_label': 'Κατάσταση', 'task.yours': 'Η εργασία σου', 'task.offer.yours': 'Η προσφορά σου', 'review.leave': 'Άφησε αξιολόγηση', 'review.rating': 'Βαθμολογία', 'review.comment': 'Σχόλιο', 'review.comment.placeholder': 'Πες μας για την εμπειρία σου...', 'review.submit': 'Υποβολή αξιολόγησης', 'review.submitting': 'Αποστολή...', 'review.done': 'Η αξιολόγηση καταχωρήθηκε!', 'profile.reviews': 'Αξιολογήσεις', 'profile.no_reviews': 'Δεν υπάρχουν αξιολογήσεις ακόμα', 'profile.rating': 'Βαθμολογία', 'profile.skills.label': 'Δεξιότητες', 'profile.member_since': 'Μέλος από', 'task.offers': 'Προσφορές', 'task.offers.none': 'Δεν υπάρχουν ακόμα προσφορές', // Create task 'create.title': 'Δημοσίευση εργασίας', 'create.field.title': 'Τίτλος', 'create.field.description': 'Περιγραφή', 'create.field.category': 'Κατηγορία', 'create.field.category.select': 'Επιλέξτε...', 'create.field.location': 'Τοποθεσία', 'create.field.location.any': 'Οπουδήποτε', 'create.field.location.all': 'Ολόκληρη η πόλη', 'create.field.budget': 'Προϋπολογισμός (€)', 'create.field.deadline': 'Ημερομηνία έναρξης', 'create.field.budget_negotiable': 'Η τιμή είναι διαπραγματεύσιμη', 'create.field.time_slot': 'Χρόνος εκτέλεσης', 'create.field.time_slot.any': 'Οποιαδήποτε', 'create.field.time_slot.morning': 'Πρωινό (08:00–13:00)', 'create.field.time_slot.afternoon': 'Μεσημέρι (13:00–18:00)', 'create.field.time_slot.evening': 'Βράδυ (18:00–22:00)', 'create.field.time_slot.weekend': 'Σαββατοκύριακο', 'create.field.address': 'Διεύθυνση (προαιρετικά)', 'create.field.address.district': 'Συνοικία', 'create.field.address.street': 'Οδός', 'create.field.address.house': 'Αριθμός', 'create.field.confidential': 'Εμπιστευτική σημείωση', 'create.field.confidential.placeholder': 'Λεπτομέρειες που θα δει μόνο ο αναδοχόμενος...', 'create.field.confidential.hint': 'Δεν εμφανίζεται δημόσια', 'create.field.photos': 'Φωτογραφίες', 'create.field.photos.add': 'Προσθήκη φωτογραφίας', 'create.field.photos.uploading': 'Ανέβασμα...', 'task.budget_negotiable': 'Τιμή διαπραγματεύσιμη', 'task.time_slot': 'Χρόνος', 'task.confidential': 'Εμπιστευτική σημείωση', 'create.field.title.placeholder': 'π.χ. Καθαρισμός διαμερίσματος 80τμ', 'create.field.description.placeholder': 'Περίγραψε λεπτομερώς τι χρειάζεσαι...', 'create.field.location.placeholder': 'π.χ. Αθήνα, Κολωνάκι', 'create.field.budget.placeholder': 'π.χ. 100', 'create.submit': 'Δημοσίευση εργασίας', 'create.submitting': 'Δημοσίευση...', // Auth 'login.title': 'Καλωσόρισες', 'login.subtitle': 'Σύνδεση στο CanHelp', 'login.email': 'Email', 'login.password': 'Κωδικός', 'login.submit': 'Σύνδεση', 'login.submitting': 'Σύνδεση...', 'login.error': 'Λάθος email ή κωδικός', 'login.unverified.title': 'Επιβεβαιώστε το email σας', 'login.unverified.desc': 'Στείλαμε σύνδεσμο επαλήθευσης στο email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε το σύνδεσμο.', 'login.unverified.resend': 'Αποστολή νέου email επαλήθευσης', 'login.unverified.sending': 'Αποστολή...', 'login.unverified.sent': '✓ Εστάλη — ελέγξτε τα εισερχόμενα', 'profile.email.verified': 'Email επαληθεύτηκε', 'profile.email.not_verified': 'Email δεν επαληθεύτηκε', 'login.no_account': 'Δεν έχεις λογαριασμό;', 'login.register_link': 'Εγγραφή', 'login.forgot_password': 'Ξέχασα τον κωδικό', 'login.or_continue_with': 'ή συνεχίστε με', 'login.continue_google': 'Σύνδεση με Google', 'forgot.title': 'Ξέχασα τον κωδικό', 'forgot.subtitle': 'Εισάγετε το email σας για να λάβετε σύνδεσμο ανάκτησης', 'forgot.email': 'Email', 'forgot.submit': 'Αποστολή', 'forgot.submitting': 'Αποστολή...', 'forgot.sent.title': 'Ελέγξτε τα εισερχόμενά σας', 'forgot.sent.desc': 'Αν υπάρχει λογαριασμός με αυτό το email, θα σας στείλουμε σύνδεσμο ανάκτησης κωδικού.', 'forgot.back_to_login': 'Επιστροφή στη σύνδεση', 'forgot.error': 'Αποτυχία αποστολής. Ελέγξτε το email σας ή δοκιμάστε ξανά.', 'forgot.error.not_found': 'Δεν βρέθηκε λογαριασμός με αυτό το email.', 'forgot.error.send_failed': 'Αποτυχία αποστολής email. Δοκιμάστε ξανά αργότερα', 'reset.title': 'Νέος κωδικός', 'reset.subtitle': 'Εισάγετε τον νέο σας κωδικό', 'reset.password': 'Νέος κωδικός', 'reset.confirm': 'Επιβεβαίωση κωδικού', 'reset.submit': 'Αλλαγή κωδικού', 'reset.submitting': 'Αποθήκευση...', 'reset.success': 'Ο κωδικός άλλαξε επιτυχώς. Ανακατεύθυνση στη σύνδεση...', 'reset.back_to_login': 'Επιστροφή στη σύνδεση', 'reset.error.mismatch': 'Οι κωδικοί δεν ταιριάζουν', 'reset.error.invalid': 'Μη έγκυρος σύνδεσμος. Παρακαλώ ζητήστε νέο.', 'register.title': 'Εγγραφή', 'register.subtitle': 'Δημιουργία λογαριασμού στο CanHelp', 'register.first_name': 'Όνομα', 'register.last_name': 'Επώνυμο', 'register.email': 'Email', 'register.password': 'Κωδικός (min 8 χαρακτήρες)', 'register.role': 'Ρόλος', 'register.role.customer': 'Χρήστης', 'register.role.customer.desc': 'Δημοσιεύω εργασίες', 'register.role.specialist': 'Ειδικός', 'register.role.specialist.desc': 'Αναλαμβάνω εργασίες', 'register.submit': 'Δημιουργία λογαριασμού', 'register.submitting': 'Εγγραφή...', 'register.has_account': 'Έχεις ήδη λογαριασμό;', 'register.login_link': 'Σύνδεση', 'register.continue_google': 'Εγγραφή με Google', 'register.check_email.title': 'Ελέγξτε το email σας', 'register.check_email.desc': 'Στείλαμε σύνδεσμο επαλήθευσης στη διεύθυνση email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε τον σύνδεσμο.', 'register.check_email.login': 'Επιστροφή στη σύνδεση', // Dashboard 'dashboard.title': 'Πίνακας ελέγχου', 'dashboard.new_task': '+ Νέα εργασία', 'dashboard.my_tasks': 'Οι εργασίες μου', 'dashboard.my_offers': 'Οι προσφορές μου', 'dashboard.invitations': 'Προσκλήσεις για εργασία', 'dashboard.offers_count': 'προσφορές', 'dashboard.declined_count': 'απορρίφθηκαν', 'dashboard.completed_tasks': 'Ολοκληρωμένες εργασίες', 'dashboard.completed_offers': 'Ολοκληρωμένες προσφορές', 'dashboard.review_pending': 'Η αξιολόγηση δεν έχει υποβληθεί ακόμα', 'tasks.new.top_specialists': 'Κορυφαίοι ειδικοί', 'tasks.new.select_category': 'Επιλέξτε κατηγορία για να δείτε ειδικούς', 'tasks.new.invite': 'Πρόσκληση', 'tasks.new.invited': 'Επιλέχθηκε ✓', 'reviews.count': 'αξιολογήσεις', 'filter.location': 'Τοποθεσία', 'filter.language': 'Γλώσσες', 'filter.language.any': 'Οποιαδήποτε γλώσσα', 'filter.category.all': 'Όλες οι κατηγορίες', 'user.categories': 'Κατηγορίες', 'user.work_area': 'Περιοχή εργασίας', 'dashboard.tasks.empty': 'Δεν έχεις δημοσιεύσει εργασίες', 'dashboard.tasks.empty.cta': 'Δημοσίευσε την πρώτη σου', 'dashboard.tasks.add_new': 'Πρόσθεσε νέα εργασία', 'dashboard.offers.empty': 'Δεν έχεις υποβάλλει προσφορές', 'dashboard.offers.empty.cta': 'Βρες εργασίες', 'dashboard.customer.specialists_title': 'Ψάχνεις εκτελεστή;', 'dashboard.customer.specialists_hint': 'Δες προφίλ ειδικών, διάβασε αξιολογήσεις και κάλεσέ τους στις εργασίες σου', 'dashboard.customer.specialists_cta': 'Βρες ειδικό', 'dashboard.customer.how_title': 'Πώς λειτουργεί', 'dashboard.customer.step1': 'Δημιούργησε εργασία με περιγραφή και προϋπολογισμό', 'dashboard.customer.step2': 'Οι ειδικοί θα στείλουν προσφορές με τιμή και χρόνο', 'dashboard.customer.step3': 'Επίλεξε τον κατάλληλο και ξεκίνα τη συνεργασία', // Notifications 'notif.title': 'Ειδοποιήσεις', 'notif.mark_all': 'Σήμανση όλων ως αναγνωσμένα', 'notif.empty': 'Δεν υπάρχουν ειδοποιήσεις', 'notif.type.new_offer': 'Νέα προσφορά', 'notif.type.offer_accepted': 'Η προσφορά σας έγινε δεκτή', 'notif.type.offer_declined': 'Η προσφορά σας απορρίφθηκε', 'notif.type.task_completed': 'Η εργασία ολοκληρώθηκε', 'notif.type.task_cancelled': 'Η εργασία ακυρώθηκε', 'notif.type.new_message': 'Νέο μήνυμα', 'notif.type.new_review': 'Νέα αξιολόγηση', 'notif.type.task_invite': 'Πρόσκληση σε εργασία', 'notif.body.new_offer': 'Νέα προσφορά για «{title}»', 'notif.body.offer_accepted': 'Η προσφορά σας για «{title}» έγινε δεκτή', 'notif.body.offer_declined': 'Η προσφορά σας για «{title}» απορρίφθηκε', 'notif.body.task_invite': 'Σας προσκαλούν για «{title}»', 'notif.body.new_review': 'Λάβατε αξιολόγηση {rating}★', // Offer status 'offer.status.pending': 'Εκκρεμεί', 'offer.status.accepted': 'Αποδεκτή', 'offer.status.declined': 'Απορρίφθηκε', 'offer.status.withdrawn': 'Αποσύρθηκε', 'offer.status.other_accepted': 'Επιλέχθηκε άλλος ειδικός', // Common 'common.loading': 'Φόρτωση...', 'common.error': 'Σφάλμα', 'common.save': 'Αποθήκευση', 'common.saving': 'Αποθήκευση...', 'common.cancel': 'Ακύρωση', 'common.add': 'Προσθήκη', 'common.close': 'Κλείσιμο', 'common.edit': 'Επεξεργασία', 'common.delete': 'Διαγραφή', 'common.from': 'από', 'common.currency': '€', 'common.greece': 'Ελλάδα', // Chat 'chat.connected': 'Συνδεδεμένος', 'chat.disconnected': 'Αποσυνδεδεμένος', 'chat.no_rooms': 'Δεν υπάρχουν συνομιλίες ακόμα', 'chat.task_fallback': 'Εργασία', 'chat.select': 'Επίλεξε συνομιλία', 'chat.no_messages': 'Δεν υπάρχουν μηνύματα', 'chat.placeholder': 'Γράψε μήνυμα... (Enter για αποστολή)', 'chat.conversation_fallback': 'Συνομιλία', 'chat.direct_chat': 'Απευθείας συνομιλία', 'chat.linked_task': 'Συνδεδεμένη εργασία', 'chat.write_btn': 'Μήνυμα', 'chat.just_now': 'μόλις τώρα', 'chat.min_ago': 'λ', 'chat.write_specialist': 'Γράψε στον ειδικό', 'chat.write_customer': 'Γράψε στον πελάτη', 'chat.notif_settings': 'Ρυθμίσεις ειδοποιήσεων', 'chat.notif_messages': 'Ειδοποιήσεις για νέα μηνύματα', 'chat.toast_title': 'Νέο μήνυμα', 'chat.toast_open': 'Άνοιγμα συνομιλίας', // Offer form 'offer.price': 'Τιμή', 'offer.price.placeholder': 'π.χ. 80', 'offer.customer_budget': 'Προϋπολογισμός πελάτη', 'offer.message': 'Μήνυμα', 'offer.optional': 'προαιρετικό', 'offer.message.placeholder': 'Παρουσίασε τον εαυτό σου, την εμπειρία σου και γιατί είσαι η καλύτερη επιλογή...', 'offer.submitting': 'Αποστολή...', // Profile 'profile.photo': 'Φωτογραφία προφίλ', 'profile.photo.change': 'Αλλαγή φωτογραφίας', 'profile.photo.hint': 'JPEG, PNG, WebP · έως 5MB', 'profile.basic_info': 'Βασικά στοιχεία', 'profile.phone': 'Τηλέφωνο', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Σύντομη περιγραφή', 'profile.bio.placeholder': 'Πες μας λίγα λόγια για εσένα...', 'profile.language': 'Γλώσσα', 'profile.language.hint': 'Γλώσσα διεπαφής και email ειδοποιήσεων', 'profile.languages': 'Γλώσσες επικοινωνίας', 'profile.languages.hint': 'Επιλέξτε όλες τις γλώσσες που μιλάτε', 'profile.skills': 'Δεξιότητες', 'profile.skills.subtitle': 'Προσθέσε τις υπηρεσίες που προσφέρεις', 'profile.skills.placeholder': 'π.χ. Καθαρισμός, IT, Μαθήματα...', 'profile.role': 'Ρόλος λογαριασμού', 'profile.role.specialist': '🔧 Ειδικός', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 Χρήστης', 'profile.role.change': 'Για αλλαγή ρόλου επικοινωνήστε με την υποστήριξη.', 'profile.become_specialist': 'Γίνε Ειδικός', 'profile.become_specialist.desc': 'Αναβαθμίσου σε Ειδικό για να δέχεσαι εργασίες και να δημιουργήσεις το προφίλ σου.', 'become_specialist.hero.title': 'Κέρδισε χρήματα κάνοντας αυτό που ξέρεις', 'become_specialist.hero.subtitle': 'Δημιούργησε προφίλ ειδικού και λάβε παραγγελίες από πελάτες σε όλη την Ελλάδα', 'become_specialist.how.title': 'Πώς λειτουργεί', 'become_specialist.step1.title': 'Δημιούργησε κάρτα ειδικού', 'become_specialist.step1.desc': 'Δήλωσε κατηγορίες, δεξιότητες και περιοχές κάλυψης — το σύστημα θα βρει τις κατάλληλες εργασίες για σένα αυτόματα', 'become_specialist.step2.title': 'Βρες εργασίες', 'become_specialist.step2.desc': 'Ανακάλυψε εργασίες στις κατηγορίες σου στην ενότητα «Αναζήτηση εργασιών»', 'become_specialist.step3.title': 'Στείλε προσφορά & κέρδισε', 'become_specialist.step3.desc': 'Υποβάλε προσφορές με τιμή και χρόνο, επικοινωνήσε με πελάτες και ολοκλήρωσε εργασίες', 'become_specialist.benefits.title': 'Πλεονεκτήματα προφίλ ειδικού', 'become_specialist.benefit1': 'Αναζήτηση εργασιών ανά κατηγορία και τοποθεσία', 'become_specialist.benefit2': 'Δημόσιο προφίλ με αξιολογήσεις πελατών', 'become_specialist.benefit3': 'Πρόγραμμα διαθεσιμότητας ορατό στους πελάτες', 'become_specialist.benefit4': 'Προσθήκη σε αγαπημένα από πελάτες', 'become_specialist.cta': 'Γίνε Ειδικός — είναι δωρεάν', 'become_specialist.free_badge': 'Δωρεάν εγγραφή', 'profile.tab.notifications': 'Ειδοποιήσεις', 'profile.tab.reviews': 'Αξιολογήσεις', 'profile.tab.referral': 'Παραπομπές', 'profile.tab.auto_response': 'Αυτόματη απάντηση', 'profile.tab.site': 'Site', 'profile.site.title': 'Προσωπική σελίδα', 'profile.site.url_label': 'Προσωπικό site', 'profile.site.copy': 'Αντιγραφή', 'profile.site.copied': 'Αντιγράφηκε', 'profile.site.visible_title': 'Τι εμφανίζεται στη σελίδα σας', 'profile.site.visible.name': 'Όνομα και φωτογραφία', 'profile.site.visible.bio': 'Βιογραφικό', 'profile.site.visible.rating': 'Αξιολόγηση και κριτικές', 'profile.site.visible.portfolio': 'Χαρτοφυλάκιο / Κάρτες', 'profile.site.visible.contacts': 'Στοιχεία επικοινωνίας', 'profile.site.visible.full_last_name': 'Πλήρες επώνυμο', 'profile.site.visible.services': 'Κάρτες υπηρεσιών', 'profile.site.visible.reviews': 'Ενότητα κριτικών', 'profile.site.visible.status': 'Κατάσταση «Έτοιμος να βοηθήσω»', 'profile.site.theme': 'Θέμα εμφάνισης', 'profile.site.theme.dark': 'Σκοτεινό', 'profile.site.theme.light': 'Φωτεινό', 'profile.site.slug_taken': 'Αυτή η διεύθυνση είναι ήδη κατειλημμένη', 'profile.site.stats.title': 'Στατιστικά επισκεψιμότητας', 'profile.site.stats.days': 'τελευταίες 30 ημέρες', 'profile.site.stats.views': 'Προβολές', 'profile.site.stats.unique': 'Μοναδικοί επισκέπτες', 'profile.site.stats.messages': 'Μηνύματα', 'profile.site.stats.total_views': 'Συνολικές προβολές', 'profile.site.stats.total_unique': 'Μοναδικοί επισκέπτες', 'profile.site.stats.total_messages': 'Μηνύματα', 'profile.site.stats.empty': 'Δεν υπάρχουν δεδομένα ακόμη', 'profile.site.stats.loading': 'Φόρτωση στατιστικών...', 'profile.site.stats.no_slug': 'Ορίστε τη διεύθυνση του site για να δείτε στατιστικά', 'profile.site.edit_bio_hint': 'Το βιογραφικό και η φωτογραφία ρυθμίζονται στην καρτέλα «Βασικά».', 'status.can_help_now_hint': 'Η κάρτα σου εμφανίζεται ψηλότερα', 'status.need_help_hint': 'Οι ειδικοί μπορούν να σε βοηθήσουν', 'profile.referral.title': 'Πρόγραμμα παραπομπών', 'profile.referral.desc': 'Μοιράσου τον σύνδεσμο σου και κέρδισε ανταμοιβές για κάθε νέο χρήστη.', 'profile.referral.link_label': 'Ο σύνδεσμος παραπομπής σου', 'profile.referral.copy': 'Αντιγραφή', 'profile.referral.copied': 'Αντιγράφηκε!', 'profile.referral.invited_count': 'επιτυχείς παραπομπές', 'profile.referral.no_code': 'Ο κωδικός παραπομπής δεν είναι διαθέσιμος.', 'notifications.title': 'Ρυθμίσεις ειδοποιήσεων', 'notifications.email.new_tasks': 'Email για νέες εργασίες', 'notifications.email.new_tasks.desc': 'Λάβε email όταν δημοσιευτεί νέα εργασία στις κατηγορίες σου', 'notifications.messages.desc': 'Λαμβάνεις ειδοποίηση όταν έρθει νέο μήνυμα', 'notifications.saved': 'Ρυθμίσεις αποθηκεύτηκαν', 'notifications.plan_required': 'Συνδρομή απαιτείται για αυτή τη λειτουργία', 'profile.tab.info': 'Βασικά στοιχεία', 'profile.tab.finance': 'Οικονομικά', 'profile.tab.skills': 'Δεξιότητες', 'profile.tab.categories': 'Κατηγορίες', 'profile.tab.geography': 'Γεωγραφία', 'profile.specialist.categories': 'Κατηγορίες εργασιών', 'profile.specialist.categories.desc': 'Επίλεξε τις κατηγορίες στις οποίες εργάζεσαι', 'profile.specialist.geography': 'Περιοχές κάλυψης', 'profile.specialist.geography.desc': 'Επίλεξε τις πόλεις / περιοχές όπου δραστηριοποιείσαι', 'profile.saving': 'Αποθήκευση...', 'profile.upload.error': 'Σφάλμα κατά την αναφόρτωση', 'profile.saved': 'Αποθηκεύτηκε', 'profile.tab.cards': 'Χαρτοφυλάκιο', 'profile.cards.count': 'Χαρτοφυλάκια', 'profile.cards.add': 'Νέο χαρτοφυλάκιο', 'profile.cards.new_title': 'Τίτλος νέου χαρτοφυλακίου', 'profile.cards.placeholder': 'π.χ. Υδραυλικά', 'profile.cards.create': 'Δημιουργία', 'profile.cards.cancel': 'Ακύρωση', 'profile.cards.empty': 'Δεν έχετε χαρτοφυλάκιο', 'profile.cards.create_first': 'Δημιουργήστε το πρώτο σας χαρτοφυλάκιο', 'profile.cards.delete_confirm': 'Διαγραφή χαρτοφυλακίου;', 'profile.card.tab.main': 'Γενικά', 'profile.card.tab.skills': 'Δεξιότητες', 'profile.card.tab.categories': 'Κατηγορίες', 'profile.card.tab.geography': 'Γεωγραφία', 'profile.card.tab.portfolio': 'Γκαλερί', 'profile.card.active': 'Ενεργή', 'profile.card.save': 'Αποθήκευση', 'profile.card.saved': 'Αποθηκεύτηκε', 'profile.card.delete': 'Διαγραφή', 'profile.card.skill.add': 'Προσθήκη δεξιότητας', 'profile.card.photo.add': 'Προσθήκη φωτογραφίας', 'profile.card.photo.uploading': 'Μεταφόρτωση...', 'profile.card.photo.empty': 'Δεν υπάρχουν φωτογραφίες', 'profile.card.item.title': 'Τίτλος', 'profile.card.item.desc': 'Περιγραφή', 'profile.card.item.save': 'Αποθήκευση', 'profile.card.item.cancel': 'Ακύρωση', 'profile.card.item.edit': 'Επεξεργασία', 'profile.upgrade.cards_limit': 'Όριο χαρτοφυλακίων εξαντλήθηκε', 'profile.upgrade.plan': 'Τρέχον πλάνο:', 'profile.upgrade.contact': 'Επικοινωνήστε με τον διαχειριστή για αλλαγή πλάνου', 'profile.upgrade.ok': 'Εντάξει', 'profile.plan.title': 'Πλάνο συνδρομής', 'profile.balance': 'Υπόλοιπο', 'profile.balance.topup': 'Αναπλήρωση υπολοίπου', 'profile.balance.topup.title': 'Αναπλήρωση υπολοίπου', 'profile.balance.topup.amount': 'Ποσό (σε EUR)', 'profile.balance.topup.hint': 'Επιλέξτε ποσό ή εισαγάγετε μανούαλα', 'profile.balance.topup.submit': 'Πληρωμή', 'profile.balance.topup.loading': 'Ρεδιρεκτάρισμα...', 'profile.balance.topup.error': 'Σφάλμα μετάβασης στην πληρωμή. Προσπαθήστε ξανά.', 'payment.success.title': 'Πληρωμή επιτυχής!', 'payment.success.desc': 'Το υπόλοιπό σας ενημερώθηκε.', 'payment.cancelled.title': 'Ακύρωση πληρωμής', 'payment.cancelled.desc': 'Η πληρωμή ακυρώθηκε. Κανένα χρήμα δεν χρεώθηκε.', 'payment.pending.title': 'Σε εξέλιξη...', 'payment.pending.desc': 'Επεξεργαζόμαστε την πληρωμή σας.', 'payment.back_to_profile': 'Επιστροφή στο προφίλ', 'profile.plan.basic': 'Βασικό (δωρεάν)', 'profile.plan.contact_upgrade': 'Επικοινωνήστε με τον διαχειριστή για αναβάθμιση', 'profile.plan.cards_up_to': 'Χαρτοφυλάκια: έως', 'profile.plan.cards_unlimited': 'Χαρτοφυλάκια: απεριόριστα', 'profile.plan.tasks_up_to': 'Εργασίες: έως', 'profile.plan.offers_up_to': 'Προσφορές: έως', 'profile.plan.valid_until': 'Ισχύει έως', 'profile.plan.no_expiry': 'Δεν λήγει', // Create task 'create.error': 'Σφάλμα κατά τη δημοσίευση', // Tasks list extras 'tasks.category.general': 'Γενικά', 'tasks.budget.range': 'Εύρος:', 'tasks.budget.from': 'από', 'tasks.budget.to': 'έως', 'tasks.filter.reset': 'Εκκαθάριση φίλτρων', 'tasks.load_more': 'Φόρτωση ακόμα', 'tasks.showing': 'Αποτελέσματα:', 'tasks.field.budget': 'Προϋπολογισμός, €', // Admin 'admin.title': 'Πίνακας Διαχείρισης', 'admin.tab.stats': 'Στατιστικά', 'admin.tab.users': 'Χρήστες', 'admin.tab.tasks': 'Εργασίες', 'admin.tab.reports': 'Αναφορές', 'admin.stats.users': 'Χρήστες', 'admin.stats.tasks': 'Εργασίες', 'admin.stats.offers': 'Προσφορές', 'admin.stats.reviews': 'Αξιολογήσεις', 'admin.tasks.by_status': 'Εργασίες ανά κατάσταση', 'admin.col.user': 'Χρήστης', 'admin.col.email': 'Email', 'admin.col.role': 'Ρόλος', 'admin.col.registered': 'Εγγραφή', 'admin.col.status': 'Κατάσταση', 'admin.col.title': 'Τίτλος', 'admin.col.budget': 'Προϋπολογισμός', 'admin.col.created': 'Δημιουργία', 'admin.users.active': 'Ενεργός', 'admin.users.inactive': 'Ανενεργός', 'admin.users.deactivate': 'Απενεργοποίηση', 'admin.users.activate': 'Ενεργοποίηση', 'admin.tasks.cancel': 'Ακύρωση', 'admin.reports.none': 'Δεν υπάρχουν αναφορές', 'admin.reports.reviewed': 'Αναθεωρήθηκε', 'admin.reports.dismiss': 'Απόρριψη', 'admin.pagination.total': 'Σύνολο', 'admin.users.role.change': 'Αλλαγή ρόλου', 'admin.users.search.placeholder': 'Αναζήτηση ονόματος ή email...', 'admin.tasks.delete': 'Διαγραφή', 'admin.tasks.delete.confirm': 'Διαγραφή αυτής της εργασίας μόνιμα;', 'admin.tasks.search.placeholder': 'Αναζήτηση τίτλου...', 'admin.col.customer': 'Πελάτης', 'admin.col.reporter': 'Καταγγέλλων', 'admin.col.target': 'Στόχος', 'admin.filter.all_roles': 'Όλοι οι ρόλοι', 'admin.filter.all_statuses': 'Όλες οι καταστάσεις', 'admin.reports.target.task': 'Εργασία', 'admin.reports.target.user': 'Χρήστης', 'admin.tab.categories': 'Κατηγορίες', 'admin.tab.locations': 'Πόλεις & Περιοχές', 'admin.tab.logs': 'Αρχεία', 'admin.tab.plans': 'Πακέτα', 'admin.tab.settings': 'Ρυθμίσεις', 'admin.logs.subtab.ai': 'AI Logs', 'admin.logs.subtab.activity': 'Δραστηριότητα', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Ειδοποιήσεις', 'admin.notif_logs.type': 'Τύπος', 'admin.notif_logs.title': 'Τίτλος', 'admin.notif_logs.read': 'Διαβασμένο', 'admin.notif_logs.empty': 'Δεν υπάρχουν αρχεία ειδοποιήσεων', 'admin.stats.notif_chart_title': 'Ειδοποιήσεις ανά ημέρα', 'admin.stats.notif_label': 'Ειδοποιήσεις', 'admin.stats.mail_chart_title': 'Emails ανά ημέρα', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'Όλα', 'admin.stats.specialists': 'Ειδικοί', 'admin.col.plan': 'Πακέτο', 'admin.back_home': 'Αρχική', 'admin.plans.title': 'Πακέτα συνδρομής', 'admin.plans.add': '+ Νέο πακέτο', 'admin.plans.empty': 'Δεν υπάρχουν πακέτα', 'admin.plans.form.new': 'Νέο πακέτο', 'admin.plans.form.edit': 'Επεξεργασία πακέτου', 'admin.plans.form.name': 'Όνομα', 'admin.plans.form.price': 'Τιμή (EUR)', 'admin.plans.form.old_price': 'Παλιά τιμή (EUR, προαιρετικό)', 'admin.plans.form.max_offers': 'Μέγ. προσφορές (κενό = χωρίς όριο)', 'admin.plans.form.max_cards': 'Μέγ. χαρτοφυλάκιο (κενό = χωρίς όριο)', 'admin.plans.form.duration_days': 'Διάρκεια (ημέρες, κενό = χωρίς λήξη)', 'admin.plans.form.description': 'Περιγραφή', 'admin.plans.form.features': 'Δυνατότητες (μία ανά γραμμή)', 'admin.plans.form.notify': 'Ειδοποιήσεις νέων εργασιών', 'admin.plans.form.default': 'Προεπιλογή', 'admin.plans.form.active': 'Ενεργό', 'admin.plans.form.order': 'Σειρά', 'admin.plans.form.role': 'Ρόλος', 'admin.plans.form.tier': 'Επίπεδο', 'admin.plans.form.role.customer': 'Πελάτης', 'admin.plans.form.role.specialist': 'Ειδικός', 'admin.plans.form.tier.free': 'Δωρεάν', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Όρια (κενό = χωρίς όριο)', 'admin.plans.form.max_messages_day': 'Μέγ. μηνύματα/ημέρα', 'admin.plans.form.max_orders_day': 'Μέγ. παραγγελίες/ημέρα', 'admin.plans.form.max_skills': 'Μέγ. δεξιότητες', 'admin.plans.form.max_profiles': 'Μέγ. προφίλ', 'admin.plans.form.max_portfolio': 'Μέγ. στοιχεία χαρτοφυλακίου', 'admin.plans.form.section.boost': 'Πολλαπλασιαστές & Ενίσχυση', 'admin.plans.form.search_boost': 'Ενίσχυση αναζήτησης', 'admin.plans.form.offers_multiplier': 'Πολλαπλασιαστής προσφορών', 'admin.plans.form.section.contact': 'Δικαιώματα επικοινωνίας', 'admin.plans.form.can_contact_free': 'Επικοινωνία με δωρεάν χρήστες', 'admin.plans.form.can_contact_pro': 'Επικοινωνία με Pro χρήστες', 'admin.plans.form.can_contact_all': 'Επικοινωνία με όλους', 'admin.plans.form.can_show_contact': 'Εμφάνιση στοιχείων επικοινωνίας', 'admin.plans.form.can_view_phone': 'Προβολή τηλεφώνου', 'admin.plans.form.section.features': 'Λειτουργίες', 'admin.plans.form.upload_video': 'Μεταφόρτωση βίντεο', 'admin.plans.form.favorites': 'Αγαπημένα', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Σήμα επαλήθευσης', 'admin.plans.form.highlighted_reviews': 'Προβεβλημένες κριτικές', 'admin.plans.form.personal_site': 'Προσωπική σελίδα', 'admin.plans.form.can_help_now': 'Κατάσταση «Μπορώ να βοηθήσω»', 'admin.plans.form.need_help': 'Κατάσταση «Χρειάζομαι βοήθεια»', 'admin.plans.form.auto_response': 'Αυτόματη απάντηση', 'admin.plans.form.auto_match': 'Αυτόματη αντιστοίχιση', 'admin.plans.form.instant_dispatch_free': 'Άμεση αποστολή (δωρεάν)', 'admin.plans.form.instant_dispatch_pro': 'Άμεση αποστολή (Pro)', 'admin.plans.badge.default': 'Προεπιλογή', 'admin.plans.badge.inactive': 'Ανενεργό', 'admin.plans.make_default': 'Ορισμός ως προεπιλογή', 'admin.plans.tasks': 'Εργασίες', 'admin.plans.offers': 'Προσφορές', 'admin.plans.cards': 'Χαρτοφυλάκιο', 'admin.plans.notify_tasks': 'Ειδοποιήσεις εργασιών', 'admin.plans.delete.confirm': 'Διαγραφή πακέτου', 'admin.activity.title': 'Αρχείο δραστηριότητας', 'admin.activity.event': 'Γεγονός', 'admin.activity.all_events': 'Όλα τα γεγονότα', 'admin.activity.from': 'Από', 'admin.activity.to': 'Έως', 'admin.activity.reset': 'Επαναφορά', 'admin.activity.total': 'Σύνολο', 'admin.activity.empty': 'Δεν υπάρχουν εγγραφές', 'admin.mail.event': 'Συμβάν email', 'admin.mail.all_events': 'Όλα τα email συμβάντα', 'admin.mail.from': 'Από', 'admin.mail.to': 'Έως', 'admin.mail.reset': 'Επαναφορά', 'admin.mail.total': 'Σύνολο', 'admin.mail.empty': 'Δεν υπάρχουν email logs', 'admin.mail.recipient': 'Παραλήπτης', 'admin.mail.provider': 'Πάροχος', 'admin.mail.details': 'Λεπτομέρειες', 'admin.mail.status': 'Κατάσταση', 'admin.mail.success': 'Επιτυχία', 'admin.mail.failed': 'Σφάλμα', 'admin.event.email_sent': 'Email sent', 'admin.event.email_failed': 'Email failed', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Admin test email sent', 'admin.event.admin_email_test_failed': 'Admin test email failed', 'admin.logs.empty': 'Δεν υπάρχουν εγγραφές', 'admin.logs.date': 'Ημερομηνία', 'admin.logs.provider': 'Πάροχος', 'admin.logs.model': 'Μοντέλο', 'admin.logs.action': 'Ενέργεια', 'admin.logs.langs': 'Γλώσσες', 'admin.logs.in': 'Είσοδος', 'admin.logs.out': 'Έξοδος', 'admin.logs.total': 'Σύνολο', 'admin.logs.ms': 'ms', 'admin.logs.status': 'Κατάσταση', 'admin.stats.activity_30d': 'Δραστηριότητα 30 ημερών', 'admin.stats.tasks_label': 'Εργασίες', 'admin.stats.users_label': 'Χρήστες', 'admin.stats.specialists_label': 'Ειδικοί', 'admin.stats.tokens_title': 'Χρήση tokens (ανά μήνα)', 'admin.stats.tokens_out': 'Εξερχόμενα', 'admin.stats.tokens_in': 'Εισερχόμενα', 'admin.stats.tokens_out_label': 'Εξερχόμενα tokens', 'admin.stats.tokens_in_label': 'Εισερχόμενα tokens', 'admin.stats.cost_label': 'Κόστος (USD)', 'admin.stats.tasks_by_status': 'Εργασίες ανά κατάσταση', 'admin.task_status.open': 'Ανοιχτές', 'admin.task_status.in_progress': 'Σε εξέλιξη', 'admin.task_status.completed': 'Ολοκληρωμένες', 'admin.task_status.cancelled': 'Ακυρωμένες', 'admin.task_status.draft': 'Προσχέδια', 'admin.settings.tab.general': 'Γενικά', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Ειδοποιήσεις', 'admin.settings.tab.payment': 'Πληρωμή', 'admin.settings.tab.referral': 'Παραπομπές', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO & Συντήρηση', 'admin.settings.seo.maintenance_label': 'Λειτουργία συντήρησης', 'admin.settings.seo.maintenance_hint': 'Εμφάνιση σελίδας συντήρησης σε όλους τους επισκέπτες', 'admin.settings.seo.indexing_label': 'Ευρετηρίαση από μηχανές αναζήτησης', 'admin.settings.seo.indexing_hint': 'Επιτρέπει στις μηχανές αναζήτησης να ευρετηριάσουν τον ιστότοπο', 'admin.settings.seo.head_scripts_label': 'Scripts στο (JS)', 'admin.settings.seo.head_scripts_hint': 'Εκτελείται σε κάθε σελίδα (Google Tag Manager, analytics κ.λπ.)', 'admin.settings.seo.site_title_label': 'Τίτλος ιστότοπου', 'admin.settings.seo.site_description_label': 'Περιγραφή ιστότοπου (meta description)', 'admin.settings.referral.title': 'Πρόγραμμα παραπομπών', 'admin.settings.referral.hint': 'Επιβράβευσε χρήστες που φέρνουν νέους εγγεγραμμένους.', 'admin.settings.referral.enabled_label': 'Ενεργό', 'admin.settings.referral.enabled_hint': 'Ενεργοποίηση / απενεργοποίηση εφαρμογής ανταμοιβών', 'admin.settings.referral.customer_section': 'Για πελάτες', 'admin.settings.referral.specialist_section': 'Για ειδικούς', 'admin.settings.referral.plan_label': 'Πλάνο ανταμοιβής', 'admin.settings.referral.no_plan': '— χωρίς πλάνο —', 'admin.settings.referral.plan_hint': 'Αυτό το πλάνο θα ανατεθεί στον χρήστη που έφερε νέους. Εάν το τρέχον πλάνο του είναι υψηλότερο, θα προστεθούν μόνο οι μέρες.', 'admin.settings.referral.days_label': 'Ημέρες ανταμοιβής', 'admin.settings.referral.days_hint': 'Αριθμός ημερών που θα προστεθούν στη λήξη του πλάνου.', 'admin.settings.general.title': 'Γενικές ρυθμίσεις', 'admin.settings.general.site_name': 'Όνομα ιστότοπου', 'admin.settings.general.site_url': 'URL ιστότοπου', 'admin.settings.general.contact_email': 'Email επικοινωνίας', 'admin.settings.general.support_phone': 'Τηλέφωνο υποστήριξης', 'admin.settings.smtp.title': 'Ρυθμίσεις SMTP', 'admin.settings.smtp.hint': 'Χρησιμοποιείται για αποστολή ειδοποιήσεων email.', 'admin.settings.smtp.host': 'SMTP Host', 'admin.settings.smtp.port': 'Θύρα', 'admin.settings.smtp.encryption': 'Κρυπτογράφηση', 'admin.settings.smtp.enc.none': 'Χωρίς', 'admin.settings.smtp.enc.tls': 'STARTTLS (θύρα 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (θύρα 465)', 'admin.settings.smtp.username': 'Όνομα χρήστη', 'admin.settings.smtp.password': 'Κωδικός / App Password', 'admin.settings.smtp.from_name': 'Όνομα αποστολέα', 'admin.settings.smtp.from_email': 'Email αποστολέα', 'admin.settings.smtp.test': 'Αποστολή δοκιμαστικού email', 'admin.settings.smtp.sending': 'Αποστολή...', 'admin.settings.payment.hint': 'Τα στοιχεία για ePay Piraeus Bank.', 'admin.settings.env.test': 'Δοκιμαστικό (sandbox)', 'admin.settings.env.prod': 'Παραγωγή', 'admin.settings.env.label': 'Περιβάλλον', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Ενεργό', 'admin.settings.saving': 'Αποθήκευση...', 'admin.settings.saved': '✓ Αποθηκεύτηκε', 'admin.notif.vars_hint': 'Διαθέσιμες μεταβλητές στα πρότυπα', 'admin.notif.tmpl.not_set': 'Πρότυπο δεν έχει οριστεί', 'admin.notif.tmpl.subject_label': 'Θέμα email', 'admin.notif.tmpl.body_label': 'Κείμενο email (HTML)', 'admin.notif.tmpl.save': 'Αποθήκευση', 'admin.notif.tmpl.close': 'Κλείσιμο', 'admin.notif.tmpl.translate': 'Αυτόματη μετάφραση', 'admin.notif.tmpl.translating': 'Μετάφραση...', 'admin.notif.tmpl.saving': 'Αποθήκευση...', 'admin.notif.email_verification': 'Επαλήθευση email', 'admin.notif.registration_success': 'Επιτυχής εγγραφή', 'admin.notif.password_reset': 'Επαναφορά κωδικού', 'admin.notif.new_offer': 'Νέα προσφορά', 'admin.notif.new_task': 'Νέα εργασία', 'admin.notif.offer_accepted': 'Προσφορά αποδεκτή', 'admin.notif.new_message': 'Νέο μήνυμα', 'admin.notif.offer_declined': 'Απόρριψη προσφοράς', 'admin.notif.offer_other_accepted': 'Επιλέχθηκε άλλος ειδικός', 'admin.notif.task_updated': 'Ενημέρωση εργασίας', 'admin.notif.deadline_reminder': 'Υπενθύμιση προθεσμίας', 'admin.notif.task_archived': 'Αυτόματη απόσυρση εργασίας', 'admin.notif.referral_reward': 'Ανταμοιβή παραπομπής', // Plan lifecycle email templates 'admin.email_template.plan_activated': 'Τιμολόγιο — ενεργοποίηση πλάνου', 'admin.email_template.plan_upgraded': 'Τιμολόγιο — αναβάθμιση πλάνου', 'admin.email_template.plan_downgrade_scheduled': 'Τιμολόγιο — προγραμματισμένη υποβάθμιση', 'admin.email_template.plan_downgrade_applied': 'Τιμολόγιο — εφαρμογή υποβάθμισης', 'admin.email_template.plan_renewal_reminder': 'Τιμολόγιο — υπενθύμιση ανανέωσης', 'admin.email_template.plan_insufficient_funds': 'Τιμολόγιο — ανεπαρκές υπόλοιπο', // Pricing confirm modal 'pricing.confirm.title': 'Επιβεβαίωση επιλογής πλάνου', 'pricing.confirm.plan': 'Πλάνο', 'pricing.confirm.prorated': 'Αναλογική έκπτωση', 'pricing.confirm.effective_price': 'Προς πληρωμή', 'pricing.confirm.your_balance': 'Το υπόλοιπό σας', 'pricing.confirm.downgrade_info': 'Η μετάβαση στο νέο πλάνο θα γίνει αυτόματα μετά τη λήξη της τρέχουσας περιόδου.', 'pricing.confirm.insufficient': 'Ανεπαρκές υπόλοιπο.', 'pricing.confirm.top_up': 'Ανανέωση', 'pricing.confirm.schedule_downgrade': 'Προγραμματισμός μετάβασης', 'pricing.confirm.pay': 'Πληρωμή', 'admin.user_edit.title': 'Επεξεργασία χρήστη', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Εγγραφή', 'admin.user_edit.last_seen': 'Τελευταία σύνδεση', 'admin.user_edit.lang': 'Γλώσσα', 'admin.user_edit.first_name': 'Όνομα', 'admin.user_edit.last_name': 'Επώνυμο', 'admin.user_edit.phone': 'Τηλέφωνο', 'admin.user_edit.bio': 'Βιογραφικό', 'admin.user_edit.role': 'Ρόλος', 'admin.user_edit.plan': 'Πακέτο', 'admin.user_edit.no_plan': '— Χωρίς πακέτο —', 'admin.user_edit.active': 'Ενεργός λογαριασμός', 'admin.user_edit.balance': 'Υπόλοιπο (EUR)', 'admin.user_edit.skills': 'Δεξιότητες', 'admin.user_edit.tab.profile': 'Προφίλ', 'admin.user_edit.tab.account': 'Λογαριασμός', 'admin.user_edit.tab.balance': 'Υπόλοιπο', 'admin.user_edit.tab.settings': 'Ρυθμίσεις', 'admin.user_edit.tab.specialist': 'Χαρτοφυλάκιο', 'admin.user_edit.tab.site': 'Ιστοσελίδα', 'admin.user_edit.plan_expires': 'Λήξη πλάνου', 'admin.user_edit.interface_lang': 'Γλώσσα διεπαφής', 'admin.user_edit.comm_languages': 'Γλώσσες επικοινωνίας', 'admin.user_edit.personal_site_slug': 'Προσωπική σελίδα', 'admin.user_edit.show_contact_info': 'Εμφάνιση στοιχείων επικοινωνίας', 'admin.user_edit.show_contact_info.hint': 'Ορατό στους πελάτες', 'admin.user_edit.notify_new_tasks': 'Ειδοποίηση για νέες εργασίες', 'admin.user_edit.notify_new_tasks.hint': 'Push και email ειδοποιήσεις', 'admin.user_edit.notif_messages': 'Ειδοποιήσεις μηνυμάτων', 'admin.user_edit.notif_messages.hint': 'Νέα μηνύματα στη συνομιλία', 'admin.user_edit.site_settings': 'Ρυθμίσεις προσωπικής σελίδας', 'admin.user_edit.categories': 'Κατηγορίες υπηρεσιών', 'admin.user_edit.locations': 'Περιοχές εξυπηρέτησης', 'admin.user_edit.skill_placeholder': 'Νέα δεξιότητα...', 'admin.user_edit.add_category': '— Επιλέξτε κατηγορία —', 'admin.user_edit.add_location': '— Επιλέξτε περιοχή —', 'admin.user_edit.specialist_cards': 'Χαρτοφυλάκιο ειδικού', 'admin.user_edit.no_cards': 'Δεν βρέθηκαν στοιχεία χαρτοφυλακίου', 'admin.user_edit.card_title': 'Τίτλος χαρτοφυλακίου', 'admin.user_edit.card_description': 'Περιγραφή', 'admin.balance.topup.btn': 'Αναπλήρωση', 'admin.balance.withdraw.btn': 'Αφαίρεση', 'admin.balance.modal_hint': 'Οι αλλαγές ισχύουν άμεσα και καταγράφονται στο ιστορικό', 'admin.balance.topup.title': 'Αναπλήρωση υπολοίπου', 'admin.balance.topup.amount': 'Ποσό', 'admin.balance.topup.description': 'Σχόλιο', 'admin.balance.topup.description.placeholder': 'Για παράδειγμα: bonus ή χειροκίνητη αναπλήρωση', 'admin.balance.topup.submit': 'Αναπλήρωση υπολοίπου', 'admin.balance.withdraw.title': 'Αφαίρεση υπολοίπου', 'admin.balance.withdraw.amount': 'Ποσό', 'admin.balance.withdraw.description': 'Σχόλιο', 'admin.balance.withdraw.description.placeholder': 'Για παράδειγμα: επιστροφή ή χειροκίνητη χρέωση', 'admin.balance.withdraw.submit': 'Αφαίρεση από το υπόλοιπο', 'admin.user_edit.role.customer': 'Πελάτης', 'admin.user_edit.role.specialist': 'Ειδικός', 'admin.user_edit.role.admin': 'Διαχειριστής', 'common.refresh': 'Ανανέωση', 'common.back_home': 'Αρχική', 'admin.loc.hint': 'Διαχείριση πόλεων και συνοικιών', 'admin.loc.add_city': 'Νέα πόλη', 'admin.loc.add_district': 'Προσθήκη συνοικίας', 'admin.loc.new': 'Νέα τοποθεσία', 'admin.loc.edit': 'Επεξεργασία τοποθεσίας', 'admin.loc.district': 'συνοικία', 'admin.loc.empty': 'Δεν υπάρχουν τοποθεσίες', 'admin.loc.delete.confirm': 'Διαγραφή τοποθεσίας; Όλες οι συνοικίες θα διαγραφούν επίσης.', 'admin.cat.add_root': 'Νέα κατηγορία', 'admin.cat.add_sub': 'Υποκατηγορία', 'admin.cat.edit': 'Επεξεργασία', 'admin.cat.delete': 'Διαγραφή', 'admin.cat.delete.confirm': 'Διαγραφή κατηγορίας; Όλες οι υποκατηγορίες θα διαγραφούν επίσης.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Εικονίδιο', 'admin.cat.name_el': 'Ελληνικά', 'admin.cat.name_en': 'Αγγλικά', 'admin.cat.name_ru': 'Ρωσικά', 'admin.cat.order': 'Σειρά', 'admin.cat.active': 'Ενεργή', 'admin.cat.parent': 'Γονική κατηγορία', 'admin.cat.no_parent': 'Κορυφαίο επίπεδο', 'admin.cat.save': 'Αποθήκευση', 'admin.cat.cancel': 'Ακύρωση', 'admin.cat.empty': 'Δεν υπάρχουν κατηγορίες', 'admin.cat.hint': 'Διαχείριση κατηγοριών με πολυεπίπεδη ιεραρχία', 'admin.cat.new': 'Νέα κατηγορία', 'admin.cat.subcategory': 'υποκατηγορία', 'admin.cat.add_child': 'Προσθήκη υποκατηγορίας', 'admin.cat.inactive': 'Ανενεργή', 'admin.event.user_login': 'Σύνδεση', 'admin.event.user_register': 'Εγγραφή', 'admin.event.admin_user_deactivate': 'Αποκλεισμός χρήστη', 'admin.event.admin_user_activate': 'Ενεργοποίηση χρήστη', 'admin.event.admin_user_role_changed': 'Αλλαγή ρόλου', 'admin.event.admin_task_cancelled': 'Ακύρωση εργασίας', 'admin.event.admin_task_deleted': 'Διαγραφή εργασίας', 'admin.event.admin_report_reviewed': 'Αναφορά εξετάστηκε', 'admin.event.admin_report_dismissed': 'Αναφορά απορρίφθηκε', 'admin.event.task_created': 'Δημιουργία εργασίας', 'user.online': 'Σε σύνδεση', 'user.seen_minutes': 'ήταν εδώ πριν {n} λεπτά', 'user.seen_hours': 'ήταν εδώ πριν {n} ώρες', 'user.seen_yesterday': 'ήταν εδώ χθες', 'user.seen_days': 'ήταν εδώ πριν {n} μέρες', // Specialists 'specialists.title': 'Ειδικοί', 'specialists.search': 'Αναζήτηση ειδικού...', 'specialists.search.btn': 'Αναζήτηση', 'specialists.empty': 'Δεν βρέθηκαν ειδικοί', 'specialists.no_bio': 'Χωρίς περιγραφή', 'specialists.view': 'Προβολή προφίλ', 'specialists.reviews': 'αξιολογήσεις', 'specialist.favorite': 'Προσθήκη στα αγαπημένα', 'specialist.unfavorite': 'Αφαίρεση από αγαπημένα', 'specialist.site_link': 'Προσωπικό site', 'favorites.specialists.title': 'Αγαπημένοι ειδικοί', 'favorites.specialists.empty': 'Δεν έχετε αγαπημένους ειδικούς', 'nav.favorites': 'Αγαπημένα', 'nav.schedule': 'Πρόγραμμα', 'nav.find_tasks': 'Αναζήτηση εργασιών', 'schedule.title': 'Το πρόγραμμά μου', 'schedule.subtitle': 'Σημειώστε τις ημέρες που είστε ελεύθεροι ή απασχολημένοι — οι πελάτες θα δουν τη διαθεσιμότητά σας', 'schedule.available': 'Ελεύθερος', 'schedule.busy': 'Απασχολημένος', 'schedule.unset': 'Μη ορισμένο', 'schedule.click_hint': '← κλικ για εναλλαγή κατάστασης', 'schedule.range_mode': 'Επιλογή εύρους', 'schedule.range_from': 'Από {date} — επιλέξτε τελική ημερομηνία', 'schedule.click_to_set': 'Κλικ για ορισμό', 'schedule.free': 'ελεύθερα', 'schedule.busy_count': 'απασχολημένα', 'schedule.free_days': 'ελεύθερες ημέρες', 'schedule.googleCalendar': 'Google Calendar', 'schedule.connectGoogle': 'Σύνδεση με Google Calendar', 'schedule.disconnectGoogle': 'Αποσύνδεση', 'schedule.connectedAs': 'Συνδεδεμένο ως', 'schedule.importFromGoogle': 'Συγχρονισμός από Google', 'schedule.gcalConnected': '✓ Google Calendar συνδέθηκε', 'schedule.gcalError': 'Σφάλμα σύνδεσης Google Calendar', 'schedule.gcalImportDone': 'Εισήχθησαν {n} ημερ. από Google Calendar', 'schedule.gcalAutoSyncNote': 'Οι αλλαγές αποστέλλονται αυτόματα στο Google Calendar', 'schedule.gcalConnectDesc': 'Συνδέστε το Google Calendar για αυτόματο συγχρονισμό', 'schedule.gcalDisconnectConfirm': 'Αποσύνδεση Google Calendar;', 'find_tasks.title': 'Αναζήτηση εργασιών', 'find_tasks.for_me': 'Για μένα', 'find_tasks.all': 'Όλες οι εργασίες', 'find_tasks.by_category': 'Ανά κατηγορία', 'find_tasks.list': 'Λίστα', 'find_tasks.already_offered': 'Προσφορά υποβλήθηκε', 'find_tasks.offer_now': 'Υποβολή προσφοράς', 'find_tasks.empty_for_me': 'Δεν βρέθηκαν εργασίες στις κατηγορίες σας', 'find_tasks.banner_hint': 'Βρείτε εργασίες που ταιριάζουν με το χαρτοφυλάκιό σας', 'find_tasks.no_cards': 'Δημιουργήστε ένα χαρτοφυλάκιο ειδικού για να δείτε εργασίες για εσάς', 'find_tasks.add_card': 'Δημιουργία χαρτοφυλακίου', 'find_tasks.search': 'Αναζήτηση εργασιών...', 'find_tasks.tasks_count': 'εργασίες', // Footer 'footer.tagline': 'Η πλατφόρμα εργασιών για την Ελλάδα', 'footer.rights': 'Όλα τα δικαιώματα διατηρούνται.', // App download section 'app.download_title': 'Κατεβάστε την εφαρμογή CanHelp', 'app.download_desc': 'Όλο το CanHelp — πάντα μαζί σας. Διαθέσιμο για Android και iOS.', // Nav 'nav.pricing': 'Τιμές', // Pricing page 'pricing.title': 'Τιμολόγηση', 'pricing.subtitle': 'Επιλέξτε το κατάλληλο πρόγραμμα', 'pricing.role.customer': 'Πελάτης', 'pricing.role.specialist': 'Ειδικός', 'pricing.free': 'Δωρεάν', 'pricing.per_month': 'μήνα', 'pricing.duration': 'Διάρκεια', 'pricing.days': 'ημ.', 'pricing.current_plan': 'Το πρόγραμμά σας', 'pricing.popular': 'Δημοφιλές', 'pricing.choose': 'Επιλογή', 'pricing.your_plan': 'Ενεργό πρόγραμμα', 'pricing.free_default': 'Προεπιλογή', 'pricing.compare': 'Σύγκριση λειτουργιών', 'pricing.feature': 'Λειτουργία', 'pricing.faq_note': 'Η πληρωμή γίνεται από το υπόλοιπο CanHelp. Ανατροφοδότηση διαθέσιμη στην Πληρωμή.', 'pricing.feat.messages': 'Μηνύματα / ημέρα', 'pricing.feat.orders': 'Παραγγελίες / ημέρα', 'pricing.feat.contact_all': 'Επικοινωνία με όλους', 'pricing.feat.view_phone': 'Εμφάνιση τηλεφώνου', 'pricing.feat.show_contact': 'Εμφάνιση στοιχείων επαφής', 'pricing.feat.favorites': 'Αγαπημένα', 'pricing.feat.verified_badge': 'Επαληθευμένο badge', 'pricing.feat.google_calendar': 'Google Calendar', 'pricing.feat.personal_site': 'Προσωπικό site', 'pricing.feat.auto_response': 'Αυτόματη απάντηση', 'pricing.feat.auto_match': 'Αυτόματη αντιστοίχιση', 'pricing.feat.highlighted_reviews': 'Επισημασμένες αξιολογήσεις', 'pricing.feat.portfolio': 'Στοιχεία χαρτοφυλακίου', 'pricing.feat.cards': 'Κάρτες ειδικού', 'pricing.feat.notify_tasks': 'Ειδοποιήσεις νέων εργασιών', 'pricing.feat.video': 'Βίντεο στο χαρτοφυλάκιο', // Upgrade prompt 'upgrade.available_in': 'Διαθέσιμο στο', 'upgrade.cta': 'Αναβάθμιση', // Dashboard plan block 'dashboard.plan.title': 'Το πρόγραμμά μου', 'dashboard.plan.expires': 'Λήγει σε {n} ημέρες', 'dashboard.plan.upgrade': 'Αναβάθμιση προγράμματος', 'dashboard.plan.no_plan': 'Δωρεάν πρόγραμμα', 'dashboard.plan.messages': 'Μηνύματα σήμερα', 'dashboard.plan.orders': 'Παραγγελίες σήμερα', 'dashboard.plan.limits': 'Ημερήσια όρια', 'dashboard.plan.features': 'Λειτουργίες', 'dashboard.plan.stats': 'Στατιστικά', 'dashboard.stats.cards': 'Χαρτοφυλάκια', 'dashboard.stats.maxCards': 'Μέγ. χαρτοφυλάκια', 'dashboard.stats.portfolioItems': 'Στοιχεία portfolio', 'dashboard.stats.maxPortfolioItems': 'Μέγ. στοιχεία', 'dashboard.stats.activeOffers': 'Ενεργές προσφορές', 'dashboard.stats.reviewsReceived': 'Αξιολογήσεις', 'dashboard.stats.activeTasks': 'Ενεργές εργασίες', 'dashboard.stats.completedTasks': 'Ολοκληρωμένες', 'status.can_help_now': 'Είμαι διαθέσιμος τώρα', 'status.need_help': 'Χρειάζομαι βοήθεια', 'status.active': 'Ενεργό', 'status.toggle_on': 'Ενεργοποίηση', 'status.toggle_off': 'Απενεργοποίηση', // FOMO 'fomo.missed_orders': 'Χάσατε {n} παραγγελίες', 'fomo.missed_value': 'Αξία €{v}', 'fomo.upgrade_hint': 'Αναβαθμίστε για να λαμβάνετε περισσότερες παραγγελίες', 'fomo.conversion': 'Μετατροπές εργασιών', 'fomo.active': 'Ενεργές', 'fomo.with_offers': 'Με προσφορές', 'fomo.completed': 'Ολοκληρωμένες', 'fomo.already_offered': '{n} ειδικοί έχουν ήδη απαντήσει', 'fomo.specialist_missed': 'Χάσατε {n} παραγγελίες', 'fomo.top_categories': 'Κατηγορίες', 'fomo.offers_received': 'προσφορές ελήφθησαν', 'fomo.avg_offers': 'Μέσο {n}/εργασία', 'fomo.completion_rate': 'ολοκληρωμένες', // Task auto-match 'task.auto_match': 'Αυτόματη αντιστοίχιση', 'task.auto_match_results': 'Κορυφαίοι ειδικοί', 'task.no_offer_yet': 'Δεν έχετε στείλει προσφορά ακόμα', 'task.make_offer': 'Αποστολή προσφοράς', 'auto_response.title': 'Αυτόματη Απάντηση', 'auto_response.enabled': 'Ενεργοποίηση αυτόματης απάντησης', 'auto_response.min_budget': 'Ελάχ. προϋπολογισμός', 'auto_response.max_budget': 'Μέγ. προϋπολογισμός', 'auto_response.default_price': 'Προεπιλεγμένη τιμή', 'auto_response.default_message': 'Προεπιλεγμένο μήνυμα', 'auto_response.max_per_day': 'Μέγ. αυτόματες προσφορές/ημέρα', 'auto_response.save': 'Αποθήκευση', 'auto_response.saved': 'Αποθηκεύτηκε', 'auto_response.categories': 'Κατηγορίες', 'auto_response.locations': 'Τοποθεσίες', // Personal site 'profile.personal_site': 'Προσωπικό Site', 'profile.site_slug': 'Slug URL', 'profile.site_slug_hint': 'Μόνο λατινικοί χαρακτήρες, αριθμοί, - και _', 'profile.site_open': 'Άνοιγμα site', 'profile.site_preview': 'Το site σας', 'profile.show_contact': 'Εμφάνιση στοιχείων επαφής', 'profile.show_contact_hint': 'Πελάτες με Pro/Ultimate πρόγραμμα θα βλέπουν το τηλέφωνό σας', // Google Calendar plan gate 'gcal.upgrade_required': 'Το Google Calendar απαιτεί Pro ή Ultimate πρόγραμμα', // Chat limits 'chat.limit_warning': 'Απομένουν {n} μηνύματα σήμερα', 'chat.limit_reached': 'Εξαντλήθηκαν τα μηνύματα. Αναβαθμίστε το πρόγραμμά σας', 'chat.upgrade': 'Αναβάθμιση', // Site page 'site.member_since': 'Μαζί μας από', 'site.rating': 'Βαθμολογία', 'site.completed_tasks': 'Ολοκληρώθηκαν', 'site.languages': 'Γλώσσες', 'site.photos': 'φωτ.', 'site.contact_form': 'Επικοινωνία', 'site.contact_sent': 'Το μήνυμα στάλθηκε!', 'site.contact_sent_desc': 'Ο ειδικός θα επικοινωνήσει μαζί σας σύντομα', 'site.contact_name': 'Όνομα', 'site.contact_name_ph': 'Το όνομά σας', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Μήνυμα', 'site.contact_message_ph': 'Περιγράψτε την εργασία σας...', 'site.contact_send': 'Αποστολή', 'site.share': 'Κοινοποίηση', 'site.speaks_languages': 'Μιλάει', 'site.message_sent': 'Το μήνυμα εστάλη!', 'site.message_sent_desc': 'Ο ειδικός θα το λάβει στη συνομιλία', 'site.message_placeholder': 'Γράψτε το μήνυμά σας...', 'site.write_to_chat': 'Γράψτε στο chat', 'site.auth_required_title': 'Απαιτείται σύνδεση', 'site.auth_required_desc': 'Για να γράψετε στο chat, χρειάζεται να συνδεθείτε στο λογαριασμό σας.', 'site.auth_login_btn': 'Σύνδεση', 'site.auth_contact_form_btn': 'Επικοινωνία μέσω φόρμας', 'specialist.services': 'Υπηρεσίες', 'portfolio.title': 'Χαρτοφυλάκιο', 'common.not_found': 'Η σελίδα δεν βρέθηκε', 'common.anonymous': 'Ανώνυμα' }, en: { 'footer.slogan': 'Your task — our care! We solve any issue quickly and easily.', 'footer.links': 'Links', 'footer.socials': 'Socials', 'nav.home': 'Home', 'nav.tasks': 'Tasks', 'nav.post': '+ Post task', 'nav.dashboard': 'Dashboard', 'nav.chat': 'Messages', 'nav.notifications': 'Notifications', 'nav.profile': 'Profile', 'nav.admin': 'Admin Panel', 'nav.specialists': 'Specialists', 'nav.new_task': 'New task', 'nav.login': 'Login', 'nav.register': 'Register', 'nav.logout': 'Logout', 'hero.title': 'Find a specialist for any job', 'hero.subtitle': 'Post a task, receive offers and choose the best professional', 'hero.cta.post': 'Post a task', 'hero.cta.browse': 'Find work', 'hero.search.placeholder': 'What do you need? e.g. electrician, cleaning...', 'stats.specialists': 'specialists', 'stats.tasks': 'tasks', 'stats.categories': 'categories', 'stats.free': 'free sign-up', 'section.categories': 'Create a task in any category', 'section.how': 'How it works', 'section.recent': 'Recent tasks', 'section.all': 'See all →', 'section.more': 'more', 'section.cities': 'Cities & Districts', 'section.community': 'A community project for everyone', 'community.subtitle': 'CanHelp is not just a marketplace — it\'s a community of mutual help. Anyone with knowledge or a skill can find a client. Anyone with a problem can find a specialist.', 'community.point1.title': 'Are you good at something?', 'community.point1.desc': 'Repairs, tutoring, design, translation, care — every skill has value. Create a profile and find clients near you.', 'community.point2.title': 'Need help with something?', 'community.point2.desc': 'Post a task in under a minute and receive offers from verified specialists in your city.', 'community.point3.title': 'Help the project grow', 'community.point3.desc': 'CanHelp grows through communities. Share the link with friends and acquaintances — together we build something useful for everyone.', 'community.share': 'Share with friends', 'community.share.copied': 'Link copied!', // Referral section on home page 'section.referral': 'Referral Program', 'referral.home.subtitle': 'Share your link — every new user who signs up through it earns you a reward.', 'referral.home.step1.title': 'Sign up and get your link', 'referral.home.step1.desc': 'Create an account and find your unique referral link in your profile.', 'referral.home.step2.title': 'Share with friends', 'referral.home.step2.desc': 'Send the link to friends, acquaintances, or post it on social media.', 'referral.home.step3.title': 'Earn rewards', 'referral.home.step3.desc': 'Once your friend verifies their email, you automatically receive your reward.', 'referral.home.cta': 'Get your link', 'referral.home.badge': 'Referral Program', // FAQ section 'section.faq': 'Frequently Asked Questions', 'faq.q1': 'How does CanHelp work?', 'faq.a1': 'Post a task, receive offers from specialists, choose the best one and start working together. It\'s fast, simple and free for customers.', 'faq.q2': 'How much does it cost to use the platform?', 'faq.a2': 'Registration and task posting is completely free for customers. Specialists have access to a free plan as well as premium options.', 'faq.q3': 'How can I become a specialist?', 'faq.a3': 'Register, go to «Become a Specialist», fill in your profile with skills and categories, and start receiving tasks.', 'faq.q4': 'How do I choose the right specialist?', 'faq.a4': 'Check their reviews, experience, skills and portfolio. Chat with them through the platform and discuss the details before deciding.', 'faq.q5': 'What if I am not satisfied?', 'faq.a5': 'You can leave a review about the specialist and rate them from 1 to 5 stars. Reviews help other users find trusted professionals.', 'faq.q6': 'Can I contact a specialist before accepting their offer?', 'faq.a6': 'Yes. Once you receive an offer, you can open a chat with the specialist, ask questions and discuss all the details before making a decision.', 'faq.q7': 'How long does it take to receive offers?', 'faq.a7': 'Usually within a few hours. Specialists get notified about new tasks and can respond quickly.', 'faq.q8': 'Can I post a task in any city in Greece?', 'faq.a8': 'Yes! CanHelp covers all of Greece — Athens, Thessaloniki, Patras and more.', 'faq.q9': 'What types of tasks can I find on CanHelp?', 'faq.a9': 'Repairs, cleaning, electricians, tutoring, design, IT, moving, beauty and much more. Categories are constantly expanding.', 'faq.q10': 'Is there a mobile app?', 'faq.a10': 'Yes! CanHelp is available for Android and iOS. Download the app and manage everything from your phone.', 'how.step1.title': 'Post a task', 'how.step1.desc': 'Describe what you need and set your budget', 'how.step2.title': 'Receive offers', 'how.step2.desc': 'Specialists will send you offers with price and timeline', 'how.step3.title': 'Choose & start', 'how.step3.desc': 'Pick the best professional and start the collaboration', 'tasks.title': 'tasks', 'tasks.filters': 'Filters', 'tasks.search': 'Search', 'tasks.search.placeholder': 'Title or keyword...', 'tasks.search.btn': 'Search', 'tasks.publish': 'Post', 'tasks.category.all': 'All', 'tasks.category.all_in': 'All in', 'tasks.category.label': 'Category', 'tasks.location.label': 'City', 'tasks.location.placeholder': 'e.g. Athens', 'tasks.empty': 'No tasks found', 'tasks.empty.cta': 'Post the first one', 'task.status.open': 'Open', 'task.status.in_progress': 'In progress', 'task.status.completed': 'Completed', 'task.status.cancelled': 'Cancelled', 'task.status.draft': 'Draft', 'task.budget': 'Budget', 'task.location': 'Location', 'task.deadline': 'Start date', 'task.created_at': 'Created', 'task.customer': 'Customer', 'task.offer.btn': 'Submit offer', 'task.invite.banner_title': "You've been invited to this task", 'task.invite.banner_hint': 'The customer personally invited you', 'task.invite.accept': 'Send offer', 'task.invite.decline': 'Decline', 'offer.accept': 'Accept', 'offer.decline': 'Decline', 'task.complete': 'Complete task', 'task.complete.confirm': 'Mark this task as complete?', 'task.edit': 'Edit', 'task.status_label': 'Status', 'task.yours': 'Your task', 'task.offer.yours': 'Your offer', 'review.leave': 'Leave a review', 'review.rating': 'Rating', 'review.comment': 'Comment', 'review.comment.placeholder': 'Tell us about your experience...', 'review.submit': 'Submit review', 'review.submitting': 'Submitting...', 'review.done': 'Review submitted!', 'profile.reviews': 'Reviews', 'profile.no_reviews': 'No reviews yet', 'profile.rating': 'Rating', 'profile.skills.label': 'Skills', 'profile.member_since': 'Member since', 'task.offers': 'Offers', 'task.offers.none': 'No offers yet', 'create.title': 'Post a task', 'create.field.title': 'Title', 'create.field.description': 'Description', 'create.field.category': 'Category', 'create.field.category.select': 'Select...', 'create.field.location': 'Location', 'create.field.location.any': 'Anywhere', 'create.field.location.all': 'Entire city', 'create.field.budget': 'Budget (€)', 'create.field.deadline': 'Start date', 'create.field.budget_negotiable': 'Price is negotiable', 'create.field.time_slot': 'Time slot', 'create.field.time_slot.any': 'Anytime', 'create.field.time_slot.morning': 'Morning (08:00–13:00)', 'create.field.time_slot.afternoon': 'Afternoon (13:00–18:00)', 'create.field.time_slot.evening': 'Evening (18:00–22:00)', 'create.field.time_slot.weekend': 'Weekend', 'create.field.address': 'Address (optional)', 'create.field.address.district': 'District', 'create.field.address.street': 'Street', 'create.field.address.house': 'Number', 'create.field.confidential': 'Confidential note', 'create.field.confidential.placeholder': 'Details visible only to the assigned specialist...', 'create.field.confidential.hint': 'Not shown publicly', 'create.field.photos': 'Photos', 'create.field.photos.add': 'Add photo', 'create.field.photos.uploading': 'Uploading...', 'task.budget_negotiable': 'Price negotiable', 'task.time_slot': 'Time slot', 'task.confidential': 'Confidential note', 'create.field.title.placeholder': 'e.g. Clean 80sqm apartment', 'create.field.description.placeholder': 'Describe in detail what you need...', 'create.field.location.placeholder': 'e.g. Athens, Kolonaki', 'create.field.budget.placeholder': 'e.g. 100', 'create.submit': 'Post task', 'create.submitting': 'Posting...', 'login.title': 'Welcome back', 'login.subtitle': 'Sign in to CanHelp', 'login.email': 'Email', 'login.password': 'Password', 'login.submit': 'Sign in', 'login.submitting': 'Signing in...', 'login.error': 'Invalid email or password', 'login.unverified.title': 'Verify your email address', 'login.unverified.desc': 'We sent a verification link to your email. Check your inbox (or spam) and click the link.', 'login.unverified.resend': 'Resend verification email', 'login.unverified.sending': 'Sending...', 'login.unverified.sent': '✓ Sent — check your inbox', 'profile.email.verified': 'Email verified', 'profile.email.not_verified': 'Email not verified', 'login.no_account': "Don't have an account?", 'login.register_link': 'Register', 'login.forgot_password': 'Forgot password?', 'login.or_continue_with': 'or continue with', 'login.continue_google': 'Continue with Google', 'forgot.title': 'Forgot password', 'forgot.subtitle': 'Enter your email to receive a reset link', 'forgot.email': 'Email', 'forgot.submit': 'Send reset link', 'forgot.submitting': 'Sending...', 'forgot.sent.title': 'Check your inbox', 'forgot.sent.desc': 'If an account exists with that email, we\'ll send you a password reset link.', 'forgot.back_to_login': 'Back to sign in', 'forgot.error': 'Could not send reset link. Check the email address and try again.', 'forgot.error.not_found': 'No account found with this email address.', 'forgot.error.send_failed': 'Failed to send email. Please try again later.', 'reset.title': 'New password', 'reset.subtitle': 'Enter your new password', 'reset.password': 'New password', 'reset.confirm': 'Confirm password', 'reset.submit': 'Change password', 'reset.submitting': 'Saving...', 'reset.success': 'Password changed successfully. Redirecting to sign in...', 'reset.back_to_login': 'Back to sign in', 'reset.error.mismatch': 'Passwords do not match', 'reset.error.invalid': 'Invalid or expired link. Please request a new one.', 'register.title': 'Register', 'register.subtitle': 'Create a CanHelp account', 'register.first_name': 'First name', 'register.last_name': 'Last name', 'register.email': 'Email', 'register.password': 'Password (min 8 characters)', 'register.role': 'Role', 'register.role.customer': 'User', 'register.role.customer.desc': 'I post tasks', 'register.role.specialist': 'Specialist', 'register.role.specialist.desc': 'I take on tasks', 'register.submit': 'Create account', 'register.submitting': 'Registering...', 'register.has_account': 'Already have an account?', 'register.login_link': 'Sign in', 'register.continue_google': 'Continue with Google', 'register.check_email.title': 'Check your email', 'register.check_email.desc': 'We sent a verification link to your email address. Check your inbox (or spam) and click the link.', 'register.check_email.login': 'Back to sign in', 'dashboard.title': 'Dashboard', 'dashboard.new_task': '+ New task', 'dashboard.my_tasks': 'My tasks', 'dashboard.my_offers': 'My offers', 'dashboard.invitations': 'Job invitations', 'dashboard.offers_count': 'offers', 'dashboard.declined_count': 'declined', 'dashboard.completed_tasks': 'Completed tasks', 'dashboard.completed_offers': 'Completed offers', 'dashboard.review_pending': 'Review not yet submitted', 'tasks.new.top_specialists': 'Top specialists', 'tasks.new.select_category': 'Select a category to see matching specialists', 'tasks.new.invite': 'Offer work', 'tasks.new.invited': 'Selected ✓', 'reviews.count': 'reviews', 'filter.location': 'Location', 'filter.language': 'Languages', 'filter.language.any': 'Any language', 'filter.category.all': 'All categories', 'user.categories': 'Categories', 'user.work_area': 'Work area', 'dashboard.tasks.empty': "You haven't posted any tasks", 'dashboard.tasks.empty.cta': 'Post your first one', 'dashboard.tasks.add_new': 'Add a new task', 'dashboard.offers.empty': "You haven't submitted any offers", 'dashboard.offers.empty.cta': 'Find tasks', 'dashboard.customer.specialists_title': 'Looking for a specialist?', 'dashboard.customer.specialists_hint': 'Browse specialist profiles, read reviews and invite them to your tasks', 'dashboard.customer.specialists_cta': 'Find a specialist', 'dashboard.customer.how_title': 'How it works', 'dashboard.customer.step1': 'Create a task with a description and budget', 'dashboard.customer.step2': 'Specialists will send offers with price and timeline', 'dashboard.customer.step3': 'Choose the right one and start working', 'notif.title': 'Notifications', 'notif.mark_all': 'Mark all as read', 'notif.empty': 'No notifications', 'notif.type.new_offer': 'New offer', 'notif.type.offer_accepted': 'Your offer was accepted', 'notif.type.offer_declined': 'Your offer was declined', 'notif.type.task_completed': 'Task completed', 'notif.type.task_cancelled': 'Task cancelled', 'notif.type.new_message': 'New message', 'notif.type.new_review': 'New review', 'notif.type.task_invite': 'Job invitation', 'notif.body.new_offer': 'New offer for «{title}»', 'notif.body.offer_accepted': 'Your offer for «{title}» was accepted', 'notif.body.offer_declined': 'Your offer for «{title}» was declined', 'notif.body.task_invite': 'You\'ve been invited for «{title}»', 'notif.body.new_review': 'You received a {rating}★ review', 'offer.status.pending': 'Pending', 'offer.status.accepted': 'Accepted', 'offer.status.declined': 'Declined', 'offer.status.withdrawn': 'Withdrawn', 'offer.status.other_accepted': 'Another specialist was chosen', 'common.loading': 'Loading...', 'common.error': 'Error', 'common.save': 'Save', 'common.saving': 'Saving...', 'common.cancel': 'Cancel', 'common.add': 'Add', 'common.close': 'Close', 'common.edit': 'Edit', 'common.delete': 'Delete', 'common.from': 'by', 'common.currency': '€', 'common.greece': 'Greece', // Chat 'chat.connected': 'Connected', 'chat.disconnected': 'Disconnected', 'chat.no_rooms': 'No conversations yet', 'chat.task_fallback': 'Task', 'chat.select': 'Select a conversation', 'chat.no_messages': 'No messages yet', 'chat.placeholder': 'Write a message... (Enter to send)', 'chat.conversation_fallback': 'Conversation', 'chat.direct_chat': 'Direct chat', 'chat.linked_task': 'Linked task', 'chat.write_btn': 'Message', 'chat.just_now': 'just now', 'chat.min_ago': 'm', 'chat.write_specialist': 'Write to specialist', 'chat.write_customer': 'Write to customer', 'chat.notif_settings': 'Notification settings', 'chat.notif_messages': 'Notifications for new messages', 'chat.toast_title': 'New message', 'chat.toast_open': 'Open chat', // Offer form 'offer.price': 'Price', 'offer.price.placeholder': 'e.g. 80', 'offer.customer_budget': 'Client budget', 'offer.message': 'Message', 'offer.optional': 'optional', 'offer.message.placeholder': 'Introduce yourself, your experience and why you are the best choice...', 'offer.submitting': 'Sending...', // Profile 'profile.photo': 'Profile photo', 'profile.photo.change': 'Change photo', 'profile.photo.hint': 'JPEG, PNG, WebP · up to 5MB', 'profile.basic_info': 'Basic info', 'profile.phone': 'Phone', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Short bio', 'profile.bio.placeholder': 'Tell us a bit about yourself...', 'profile.language': 'Language', 'profile.language.hint': 'App interface and email notification language', 'profile.languages': 'Languages spoken', 'profile.languages.hint': 'Select all languages you speak', 'profile.skills': 'Skills', 'profile.skills.subtitle': 'Add the services you offer', 'profile.skills.placeholder': 'e.g. Cleaning, IT, Tutoring...', 'profile.role': 'Account role', 'profile.role.specialist': '🔧 Specialist', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 User', 'profile.role.change': 'To change your role please contact support.', 'profile.become_specialist': 'Become a Specialist', 'profile.become_specialist.desc': 'Upgrade to Specialist to take on tasks and build your profile.', 'become_specialist.hero.title': 'Earn money doing what you do best', 'become_specialist.hero.subtitle': 'Create a specialist profile and receive orders from clients across Greece', 'become_specialist.how.title': 'How it works', 'become_specialist.step1.title': 'Create a specialist portfolio', 'become_specialist.step1.desc': 'Set your categories, skills and coverage areas — the system will automatically match you with relevant tasks', 'become_specialist.step2.title': 'Find tasks', 'become_specialist.step2.desc': 'Discover tasks in your categories in the "Find Orders" section', 'become_specialist.step3.title': 'Send an offer & earn', 'become_specialist.step3.desc': 'Submit offers with price and timeline, chat with clients and complete tasks', 'become_specialist.benefits.title': 'Specialist profile advantages', 'become_specialist.benefit1': 'Task search filtered by your categories and location', 'become_specialist.benefit2': 'Public profile with client reviews', 'become_specialist.benefit3': 'Availability schedule visible to clients', 'become_specialist.benefit4': 'Saved to favourites by clients', 'become_specialist.cta': 'Become a Specialist — it\'s free', 'become_specialist.free_badge': 'Free registration', 'profile.tab.notifications': 'Notifications', 'profile.tab.reviews': 'Reviews', 'profile.tab.referral': 'Referrals', 'profile.tab.auto_response': 'Auto-response', 'profile.tab.site': 'Site', 'profile.site.title': 'Personal page', 'profile.site.url_label': 'Personal site', 'profile.site.copy': 'Copy', 'profile.site.copied': 'Copied', 'profile.site.visible_title': "What's on your page", 'profile.site.visible.name': 'Name and photo', 'profile.site.visible.bio': 'Bio', 'profile.site.visible.rating': 'Rating and reviews', 'profile.site.visible.portfolio': 'Portfolio / Cards', 'profile.site.visible.contacts': 'Contact info', 'profile.site.visible.full_last_name': 'Full last name', 'profile.site.visible.services': 'Service cards', 'profile.site.visible.reviews': 'Reviews section', 'profile.site.visible.status': '"Ready to help" status', 'profile.site.theme': 'Appearance theme', 'profile.site.theme.dark': 'Dark', 'profile.site.theme.light': 'Light', 'profile.site.slug_taken': 'This address is already taken', 'profile.site.stats.title': 'Site analytics', 'profile.site.stats.days': 'last 30 days', 'profile.site.stats.views': 'Views', 'profile.site.stats.unique': 'Unique visitors', 'profile.site.stats.messages': 'Messages', 'profile.site.stats.total_views': 'Total views', 'profile.site.stats.total_unique': 'Unique visitors', 'profile.site.stats.total_messages': 'Messages', 'profile.site.stats.empty': 'No data yet', 'profile.site.stats.loading': 'Loading analytics...', 'profile.site.stats.no_slug': 'Set your site URL to see analytics', 'profile.site.edit_bio_hint': 'Bio and photo are edited in the "Basic info" tab.', 'status.title': 'Status', 'status.can_help_now_hint': 'Your card is shown higher in search', 'status.need_help_hint': 'Specialists can offer you help', 'profile.referral.title': 'Referral program', 'profile.referral.desc': 'Share your link and earn rewards for every new user you invite.', 'profile.referral.link_label': 'Your referral link', 'profile.referral.copy': 'Copy', 'profile.referral.copied': 'Copied!', 'profile.referral.invited_count': 'successful referrals', 'profile.referral.no_code': 'Referral code is not available.', 'notifications.title': 'Notification settings', 'notifications.email.new_tasks': 'Email for new tasks', 'notifications.email.new_tasks.desc': 'Receive an email when a new task is posted in your categories', 'notifications.messages.desc': 'Receive a notification when a new message arrives', 'notifications.saved': 'Settings saved', 'notifications.plan_required': 'Not available in your plan', 'profile.tab.info': 'Basic info', 'profile.tab.finance': 'Finance', 'profile.tab.skills': 'Skills', 'profile.tab.categories': 'Categories', 'profile.tab.geography': 'Geography', 'profile.specialist.categories': 'Work categories', 'profile.specialist.categories.desc': 'Select the categories you work in', 'profile.specialist.geography': 'Coverage areas', 'profile.specialist.geography.desc': 'Select the cities / districts where you are active', 'profile.saving': 'Saving...', 'profile.upload.error': 'Error uploading photo', 'profile.saved': 'Saved', 'profile.tab.cards': 'Portfolio', 'profile.cards.count': 'Portfolio', 'profile.cards.add': 'Add portfolio', 'profile.cards.new_title': 'New portfolio title', 'profile.cards.placeholder': 'e.g. Plumbing', 'profile.cards.create': 'Create', 'profile.cards.cancel': 'Cancel', 'profile.cards.empty': 'No portfolio yet', 'profile.cards.create_first': 'Create your first portfolio', 'profile.cards.delete_confirm': 'Delete portfolio?', 'profile.card.tab.main': 'General', 'profile.card.tab.skills': 'Skills', 'profile.card.tab.categories': 'Categories', 'profile.card.tab.geography': 'Geography', 'profile.card.tab.portfolio': 'Portfolio', 'profile.card.active': 'Active', 'profile.card.save': 'Save', 'profile.card.saved': 'Saved', 'profile.card.delete': 'Delete', 'profile.card.skill.add': 'Add skill', 'profile.card.photo.add': 'Add photo', 'profile.card.photo.uploading': 'Uploading...', 'profile.card.photo.empty': 'No photos yet', 'profile.card.item.title': 'Title', 'profile.card.item.desc': 'Description', 'profile.card.item.save': 'Save', 'profile.card.item.cancel': 'Cancel', 'profile.card.item.edit': 'Edit', 'profile.upgrade.cards_limit': 'Portfolio limit reached', 'profile.upgrade.plan': 'Current plan:', 'profile.upgrade.contact': 'Contact the administrator to change your plan', 'profile.upgrade.ok': 'Got it', 'profile.plan.title': 'Subscription plan', 'profile.balance': 'Balance', 'profile.balance.topup': 'Top Up Balance', 'profile.balance.topup.title': 'Top Up Balance', 'profile.balance.topup.amount': 'Amount (EUR)', 'profile.balance.topup.hint': 'Choose a preset or enter a custom amount', 'profile.balance.topup.submit': 'Proceed to Payment', 'profile.balance.topup.loading': 'Redirecting...', 'profile.balance.topup.error': 'Payment initiation failed. Please try again.', 'payment.success.title': 'Payment Successful!', 'payment.success.desc': 'Your balance has been updated.', 'payment.cancelled.title': 'Payment Cancelled', 'payment.cancelled.desc': 'Payment was cancelled. No charges were made.', 'payment.pending.title': 'Processing...', 'payment.pending.desc': 'Your payment is being processed.', 'payment.back_to_profile': 'Back to Profile', 'profile.plan.basic': 'Basic (free)', 'profile.plan.contact_upgrade': 'Contact admin to upgrade your plan', 'profile.plan.cards_up_to': 'Portfolio: up to', 'profile.plan.cards_unlimited': 'Portfolio: unlimited', 'profile.plan.tasks_up_to': 'Tasks: up to', 'profile.plan.offers_up_to': 'Offers: up to', 'profile.plan.valid_until': 'Valid until', 'profile.plan.no_expiry': 'No expiry', // Create task 'create.error': 'Error posting task', // Tasks list extras 'tasks.category.general': 'General', 'tasks.budget.range': 'Range:', 'tasks.budget.from': 'from', 'tasks.budget.to': 'to', 'tasks.filter.reset': 'Reset filters', 'tasks.load_more': 'Load more', 'tasks.showing': 'Results:', 'tasks.field.budget': 'Budget, €', // Admin 'admin.title': 'Admin Panel', 'admin.tab.stats': 'Statistics', 'admin.tab.users': 'Users', 'admin.tab.tasks': 'Tasks', 'admin.tab.reports': 'Reports', 'admin.stats.users': 'Users', 'admin.stats.tasks': 'Tasks', 'admin.stats.offers': 'Offers', 'admin.stats.reviews': 'Reviews', 'admin.tasks.by_status': 'Tasks by status', 'admin.col.user': 'User', 'admin.col.email': 'Email', 'admin.col.role': 'Role', 'admin.col.registered': 'Registered', 'admin.col.status': 'Status', 'admin.col.title': 'Title', 'admin.col.budget': 'Budget', 'admin.col.created': 'Created', 'admin.users.active': 'Active', 'admin.users.inactive': 'Inactive', 'admin.users.deactivate': 'Deactivate', 'admin.users.activate': 'Activate', 'admin.tasks.cancel': 'Cancel', 'admin.reports.none': 'No reports', 'admin.reports.reviewed': 'Reviewed', 'admin.reports.dismiss': 'Dismiss', 'admin.pagination.total': 'Total', 'admin.users.role.change': 'Change role', 'admin.users.search.placeholder': 'Search name or email...', 'admin.tasks.delete': 'Delete', 'admin.tasks.delete.confirm': 'Permanently delete this task?', 'admin.tasks.search.placeholder': 'Search title...', 'admin.col.customer': 'Customer', 'admin.col.reporter': 'Reporter', 'admin.col.target': 'Target', 'admin.filter.all_roles': 'All roles', 'admin.filter.all_statuses': 'All statuses', 'admin.reports.target.task': 'Task', 'admin.reports.target.user': 'User', 'admin.tab.categories': 'Categories', 'admin.tab.locations': 'Cities & Districts', 'admin.tab.logs': 'Logs', 'admin.tab.plans': 'Plans', 'admin.tab.settings': 'Settings', 'admin.logs.subtab.ai': 'AI Logs', 'admin.logs.subtab.activity': 'Activity', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Notifications', 'admin.notif_logs.type': 'Type', 'admin.notif_logs.title': 'Title', 'admin.notif_logs.read': 'Read', 'admin.notif_logs.empty': 'No notification logs', 'admin.stats.notif_chart_title': 'Notifications per day', 'admin.stats.notif_label': 'Notifications', 'admin.stats.mail_chart_title': 'Emails per day', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'All', 'admin.stats.specialists': 'Specialists', 'admin.col.plan': 'Plan', 'admin.back_home': 'Home', 'admin.plans.title': 'Subscription plans', 'admin.plans.add': '+ New plan', 'admin.plans.empty': 'No plans created', 'admin.plans.form.new': 'New plan', 'admin.plans.form.edit': 'Edit plan', 'admin.plans.form.name': 'Name', 'admin.plans.form.price': 'Price (EUR)', 'admin.plans.form.old_price': 'Old price (EUR, optional)', 'admin.plans.form.max_offers': 'Max offers (empty = no limit)', 'admin.plans.form.max_cards': 'Max portfolio (empty = no limit)', 'admin.plans.form.duration_days': 'Duration (days, empty = no expiry)', 'admin.plans.form.description': 'Description', 'admin.plans.form.features': 'Features (one per line)', 'admin.plans.form.notify': 'Notify about new tasks', 'admin.plans.form.default': 'Default', 'admin.plans.form.active': 'Active', 'admin.plans.form.order': 'Order', 'admin.plans.form.role': 'Role', 'admin.plans.form.tier': 'Tier', 'admin.plans.form.role.customer': 'Customer', 'admin.plans.form.role.specialist': 'Specialist', 'admin.plans.form.tier.free': 'Free', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Limits (empty = unlimited)', 'admin.plans.form.max_messages_day': 'Max Messages/Day', 'admin.plans.form.max_orders_day': 'Max Orders/Day', 'admin.plans.form.max_skills': 'Max Skills', 'admin.plans.form.max_profiles': 'Max Profiles', 'admin.plans.form.max_portfolio': 'Max Portfolio Items', 'admin.plans.form.section.boost': 'Multipliers & Boost', 'admin.plans.form.search_boost': 'Search Boost', 'admin.plans.form.offers_multiplier': 'Offers Multiplier', 'admin.plans.form.section.contact': 'Contact Permissions', 'admin.plans.form.can_contact_free': 'Contact Free Plan users', 'admin.plans.form.can_contact_pro': 'Contact Pro Plan users', 'admin.plans.form.can_contact_all': 'Contact All users', 'admin.plans.form.can_show_contact': 'Show Contact Info', 'admin.plans.form.can_view_phone': 'View Phone', 'admin.plans.form.section.features': 'Feature Flags', 'admin.plans.form.upload_video': 'Upload Video', 'admin.plans.form.favorites': 'Favorites', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Verified Badge', 'admin.plans.form.highlighted_reviews': 'Highlighted Reviews', 'admin.plans.form.personal_site': 'Personal Site', 'admin.plans.form.can_help_now': 'Can Help Now Status', 'admin.plans.form.need_help': 'Need Help Status', 'admin.plans.form.auto_response': 'Auto Response', 'admin.plans.form.auto_match': 'Auto Match', 'admin.plans.form.instant_dispatch_free': 'Instant Dispatch (Free)', 'admin.plans.form.instant_dispatch_pro': 'Instant Dispatch (Pro)', 'admin.plans.badge.default': 'Default', 'admin.plans.badge.inactive': 'Inactive', 'admin.plans.make_default': 'Set as default', 'admin.plans.tasks': 'Tasks', 'admin.plans.offers': 'Offers', 'admin.plans.cards': 'Portfolio', 'admin.plans.notify_tasks': 'Task notifications', 'admin.plans.delete.confirm': 'Delete plan', 'admin.activity.title': 'Activity log', 'admin.activity.event': 'Event', 'admin.activity.all_events': 'All events', 'admin.activity.from': 'From', 'admin.activity.to': 'To', 'admin.activity.reset': 'Reset', 'admin.activity.total': 'Total', 'admin.activity.empty': 'No records', 'admin.mail.event': 'Email event', 'admin.mail.all_events': 'All email events', 'admin.mail.from': 'From', 'admin.mail.to': 'To', 'admin.mail.reset': 'Reset', 'admin.mail.total': 'Total', 'admin.mail.empty': 'No email logs', 'admin.mail.recipient': 'Recipient', 'admin.mail.provider': 'Provider', 'admin.mail.details': 'Details', 'admin.mail.status': 'Status', 'admin.mail.success': 'Success', 'admin.mail.failed': 'Failed', 'admin.event.email_sent': 'Email sent', 'admin.event.email_failed': 'Email failed', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Admin test email sent', 'admin.event.admin_email_test_failed': 'Admin test email failed', 'admin.logs.empty': 'No records', 'admin.logs.date': 'Date', 'admin.logs.provider': 'Provider', 'admin.logs.model': 'Model', 'admin.logs.action': 'Action', 'admin.logs.langs': 'Languages', 'admin.logs.in': 'In', 'admin.logs.out': 'Out', 'admin.logs.total': 'Total', 'admin.logs.ms': 'ms', 'admin.logs.status': 'Status', 'admin.stats.activity_30d': 'Activity over 30 days', 'admin.stats.tasks_label': 'Tasks', 'admin.stats.users_label': 'Users', 'admin.stats.specialists_label': 'Specialists', 'admin.stats.tokens_title': 'Token usage (by month)', 'admin.stats.tokens_out': 'Output', 'admin.stats.tokens_in': 'Input', 'admin.stats.tokens_out_label': 'Output tokens', 'admin.stats.tokens_in_label': 'Input tokens', 'admin.stats.cost_label': 'Cost (USD)', 'admin.stats.tasks_by_status': 'Tasks by status', 'admin.task_status.open': 'Open', 'admin.task_status.in_progress': 'In progress', 'admin.task_status.completed': 'Completed', 'admin.task_status.cancelled': 'Cancelled', 'admin.task_status.draft': 'Drafts', 'admin.settings.tab.general': 'General', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Notifications', 'admin.settings.tab.payment': 'Payment', 'admin.settings.tab.referral': 'Referrals', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO & Maintenance', 'admin.settings.seo.maintenance_label': 'Maintenance Mode', 'admin.settings.seo.maintenance_hint': 'Show a maintenance page to all visitors', 'admin.settings.seo.indexing_label': 'Search Engine Indexing', 'admin.settings.seo.indexing_hint': 'Allow search engines to index the site', 'admin.settings.seo.head_scripts_label': ' Scripts (JS)', 'admin.settings.seo.head_scripts_hint': 'Runs on every page (Google Tag Manager, analytics, etc.)', 'admin.settings.seo.site_title_label': 'Site Title', 'admin.settings.seo.site_description_label': 'Site Description (meta description)', 'admin.settings.referral.title': 'Referral program', 'admin.settings.referral.hint': 'Reward users who bring new registrations.', 'admin.settings.referral.enabled_label': 'Enabled', 'admin.settings.referral.enabled_hint': 'Enable / disable reward application', 'admin.settings.referral.customer_section': 'For customers', 'admin.settings.referral.specialist_section': 'For specialists', 'admin.settings.referral.plan_label': 'Reward plan', 'admin.settings.referral.no_plan': '— no plan —', 'admin.settings.referral.plan_hint': 'This plan will be assigned to the referrer. If their current plan is higher, only days will be added.', 'admin.settings.referral.days_label': 'Reward days', 'admin.settings.referral.days_hint': 'Number of days added to the plan expiry.', 'admin.settings.general.title': 'General settings', 'admin.settings.general.site_name': 'Site name', 'admin.settings.general.site_url': 'Site URL', 'admin.settings.general.contact_email': 'Contact email', 'admin.settings.general.support_phone': 'Support phone', 'admin.settings.smtp.title': 'SMTP settings', 'admin.settings.smtp.hint': 'Used to send email notifications.', 'admin.settings.smtp.host': 'SMTP Host', 'admin.settings.smtp.port': 'Port', 'admin.settings.smtp.encryption': 'Encryption', 'admin.settings.smtp.enc.none': 'None', 'admin.settings.smtp.enc.tls': 'STARTTLS (port 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (port 465)', 'admin.settings.smtp.username': 'Username', 'admin.settings.smtp.password': 'Password / App Password', 'admin.settings.smtp.from_name': 'Sender name', 'admin.settings.smtp.from_email': 'Sender email', 'admin.settings.smtp.test': 'Send test email', 'admin.settings.smtp.sending': 'Sending...', 'admin.settings.payment.hint': 'ePay Piraeus Bank credentials.', 'admin.settings.env.test': 'Test (sandbox)', 'admin.settings.env.prod': 'Production', 'admin.settings.env.label': 'Environment', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Active', 'admin.settings.saving': 'Saving...', 'admin.settings.saved': 'Saved', 'admin.notif.vars_hint': 'Available variables in templates', 'admin.notif.tmpl.not_set': 'Template not configured', 'admin.notif.tmpl.subject_label': 'Email subject', 'admin.notif.tmpl.body_label': 'Email body (HTML)', 'admin.notif.tmpl.save': 'Save', 'admin.notif.tmpl.close': 'Close', 'admin.notif.tmpl.translate': 'Auto-translate to other languages', 'admin.notif.tmpl.translating': 'Translating...', 'admin.notif.tmpl.saving': 'Saving...', 'admin.notif.email_verification': 'Email verification', 'admin.notif.registration_success': 'Successful registration', 'admin.notif.password_reset': 'Password reset', 'admin.notif.new_offer': 'New offer', 'admin.notif.new_task': 'New task', 'admin.notif.offer_accepted': 'Offer accepted', 'admin.notif.new_message': 'New message', 'admin.notif.offer_declined': 'Offer declined', 'admin.notif.offer_other_accepted': 'Another specialist chosen', 'admin.notif.task_updated': 'Task updated', 'admin.notif.deadline_reminder': 'Deadline reminder', 'admin.notif.task_archived': 'Task unpublished automatically', 'admin.notif.referral_reward': 'Referral reward', // Plan lifecycle email templates 'admin.email_template.plan_activated': 'Plan activated', 'admin.email_template.plan_upgraded': 'Plan upgraded', 'admin.email_template.plan_downgrade_scheduled': 'Downgrade scheduled', 'admin.email_template.plan_downgrade_applied': 'Downgrade applied', 'admin.email_template.plan_renewal_reminder': 'Renewal reminder', 'admin.email_template.plan_insufficient_funds': 'Insufficient funds warning', // Pricing confirm modal 'pricing.confirm.title': 'Confirm plan selection', 'pricing.confirm.plan': 'Plan', 'pricing.confirm.prorated': 'Prorated credit', 'pricing.confirm.effective_price': 'Amount due', 'pricing.confirm.your_balance': 'Your balance', 'pricing.confirm.downgrade_info': 'The switch to the new plan will happen automatically after the current period ends.', 'pricing.confirm.insufficient': 'Insufficient balance.', 'pricing.confirm.top_up': 'Top up', 'pricing.confirm.schedule_downgrade': 'Schedule downgrade', 'pricing.confirm.pay': 'Pay', 'admin.user_edit.title': 'Edit user', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Registered', 'admin.user_edit.last_seen': 'Last seen', 'admin.user_edit.lang': 'Language', 'admin.user_edit.first_name': 'First name', 'admin.user_edit.last_name': 'Last name', 'admin.user_edit.phone': 'Phone', 'admin.user_edit.bio': 'Bio', 'admin.user_edit.role': 'Role', 'admin.user_edit.plan': 'Plan', 'admin.user_edit.no_plan': '— No plan —', 'admin.user_edit.active': 'Active account', 'admin.user_edit.balance': 'Balance (EUR)', 'admin.user_edit.skills': 'Skills', 'admin.user_edit.tab.profile': 'Profile', 'admin.user_edit.tab.account': 'Account', 'admin.user_edit.tab.balance': 'Balance', 'admin.user_edit.tab.settings': 'Settings', 'admin.user_edit.tab.specialist': 'Portfolio', 'admin.user_edit.tab.site': 'Website', 'admin.user_edit.plan_expires': 'Plan expires', 'admin.user_edit.interface_lang': 'Interface language', 'admin.user_edit.comm_languages': 'Communication languages', 'admin.user_edit.personal_site_slug': 'Personal page', 'admin.user_edit.show_contact_info': 'Show contact info', 'admin.user_edit.show_contact_info.hint': 'Visible to customers', 'admin.user_edit.notify_new_tasks': 'Notify about new tasks', 'admin.user_edit.notify_new_tasks.hint': 'Push and email notifications', 'admin.user_edit.notif_messages': 'Message notifications', 'admin.user_edit.notif_messages.hint': 'New messages in chat', 'admin.user_edit.site_settings': 'Personal page settings', 'admin.user_edit.categories': 'Service categories', 'admin.user_edit.locations': 'Service areas', 'admin.user_edit.skill_placeholder': 'New skill...', 'admin.user_edit.add_category': '— Select category —', 'admin.user_edit.add_location': '— Select location —', 'admin.user_edit.specialist_cards': 'Portfolio', 'admin.user_edit.no_cards': 'No portfolio found', 'admin.user_edit.card_title': 'Portfolio title', 'admin.user_edit.card_description': 'Description', 'admin.balance.topup.btn': 'Top up', 'admin.balance.withdraw.btn': 'Withdraw', 'admin.balance.modal_hint': 'Changes take effect immediately and are recorded in history', 'admin.balance.topup.title': 'Top up balance', 'admin.balance.topup.amount': 'Amount', 'admin.balance.topup.description': 'Comment', 'admin.balance.topup.description.placeholder': 'For example: bonus or manual top-up', 'admin.balance.topup.submit': 'Top up balance', 'admin.balance.withdraw.title': 'Withdraw balance', 'admin.balance.withdraw.amount': 'Amount', 'admin.balance.withdraw.description': 'Comment', 'admin.balance.withdraw.description.placeholder': 'For example: refund or manual debit', 'admin.balance.withdraw.submit': 'Withdraw from balance', 'admin.user_edit.role.customer': 'Customer', 'admin.user_edit.role.specialist': 'Specialist', 'admin.user_edit.role.admin': 'Administrator', 'common.refresh': 'Refresh', 'common.back_home': 'Home', 'admin.loc.hint': 'Manage cities and districts', 'admin.loc.add_city': 'New city', 'admin.loc.add_district': 'Add district', 'admin.loc.new': 'New location', 'admin.loc.edit': 'Edit location', 'admin.loc.district': 'district', 'admin.loc.empty': 'No locations', 'admin.loc.delete.confirm': 'Delete location? All districts will also be deleted.', 'admin.cat.add_root': 'New category', 'admin.cat.add_sub': 'Subcategory', 'admin.cat.edit': 'Edit', 'admin.cat.delete': 'Delete', 'admin.cat.delete.confirm': 'Delete category? All subcategories will also be deleted.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Icon', 'admin.cat.name_el': 'Greek', 'admin.cat.name_en': 'English', 'admin.cat.name_ru': 'Russian', 'admin.cat.order': 'Order', 'admin.cat.active': 'Active', 'admin.cat.parent': 'Parent category', 'admin.cat.no_parent': 'Top level', 'admin.cat.save': 'Save', 'admin.cat.cancel': 'Cancel', 'admin.cat.empty': 'No categories', 'admin.cat.hint': 'Manage categories with multi-level hierarchy', 'admin.cat.new': 'New category', 'admin.cat.subcategory': 'subcategory', 'admin.cat.add_child': 'Add subcategory', 'admin.cat.inactive': 'Inactive', 'admin.event.user_login': 'Login', 'admin.event.user_register': 'Registration', 'admin.event.admin_user_deactivate': 'User blocked', 'admin.event.admin_user_activate': 'User activated', 'admin.event.admin_user_role_changed': 'Role changed', 'admin.event.admin_task_cancelled': 'Task cancelled', 'admin.event.admin_task_deleted': 'Task deleted', 'admin.event.admin_report_reviewed': 'Report reviewed', 'admin.event.admin_report_dismissed': 'Report dismissed', 'admin.event.task_created': 'Task created', // User status 'user.online': 'Online', 'user.seen_minutes': 'was here {n} min ago', 'user.seen_hours': 'was here {n} hr ago', 'user.seen_yesterday': 'was here yesterday', 'user.seen_days': 'was here {n} days ago', // Specialists 'specialists.title': 'Specialists', 'specialists.search': 'Search specialist...', 'specialists.search.btn': 'Search', 'specialists.empty': 'No specialists found', 'specialists.no_bio': 'No description', 'specialists.view': 'View profile', 'specialists.reviews': 'reviews', 'specialist.favorite': 'Add to favorites', 'specialist.unfavorite': 'Remove from favorites', 'specialist.site_link': 'Personal site', 'favorites.specialists.title': 'Favourite specialists', 'favorites.specialists.empty': 'No favourite specialists yet', 'nav.favorites': 'Favourites', 'nav.schedule': 'Schedule', 'nav.find_tasks': 'Find Orders', 'schedule.title': 'My Schedule', 'schedule.subtitle': 'Mark the days when you are free or busy — clients will see your availability', 'schedule.available': 'Available', 'schedule.busy': 'Busy', 'schedule.unset': 'Not set', 'schedule.click_hint': '← click to cycle status', 'schedule.range_mode': 'Select range', 'schedule.range_from': 'From {date} — select end date', 'schedule.click_to_set': 'Click to set', 'schedule.free': 'free', 'schedule.busy_count': 'busy', 'schedule.free_days': 'free days', 'schedule.googleCalendar': 'Google Calendar', 'schedule.connectGoogle': 'Connect Google Calendar', 'schedule.disconnectGoogle': 'Disconnect', 'schedule.connectedAs': 'Connected as', 'schedule.importFromGoogle': 'Sync from Google', 'schedule.gcalConnected': '\u2713 Google Calendar connected', 'schedule.gcalError': 'Google Calendar connection error', 'schedule.gcalImportDone': 'Imported {n} days from Google Calendar', 'schedule.gcalAutoSyncNote': 'Availability changes are automatically synced to Google Calendar', 'schedule.gcalConnectDesc': 'Connect Google Calendar to automatically sync your availability', 'schedule.gcalDisconnectConfirm': 'Disconnect Google Calendar?', 'find_tasks.title': 'Find Orders', 'find_tasks.for_me': 'For me', 'find_tasks.all': 'All orders', 'find_tasks.by_category': 'By category', 'find_tasks.list': 'List', 'find_tasks.already_offered': 'Offer sent', 'find_tasks.offer_now': 'Make an offer', 'find_tasks.empty_for_me': 'No tasks found in your categories', 'find_tasks.banner_hint': 'Find tasks matching your portfolio categories', 'find_tasks.no_cards': 'Create a specialist portfolio to see tasks matched to you', 'find_tasks.add_card': 'Create portfolio', 'find_tasks.search': 'Search tasks...', 'find_tasks.tasks_count': 'tasks', 'footer.tagline': 'The task platform for Greece', 'footer.rights': 'All rights reserved.', // App download section 'app.download_title': 'Download the CanHelp mobile app', 'app.download_desc': 'All of CanHelp — always at your fingertips. Available for Android and iOS.', // Nav 'nav.pricing': 'Pricing', // Pricing page 'pricing.title': 'Pricing', 'pricing.subtitle': 'Choose the right plan for you', 'pricing.role.customer': 'Customer', 'pricing.role.specialist': 'Specialist', 'pricing.free': 'Free', 'pricing.per_month': 'mo', 'pricing.duration': 'Duration', 'pricing.days': 'days', 'pricing.current_plan': 'Your plan', 'pricing.popular': 'Popular', 'pricing.choose': 'Choose', 'pricing.your_plan': 'Active plan', 'pricing.free_default': 'Default', 'pricing.compare': 'Compare features', 'pricing.feature': 'Feature', 'pricing.faq_note': 'Payment is deducted from your CanHelp balance. Top up available in Payments.', 'pricing.feat.messages': 'Messages / day', 'pricing.feat.orders': 'Orders / day', 'pricing.feat.contact_all': 'Contact everyone', 'pricing.feat.view_phone': 'View phone number', 'pricing.feat.show_contact': 'Show contact info', 'pricing.feat.favorites': 'Favorites', 'pricing.feat.verified_badge': 'Verified badge', 'pricing.feat.google_calendar': 'Google Calendar', 'pricing.feat.personal_site': 'Personal site', 'pricing.feat.auto_response': 'Auto-response', 'pricing.feat.auto_match': 'Auto-match', 'pricing.feat.highlighted_reviews': 'Highlighted reviews', 'pricing.feat.portfolio': 'Portfolio items', 'pricing.feat.cards': 'Specialist cards', 'pricing.feat.notify_tasks': 'New task notifications', 'pricing.feat.video': 'Video in portfolio', // Upgrade prompt 'upgrade.available_in': 'Available in', 'upgrade.cta': 'Upgrade', // Dashboard plan block 'dashboard.plan.title': 'My Plan', 'dashboard.plan.expires': 'Expires in {n} days', 'dashboard.plan.upgrade': 'Upgrade plan', 'dashboard.plan.no_plan': 'Free plan', 'dashboard.plan.messages': 'Messages today', 'dashboard.plan.orders': 'Orders today', 'dashboard.plan.limits': 'Daily limits', 'dashboard.plan.features': 'Features', 'dashboard.plan.stats': 'Stats', 'dashboard.stats.cards': 'Portfolios', 'dashboard.stats.maxCards': 'Max portfolios', 'dashboard.stats.portfolioItems': 'Portfolio items', 'dashboard.stats.maxPortfolioItems': 'Max items', 'dashboard.stats.activeOffers': 'Active offers', 'dashboard.stats.reviewsReceived': 'Reviews', 'dashboard.stats.activeTasks': 'Active tasks', 'dashboard.stats.completedTasks': 'Completed', 'status.need_help': 'I need help', 'status.active': 'Active', 'status.toggle_on': 'Enable', 'status.toggle_off': 'Disable', // FOMO 'fomo.missed_orders': 'Missed {n} orders', 'fomo.missed_value': 'Worth €{v}', 'fomo.upgrade_hint': 'Upgrade to receive more orders', 'fomo.conversion': 'Task conversion', 'fomo.active': 'Active', 'fomo.with_offers': 'With offers', 'fomo.completed': 'Completed', 'fomo.already_offered': '{n} specialists have already responded', 'fomo.specialist_missed': 'You missed {n} orders', 'fomo.top_categories': 'Categories', 'fomo.offers_received': 'offers received', 'fomo.avg_offers': 'Avg {n}/task', 'fomo.completion_rate': 'completed', // Task auto-match 'task.auto_match': 'Auto-match', 'task.auto_match_results': 'Top specialists', 'task.no_offer_yet': 'You haven\'t sent an offer yet', 'task.make_offer': 'Send offer', 'auto_response.title': 'Auto-Response', 'auto_response.enabled': 'Enable auto-response', 'auto_response.min_budget': 'Min budget', 'auto_response.max_budget': 'Max budget', 'auto_response.default_price': 'Default price', 'auto_response.default_message': 'Default message', 'auto_response.max_per_day': 'Max auto-offers per day', 'auto_response.save': 'Save', 'auto_response.saved': 'Saved', 'auto_response.categories': 'Categories', 'auto_response.locations': 'Locations', // Personal site 'profile.personal_site': 'Personal Site', 'profile.site_slug': 'URL slug', 'profile.site_slug_hint': 'Only latin letters, numbers, - and _', 'profile.site_open': 'Open site', 'profile.site_preview': 'Your site', 'profile.show_contact': 'Show contact info', 'profile.show_contact_hint': 'Customers with Pro/Ultimate plans will see your phone number', // Google Calendar plan gate 'gcal.upgrade_required': 'Google Calendar requires a Pro or Ultimate plan', // Chat limits 'chat.limit_warning': '{n} messages left today', 'chat.limit_reached': 'Message limit reached. Upgrade your plan', 'chat.upgrade': 'Upgrade', // Site page 'site.member_since': 'Member since', 'site.rating': 'Rating', 'site.completed_tasks': 'Completed', 'site.languages': 'Languages', 'site.photos': 'photos', 'site.contact_form': 'Get in touch', 'site.contact_sent': 'Message sent!', 'site.contact_sent_desc': 'The specialist will contact you soon', 'site.contact_name': 'Name', 'site.contact_name_ph': 'Your name', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Message', 'site.contact_message_ph': 'Describe your task...', 'site.contact_send': 'Send', 'site.share': 'Share', 'site.speaks_languages': 'Speaks', 'site.message_sent': 'Message sent!', 'site.message_sent_desc': 'The specialist will receive it in the chat', 'site.message_placeholder': 'Write your message...', 'site.write_to_chat': 'Write to chat', 'site.auth_required_title': 'Sign in required', 'site.auth_required_desc': 'To write in the chat, you need to sign in to your CanHelp account.', 'site.auth_login_btn': 'Sign in', 'site.auth_contact_form_btn': 'Contact via feedback form', 'specialist.services': 'Services', 'portfolio.title': 'Portfolio', 'status.can_help_now': 'Available now', 'common.not_found': 'Page not found', 'common.anonymous': 'Anonymous' }, ru: { 'footer.slogan': 'Ваша задача — наша забота! Решаем любые вопросы быстро и удобно.', 'footer.links': 'Ссылки', 'footer.socials': 'Мы в соцсетях', 'nav.home': 'Главная', 'nav.tasks': 'Задачи', 'nav.post': '+ Опубликовать', 'nav.dashboard': 'Панель управления', 'nav.chat': 'Сообщения', 'nav.notifications': 'Уведомления', 'nav.profile': 'Профиль', 'nav.admin': 'Админка', 'nav.specialists': 'Специалисты', 'nav.new_task': 'Новая задача', 'nav.login': 'Войти', 'nav.register': 'Регистрация', 'nav.logout': 'Выйти', 'hero.title': 'Найди специалиста для любой работы', 'hero.subtitle': 'Опубликуй задачу, получи предложения и выбери лучшего профессионала', 'hero.cta.post': 'Опубликовать задачу', 'hero.cta.browse': 'Найти работу', 'hero.search.placeholder': 'Что нужно? напр. электрик, уборка...', 'stats.specialists': 'специалистов', 'stats.tasks': 'задач', 'stats.categories': 'категорий', 'stats.free': 'бесплатная регистрация', 'section.categories': 'Создай задачу в любой категории', 'section.how': 'Как это работает', 'section.recent': 'Последние задачи', 'section.all': 'Смотреть все →', 'section.more': 'ещё', 'section.cities': 'Города и районы', 'section.community': 'Общественный проект для всех', 'community.subtitle': 'CanHelp — не просто маркетплейс, это сообщество взаимопомощи. Любой, у кого есть знания или навык, может найти клиента. Любой, у кого есть задача, может найти специалиста.', 'community.point1.title': 'Умеете что-то делать?', 'community.point1.desc': 'Ремонт, репетиторство, дизайн, переводы, уход — каждый навык имеет ценность. Создайте профиль и находите клиентов рядом с вами.', 'community.point2.title': 'Нужна помощь?', 'community.point2.desc': 'Опубликуйте задачу за минуту и получайте предложения от проверенных специалистов в вашем городе.', 'community.point3.title': 'Помогите проекту расти', 'community.point3.desc': 'CanHelp развивается благодаря сообществам. Поделитесь ссылкой с друзьями и знакомыми — вместе мы строим что-то полезное для всех.', 'community.share': 'Поделиться с друзьями', 'community.share.copied': 'Ссылка скопирована!', // Referral section on home page 'section.referral': 'Реферальная программа', 'referral.home.subtitle': 'Поделитесь ссылкой — каждый новый пользователь, зарегистрировавшийся по ней, принесёт вам награду.', 'referral.home.step1.title': 'Зарегистрируйтесь и получите ссылку', 'referral.home.step1.desc': 'Создайте аккаунт и найдите свою уникальную реферальную ссылку в профиле.', 'referral.home.step2.title': 'Поделитесь с друзьями', 'referral.home.step2.desc': 'Отправьте ссылку друзьям, знакомым или опубликуйте в социальных сетях.', 'referral.home.step3.title': 'Получайте награды', 'referral.home.step3.desc': 'Как только друг подтвердит email, вы автоматически получите свою награду.', 'referral.home.cta': 'Получить ссылку', 'referral.home.badge': 'Реферальная программа', // FAQ section 'section.faq': 'Частые вопросы', 'faq.q1': 'Как работает CanHelp?', 'faq.a1': 'Опубликуйте задачу, получите предложения от специалистов, выберите лучшего и начните сотрудничество. Это быстро, просто и бесплатно для клиентов.', 'faq.q2': 'Сколько стоит использование платформы?', 'faq.a2': 'Регистрация и публикация задач полностью бесплатны для клиентов. Специалисты имеют доступ к бесплатному плану, а также к премиум-опциям.', 'faq.q3': 'Как стать специалистом?', 'faq.a3': 'Зарегистрируйтесь, перейдите в «Стать специалистом», заполните профиль навыками и категориями и начните получать задачи.', 'faq.q4': 'Как выбрать подходящего специалиста?', 'faq.a4': 'Оцените отзывы, опыт, навыки и портфолио каждого специалиста. Общайтесь через чат платформы и уточняйте детали до принятия решения.', 'faq.q5': 'Что если я не доволен результатом?', 'faq.a5': 'Вы можете оставить отзыв о специалисте и поставить оценку от 1 до 5 звёзд. Отзывы помогают другим пользователям выбирать проверенных профессионалов.', 'faq.q6': 'Можно ли связаться со специалистом до принятия предложения?', 'faq.a6': 'Да. Как только вы получили предложение, можно открыть чат со специалистом, задать вопросы и уточнить все детали до принятия решения.', 'faq.q7': 'Сколько времени ждать предложений?', 'faq.a7': 'Как правило, в течение нескольких часов. Специалисты получают уведомление о новых задачах и могут быстро ответить.', 'faq.q8': 'Можно ли разместить задачу в любом городе Греции?', 'faq.a8': 'Да! CanHelp охватывает всю Грецию — Афины, Фессалоники, Патры и другие города.', 'faq.q9': 'Какие виды задач есть на CanHelp?', 'faq.a9': 'Ремонт, уборка, электрики, репетиторство, дизайн, IT, переезды, красота и многое другое. Категории постоянно расширяются.', 'faq.q10': 'Есть ли мобильное приложение?', 'faq.a10': 'Да! CanHelp доступно для Android и iOS. Скачайте приложение и управляйте всем со своего телефона.', 'how.step1.title': 'Опубликуй задачу', 'how.step1.desc': 'Опиши что нужно и установи бюджет', 'how.step2.title': 'Получи предложения', 'how.step2.desc': 'Специалисты пришлют предложения с ценой и сроками', 'how.step3.title': 'Выбери и начни', 'how.step3.desc': 'Выбери лучшего профессионала и начни сотрудничество', 'tasks.title': 'задач', 'tasks.filters': 'Фильтры', 'tasks.search': 'Поиск', 'tasks.search.placeholder': 'Название или ключевое слово...', 'tasks.search.btn': 'Поиск', 'tasks.publish': 'Опубликовать', 'tasks.category.all': 'Все', 'tasks.category.all_in': 'Все в', 'tasks.category.label': 'Категория', 'tasks.location.label': 'Город', 'tasks.location.placeholder': 'напр. Афины', 'tasks.empty': 'Задачи не найдены', 'tasks.empty.cta': 'Опубликуй первую', 'task.status.open': 'Открыта', 'task.status.in_progress': 'В работе', 'task.status.completed': 'Завершена', 'task.status.cancelled': 'Отменена', 'task.status.draft': 'Черновик', 'task.budget': 'Бюджет', 'task.location': 'Местоположение', 'task.deadline': 'Дата начала', 'task.created_at': 'Создано', 'task.customer': 'Заказчик', 'task.offer.btn': 'Отправить предложение', 'task.invite.banner_title': 'Вас пригласили на это задание', 'task.invite.banner_hint': 'Заказчик лично пригласил вас', 'task.invite.accept': 'Отправить предложение', 'task.invite.decline': 'Отказаться', 'offer.accept': 'Принять', 'offer.decline': 'Отклонить', 'task.complete': 'Завершить задачу', 'task.complete.confirm': 'Отметить задачу как выполненную?', 'task.edit': 'Редактировать', 'task.status_label': 'Статус', 'task.yours': 'Ваша задача', 'task.offer.yours': 'Ваше предложение', 'review.leave': 'Оставить отзыв', 'review.rating': 'Оценка', 'review.comment': 'Комментарий', 'review.comment.placeholder': 'Расскажите о своём опыте...', 'review.submit': 'Отправить отзыв', 'review.submitting': 'Отправка...', 'review.done': 'Отзыв отправлен!', 'profile.reviews': 'Отзывы', 'profile.no_reviews': 'Отзывов пока нет', 'profile.rating': 'Рейтинг', 'profile.skills.label': 'Навыки', 'profile.member_since': 'Участник с', 'task.offers': 'Предложения', 'task.offers.none': 'Предложений пока нет', 'create.title': 'Опубликовать задачу', 'create.field.title': 'Название', 'create.field.description': 'Описание', 'create.field.category': 'Категория', 'create.field.category.select': 'Выберите...', 'create.field.location': 'Местоположение', 'create.field.location.any': 'Где угодно', 'create.field.location.all': 'Весь город', 'create.field.budget': 'Бюджет (€)', 'create.field.deadline': 'Дата начала', 'create.field.budget_negotiable': 'Цена обсуждается', 'create.field.time_slot': 'Время выполнения', 'create.field.time_slot.any': 'В любое время', 'create.field.time_slot.morning': 'Утром (08:00–13:00)', 'create.field.time_slot.afternoon': 'Днём (13:00–18:00)', 'create.field.time_slot.evening': 'Вечером (18:00–22:00)', 'create.field.time_slot.weekend': 'Выходной', 'create.field.address': 'Адрес (необязательно)', 'create.field.address.district': 'Квартал', 'create.field.address.street': 'Улица', 'create.field.address.house': 'Дом', 'create.field.confidential': 'Конфиденциальная заметка', 'create.field.confidential.placeholder': 'Детали, видные только назначенному специалисту...', 'create.field.confidential.hint': 'Не отображается публично', 'create.field.photos': 'Фотографии', 'create.field.photos.add': 'Добавить фото', 'create.field.photos.uploading': 'Загрузка...', 'task.budget_negotiable': 'Цена обсуждается', 'task.time_slot': 'Время', 'task.confidential': 'Конфид. заметка', 'create.field.title.placeholder': 'напр. Уборка квартиры 80кв', 'create.field.description.placeholder': 'Подробно опишите что нужно...', 'create.field.location.placeholder': 'напр. Афины, Колонаки', 'create.field.budget.placeholder': 'напр. 100', 'create.submit': 'Опубликовать задачу', 'create.submitting': 'Публикация...', 'login.title': 'Добро пожаловать', 'login.subtitle': 'Вход в CanHelp', 'login.email': 'Email', 'login.password': 'Пароль', 'login.submit': 'Войти', 'login.submitting': 'Вход...', 'login.error': 'Неверный email или пароль', 'login.unverified.title': 'Подтвердите ваш email', 'login.unverified.desc': 'Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.', 'login.unverified.resend': 'Отправить письмо повторно', 'login.unverified.sending': 'Отправка...', 'login.unverified.sent': '✓ Отправлено — проверьте входящие', 'profile.email.verified': 'Email подтверждён', 'profile.email.not_verified': 'Email не подтверждён', 'login.no_account': 'Нет аккаунта?', 'login.register_link': 'Зарегистрироваться', 'login.forgot_password': 'Забыл пароль?', 'login.or_continue_with': 'или продолжите через', 'login.continue_google': 'Войти через Google', 'forgot.title': 'Забыл пароль', 'forgot.subtitle': 'Введите email для получения ссылки восстановления', 'forgot.email': 'Email', 'forgot.submit': 'Отправить ссылку', 'forgot.submitting': 'Отправка...', 'forgot.sent.title': 'Проверьте входящие', 'forgot.sent.desc': 'Если аккаунт с таким email существует, мы отправим ссылку для сброса пароля.', 'forgot.back_to_login': 'Вернуться ко входу', 'forgot.error': 'Не удалось отправить ссылку. Проверьте адрес и попробуйте снова.', 'forgot.error.not_found': 'Аккаунт с таким email не найден.', 'forgot.error.send_failed': 'Ошибка отправки письма. Попробуйте позже.', 'reset.title': 'Новый пароль', 'reset.subtitle': 'Введите новый пароль', 'reset.password': 'Новый пароль', 'reset.confirm': 'Подтвердите пароль', 'reset.submit': 'Изменить пароль', 'reset.submitting': 'Сохранение...', 'reset.success': 'Пароль успешно изменён. Перенаправление ко входу...', 'reset.back_to_login': 'Вернуться ко входу', 'reset.error.mismatch': 'Пароли не совпадают', 'reset.error.invalid': 'Недействительная или устаревшая ссылка. Запросите новую.', 'register.title': 'Регистрация', 'register.subtitle': 'Создать аккаунт в CanHelp', 'register.first_name': 'Имя', 'register.last_name': 'Фамилия', 'register.email': 'Email', 'register.password': 'Пароль (мин. 8 символов)', 'register.role': 'Роль', 'register.role.customer': 'Пользователь', 'register.role.customer.desc': 'Публикую задачи', 'register.role.specialist': 'Специалист', 'register.role.specialist.desc': 'Беру задачи', 'register.submit': 'Создать аккаунт', 'register.submitting': 'Регистрация...', 'register.has_account': 'Уже есть аккаунт?', 'register.login_link': 'Войти', 'register.continue_google': 'Зарегистрироваться через Google', 'register.check_email.title': 'Проверьте почту', 'register.check_email.desc': 'Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.', 'register.check_email.login': 'Вернуться к входу', 'dashboard.title': 'Панель управления', 'dashboard.new_task': '+ Новая задача', 'dashboard.my_tasks': 'Мои задачи', 'dashboard.my_offers': 'Мои предложения', 'dashboard.invitations': 'Приглашения на задания', 'dashboard.offers_count': 'предл.', 'dashboard.declined_count': 'откл.', 'dashboard.completed_tasks': 'Завершённые задачи', 'dashboard.completed_offers': 'Завершённые предложения', 'dashboard.review_pending': 'Оценка ещё не оставлена', 'tasks.new.top_specialists': 'Топ специалисты', 'tasks.new.select_category': 'Выберите категорию, чтобы увидеть специалистов', 'tasks.new.invite': 'Предложить работу', 'tasks.new.invited': 'Выбран ✓', 'reviews.count': 'отзывов', 'filter.location': 'Локация', 'filter.language': 'Языки', 'filter.language.any': 'Любой язык', 'filter.category.all': 'Все категории', 'user.categories': 'Категории', 'user.work_area': 'Район работы', 'dashboard.tasks.empty': 'Вы не публиковали задачи', 'dashboard.tasks.empty.cta': 'Опубликуйте первую', 'dashboard.tasks.add_new': 'Добавить новую задачу', 'dashboard.offers.empty': 'Вы не отправляли предложений', 'dashboard.offers.empty.cta': 'Найти задачи', 'dashboard.customer.specialists_title': 'Ищете исполнителя?', 'dashboard.customer.specialists_hint': 'Просматривайте профили специалистов, читайте отзывы и приглашайте их на свои задачи', 'dashboard.customer.specialists_cta': 'Найти исполнителя', 'dashboard.customer.how_title': 'Как это работает', 'dashboard.customer.step1': 'Создайте задачу с описанием и бюджетом', 'dashboard.customer.step2': 'Специалисты пришлют предложения с ценой и сроками', 'dashboard.customer.step3': 'Выберите подходящего и начните работу', 'notif.title': 'Уведомления', 'notif.mark_all': 'Отметить все как прочитанные', 'notif.empty': 'Нет уведомлений', 'notif.type.new_offer': 'Новое предложение', 'notif.type.offer_accepted': 'Ваше предложение принято', 'notif.type.offer_declined': 'Ваше предложение отклонено', 'notif.type.task_completed': 'Задание выполнено', 'notif.type.task_cancelled': 'Задание отменено', 'notif.type.new_message': 'Новое сообщение', 'notif.type.new_review': 'Новый отзыв', 'notif.type.task_invite': 'Приглашение на задание', 'notif.body.new_offer': 'Новое предложение на «{title}»', 'notif.body.offer_accepted': 'Ваше предложение на «{title}» принято', 'notif.body.offer_declined': 'Ваше предложение на «{title}» отклонено', 'notif.body.task_invite': 'Вас приглашают на «{title}»', 'notif.body.new_review': 'Вы получили оценку {rating}★', 'offer.status.pending': 'Ожидает', 'offer.status.accepted': 'Принято', 'offer.status.declined': 'Отклонено', 'offer.status.withdrawn': 'Отозвано', 'offer.status.other_accepted': 'Выбран другой исполнитель', 'common.loading': 'Загрузка...', 'common.error': 'Ошибка', 'common.save': 'Сохранить', 'common.saving': 'Сохранение...', 'common.cancel': 'Отмена', 'common.add': 'Добавить', 'common.close': 'Закрыть', 'common.edit': 'Редактировать', 'common.delete': 'Удалить', 'common.from': 'от', 'common.currency': '€', 'common.greece': 'Греция', // Chat 'chat.connected': 'Подключено', 'chat.disconnected': 'Отключено', 'chat.no_rooms': 'Переписок пока нет', 'chat.task_fallback': 'Задача', 'chat.select': 'Выберите переписку', 'chat.no_messages': 'Сообщений пока нет', 'chat.placeholder': 'Напишите сообщение... (Enter для отправки)', 'chat.conversation_fallback': 'Переписка', 'chat.direct_chat': 'Личный чат', 'chat.linked_task': 'Прикреплённый заказ', 'chat.write_btn': 'Написать', 'chat.just_now': 'только что', 'chat.min_ago': 'м', 'chat.write_specialist': 'Написать специалисту', 'chat.write_customer': 'Написать заказчику', 'chat.notif_settings': 'Настройки уведомлений', 'chat.notif_messages': 'Уведомления о новых сообщениях', 'chat.toast_title': 'Новое сообщение', 'chat.toast_open': 'Открыть чат', // Offer form 'offer.price': 'Цена', 'offer.price.placeholder': 'напр. 80', 'offer.customer_budget': 'Бюджет заказчика', 'offer.message': 'Сообщение', 'offer.optional': 'необязательно', 'offer.message.placeholder': 'Представьтесь, расскажите об опыте и почему вы лучший выбор...', 'offer.submitting': 'Отправка...', // Profile 'profile.photo': 'Фото профиля', 'profile.photo.change': 'Изменить фото', 'profile.photo.hint': 'JPEG, PNG, WebP · до 5MB', 'profile.basic_info': 'Основная информация', 'profile.phone': 'Телефон', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Краткое описание', 'profile.bio.placeholder': 'Расскажите немного о себе...', 'profile.language': 'Язык', 'profile.language.hint': 'Язык интерфейса и email-уведомлений', 'profile.languages': 'Языки общения', 'profile.languages.hint': 'Выберите все языки, на которых вы общаетесь', 'profile.skills': 'Навыки', 'profile.skills.subtitle': 'Добавьте услуги, которые вы предлагаете', 'profile.skills.placeholder': 'напр. Уборка, IT, Репетиторство...', 'profile.role': 'Роль аккаунта', 'profile.role.specialist': '🔧 Специалист', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 Пользователь', 'profile.role.change': 'Для смены роли обратитесь в службу поддержки.', 'profile.become_specialist': 'Стать специалистом', 'profile.become_specialist.desc': 'Перейдите в роль специалиста, чтобы брать задачи и наполнить профиль.', 'become_specialist.hero.title': 'Зарабатывай, делая то, что умеешь', 'become_specialist.hero.subtitle': 'Создай профиль специалиста и получай заказы от клиентов по всей Греции', 'become_specialist.how.title': 'Как это работает', 'become_specialist.step1.title': 'Создай портфолио специалиста', 'become_specialist.step1.desc': 'Укажи категории, навыки и зону покрытия — система автоматически подберёт подходящие заказы', 'become_specialist.step2.title': 'Ищи заказы', 'become_specialist.step2.desc': 'Просматривай задачи по своим категориям в разделе «Поиск заказов»', 'become_specialist.step3.title': 'Откликайся и зарабатывай', 'become_specialist.step3.desc': 'Отправляй предложения с ценой и сроками, общайся с клиентами и выполняй заказы', 'become_specialist.benefits.title': 'Преимущества профиля специалиста', 'become_specialist.benefit1': 'Поиск заказов по вашим категориям и локации', 'become_specialist.benefit2': 'Публичный профиль с отзывами клиентов', 'become_specialist.benefit3': 'Расписание доступности, видимое клиентам', 'become_specialist.benefit4': 'Добавление в избранное клиентами', 'become_specialist.cta': 'Стать специалистом — это бесплатно', 'become_specialist.free_badge': 'Бесплатная регистрация', 'profile.tab.notifications': 'Уведомления', 'profile.tab.reviews': 'Отзывы', 'profile.tab.referral': 'Рефералы', 'profile.tab.auto_response': 'Авто-ответ', 'profile.tab.site': 'Сайт', 'profile.site.title': 'Персональная страница', 'profile.site.url_label': 'Личный сайт', 'profile.site.copy': 'Копировать', 'profile.site.copied': 'Скопировано', 'profile.site.visible_title': 'Что отображается на вашей странице', 'profile.site.visible.name': 'Имя и фото', 'profile.site.visible.bio': 'Биография', 'profile.site.visible.rating': 'Рейтинг и отзывы', 'profile.site.visible.portfolio': 'Портфолио / Карточки', 'profile.site.visible.contacts': 'Контактные данные', 'profile.site.visible.full_last_name': 'Фамилия полностью', 'profile.site.visible.services': 'Карточки услуг', 'profile.site.visible.reviews': 'Раздел с отзывами', 'profile.site.visible.status': 'Статус «Готов помочь»', 'profile.site.theme': 'Тема оформления', 'profile.site.theme.dark': 'Тёмная', 'profile.site.theme.light': 'Светлая', 'profile.site.slug_taken': 'Этот адрес уже занят', 'profile.site.stats.title': 'Аналитика сайта', 'profile.site.stats.days': 'последние 30 дней', 'profile.site.stats.views': 'Просмотры', 'profile.site.stats.unique': 'Уникальные посетители', 'profile.site.stats.messages': 'Сообщения', 'profile.site.stats.total_views': 'Просмотры', 'profile.site.stats.total_unique': 'Уник. посетители', 'profile.site.stats.total_messages': 'Сообщения', 'profile.site.stats.empty': 'Данных пока нет', 'profile.site.stats.loading': 'Загрузка аналитики...', 'profile.site.stats.no_slug': 'Укажите адрес сайта, чтобы видеть статистику', 'profile.site.edit_bio_hint': 'Биография и фото настраиваются во вкладке «Основное».', 'status.title': 'Статус', 'status.can_help_now_hint': 'Ваша карточка показывается выше в поиске', 'status.need_help_hint': 'Специалисты могут предложить вам помощь', 'profile.referral.title': 'Партнёрская программа', 'profile.referral.desc': 'Поделитесь ссылкой и получайте награду за каждого привлечённого пользователя.', 'profile.referral.link_label': 'Ваша реферальная ссылка', 'profile.referral.copy': 'Копировать', 'profile.referral.copied': 'Скопировано!', 'profile.referral.invited_count': 'успешных приглашений', 'profile.referral.no_code': 'Реферальный код недоступен.', 'notifications.title': 'Настройки уведомлений', 'notifications.email.new_tasks': 'Email о новых заказах', 'notifications.email.new_tasks.desc': 'Получать email, когда в ваших категориях публикуется новый заказ', 'notifications.messages.desc': 'Получать уведомление при новом входящем сообщении', 'notifications.saved': 'Настройки сохранены', 'notifications.plan_required': 'Недоступно в вашем тарифе', 'profile.tab.info': 'Основное', 'profile.tab.finance': 'Финансы', 'profile.tab.skills': 'Навыки', 'profile.tab.categories': 'Категории', 'profile.tab.geography': 'География', 'profile.specialist.categories': 'Категории работ', 'profile.specialist.categories.desc': 'Выберите категории, в которых вы работаете', 'profile.specialist.geography': 'Города покрытия', 'profile.specialist.geography.desc': 'Выберите города / районы, где вы работаете', 'profile.saving': 'Сохранение...', 'profile.upload.error': 'Ошибка загрузки фото', 'profile.saved': 'Сохранено', 'profile.tab.cards': 'Портфолио', 'profile.cards.count': 'Портфолио', 'profile.cards.add': 'Добавить портфолио', 'profile.cards.new_title': 'Название нового портфолио', 'profile.cards.placeholder': 'Например: Сантехника', 'profile.cards.create': 'Создать', 'profile.cards.cancel': 'Отмена', 'profile.cards.empty': 'У вас нет портфолио', 'profile.cards.create_first': 'Создать первое портфолио', 'profile.cards.delete_confirm': 'Удалить портфолио?', 'profile.card.tab.main': 'Основное', 'profile.card.tab.skills': 'Навыки', 'profile.card.tab.categories': 'Категории', 'profile.card.tab.geography': 'География', 'profile.card.tab.portfolio': 'Галерея', 'profile.card.active': 'Активна', 'profile.card.save': 'Сохранить', 'profile.card.saved': 'Сохранено', 'profile.card.delete': 'Удалить', 'profile.card.skill.add': 'Добавить навык', 'profile.card.photo.add': 'Добавить фото', 'profile.card.photo.uploading': 'Загрузка...', 'profile.card.photo.empty': 'Нет фотографий', 'profile.card.item.title': 'Заголовок', 'profile.card.item.desc': 'Описание', 'profile.card.item.save': 'Сохранить', 'profile.card.item.cancel': 'Отмена', 'profile.card.item.edit': 'Описание работы', 'profile.upgrade.cards_limit': 'Лимит портфолио исчерпан', 'profile.upgrade.plan': 'Текущий тариф:', 'profile.upgrade.contact': 'Обратитесь к администратору для смены тарифа', 'profile.upgrade.ok': 'Понятно', 'profile.plan.title': 'Тарифный план', 'profile.balance': 'Баланс', 'profile.balance.topup': 'Пополнить баланс', 'profile.balance.topup.title': 'Пополнить баланс', 'profile.balance.topup.amount': 'Сумма (в EUR)', 'profile.balance.topup.hint': 'Выберите сумму или введите вручную', 'profile.balance.topup.submit': 'Перейти к оплате', 'profile.balance.topup.loading': 'Перенаправление...', 'profile.balance.topup.error': 'Ошибка инициализации платежа. Попробуйте снова.', 'payment.success.title': 'Оплата прошла успешно!', 'payment.success.desc': 'Ваш баланс обновлён.', 'payment.cancelled.title': 'Оплата отменена', 'payment.cancelled.desc': 'Оплата была отменена. Средства не списаны.', 'payment.pending.title': 'Обрабатывается...', 'payment.pending.desc': 'Ваш платёж в обработке.', 'payment.back_to_profile': 'Вернуться в профиль', 'profile.plan.basic': 'Базовый (бесплатный)', 'profile.plan.contact_upgrade': 'Обратитесь к администратору для подключения тарифа', 'profile.plan.cards_up_to': 'Портфолио: до', 'profile.plan.cards_unlimited': 'Портфолио: безлимитно', 'profile.plan.tasks_up_to': 'Задач: до', 'profile.plan.offers_up_to': 'Откликов: до', 'profile.plan.valid_until': 'Действителен до', 'profile.plan.no_expiry': 'Бессрочно', // Create task 'create.error': 'Ошибка при публикации', // Tasks list extras 'tasks.category.general': 'Общее', 'tasks.budget.range': 'Диапазон:', 'tasks.budget.from': 'от', 'tasks.budget.to': 'до', 'tasks.filter.reset': 'Сбросить фильтры', 'tasks.load_more': 'Загрузить ещё', 'tasks.showing': 'Результатов:', 'tasks.field.budget': 'Бюджет, €', // Admin 'admin.title': 'Панель администратора', 'admin.tab.stats': 'Статистика', 'admin.tab.users': 'Пользователи', 'admin.tab.tasks': 'Задачи', 'admin.tab.reports': 'Жалобы', 'admin.stats.users': 'Пользователи', 'admin.stats.tasks': 'Задачи', 'admin.stats.offers': 'Предложения', 'admin.stats.reviews': 'Отзывы', 'admin.tasks.by_status': 'Задачи по статусу', 'admin.col.user': 'Пользователь', 'admin.col.email': 'Email', 'admin.col.role': 'Роль', 'admin.col.registered': 'Регистрация', 'admin.col.status': 'Статус', 'admin.col.title': 'Название', 'admin.col.budget': 'Бюджет', 'admin.col.created': 'Создано', 'admin.users.active': 'Активен', 'admin.users.inactive': 'Неактивен', 'admin.users.deactivate': 'Деактивировать', 'admin.users.activate': 'Активировать', 'admin.tasks.cancel': 'Отменить', 'admin.reports.none': 'Жалоб нет', 'admin.reports.reviewed': 'Рассмотрено', 'admin.reports.dismiss': 'Отклонить', 'admin.pagination.total': 'Всего', 'admin.users.role.change': 'Изменить роль', 'admin.users.search.placeholder': 'Поиск по имени или email...', 'admin.tasks.delete': 'Удалить', 'admin.tasks.delete.confirm': 'Удалить эту задачу навсегда?', 'admin.tasks.search.placeholder': 'Поиск по названию...', 'admin.col.customer': 'Заказчик', 'admin.col.reporter': 'Жалобщик', 'admin.col.target': 'Цель', 'admin.filter.all_roles': 'Все роли', 'admin.filter.all_statuses': 'Все статусы', 'admin.reports.target.task': 'Задача', 'admin.reports.target.user': 'Пользователь', 'admin.tab.categories': 'Категории', 'admin.tab.locations': 'Города и районы', 'admin.tab.logs': 'Логи', 'admin.tab.plans': 'Тарифы', 'admin.tab.settings': 'Настройки', 'admin.logs.subtab.ai': 'AI логи', 'admin.logs.subtab.activity': 'Активность', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Уведомления', 'admin.notif_logs.type': 'Тип', 'admin.notif_logs.title': 'Заголовок', 'admin.notif_logs.read': 'Прочитано', 'admin.notif_logs.empty': 'Логи уведомлений пусты', 'admin.stats.notif_chart_title': 'Уведомления по дням', 'admin.stats.notif_label': 'Уведомления', 'admin.stats.mail_chart_title': 'Email по дням', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'Все', 'admin.stats.specialists': 'Исполнители', 'admin.col.plan': 'Тариф', 'admin.back_home': 'На главную', 'admin.plans.title': 'Тарифные пакеты', 'admin.plans.add': '+ Добавить тариф', 'admin.plans.empty': 'Тарифы не созданы', 'admin.plans.form.new': 'Новый тариф', 'admin.plans.form.edit': 'Редактировать тариф', 'admin.plans.form.name': 'Название', 'admin.plans.form.price': 'Цена (EUR)', 'admin.plans.form.old_price': 'Старая цена (EUR, необязательно)', 'admin.plans.form.max_offers': 'Макс. откликов (пусто = без лимита)', 'admin.plans.form.max_cards': 'Макс. портфолио (пусто = без лимита)', 'admin.plans.form.duration_days': 'Срок (дней, пусто = без истечения)', 'admin.plans.form.description': 'Описание', 'admin.plans.form.features': 'Возможности (по одной на строку)', 'admin.plans.form.notify': 'Уведомления о новых заказах', 'admin.plans.form.default': 'По умолчанию', 'admin.plans.form.active': 'Активен', 'admin.plans.form.order': 'Порядок', 'admin.plans.form.role': 'Роль', 'admin.plans.form.tier': 'Уровень', 'admin.plans.form.role.customer': 'Заказчик', 'admin.plans.form.role.specialist': 'Специалист', 'admin.plans.form.tier.free': 'Бесплатный', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Лимиты (пусто = без ограничений)', 'admin.plans.form.max_messages_day': 'Макс. сообщений/день', 'admin.plans.form.max_orders_day': 'Макс. заказов/день', 'admin.plans.form.max_skills': 'Макс. навыков', 'admin.plans.form.max_profiles': 'Макс. профилей', 'admin.plans.form.max_portfolio': 'Макс. элементов портфолио', 'admin.plans.form.section.boost': 'Множители & Буст', 'admin.plans.form.search_boost': 'Буст в поиске', 'admin.plans.form.offers_multiplier': 'Множитель откликов', 'admin.plans.form.section.contact': 'Права контактов', 'admin.plans.form.can_contact_free': 'Контакт с бесплатными пользователями', 'admin.plans.form.can_contact_pro': 'Контакт с Pro пользователями', 'admin.plans.form.can_contact_all': 'Контакт со всеми', 'admin.plans.form.can_show_contact': 'Показывать контакты', 'admin.plans.form.can_view_phone': 'Просмотр телефона', 'admin.plans.form.section.features': 'Возможности', 'admin.plans.form.upload_video': 'Загрузка видео', 'admin.plans.form.favorites': 'Избранное', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Знак верификации', 'admin.plans.form.highlighted_reviews': 'Выделенные отзывы', 'admin.plans.form.personal_site': 'Личный сайт', 'admin.plans.form.can_help_now': 'Статус «Могу помочь»', 'admin.plans.form.need_help': 'Статус «Нужна помощь»', 'admin.plans.form.auto_response': 'Автоответ', 'admin.plans.form.auto_match': 'Автоподбор', 'admin.plans.form.instant_dispatch_free': 'Мгновенная рассылка (бесплатно)', 'admin.plans.form.instant_dispatch_pro': 'Мгновенная рассылка (Pro)', 'admin.plans.badge.default': 'По умолчанию', 'admin.plans.badge.inactive': 'Неактивен', 'admin.plans.make_default': 'Сделать по умолчанию', 'admin.plans.tasks': 'Задач', 'admin.plans.offers': 'Откликов', 'admin.plans.cards': 'Портфолио', 'admin.plans.notify_tasks': 'Уведомления о заказах', 'admin.plans.delete.confirm': 'Удалить тариф', 'admin.activity.title': 'Журнал активности', 'admin.activity.event': 'Событие', 'admin.activity.all_events': 'Все события', 'admin.activity.from': 'От', 'admin.activity.to': 'До', 'admin.activity.reset': 'Сбросить', 'admin.activity.total': 'Всего', 'admin.activity.empty': 'Нет записей', 'admin.mail.event': 'Email событие', 'admin.mail.all_events': 'Все email события', 'admin.mail.from': 'От', 'admin.mail.to': 'До', 'admin.mail.reset': 'Сбросить', 'admin.mail.total': 'Всего', 'admin.mail.empty': 'Нет email логов', 'admin.mail.recipient': 'Получатель', 'admin.mail.provider': 'Провайдер', 'admin.mail.details': 'Детали', 'admin.mail.status': 'Статус', 'admin.mail.success': 'Успешно', 'admin.mail.failed': 'Ошибка', 'admin.event.email_sent': 'Email отправлен', 'admin.event.email_failed': 'Email не отправлен', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Тестовый email отправлен', 'admin.event.admin_email_test_failed': 'Тестовый email не отправлен', 'admin.logs.empty': 'Нет записей', 'admin.logs.date': 'Дата', 'admin.logs.provider': 'Провайдер', 'admin.logs.model': 'Модель', 'admin.logs.action': 'Действие', 'admin.logs.langs': 'Языки', 'admin.logs.in': 'Вход', 'admin.logs.out': 'Выход', 'admin.logs.total': 'Итого', 'admin.logs.ms': 'мс', 'admin.logs.status': 'Статус', 'admin.stats.activity_30d': 'Активность за 30 дней', 'admin.stats.tasks_label': 'Заявки', 'admin.stats.users_label': 'Пользователи', 'admin.stats.specialists_label': 'Исполнители', 'admin.stats.tokens_title': 'Расход токенов (по месяцам)', 'admin.stats.tokens_out': 'Исходящие', 'admin.stats.tokens_in': 'Входящие', 'admin.stats.tokens_out_label': 'Исходящие токены', 'admin.stats.tokens_in_label': 'Входящие токены', 'admin.stats.cost_label': 'Стоимость (USD)', 'admin.stats.tasks_by_status': 'Заявки по статусам', 'admin.task_status.open': 'Открытые', 'admin.task_status.in_progress': 'В работе', 'admin.task_status.completed': 'Завершённые', 'admin.task_status.cancelled': 'Отменённые', 'admin.task_status.draft': 'Черновики', 'admin.settings.tab.general': 'Общие', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Уведомления', 'admin.settings.tab.payment': 'Оплата', 'admin.settings.tab.referral': 'Реферальная', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO и обслуживание', 'admin.settings.seo.maintenance_label': 'Режим обслуживания', 'admin.settings.seo.maintenance_hint': 'Показывать страницу обслуживания всем посетителям', 'admin.settings.seo.indexing_label': 'Индексация поисковыми системами', 'admin.settings.seo.indexing_hint': 'Разрешить поисковым системам индексировать сайт', 'admin.settings.seo.head_scripts_label': 'Скрипты в (JS)', 'admin.settings.seo.head_scripts_hint': 'Выполняется на каждой странице (Google Tag Manager, аналитика и т.д.)', 'admin.settings.seo.site_title_label': 'Заголовок сайта', 'admin.settings.seo.site_description_label': 'Описание сайта (meta description)', 'admin.settings.referral.title': 'Партнёрская программа', 'admin.settings.referral.hint': 'Награждайте пользователей, приводящих новых участников.', 'admin.settings.referral.enabled_label': 'Включено', 'admin.settings.referral.enabled_hint': 'Включить / отключить выдачу наград', 'admin.settings.referral.customer_section': 'Для клиентов', 'admin.settings.referral.specialist_section': 'Для специалистов', 'admin.settings.referral.plan_label': 'Тарифный план за реферала', 'admin.settings.referral.no_plan': '— без плана —', 'admin.settings.referral.plan_hint': 'Этот план будет назначен пригласившему. Если его текущий план выше — добавятся только дни.', 'admin.settings.referral.days_label': 'Дней награды', 'admin.settings.referral.days_hint': 'Количество дней, добавляемых к сроку действия плана.', 'admin.settings.general.title': 'Общие настройки', 'admin.settings.general.site_name': 'Название сайта', 'admin.settings.general.site_url': 'URL сайта', 'admin.settings.general.contact_email': 'Email для связи', 'admin.settings.general.support_phone': 'Телефон поддержки', 'admin.settings.smtp.title': 'Настройки SMTP сервера', 'admin.settings.smtp.hint': 'Используется для отправки email-уведомлений.', 'admin.settings.smtp.host': 'SMTP Хост', 'admin.settings.smtp.port': 'Порт', 'admin.settings.smtp.encryption': 'Шифрование', 'admin.settings.smtp.enc.none': 'Нет', 'admin.settings.smtp.enc.tls': 'STARTTLS (порт 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (порт 465)', 'admin.settings.smtp.username': 'Имя пользователя', 'admin.settings.smtp.password': 'Пароль / App Password', 'admin.settings.smtp.from_name': 'Имя отправителя', 'admin.settings.smtp.from_email': 'Email отправителя', 'admin.settings.smtp.test': 'Отправить тестовый email', 'admin.settings.smtp.sending': 'Отправка...', 'admin.settings.payment.hint': 'Данные для подключения к ePay Piraeus Bank.', 'admin.settings.env.test': 'Тест (sandbox)', 'admin.settings.env.prod': 'Боевой режим', 'admin.settings.env.label': 'Среда', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Активен', 'admin.settings.saving': 'Сохранение...', 'admin.settings.saved': 'Сохранено', 'admin.notif.vars_hint': 'Доступные переменные в шаблонах', 'admin.notif.tmpl.not_set': 'Шаблон не настроен', 'admin.notif.tmpl.subject_label': 'Тема письма', 'admin.notif.tmpl.body_label': 'Текст письма (HTML)', 'admin.notif.tmpl.save': 'Сохранить', 'admin.notif.tmpl.close': 'Закрыть', 'admin.notif.tmpl.translate': 'Авто-перевод на другие языки', 'admin.notif.tmpl.translating': 'Перевод...', 'admin.notif.tmpl.saving': 'Сохранение...', 'admin.notif.email_verification': 'Подтверждение email адреса', 'admin.notif.registration_success': 'Успешная регистрация', 'admin.notif.password_reset': 'Восстановление пароля', 'admin.notif.new_offer': 'Новое предложение', 'admin.notif.new_task': 'Новая задача', 'admin.notif.offer_accepted': 'Предложение принято', 'admin.notif.new_message': 'Новое сообщение', 'admin.notif.offer_declined': 'Отклонение предложения', 'admin.notif.offer_other_accepted': 'Выбран другой исполнитель', 'admin.notif.task_updated': 'Изменение задания', 'admin.notif.deadline_reminder': 'Напоминание о дедлайне', 'admin.notif.task_archived': 'Автоснятие задания', 'admin.notif.referral_reward': 'Реферальная награда', // Шаблоны email для тарифов 'admin.email_template.plan_activated': 'Тарифы — активация тарифа', 'admin.email_template.plan_upgraded': 'Тарифы — повышение тарифа', 'admin.email_template.plan_downgrade_scheduled': 'Тарифы — запланированное понижение', 'admin.email_template.plan_downgrade_applied': 'Тарифы — применение понижения', 'admin.email_template.plan_renewal_reminder': 'Тарифы — напоминание о продлении', 'admin.email_template.plan_insufficient_funds': 'Тарифы — нехватка средств', // Модальное окно подтверждения тарифа 'pricing.confirm.title': 'Подтвердите выбор тарифа', 'pricing.confirm.plan': 'Тариф', 'pricing.confirm.prorated': 'Зачёт остатка', 'pricing.confirm.effective_price': 'К оплате', 'pricing.confirm.your_balance': 'Ваш баланс', 'pricing.confirm.downgrade_info': 'Переход на новый тариф произойдёт автоматически после окончания текущего периода.', 'pricing.confirm.insufficient': 'Недостаточно средств на балансе.', 'pricing.confirm.top_up': 'Пополнить', 'pricing.confirm.schedule_downgrade': 'Запланировать переход', 'pricing.confirm.pay': 'Оплатить', 'admin.user_edit.title': 'Редактирование пользователя', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Регистрация', 'admin.user_edit.last_seen': 'Последний визит', 'admin.user_edit.lang': 'Язык', 'admin.user_edit.first_name': 'Имя', 'admin.user_edit.last_name': 'Фамилия', 'admin.user_edit.phone': 'Телефон', 'admin.user_edit.bio': 'О себе', 'admin.user_edit.role': 'Роль', 'admin.user_edit.plan': 'Тариф', 'admin.user_edit.no_plan': '— Без тарифа —', 'admin.user_edit.active': 'Активный аккаунт', 'admin.user_edit.balance': 'Баланс (EUR)', 'admin.user_edit.skills': 'Навыки', 'admin.user_edit.tab.profile': 'Профиль', 'admin.user_edit.tab.account': 'Аккаунт', 'admin.user_edit.tab.balance': 'Баланс', 'admin.user_edit.tab.settings': 'Настройки', 'admin.user_edit.tab.specialist': 'Портфолио', 'admin.user_edit.tab.site': 'Сайт', 'admin.user_edit.plan_expires': 'Тариф истекает', 'admin.user_edit.interface_lang': 'Язык интерфейса', 'admin.user_edit.comm_languages': 'Языки общения', 'admin.user_edit.personal_site_slug': 'Персональная страница', 'admin.user_edit.show_contact_info': 'Показывать контакты', 'admin.user_edit.show_contact_info.hint': 'Видно заказчикам', 'admin.user_edit.notify_new_tasks': 'Уведомлять о новых задачах', 'admin.user_edit.notify_new_tasks.hint': 'Push и email уведомления', 'admin.user_edit.notif_messages': 'Уведомления о сообщениях', 'admin.user_edit.notif_messages.hint': 'Новые сообщения в чате', 'admin.user_edit.site_settings': 'Настройки персональной страницы', 'admin.user_edit.categories': 'Категории услуг', 'admin.user_edit.locations': 'Районы обслуживания', 'admin.user_edit.skill_placeholder': 'Новый навык...', 'admin.user_edit.add_category': '— Выберите категорию —', 'admin.user_edit.add_location': '— Выберите район —', 'admin.user_edit.specialist_cards': 'Портфолио специалиста', 'admin.user_edit.no_cards': 'Портфолио не найдено', 'admin.user_edit.card_title': 'Заголовок портфолио', 'admin.user_edit.card_description': 'Описание', 'admin.balance.topup.btn': 'Пополнить', 'admin.balance.withdraw.btn': 'Списать', 'admin.balance.modal_hint': 'Изменения применяются сразу и фиксируются в истории', 'admin.balance.topup.title': 'Пополнение баланса', 'admin.balance.topup.amount': 'Сумма', 'admin.balance.topup.description': 'Комментарий', 'admin.balance.topup.description.placeholder': 'Например: бонус или ручное пополнение', 'admin.balance.topup.submit': 'Пополнить баланс', 'admin.balance.withdraw.title': 'Снятие баланса', 'admin.balance.withdraw.amount': 'Сумма', 'admin.balance.withdraw.description': 'Комментарий', 'admin.balance.withdraw.description.placeholder': 'Например: возврат или ручное списание', 'admin.balance.withdraw.submit': 'Списать баланс', 'admin.user_edit.role.customer': 'Заказчик', 'admin.user_edit.role.specialist': 'Исполнитель', 'admin.user_edit.role.admin': 'Администратор', 'common.refresh': 'Обновить', 'common.back_home': 'На главную', 'admin.loc.hint': 'Управление городами и районами', 'admin.loc.add_city': 'Новый город', 'admin.loc.add_district': 'Добавить район', 'admin.loc.new': 'Новая локация', 'admin.loc.edit': 'Редактировать локацию', 'admin.loc.district': 'район', 'admin.loc.empty': 'Нет локаций', 'admin.loc.delete.confirm': 'Удалить локацию? Все районы также будут удалены.', 'admin.cat.add_root': 'Новая категория', 'admin.cat.add_sub': 'Подкатегория', 'admin.cat.edit': 'Редактировать', 'admin.cat.delete': 'Удалить', 'admin.cat.delete.confirm': 'Удалить категорию? Все подкатегории также будут удалены.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Иконка', 'admin.cat.name_el': 'Греческий', 'admin.cat.name_en': 'Английский', 'admin.cat.name_ru': 'Русский', 'admin.cat.order': 'Порядок', 'admin.cat.active': 'Активна', 'admin.cat.parent': 'Родительская категория', 'admin.cat.no_parent': 'Верхний уровень', 'admin.cat.save': 'Сохранить', 'admin.cat.cancel': 'Отмена', 'admin.cat.empty': 'Нет категорий', 'admin.cat.hint': 'Управление категориями с многоуровневой иерархией', 'admin.cat.new': 'Новая категория', 'admin.cat.subcategory': 'подкатегория', 'admin.cat.add_child': 'Добавить подкатегорию', 'admin.cat.inactive': 'Неактивна', 'admin.event.user_login': 'Вход', 'admin.event.user_register': 'Регистрация', 'admin.event.admin_user_deactivate': 'Блокировка юзера', 'admin.event.admin_user_activate': 'Разблокировка юзера', 'admin.event.admin_user_role_changed': 'Смена роли', 'admin.event.admin_task_cancelled': 'Отмена задачи', 'admin.event.admin_task_deleted': 'Удаление задачи', 'admin.event.admin_report_reviewed': 'Жалоба рассмотрена', 'admin.event.admin_report_dismissed': 'Жалоба отклонена', 'admin.event.task_created': 'Создана задача', // User status 'user.online': 'Онлайн', 'user.seen_minutes': 'был здесь {n} мин назад', 'user.seen_hours': 'был здесь {n} ч назад', 'user.seen_yesterday': 'был здесь вчера', 'user.seen_days': 'был здесь {n} дн назад', // Specialists 'specialists.title': 'Специалисты', 'specialists.search': 'Поиск специалиста...', 'specialists.search.btn': 'Поиск', 'specialists.empty': 'Специалисты не найдены', 'specialists.no_bio': 'Без описания', 'specialists.view': 'Смотреть профиль', 'specialists.reviews': 'отзывов', 'specialist.favorite': 'Добавить в избранное', 'specialist.unfavorite': 'Убрать из избранного', 'specialist.site_link': 'Личный сайт', 'favorites.specialists.title': 'Избранные специалисты', 'favorites.specialists.empty': 'Вы ещё не добавили специалистов в избранное', 'nav.favorites': 'Избранное', 'nav.schedule': 'Расписание', 'nav.find_tasks': 'Поиск заказов', 'schedule.title': 'Моё расписание', 'schedule.subtitle': 'Отмечайте дни когда вы свободны или заняты — заказчики увидят вашу доступность', 'schedule.available': 'Свободен', 'schedule.busy': 'Занят', 'schedule.unset': 'Не указано', 'schedule.click_hint': '← клик меняет статус по кругу', 'schedule.range_mode': 'Выделить диапазон', 'schedule.range_from': 'С {date} — выберите конечную дату', 'schedule.click_to_set': 'Нажмите чтобы отметить', 'schedule.free': 'свободно', 'schedule.busy_count': 'занято', 'schedule.free_days': 'свободных дней', 'schedule.googleCalendar': 'Google Календарь', 'schedule.connectGoogle': 'Подключить Google Календарь', 'schedule.disconnectGoogle': 'Отключить', 'schedule.connectedAs': 'Подключено как', 'schedule.importFromGoogle': 'Синхр. из Google', 'schedule.gcalConnected': '\u2713 Google Календарь подключён', 'schedule.gcalError': 'Ошибка подключения Google Календарь', 'schedule.gcalImportDone': 'Импортировано {n} дней из Google Календарь', 'schedule.gcalAutoSyncNote': 'Изменения доступности автоматически отправляются в Google Календарь', 'schedule.gcalConnectDesc': 'Подключите Google Календарь для автоматической синхронизации расписания', 'schedule.gcalDisconnectConfirm': 'Отключить Google Календарь?', 'find_tasks.title': 'Поиск заказов', 'find_tasks.for_me': 'Для меня', 'find_tasks.all': 'Все заказы', 'find_tasks.by_category': 'По категориям', 'find_tasks.list': 'Списком', 'find_tasks.already_offered': 'Предложение отправлено', 'find_tasks.offer_now': 'Откликнуться', 'find_tasks.empty_for_me': 'Нет заказов в ваших категориях', 'find_tasks.banner_hint': 'Найдите заказы по категориям вашего портфолио', 'find_tasks.no_cards': 'Создайте портфолио специалиста, чтобы видеть подходящие заказы', 'find_tasks.add_card': 'Создать портфолио', 'find_tasks.search': 'Поиск заказов...', 'find_tasks.tasks_count': 'заданий', 'footer.tagline': 'Платформа задач для Греции', 'footer.rights': 'Все права защищены.', // App download section 'app.download_title': 'Скачайте мобильное приложение CanHelp', 'app.download_desc': 'Всё CanHelp — всегда под рукой. Доступно для Android и iOS.', // Nav 'nav.pricing': 'Тарифы', // Pricing page 'pricing.title': 'Тарифы', 'pricing.subtitle': 'Выберите подходящий план', 'pricing.role.customer': 'Заказчик', 'pricing.role.specialist': 'Специалист', 'pricing.free': 'Бесплатно', 'pricing.per_month': 'мес', 'pricing.duration': 'Срок', 'pricing.days': 'дн.', 'pricing.current_plan': 'Ваш план', 'pricing.popular': 'Популярный', 'pricing.choose': 'Выбрать', 'pricing.your_plan': 'Активный план', 'pricing.free_default': 'По умолчанию', 'pricing.compare': 'Сравнение функций', 'pricing.feature': 'Функция', 'pricing.faq_note': 'Оплата списывается с баланса CanHelp. Пополнение доступно в разделе Оплата.', 'pricing.feat.messages': 'Сообщений / день', 'pricing.feat.orders': 'Заказов / день', 'pricing.feat.contact_all': 'Связь со всеми', 'pricing.feat.view_phone': 'Просмотр телефона', 'pricing.feat.show_contact': 'Показывать контакты', 'pricing.feat.favorites': 'Избранное', 'pricing.feat.verified_badge': 'Верифицированный бейдж', 'pricing.feat.google_calendar': 'Google Календарь', 'pricing.feat.personal_site': 'Персональный сайт', 'pricing.feat.auto_response': 'Авто-ответ', 'pricing.feat.auto_match': 'Авто-подбор', 'pricing.feat.highlighted_reviews': 'Выделенные отзывы', 'pricing.feat.portfolio': 'Элементов портфолио', 'pricing.feat.cards': 'Карточки специалиста', 'pricing.feat.notify_tasks': 'Уведомления о новых задачах', 'pricing.feat.video': 'Видео в портфолио', // Upgrade prompt 'upgrade.available_in': 'Доступно в', 'upgrade.cta': 'Улучшить', // Dashboard plan block 'dashboard.plan.title': 'Мой план', 'dashboard.plan.expires': 'Истекает через {n} дней', 'dashboard.plan.upgrade': 'Улучшить план', 'dashboard.plan.no_plan': 'Бесплатный план', 'dashboard.plan.messages': 'Сообщений сегодня', 'dashboard.plan.orders': 'Заказов сегодня', 'dashboard.plan.limits': 'Дневные лимиты', 'dashboard.plan.features': 'Функции', 'dashboard.plan.stats': 'Статистика', 'dashboard.stats.cards': 'Портфолио', 'dashboard.stats.maxCards': 'Макс. портфолио', 'dashboard.stats.portfolioItems': 'Элементы портфолио', 'dashboard.stats.maxPortfolioItems': 'Макс. элементы', 'dashboard.stats.activeOffers': 'Активные отклики', 'dashboard.stats.reviewsReceived': 'Отзывы', 'dashboard.stats.activeTasks': 'Активные задачи', 'dashboard.stats.completedTasks': 'Завершённые', 'status.need_help': 'Нужна помощь', 'status.active': 'Активен', 'status.toggle_on': 'Включить', 'status.toggle_off': 'Выключить', // FOMO 'fomo.missed_orders': 'Пропущено {n} заказов', 'fomo.missed_value': 'На сумму €{v}', 'fomo.upgrade_hint': 'Улучшите план — получайте больше заказов', 'fomo.conversion': 'Конверсия задач', 'fomo.active': 'Активные', 'fomo.with_offers': 'С офертами', 'fomo.completed': 'Завершённые', 'fomo.already_offered': '{n} специалистов уже откликнулись', 'fomo.specialist_missed': 'Вы пропустили {n} заказов', 'fomo.top_categories': 'Категории', 'fomo.offers_received': 'предложений получено', 'fomo.avg_offers': 'В среднем {n}/задача', 'fomo.completion_rate': 'завершено', // Task auto-match 'task.auto_match': 'Авто-матч', 'task.auto_match_results': 'Топ специалисты', 'task.no_offer_yet': 'Вы ещё не отправили предложение', 'task.make_offer': 'Отправить предложение', 'auto_response.title': 'Авто-ответ', 'auto_response.enabled': 'Включить авто-ответ', 'auto_response.min_budget': 'Мин. бюджет', 'auto_response.max_budget': 'Макс. бюджет', 'auto_response.default_price': 'Цена по умолчанию', 'auto_response.default_message': 'Сообщение по умолчанию', 'auto_response.max_per_day': 'Макс. авто-офертов в день', 'auto_response.save': 'Сохранить', 'auto_response.saved': 'Сохранено', 'auto_response.categories': 'Категории', 'auto_response.locations': 'Локации', // Personal site 'profile.personal_site': 'Персональный сайт', 'profile.site_slug': 'URL slug', 'profile.site_slug_hint': 'Только латинские буквы, цифры, - и _', 'profile.site_open': 'Открыть сайт', 'profile.site_preview': 'Ваш сайт', 'profile.show_contact': 'Показывать контакты', 'profile.show_contact_hint': 'Заказчики с Pro/Ultimate-планом увидят ваш телефон', // Google Calendar plan gate 'gcal.upgrade_required': 'Google Календарь требует план Pro или Ultimate', // Chat limits 'chat.limit_warning': 'Осталось {n} сообщений сегодня', 'chat.limit_reached': 'Лимит сообщений исчерпан. Улучшите план', 'chat.upgrade': 'Улучшить', // Site page 'site.member_since': 'С нами с', 'site.rating': 'Рейтинг', 'site.completed_tasks': 'Выполнено', 'site.languages': 'Языков', 'site.photos': 'фото', 'site.contact_form': 'Связаться', 'site.contact_sent': 'Сообщение отправлено!', 'site.contact_sent_desc': 'Специалист свяжется с вами в ближайшее время', 'site.contact_name': 'Имя', 'site.contact_name_ph': 'Ваше имя', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Сообщение', 'site.contact_message_ph': 'Опишите вашу задачу...', 'site.contact_send': 'Отправить', 'site.share': 'Поделиться', 'site.speaks_languages': 'Говорит на языках', 'site.message_sent': 'Сообщение отправлено!', 'site.message_sent_desc': 'Специалист получит его в чате', 'site.message_placeholder': 'Напишите сообщение...', 'site.write_to_chat': 'Написать в чат', 'site.auth_required_title': 'Нужна авторизация', 'site.auth_required_desc': 'Чтобы написать в чат, необходимо войти в аккаунт CanHelp.', 'site.auth_login_btn': 'Войти в аккаунт', 'site.auth_contact_form_btn': 'Написать через форму обратной связи', 'specialist.services': 'Услуги', 'portfolio.title': 'Портфолио', 'status.can_help_now': 'Готов помочь', 'common.not_found': 'Страница не найдена', 'common.anonymous': 'Анонимно' } }; export function getTranslations(locale) { const t = translations[locale] ?? translations.el; return (key, fallback)=>t[key] ?? translations.el[key] ?? fallback ?? key; } C SYbuffersourcesizemapshash;/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $: () => (/* binding */ getTranslations), /* harmony export */ YZ: () => (/* binding */ LOCALES) /* harmony export */ }); /* unused harmony export translations */ const LOCALES = [ { code: 'el', label: 'Ελληνικά', flag: '🇬🇷' }, { code: 'en', label: 'English', flag: '🇬🇧' }, { code: 'ru', label: 'Русский', flag: '🇷🇺' } ]; const translations = { el: { 'footer.slogan': 'Η εργασία σου — η φροντίδα μας! Λύνουμε κάθε ζήτημα γρήγορα και εύκολα.', 'footer.links': 'Σύνδεσμοι', 'footer.socials': 'Στα κοινωνικά δίκτυα', // Nav 'nav.home': 'Αρχική', 'nav.tasks': 'Εργασίες', 'nav.post': '+ Δημοσίευση', 'nav.dashboard': 'Πίνακας', 'nav.chat': 'Μηνύματα', 'nav.notifications': 'Ειδοποιήσεις', 'nav.profile': 'Προφίλ', 'nav.admin': 'Διαχείριση', 'nav.specialists': 'Ειδικοί', 'nav.new_task': 'Νέα εργασία', 'nav.login': 'Σύνδεση', 'nav.register': 'Εγγραφή', 'nav.logout': 'Έξοδος', // Hero 'hero.title': 'Βρες ειδικό για κάθε δουλειά', 'hero.subtitle': 'Δημοσίευσε εργασία, λάβε προσφορές και επίλεξε τον καλύτερο επαγγελματία', 'hero.cta.post': 'Δημοσίευσε εργασία', 'hero.cta.browse': 'Βρες εργασία', 'hero.search.placeholder': 'Τι χρειάζεσαι; π.χ. ηλεκτρολόγος, καθαρισμός...', 'stats.specialists': 'ειδικοί', 'stats.tasks': 'εργασίες', 'stats.categories': 'κατηγορίες', 'stats.free': 'δωρεάν εγγραφή', // Sections 'section.categories': 'Δημιούργησε εργασία σε οποιαδήποτε κατηγορία', 'section.how': 'Πώς λειτουργεί', 'section.recent': 'Πρόσφατες εργασίες', 'section.all': 'Δες όλες →', 'section.more': 'ακόμα', 'section.cities': 'Πόλεις & Περιοχές', 'section.community': 'Ένα κοινοτικό έργο για όλους', 'community.subtitle': 'Το CanHelp δεν είναι απλώς μια αγορά — είναι μια κοινότητα αμοιβαίας βοήθειας. Οποιοσδήποτε έχει γνώση ή δεξιότητα μπορεί να βρει έναν πελάτη. Οποιοσδήποτε έχει ένα πρόβλημα μπορεί να βρει έναν ειδικό.', 'community.point1.title': 'Είσαι ειδικός σε κάτι;', 'community.point1.desc': 'Επισκευές, μαθήματα, σχεδιασμός, μεταφράσεις, φροντίδα — κάθε δεξιότητα αξίζει. Δημιούργησε προφίλ και βρες πελάτες κοντά σου.', 'community.point2.title': 'Χρειάζεσαι βοήθεια;', 'community.point2.desc': 'Δημοσίευσε εργασία σε λιγότερο από ένα λεπτό και λάβε προσφορές από επαληθευμένους ειδικούς στην πόλη σου.', 'community.point3.title': 'Βοήθησε το έργο να αναπτυχθεί', 'community.point3.desc': 'Το CanHelp αναπτύσσεται χάρη στις κοινότητες. Μοιράσου το σύνδεσμο με φίλους και γνωστούς — μαζί χτίζουμε κάτι χρήσιμο για όλους.', 'community.share': 'Μοιράσου με φίλους', 'community.share.copied': 'Σύνδεσμος αντιγράφηκε!', // Referral section on home page 'section.referral': 'Πρόγραμμα παραπομπών', 'referral.home.subtitle': 'Μοιράσου τον σύνδεσμό σου — κάθε νέος χρήστης που εγγράφεται μέσα από αυτόν σου αποφέρει ανταμοιβή.', 'referral.home.step1.title': 'Εγγραφείσε και λάβε σύνδεσμο', 'referral.home.step1.desc': 'Δημιούργησε λογαριασμό και βρες τον μοναδικό σου σύνδεσμο παραπομπής στο προφίλ σου.', 'referral.home.step2.title': 'Μοιράσου με φίλους', 'referral.home.step2.desc': 'Στείλε τον σύνδεσμο σε φίλους, γνωστούς ή δημοσίευσέ τον στα social media.', 'referral.home.step3.title': 'Κέρδισε ανταμοιβές', 'referral.home.step3.desc': 'Μόλις ο φίλος σου επαληθεύσει το email του, λαμβάνεις αυτόματα την ανταμοιβή σου.', 'referral.home.cta': 'Πάρε τον σύνδεσμό σου', 'referral.home.badge': 'Πρόγραμμα παραπομπών', // FAQ section 'section.faq': 'Συχνές Ερωτήσεις', 'faq.q1': 'Πώς λειτουργεί το CanHelp;', 'faq.a1': 'Δημοσίευσε μια εργασία, λάβε προσφορές από ειδικούς, επέλεξε τον καλύτερο και ξεκίνα τη συνεργασία. Είναι γρήγορο, απλό και δωρεάν για πελάτες.', 'faq.q2': 'Πόσο κοστίζει η χρήση της πλατφόρμας;', 'faq.a2': 'Η εγγραφή και η δημοσίευση εργασιών είναι εντελώς δωρεάν για πελάτες. Οι ειδικοί έχουν στη διάθεσή τους δωρεάν πλάνο καθώς και premium επιλογές.', 'faq.q3': 'Πώς μπορώ να γίνω ειδικός;', 'faq.a3': 'Κάνε εγγραφή, πήγαινε στο «Γίνε Ειδικός», συμπλήρωσε το προφίλ σου με δεξιότητες και κατηγορίες και αρχίνισε να λαμβάνεις εργασίες.', 'faq.q4': 'Πώς επιλέγω τον κατάλληλο ειδικό;', 'faq.a4': 'Δες τις αξιολογήσεις, την εμπειρία, τις δεξιότητες και το χαρτοφυλάκιο κάθε ειδικού. Επικοινώνησε μαζί του μέσω chat και συζήτα τις λεπτομέρειες πριν αποφασίσεις.', 'faq.q5': 'Τι γίνεται αν δεν είμαι ικανοποιημένος;', 'faq.a5': 'Μπορείς να αφήσεις αξιολόγηση για τον ειδικό και να τον βαθμολογήσεις από 1 έως 5 αστέρια. Οι αξιολογήσεις βοηθούν άλλους χρήστες να επιλέξουν έμπιστους επαγγελματίες.', 'faq.q6': 'Μπορώ να επικοινωνήσω με τον ειδικό πριν την αποδοχή;', 'faq.a6': 'Ναι. Μόλις λάβεις μια προσφορά, μπορείς να ανοίξεις chat με τον ειδικό, να κάνεις ερωτήσεις και να συντονίσεις τις λεπτομέρειες πριν αποφασίσεις.', 'faq.q7': 'Πόσος χρόνος χρειάζεται για να λάβω προσφορές;', 'faq.a7': 'Συνήθως μέσα σε λίγες ώρες. Οι ειδικοί λαμβάνουν ειδοποίηση για νέες εργασίες και μπορούν να απαντήσουν γρήγορα.', 'faq.q8': 'Μπορώ να δημοσιεύσω εργασία σε οποιαδήποτε πόλη της Ελλάδας;', 'faq.a8': 'Ναι! Το CanHelp καλύπτει όλη την Ελλάδα. Μπορείς να βρεις ειδικούς στην Αθήνα, στη Θεσσαλονίκη, στην Πάτρα και αλλού.', 'faq.q9': 'Τι είδη εργασιών μπορώ να βρω στο CanHelp;', 'faq.a9': 'Επισκευές, καθαρισμό, ηλεκτρολόγους, μαθήματα, σχεδιασμό, IT, μετακομίσεις, ομορφιά και πολλά άλλα. Οι κατηγορίες αυξάνονται συνεχώς.', 'faq.q10': 'Υπάρχει εφαρμογή για κινητό;', 'faq.a10': 'Ναι! Το CanHelp διατίθεται για Android και iOS. Κατέβασε την εφαρμογή και διαχειρίσου τα πάντα από το τηλέφωνό σου.', // How it works 'how.step1.title': 'Δημοσίευσε εργασία', 'how.step1.desc': 'Περίγραψε τι χρειάζεσαι και ορίζε τον προϋπολογισμό σου', 'how.step2.title': 'Λάβε προσφορές', 'how.step2.desc': 'Ειδικοί θα σου στείλουν προσφορές με τιμή και χρόνο', 'how.step3.title': 'Επίλεξε & ξεκίνα', 'how.step3.desc': 'Επέλεξε τον καλύτερο επαγγελματία και ξεκίνα τη συνεργασία', // Tasks page 'tasks.title': 'εργασίες', 'tasks.filters': 'Φίλτρα', 'tasks.search': 'Αναζήτηση', 'tasks.search.placeholder': 'Τίτλος ή λέξη κλειδί...', 'tasks.search.btn': 'Αναζήτηση', 'tasks.publish': 'Δημοσίευση', 'tasks.category.all': 'Όλες', 'tasks.category.all_in': 'Όλα στην', 'tasks.category.label': 'Κατηγορία', 'tasks.location.label': 'Πόλη', 'tasks.location.placeholder': 'π.χ. Αθήνα', 'tasks.empty': 'Δεν βρέθηκαν εργασίες', 'tasks.empty.cta': 'Δημοσίευσε την πρώτη', // Task detail 'task.status.open': 'Ανοιχτή', 'task.status.in_progress': 'Σε εξέλιξη', 'task.status.completed': 'Ολοκληρωμένη', 'task.status.cancelled': 'Ακυρωμένη', 'task.status.draft': 'Πρόχειρο', 'task.budget': 'Προϋπολογισμός', 'task.location': 'Τοποθεσία', 'task.deadline': 'Ημερομηνία έναρξης', 'task.created_at': 'Δημιουργήθηκε', 'task.customer': 'Πελάτης', 'task.offer.btn': 'Υποβολή προσφοράς', 'task.invite.banner_title': 'Σας προσκαλούν σε αυτήν την εργασία', 'task.invite.banner_hint': 'Ο πελάτης σας πρόσκαλεσε προσωπικά', 'task.invite.accept': 'Αποστολή προσφοράς', 'task.invite.decline': 'Άρνηση', 'offer.accept': 'Αποδοχή', 'offer.decline': 'Απόρριψη', 'task.complete': 'Ολοκλήρωση εργασίας', 'task.complete.confirm': 'Να ολοκληρωθεί η εργασία;', 'task.edit': 'Επεξεργασία', 'task.status_label': 'Κατάσταση', 'task.yours': 'Η εργασία σου', 'task.offer.yours': 'Η προσφορά σου', 'review.leave': 'Άφησε αξιολόγηση', 'review.rating': 'Βαθμολογία', 'review.comment': 'Σχόλιο', 'review.comment.placeholder': 'Πες μας για την εμπειρία σου...', 'review.submit': 'Υποβολή αξιολόγησης', 'review.submitting': 'Αποστολή...', 'review.done': 'Η αξιολόγηση καταχωρήθηκε!', 'profile.reviews': 'Αξιολογήσεις', 'profile.no_reviews': 'Δεν υπάρχουν αξιολογήσεις ακόμα', 'profile.rating': 'Βαθμολογία', 'profile.skills.label': 'Δεξιότητες', 'profile.member_since': 'Μέλος από', 'task.offers': 'Προσφορές', 'task.offers.none': 'Δεν υπάρχουν ακόμα προσφορές', // Create task 'create.title': 'Δημοσίευση εργασίας', 'create.field.title': 'Τίτλος', 'create.field.description': 'Περιγραφή', 'create.field.category': 'Κατηγορία', 'create.field.category.select': 'Επιλέξτε...', 'create.field.location': 'Τοποθεσία', 'create.field.location.any': 'Οπουδήποτε', 'create.field.location.all': 'Ολόκληρη η πόλη', 'create.field.budget': 'Προϋπολογισμός (€)', 'create.field.deadline': 'Ημερομηνία έναρξης', 'create.field.budget_negotiable': 'Η τιμή είναι διαπραγματεύσιμη', 'create.field.time_slot': 'Χρόνος εκτέλεσης', 'create.field.time_slot.any': 'Οποιαδήποτε', 'create.field.time_slot.morning': 'Πρωινό (08:00–13:00)', 'create.field.time_slot.afternoon': 'Μεσημέρι (13:00–18:00)', 'create.field.time_slot.evening': 'Βράδυ (18:00–22:00)', 'create.field.time_slot.weekend': 'Σαββατοκύριακο', 'create.field.address': 'Διεύθυνση (προαιρετικά)', 'create.field.address.district': 'Συνοικία', 'create.field.address.street': 'Οδός', 'create.field.address.house': 'Αριθμός', 'create.field.confidential': 'Εμπιστευτική σημείωση', 'create.field.confidential.placeholder': 'Λεπτομέρειες που θα δει μόνο ο αναδοχόμενος...', 'create.field.confidential.hint': 'Δεν εμφανίζεται δημόσια', 'create.field.photos': 'Φωτογραφίες', 'create.field.photos.add': 'Προσθήκη φωτογραφίας', 'create.field.photos.uploading': 'Ανέβασμα...', 'task.budget_negotiable': 'Τιμή διαπραγματεύσιμη', 'task.time_slot': 'Χρόνος', 'task.confidential': 'Εμπιστευτική σημείωση', 'create.field.title.placeholder': 'π.χ. Καθαρισμός διαμερίσματος 80τμ', 'create.field.description.placeholder': 'Περίγραψε λεπτομερώς τι χρειάζεσαι...', 'create.field.location.placeholder': 'π.χ. Αθήνα, Κολωνάκι', 'create.field.budget.placeholder': 'π.χ. 100', 'create.submit': 'Δημοσίευση εργασίας', 'create.submitting': 'Δημοσίευση...', // Auth 'login.title': 'Καλωσόρισες', 'login.subtitle': 'Σύνδεση στο CanHelp', 'login.email': 'Email', 'login.password': 'Κωδικός', 'login.submit': 'Σύνδεση', 'login.submitting': 'Σύνδεση...', 'login.error': 'Λάθος email ή κωδικός', 'login.unverified.title': 'Επιβεβαιώστε το email σας', 'login.unverified.desc': 'Στείλαμε σύνδεσμο επαλήθευσης στο email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε το σύνδεσμο.', 'login.unverified.resend': 'Αποστολή νέου email επαλήθευσης', 'login.unverified.sending': 'Αποστολή...', 'login.unverified.sent': '✓ Εστάλη — ελέγξτε τα εισερχόμενα', 'profile.email.verified': 'Email επαληθεύτηκε', 'profile.email.not_verified': 'Email δεν επαληθεύτηκε', 'login.no_account': 'Δεν έχεις λογαριασμό;', 'login.register_link': 'Εγγραφή', 'login.forgot_password': 'Ξέχασα τον κωδικό', 'login.or_continue_with': 'ή συνεχίστε με', 'login.continue_google': 'Σύνδεση με Google', 'forgot.title': 'Ξέχασα τον κωδικό', 'forgot.subtitle': 'Εισάγετε το email σας για να λάβετε σύνδεσμο ανάκτησης', 'forgot.email': 'Email', 'forgot.submit': 'Αποστολή', 'forgot.submitting': 'Αποστολή...', 'forgot.sent.title': 'Ελέγξτε τα εισερχόμενά σας', 'forgot.sent.desc': 'Αν υπάρχει λογαριασμός με αυτό το email, θα σας στείλουμε σύνδεσμο ανάκτησης κωδικού.', 'forgot.back_to_login': 'Επιστροφή στη σύνδεση', 'forgot.error': 'Αποτυχία αποστολής. Ελέγξτε το email σας ή δοκιμάστε ξανά.', 'forgot.error.not_found': 'Δεν βρέθηκε λογαριασμός με αυτό το email.', 'forgot.error.send_failed': 'Αποτυχία αποστολής email. Δοκιμάστε ξανά αργότερα', 'reset.title': 'Νέος κωδικός', 'reset.subtitle': 'Εισάγετε τον νέο σας κωδικό', 'reset.password': 'Νέος κωδικός', 'reset.confirm': 'Επιβεβαίωση κωδικού', 'reset.submit': 'Αλλαγή κωδικού', 'reset.submitting': 'Αποθήκευση...', 'reset.success': 'Ο κωδικός άλλαξε επιτυχώς. Ανακατεύθυνση στη σύνδεση...', 'reset.back_to_login': 'Επιστροφή στη σύνδεση', 'reset.error.mismatch': 'Οι κωδικοί δεν ταιριάζουν', 'reset.error.invalid': 'Μη έγκυρος σύνδεσμος. Παρακαλώ ζητήστε νέο.', 'register.title': 'Εγγραφή', 'register.subtitle': 'Δημιουργία λογαριασμού στο CanHelp', 'register.first_name': 'Όνομα', 'register.last_name': 'Επώνυμο', 'register.email': 'Email', 'register.password': 'Κωδικός (min 8 χαρακτήρες)', 'register.role': 'Ρόλος', 'register.role.customer': 'Χρήστης', 'register.role.customer.desc': 'Δημοσιεύω εργασίες', 'register.role.specialist': 'Ειδικός', 'register.role.specialist.desc': 'Αναλαμβάνω εργασίες', 'register.submit': 'Δημιουργία λογαριασμού', 'register.submitting': 'Εγγραφή...', 'register.has_account': 'Έχεις ήδη λογαριασμό;', 'register.login_link': 'Σύνδεση', 'register.continue_google': 'Εγγραφή με Google', 'register.check_email.title': 'Ελέγξτε το email σας', 'register.check_email.desc': 'Στείλαμε σύνδεσμο επαλήθευσης στη διεύθυνση email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε τον σύνδεσμο.', 'register.check_email.login': 'Επιστροφή στη σύνδεση', // Dashboard 'dashboard.title': 'Πίνακας ελέγχου', 'dashboard.new_task': '+ Νέα εργασία', 'dashboard.my_tasks': 'Οι εργασίες μου', 'dashboard.my_offers': 'Οι προσφορές μου', 'dashboard.invitations': 'Προσκλήσεις για εργασία', 'dashboard.offers_count': 'προσφορές', 'dashboard.declined_count': 'απορρίφθηκαν', 'dashboard.completed_tasks': 'Ολοκληρωμένες εργασίες', 'dashboard.completed_offers': 'Ολοκληρωμένες προσφορές', 'dashboard.review_pending': 'Η αξιολόγηση δεν έχει υποβληθεί ακόμα', 'tasks.new.top_specialists': 'Κορυφαίοι ειδικοί', 'tasks.new.select_category': 'Επιλέξτε κατηγορία για να δείτε ειδικούς', 'tasks.new.invite': 'Πρόσκληση', 'tasks.new.invited': 'Επιλέχθηκε ✓', 'reviews.count': 'αξιολογήσεις', 'filter.location': 'Τοποθεσία', 'filter.language': 'Γλώσσες', 'filter.language.any': 'Οποιαδήποτε γλώσσα', 'filter.category.all': 'Όλες οι κατηγορίες', 'user.categories': 'Κατηγορίες', 'user.work_area': 'Περιοχή εργασίας', 'dashboard.tasks.empty': 'Δεν έχεις δημοσιεύσει εργασίες', 'dashboard.tasks.empty.cta': 'Δημοσίευσε την πρώτη σου', 'dashboard.tasks.add_new': 'Πρόσθεσε νέα εργασία', 'dashboard.offers.empty': 'Δεν έχεις υποβάλλει προσφορές', 'dashboard.offers.empty.cta': 'Βρες εργασίες', 'dashboard.customer.specialists_title': 'Ψάχνεις εκτελεστή;', 'dashboard.customer.specialists_hint': 'Δες προφίλ ειδικών, διάβασε αξιολογήσεις και κάλεσέ τους στις εργασίες σου', 'dashboard.customer.specialists_cta': 'Βρες ειδικό', 'dashboard.customer.how_title': 'Πώς λειτουργεί', 'dashboard.customer.step1': 'Δημιούργησε εργασία με περιγραφή και προϋπολογισμό', 'dashboard.customer.step2': 'Οι ειδικοί θα στείλουν προσφορές με τιμή και χρόνο', 'dashboard.customer.step3': 'Επίλεξε τον κατάλληλο και ξεκίνα τη συνεργασία', // Notifications 'notif.title': 'Ειδοποιήσεις', 'notif.mark_all': 'Σήμανση όλων ως αναγνωσμένα', 'notif.empty': 'Δεν υπάρχουν ειδοποιήσεις', 'notif.type.new_offer': 'Νέα προσφορά', 'notif.type.offer_accepted': 'Η προσφορά σας έγινε δεκτή', 'notif.type.offer_declined': 'Η προσφορά σας απορρίφθηκε', 'notif.type.task_completed': 'Η εργασία ολοκληρώθηκε', 'notif.type.task_cancelled': 'Η εργασία ακυρώθηκε', 'notif.type.new_message': 'Νέο μήνυμα', 'notif.type.new_review': 'Νέα αξιολόγηση', 'notif.type.task_invite': 'Πρόσκληση σε εργασία', 'notif.body.new_offer': 'Νέα προσφορά για «{title}»', 'notif.body.offer_accepted': 'Η προσφορά σας για «{title}» έγινε δεκτή', 'notif.body.offer_declined': 'Η προσφορά σας για «{title}» απορρίφθηκε', 'notif.body.task_invite': 'Σας προσκαλούν για «{title}»', 'notif.body.new_review': 'Λάβατε αξιολόγηση {rating}★', // Offer status 'offer.status.pending': 'Εκκρεμεί', 'offer.status.accepted': 'Αποδεκτή', 'offer.status.declined': 'Απορρίφθηκε', 'offer.status.withdrawn': 'Αποσύρθηκε', 'offer.status.other_accepted': 'Επιλέχθηκε άλλος ειδικός', // Common 'common.loading': 'Φόρτωση...', 'common.error': 'Σφάλμα', 'common.save': 'Αποθήκευση', 'common.saving': 'Αποθήκευση...', 'common.cancel': 'Ακύρωση', 'common.add': 'Προσθήκη', 'common.close': 'Κλείσιμο', 'common.edit': 'Επεξεργασία', 'common.delete': 'Διαγραφή', 'common.from': 'από', 'common.currency': '€', 'common.greece': 'Ελλάδα', // Chat 'chat.connected': 'Συνδεδεμένος', 'chat.disconnected': 'Αποσυνδεδεμένος', 'chat.no_rooms': 'Δεν υπάρχουν συνομιλίες ακόμα', 'chat.task_fallback': 'Εργασία', 'chat.select': 'Επίλεξε συνομιλία', 'chat.no_messages': 'Δεν υπάρχουν μηνύματα', 'chat.placeholder': 'Γράψε μήνυμα... (Enter για αποστολή)', 'chat.conversation_fallback': 'Συνομιλία', 'chat.direct_chat': 'Απευθείας συνομιλία', 'chat.linked_task': 'Συνδεδεμένη εργασία', 'chat.write_btn': 'Μήνυμα', 'chat.just_now': 'μόλις τώρα', 'chat.min_ago': 'λ', 'chat.write_specialist': 'Γράψε στον ειδικό', 'chat.write_customer': 'Γράψε στον πελάτη', 'chat.notif_settings': 'Ρυθμίσεις ειδοποιήσεων', 'chat.notif_messages': 'Ειδοποιήσεις για νέα μηνύματα', 'chat.toast_title': 'Νέο μήνυμα', 'chat.toast_open': 'Άνοιγμα συνομιλίας', // Offer form 'offer.price': 'Τιμή', 'offer.price.placeholder': 'π.χ. 80', 'offer.customer_budget': 'Προϋπολογισμός πελάτη', 'offer.message': 'Μήνυμα', 'offer.optional': 'προαιρετικό', 'offer.message.placeholder': 'Παρουσίασε τον εαυτό σου, την εμπειρία σου και γιατί είσαι η καλύτερη επιλογή...', 'offer.submitting': 'Αποστολή...', // Profile 'profile.photo': 'Φωτογραφία προφίλ', 'profile.photo.change': 'Αλλαγή φωτογραφίας', 'profile.photo.hint': 'JPEG, PNG, WebP · έως 5MB', 'profile.basic_info': 'Βασικά στοιχεία', 'profile.phone': 'Τηλέφωνο', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Σύντομη περιγραφή', 'profile.bio.placeholder': 'Πες μας λίγα λόγια για εσένα...', 'profile.language': 'Γλώσσα', 'profile.language.hint': 'Γλώσσα διεπαφής και email ειδοποιήσεων', 'profile.languages': 'Γλώσσες επικοινωνίας', 'profile.languages.hint': 'Επιλέξτε όλες τις γλώσσες που μιλάτε', 'profile.skills': 'Δεξιότητες', 'profile.skills.subtitle': 'Προσθέσε τις υπηρεσίες που προσφέρεις', 'profile.skills.placeholder': 'π.χ. Καθαρισμός, IT, Μαθήματα...', 'profile.role': 'Ρόλος λογαριασμού', 'profile.role.specialist': '🔧 Ειδικός', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 Χρήστης', 'profile.role.change': 'Για αλλαγή ρόλου επικοινωνήστε με την υποστήριξη.', 'profile.become_specialist': 'Γίνε Ειδικός', 'profile.become_specialist.desc': 'Αναβαθμίσου σε Ειδικό για να δέχεσαι εργασίες και να δημιουργήσεις το προφίλ σου.', 'become_specialist.hero.title': 'Κέρδισε χρήματα κάνοντας αυτό που ξέρεις', 'become_specialist.hero.subtitle': 'Δημιούργησε προφίλ ειδικού και λάβε παραγγελίες από πελάτες σε όλη την Ελλάδα', 'become_specialist.how.title': 'Πώς λειτουργεί', 'become_specialist.step1.title': 'Δημιούργησε κάρτα ειδικού', 'become_specialist.step1.desc': 'Δήλωσε κατηγορίες, δεξιότητες και περιοχές κάλυψης — το σύστημα θα βρει τις κατάλληλες εργασίες για σένα αυτόματα', 'become_specialist.step2.title': 'Βρες εργασίες', 'become_specialist.step2.desc': 'Ανακάλυψε εργασίες στις κατηγορίες σου στην ενότητα «Αναζήτηση εργασιών»', 'become_specialist.step3.title': 'Στείλε προσφορά & κέρδισε', 'become_specialist.step3.desc': 'Υποβάλε προσφορές με τιμή και χρόνο, επικοινωνήσε με πελάτες και ολοκλήρωσε εργασίες', 'become_specialist.benefits.title': 'Πλεονεκτήματα προφίλ ειδικού', 'become_specialist.benefit1': 'Αναζήτηση εργασιών ανά κατηγορία και τοποθεσία', 'become_specialist.benefit2': 'Δημόσιο προφίλ με αξιολογήσεις πελατών', 'become_specialist.benefit3': 'Πρόγραμμα διαθεσιμότητας ορατό στους πελάτες', 'become_specialist.benefit4': 'Προσθήκη σε αγαπημένα από πελάτες', 'become_specialist.cta': 'Γίνε Ειδικός — είναι δωρεάν', 'become_specialist.free_badge': 'Δωρεάν εγγραφή', 'profile.tab.notifications': 'Ειδοποιήσεις', 'profile.tab.reviews': 'Αξιολογήσεις', 'profile.tab.referral': 'Παραπομπές', 'profile.tab.auto_response': 'Αυτόματη απάντηση', 'profile.tab.site': 'Site', 'profile.site.title': 'Προσωπική σελίδα', 'profile.site.url_label': 'Προσωπικό site', 'profile.site.copy': 'Αντιγραφή', 'profile.site.copied': 'Αντιγράφηκε', 'profile.site.visible_title': 'Τι εμφανίζεται στη σελίδα σας', 'profile.site.visible.name': 'Όνομα και φωτογραφία', 'profile.site.visible.bio': 'Βιογραφικό', 'profile.site.visible.rating': 'Αξιολόγηση και κριτικές', 'profile.site.visible.portfolio': 'Χαρτοφυλάκιο / Κάρτες', 'profile.site.visible.contacts': 'Στοιχεία επικοινωνίας', 'profile.site.visible.full_last_name': 'Πλήρες επώνυμο', 'profile.site.visible.services': 'Κάρτες υπηρεσιών', 'profile.site.visible.reviews': 'Ενότητα κριτικών', 'profile.site.visible.status': 'Κατάσταση «Έτοιμος να βοηθήσω»', 'profile.site.theme': 'Θέμα εμφάνισης', 'profile.site.theme.dark': 'Σκοτεινό', 'profile.site.theme.light': 'Φωτεινό', 'profile.site.slug_taken': 'Αυτή η διεύθυνση είναι ήδη κατειλημμένη', 'profile.site.stats.title': 'Στατιστικά επισκεψιμότητας', 'profile.site.stats.days': 'τελευταίες 30 ημέρες', 'profile.site.stats.views': 'Προβολές', 'profile.site.stats.unique': 'Μοναδικοί επισκέπτες', 'profile.site.stats.messages': 'Μηνύματα', 'profile.site.stats.total_views': 'Συνολικές προβολές', 'profile.site.stats.total_unique': 'Μοναδικοί επισκέπτες', 'profile.site.stats.total_messages': 'Μηνύματα', 'profile.site.stats.empty': 'Δεν υπάρχουν δεδομένα ακόμη', 'profile.site.stats.loading': 'Φόρτωση στατιστικών...', 'profile.site.stats.no_slug': 'Ορίστε τη διεύθυνση του site για να δείτε στατιστικά', 'profile.site.edit_bio_hint': 'Το βιογραφικό και η φωτογραφία ρυθμίζονται στην καρτέλα «Βασικά».', 'status.can_help_now_hint': 'Η κάρτα σου εμφανίζεται ψηλότερα', 'status.need_help_hint': 'Οι ειδικοί μπορούν να σε βοηθήσουν', 'profile.referral.title': 'Πρόγραμμα παραπομπών', 'profile.referral.desc': 'Μοιράσου τον σύνδεσμο σου και κέρδισε ανταμοιβές για κάθε νέο χρήστη.', 'profile.referral.link_label': 'Ο σύνδεσμος παραπομπής σου', 'profile.referral.copy': 'Αντιγραφή', 'profile.referral.copied': 'Αντιγράφηκε!', 'profile.referral.invited_count': 'επιτυχείς παραπομπές', 'profile.referral.no_code': 'Ο κωδικός παραπομπής δεν είναι διαθέσιμος.', 'notifications.title': 'Ρυθμίσεις ειδοποιήσεων', 'notifications.email.new_tasks': 'Email για νέες εργασίες', 'notifications.email.new_tasks.desc': 'Λάβε email όταν δημοσιευτεί νέα εργασία στις κατηγορίες σου', 'notifications.messages.desc': 'Λαμβάνεις ειδοποίηση όταν έρθει νέο μήνυμα', 'notifications.saved': 'Ρυθμίσεις αποθηκεύτηκαν', 'notifications.plan_required': 'Συνδρομή απαιτείται για αυτή τη λειτουργία', 'profile.tab.info': 'Βασικά στοιχεία', 'profile.tab.finance': 'Οικονομικά', 'profile.tab.skills': 'Δεξιότητες', 'profile.tab.categories': 'Κατηγορίες', 'profile.tab.geography': 'Γεωγραφία', 'profile.specialist.categories': 'Κατηγορίες εργασιών', 'profile.specialist.categories.desc': 'Επίλεξε τις κατηγορίες στις οποίες εργάζεσαι', 'profile.specialist.geography': 'Περιοχές κάλυψης', 'profile.specialist.geography.desc': 'Επίλεξε τις πόλεις / περιοχές όπου δραστηριοποιείσαι', 'profile.saving': 'Αποθήκευση...', 'profile.upload.error': 'Σφάλμα κατά την αναφόρτωση', 'profile.saved': 'Αποθηκεύτηκε', 'profile.tab.cards': 'Χαρτοφυλάκιο', 'profile.cards.count': 'Χαρτοφυλάκια', 'profile.cards.add': 'Νέο χαρτοφυλάκιο', 'profile.cards.new_title': 'Τίτλος νέου χαρτοφυλακίου', 'profile.cards.placeholder': 'π.χ. Υδραυλικά', 'profile.cards.create': 'Δημιουργία', 'profile.cards.cancel': 'Ακύρωση', 'profile.cards.empty': 'Δεν έχετε χαρτοφυλάκιο', 'profile.cards.create_first': 'Δημιουργήστε το πρώτο σας χαρτοφυλάκιο', 'profile.cards.delete_confirm': 'Διαγραφή χαρτοφυλακίου;', 'profile.card.tab.main': 'Γενικά', 'profile.card.tab.skills': 'Δεξιότητες', 'profile.card.tab.categories': 'Κατηγορίες', 'profile.card.tab.geography': 'Γεωγραφία', 'profile.card.tab.portfolio': 'Γκαλερί', 'profile.card.active': 'Ενεργή', 'profile.card.save': 'Αποθήκευση', 'profile.card.saved': 'Αποθηκεύτηκε', 'profile.card.delete': 'Διαγραφή', 'profile.card.skill.add': 'Προσθήκη δεξιότητας', 'profile.card.photo.add': 'Προσθήκη φωτογραφίας', 'profile.card.photo.uploading': 'Μεταφόρτωση...', 'profile.card.photo.empty': 'Δεν υπάρχουν φωτογραφίες', 'profile.card.item.title': 'Τίτλος', 'profile.card.item.desc': 'Περιγραφή', 'profile.card.item.save': 'Αποθήκευση', 'profile.card.item.cancel': 'Ακύρωση', 'profile.card.item.edit': 'Επεξεργασία', 'profile.upgrade.cards_limit': 'Όριο χαρτοφυλακίων εξαντλήθηκε', 'profile.upgrade.plan': 'Τρέχον πλάνο:', 'profile.upgrade.contact': 'Επικοινωνήστε με τον διαχειριστή για αλλαγή πλάνου', 'profile.upgrade.ok': 'Εντάξει', 'profile.plan.title': 'Πλάνο συνδρομής', 'profile.balance': 'Υπόλοιπο', 'profile.balance.topup': 'Αναπλήρωση υπολοίπου', 'profile.balance.topup.title': 'Αναπλήρωση υπολοίπου', 'profile.balance.topup.amount': 'Ποσό (σε EUR)', 'profile.balance.topup.hint': 'Επιλέξτε ποσό ή εισαγάγετε μανούαλα', 'profile.balance.topup.submit': 'Πληρωμή', 'profile.balance.topup.loading': 'Ρεδιρεκτάρισμα...', 'profile.balance.topup.error': 'Σφάλμα μετάβασης στην πληρωμή. Προσπαθήστε ξανά.', 'payment.success.title': 'Πληρωμή επιτυχής!', 'payment.success.desc': 'Το υπόλοιπό σας ενημερώθηκε.', 'payment.cancelled.title': 'Ακύρωση πληρωμής', 'payment.cancelled.desc': 'Η πληρωμή ακυρώθηκε. Κανένα χρήμα δεν χρεώθηκε.', 'payment.pending.title': 'Σε εξέλιξη...', 'payment.pending.desc': 'Επεξεργαζόμαστε την πληρωμή σας.', 'payment.back_to_profile': 'Επιστροφή στο προφίλ', 'profile.plan.basic': 'Βασικό (δωρεάν)', 'profile.plan.contact_upgrade': 'Επικοινωνήστε με τον διαχειριστή για αναβάθμιση', 'profile.plan.cards_up_to': 'Χαρτοφυλάκια: έως', 'profile.plan.cards_unlimited': 'Χαρτοφυλάκια: απεριόριστα', 'profile.plan.tasks_up_to': 'Εργασίες: έως', 'profile.plan.offers_up_to': 'Προσφορές: έως', 'profile.plan.valid_until': 'Ισχύει έως', 'profile.plan.no_expiry': 'Δεν λήγει', // Create task 'create.error': 'Σφάλμα κατά τη δημοσίευση', // Tasks list extras 'tasks.category.general': 'Γενικά', 'tasks.budget.range': 'Εύρος:', 'tasks.budget.from': 'από', 'tasks.budget.to': 'έως', 'tasks.filter.reset': 'Εκκαθάριση φίλτρων', 'tasks.load_more': 'Φόρτωση ακόμα', 'tasks.showing': 'Αποτελέσματα:', 'tasks.field.budget': 'Προϋπολογισμός, €', // Admin 'admin.title': 'Πίνακας Διαχείρισης', 'admin.tab.stats': 'Στατιστικά', 'admin.tab.users': 'Χρήστες', 'admin.tab.tasks': 'Εργασίες', 'admin.tab.reports': 'Αναφορές', 'admin.stats.users': 'Χρήστες', 'admin.stats.tasks': 'Εργασίες', 'admin.stats.offers': 'Προσφορές', 'admin.stats.reviews': 'Αξιολογήσεις', 'admin.tasks.by_status': 'Εργασίες ανά κατάσταση', 'admin.col.user': 'Χρήστης', 'admin.col.email': 'Email', 'admin.col.role': 'Ρόλος', 'admin.col.registered': 'Εγγραφή', 'admin.col.status': 'Κατάσταση', 'admin.col.title': 'Τίτλος', 'admin.col.budget': 'Προϋπολογισμός', 'admin.col.created': 'Δημιουργία', 'admin.users.active': 'Ενεργός', 'admin.users.inactive': 'Ανενεργός', 'admin.users.deactivate': 'Απενεργοποίηση', 'admin.users.activate': 'Ενεργοποίηση', 'admin.tasks.cancel': 'Ακύρωση', 'admin.reports.none': 'Δεν υπάρχουν αναφορές', 'admin.reports.reviewed': 'Αναθεωρήθηκε', 'admin.reports.dismiss': 'Απόρριψη', 'admin.pagination.total': 'Σύνολο', 'admin.users.role.change': 'Αλλαγή ρόλου', 'admin.users.search.placeholder': 'Αναζήτηση ονόματος ή email...', 'admin.tasks.delete': 'Διαγραφή', 'admin.tasks.delete.confirm': 'Διαγραφή αυτής της εργασίας μόνιμα;', 'admin.tasks.search.placeholder': 'Αναζήτηση τίτλου...', 'admin.col.customer': 'Πελάτης', 'admin.col.reporter': 'Καταγγέλλων', 'admin.col.target': 'Στόχος', 'admin.filter.all_roles': 'Όλοι οι ρόλοι', 'admin.filter.all_statuses': 'Όλες οι καταστάσεις', 'admin.reports.target.task': 'Εργασία', 'admin.reports.target.user': 'Χρήστης', 'admin.tab.categories': 'Κατηγορίες', 'admin.tab.locations': 'Πόλεις & Περιοχές', 'admin.tab.logs': 'Αρχεία', 'admin.tab.plans': 'Πακέτα', 'admin.tab.settings': 'Ρυθμίσεις', 'admin.logs.subtab.ai': 'AI Logs', 'admin.logs.subtab.activity': 'Δραστηριότητα', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Ειδοποιήσεις', 'admin.notif_logs.type': 'Τύπος', 'admin.notif_logs.title': 'Τίτλος', 'admin.notif_logs.read': 'Διαβασμένο', 'admin.notif_logs.empty': 'Δεν υπάρχουν αρχεία ειδοποιήσεων', 'admin.stats.notif_chart_title': 'Ειδοποιήσεις ανά ημέρα', 'admin.stats.notif_label': 'Ειδοποιήσεις', 'admin.stats.mail_chart_title': 'Emails ανά ημέρα', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'Όλα', 'admin.stats.specialists': 'Ειδικοί', 'admin.col.plan': 'Πακέτο', 'admin.back_home': 'Αρχική', 'admin.plans.title': 'Πακέτα συνδρομής', 'admin.plans.add': '+ Νέο πακέτο', 'admin.plans.empty': 'Δεν υπάρχουν πακέτα', 'admin.plans.form.new': 'Νέο πακέτο', 'admin.plans.form.edit': 'Επεξεργασία πακέτου', 'admin.plans.form.name': 'Όνομα', 'admin.plans.form.price': 'Τιμή (EUR)', 'admin.plans.form.old_price': 'Παλιά τιμή (EUR, προαιρετικό)', 'admin.plans.form.max_offers': 'Μέγ. προσφορές (κενό = χωρίς όριο)', 'admin.plans.form.max_cards': 'Μέγ. χαρτοφυλάκιο (κενό = χωρίς όριο)', 'admin.plans.form.duration_days': 'Διάρκεια (ημέρες, κενό = χωρίς λήξη)', 'admin.plans.form.description': 'Περιγραφή', 'admin.plans.form.features': 'Δυνατότητες (μία ανά γραμμή)', 'admin.plans.form.notify': 'Ειδοποιήσεις νέων εργασιών', 'admin.plans.form.default': 'Προεπιλογή', 'admin.plans.form.active': 'Ενεργό', 'admin.plans.form.order': 'Σειρά', 'admin.plans.form.role': 'Ρόλος', 'admin.plans.form.tier': 'Επίπεδο', 'admin.plans.form.role.customer': 'Πελάτης', 'admin.plans.form.role.specialist': 'Ειδικός', 'admin.plans.form.tier.free': 'Δωρεάν', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Όρια (κενό = χωρίς όριο)', 'admin.plans.form.max_messages_day': 'Μέγ. μηνύματα/ημέρα', 'admin.plans.form.max_orders_day': 'Μέγ. παραγγελίες/ημέρα', 'admin.plans.form.max_skills': 'Μέγ. δεξιότητες', 'admin.plans.form.max_profiles': 'Μέγ. προφίλ', 'admin.plans.form.max_portfolio': 'Μέγ. στοιχεία χαρτοφυλακίου', 'admin.plans.form.section.boost': 'Πολλαπλασιαστές & Ενίσχυση', 'admin.plans.form.search_boost': 'Ενίσχυση αναζήτησης', 'admin.plans.form.offers_multiplier': 'Πολλαπλασιαστής προσφορών', 'admin.plans.form.section.contact': 'Δικαιώματα επικοινωνίας', 'admin.plans.form.can_contact_free': 'Επικοινωνία με δωρεάν χρήστες', 'admin.plans.form.can_contact_pro': 'Επικοινωνία με Pro χρήστες', 'admin.plans.form.can_contact_all': 'Επικοινωνία με όλους', 'admin.plans.form.can_show_contact': 'Εμφάνιση στοιχείων επικοινωνίας', 'admin.plans.form.can_view_phone': 'Προβολή τηλεφώνου', 'admin.plans.form.section.features': 'Λειτουργίες', 'admin.plans.form.upload_video': 'Μεταφόρτωση βίντεο', 'admin.plans.form.favorites': 'Αγαπημένα', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Σήμα επαλήθευσης', 'admin.plans.form.highlighted_reviews': 'Προβεβλημένες κριτικές', 'admin.plans.form.personal_site': 'Προσωπική σελίδα', 'admin.plans.form.can_help_now': 'Κατάσταση «Μπορώ να βοηθήσω»', 'admin.plans.form.need_help': 'Κατάσταση «Χρειάζομαι βοήθεια»', 'admin.plans.form.auto_response': 'Αυτόματη απάντηση', 'admin.plans.form.auto_match': 'Αυτόματη αντιστοίχιση', 'admin.plans.form.instant_dispatch_free': 'Άμεση αποστολή (δωρεάν)', 'admin.plans.form.instant_dispatch_pro': 'Άμεση αποστολή (Pro)', 'admin.plans.badge.default': 'Προεπιλογή', 'admin.plans.badge.inactive': 'Ανενεργό', 'admin.plans.make_default': 'Ορισμός ως προεπιλογή', 'admin.plans.tasks': 'Εργασίες', 'admin.plans.offers': 'Προσφορές', 'admin.plans.cards': 'Χαρτοφυλάκιο', 'admin.plans.notify_tasks': 'Ειδοποιήσεις εργασιών', 'admin.plans.delete.confirm': 'Διαγραφή πακέτου', 'admin.activity.title': 'Αρχείο δραστηριότητας', 'admin.activity.event': 'Γεγονός', 'admin.activity.all_events': 'Όλα τα γεγονότα', 'admin.activity.from': 'Από', 'admin.activity.to': 'Έως', 'admin.activity.reset': 'Επαναφορά', 'admin.activity.total': 'Σύνολο', 'admin.activity.empty': 'Δεν υπάρχουν εγγραφές', 'admin.mail.event': 'Συμβάν email', 'admin.mail.all_events': 'Όλα τα email συμβάντα', 'admin.mail.from': 'Από', 'admin.mail.to': 'Έως', 'admin.mail.reset': 'Επαναφορά', 'admin.mail.total': 'Σύνολο', 'admin.mail.empty': 'Δεν υπάρχουν email logs', 'admin.mail.recipient': 'Παραλήπτης', 'admin.mail.provider': 'Πάροχος', 'admin.mail.details': 'Λεπτομέρειες', 'admin.mail.status': 'Κατάσταση', 'admin.mail.success': 'Επιτυχία', 'admin.mail.failed': 'Σφάλμα', 'admin.event.email_sent': 'Email sent', 'admin.event.email_failed': 'Email failed', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Admin test email sent', 'admin.event.admin_email_test_failed': 'Admin test email failed', 'admin.logs.empty': 'Δεν υπάρχουν εγγραφές', 'admin.logs.date': 'Ημερομηνία', 'admin.logs.provider': 'Πάροχος', 'admin.logs.model': 'Μοντέλο', 'admin.logs.action': 'Ενέργεια', 'admin.logs.langs': 'Γλώσσες', 'admin.logs.in': 'Είσοδος', 'admin.logs.out': 'Έξοδος', 'admin.logs.total': 'Σύνολο', 'admin.logs.ms': 'ms', 'admin.logs.status': 'Κατάσταση', 'admin.stats.activity_30d': 'Δραστηριότητα 30 ημερών', 'admin.stats.tasks_label': 'Εργασίες', 'admin.stats.users_label': 'Χρήστες', 'admin.stats.specialists_label': 'Ειδικοί', 'admin.stats.tokens_title': 'Χρήση tokens (ανά μήνα)', 'admin.stats.tokens_out': 'Εξερχόμενα', 'admin.stats.tokens_in': 'Εισερχόμενα', 'admin.stats.tokens_out_label': 'Εξερχόμενα tokens', 'admin.stats.tokens_in_label': 'Εισερχόμενα tokens', 'admin.stats.cost_label': 'Κόστος (USD)', 'admin.stats.tasks_by_status': 'Εργασίες ανά κατάσταση', 'admin.task_status.open': 'Ανοιχτές', 'admin.task_status.in_progress': 'Σε εξέλιξη', 'admin.task_status.completed': 'Ολοκληρωμένες', 'admin.task_status.cancelled': 'Ακυρωμένες', 'admin.task_status.draft': 'Προσχέδια', 'admin.settings.tab.general': 'Γενικά', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Ειδοποιήσεις', 'admin.settings.tab.payment': 'Πληρωμή', 'admin.settings.tab.referral': 'Παραπομπές', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO & Συντήρηση', 'admin.settings.seo.maintenance_label': 'Λειτουργία συντήρησης', 'admin.settings.seo.maintenance_hint': 'Εμφάνιση σελίδας συντήρησης σε όλους τους επισκέπτες', 'admin.settings.seo.indexing_label': 'Ευρετηρίαση από μηχανές αναζήτησης', 'admin.settings.seo.indexing_hint': 'Επιτρέπει στις μηχανές αναζήτησης να ευρετηριάσουν τον ιστότοπο', 'admin.settings.seo.head_scripts_label': 'Scripts στο (JS)', 'admin.settings.seo.head_scripts_hint': 'Εκτελείται σε κάθε σελίδα (Google Tag Manager, analytics κ.λπ.)', 'admin.settings.seo.site_title_label': 'Τίτλος ιστότοπου', 'admin.settings.seo.site_description_label': 'Περιγραφή ιστότοπου (meta description)', 'admin.settings.referral.title': 'Πρόγραμμα παραπομπών', 'admin.settings.referral.hint': 'Επιβράβευσε χρήστες που φέρνουν νέους εγγεγραμμένους.', 'admin.settings.referral.enabled_label': 'Ενεργό', 'admin.settings.referral.enabled_hint': 'Ενεργοποίηση / απενεργοποίηση εφαρμογής ανταμοιβών', 'admin.settings.referral.customer_section': 'Για πελάτες', 'admin.settings.referral.specialist_section': 'Για ειδικούς', 'admin.settings.referral.plan_label': 'Πλάνο ανταμοιβής', 'admin.settings.referral.no_plan': '— χωρίς πλάνο —', 'admin.settings.referral.plan_hint': 'Αυτό το πλάνο θα ανατεθεί στον χρήστη που έφερε νέους. Εάν το τρέχον πλάνο του είναι υψηλότερο, θα προστεθούν μόνο οι μέρες.', 'admin.settings.referral.days_label': 'Ημέρες ανταμοιβής', 'admin.settings.referral.days_hint': 'Αριθμός ημερών που θα προστεθούν στη λήξη του πλάνου.', 'admin.settings.general.title': 'Γενικές ρυθμίσεις', 'admin.settings.general.site_name': 'Όνομα ιστότοπου', 'admin.settings.general.site_url': 'URL ιστότοπου', 'admin.settings.general.contact_email': 'Email επικοινωνίας', 'admin.settings.general.support_phone': 'Τηλέφωνο υποστήριξης', 'admin.settings.smtp.title': 'Ρυθμίσεις SMTP', 'admin.settings.smtp.hint': 'Χρησιμοποιείται για αποστολή ειδοποιήσεων email.', 'admin.settings.smtp.host': 'SMTP Host', 'admin.settings.smtp.port': 'Θύρα', 'admin.settings.smtp.encryption': 'Κρυπτογράφηση', 'admin.settings.smtp.enc.none': 'Χωρίς', 'admin.settings.smtp.enc.tls': 'STARTTLS (θύρα 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (θύρα 465)', 'admin.settings.smtp.username': 'Όνομα χρήστη', 'admin.settings.smtp.password': 'Κωδικός / App Password', 'admin.settings.smtp.from_name': 'Όνομα αποστολέα', 'admin.settings.smtp.from_email': 'Email αποστολέα', 'admin.settings.smtp.test': 'Αποστολή δοκιμαστικού email', 'admin.settings.smtp.sending': 'Αποστολή...', 'admin.settings.payment.hint': 'Τα στοιχεία για ePay Piraeus Bank.', 'admin.settings.env.test': 'Δοκιμαστικό (sandbox)', 'admin.settings.env.prod': 'Παραγωγή', 'admin.settings.env.label': 'Περιβάλλον', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Ενεργό', 'admin.settings.saving': 'Αποθήκευση...', 'admin.settings.saved': '✓ Αποθηκεύτηκε', 'admin.notif.vars_hint': 'Διαθέσιμες μεταβλητές στα πρότυπα', 'admin.notif.tmpl.not_set': 'Πρότυπο δεν έχει οριστεί', 'admin.notif.tmpl.subject_label': 'Θέμα email', 'admin.notif.tmpl.body_label': 'Κείμενο email (HTML)', 'admin.notif.tmpl.save': 'Αποθήκευση', 'admin.notif.tmpl.close': 'Κλείσιμο', 'admin.notif.tmpl.translate': 'Αυτόματη μετάφραση', 'admin.notif.tmpl.translating': 'Μετάφραση...', 'admin.notif.tmpl.saving': 'Αποθήκευση...', 'admin.notif.email_verification': 'Επαλήθευση email', 'admin.notif.registration_success': 'Επιτυχής εγγραφή', 'admin.notif.password_reset': 'Επαναφορά κωδικού', 'admin.notif.new_offer': 'Νέα προσφορά', 'admin.notif.new_task': 'Νέα εργασία', 'admin.notif.offer_accepted': 'Προσφορά αποδεκτή', 'admin.notif.new_message': 'Νέο μήνυμα', 'admin.notif.offer_declined': 'Απόρριψη προσφοράς', 'admin.notif.offer_other_accepted': 'Επιλέχθηκε άλλος ειδικός', 'admin.notif.task_updated': 'Ενημέρωση εργασίας', 'admin.notif.deadline_reminder': 'Υπενθύμιση προθεσμίας', 'admin.notif.task_archived': 'Αυτόματη απόσυρση εργασίας', 'admin.notif.referral_reward': 'Ανταμοιβή παραπομπής', // Plan lifecycle email templates 'admin.email_template.plan_activated': 'Τιμολόγιο — ενεργοποίηση πλάνου', 'admin.email_template.plan_upgraded': 'Τιμολόγιο — αναβάθμιση πλάνου', 'admin.email_template.plan_downgrade_scheduled': 'Τιμολόγιο — προγραμματισμένη υποβάθμιση', 'admin.email_template.plan_downgrade_applied': 'Τιμολόγιο — εφαρμογή υποβάθμισης', 'admin.email_template.plan_renewal_reminder': 'Τιμολόγιο — υπενθύμιση ανανέωσης', 'admin.email_template.plan_insufficient_funds': 'Τιμολόγιο — ανεπαρκές υπόλοιπο', // Pricing confirm modal 'pricing.confirm.title': 'Επιβεβαίωση επιλογής πλάνου', 'pricing.confirm.plan': 'Πλάνο', 'pricing.confirm.prorated': 'Αναλογική έκπτωση', 'pricing.confirm.effective_price': 'Προς πληρωμή', 'pricing.confirm.your_balance': 'Το υπόλοιπό σας', 'pricing.confirm.downgrade_info': 'Η μετάβαση στο νέο πλάνο θα γίνει αυτόματα μετά τη λήξη της τρέχουσας περιόδου.', 'pricing.confirm.insufficient': 'Ανεπαρκές υπόλοιπο.', 'pricing.confirm.top_up': 'Ανανέωση', 'pricing.confirm.schedule_downgrade': 'Προγραμματισμός μετάβασης', 'pricing.confirm.pay': 'Πληρωμή', 'admin.user_edit.title': 'Επεξεργασία χρήστη', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Εγγραφή', 'admin.user_edit.last_seen': 'Τελευταία σύνδεση', 'admin.user_edit.lang': 'Γλώσσα', 'admin.user_edit.first_name': 'Όνομα', 'admin.user_edit.last_name': 'Επώνυμο', 'admin.user_edit.phone': 'Τηλέφωνο', 'admin.user_edit.bio': 'Βιογραφικό', 'admin.user_edit.role': 'Ρόλος', 'admin.user_edit.plan': 'Πακέτο', 'admin.user_edit.no_plan': '— Χωρίς πακέτο —', 'admin.user_edit.active': 'Ενεργός λογαριασμός', 'admin.user_edit.balance': 'Υπόλοιπο (EUR)', 'admin.user_edit.skills': 'Δεξιότητες', 'admin.user_edit.tab.profile': 'Προφίλ', 'admin.user_edit.tab.account': 'Λογαριασμός', 'admin.user_edit.tab.balance': 'Υπόλοιπο', 'admin.user_edit.tab.settings': 'Ρυθμίσεις', 'admin.user_edit.tab.specialist': 'Χαρτοφυλάκιο', 'admin.user_edit.tab.site': 'Ιστοσελίδα', 'admin.user_edit.plan_expires': 'Λήξη πλάνου', 'admin.user_edit.interface_lang': 'Γλώσσα διεπαφής', 'admin.user_edit.comm_languages': 'Γλώσσες επικοινωνίας', 'admin.user_edit.personal_site_slug': 'Προσωπική σελίδα', 'admin.user_edit.show_contact_info': 'Εμφάνιση στοιχείων επικοινωνίας', 'admin.user_edit.show_contact_info.hint': 'Ορατό στους πελάτες', 'admin.user_edit.notify_new_tasks': 'Ειδοποίηση για νέες εργασίες', 'admin.user_edit.notify_new_tasks.hint': 'Push και email ειδοποιήσεις', 'admin.user_edit.notif_messages': 'Ειδοποιήσεις μηνυμάτων', 'admin.user_edit.notif_messages.hint': 'Νέα μηνύματα στη συνομιλία', 'admin.user_edit.site_settings': 'Ρυθμίσεις προσωπικής σελίδας', 'admin.user_edit.categories': 'Κατηγορίες υπηρεσιών', 'admin.user_edit.locations': 'Περιοχές εξυπηρέτησης', 'admin.user_edit.skill_placeholder': 'Νέα δεξιότητα...', 'admin.user_edit.add_category': '— Επιλέξτε κατηγορία —', 'admin.user_edit.add_location': '— Επιλέξτε περιοχή —', 'admin.user_edit.specialist_cards': 'Χαρτοφυλάκιο ειδικού', 'admin.user_edit.no_cards': 'Δεν βρέθηκαν στοιχεία χαρτοφυλακίου', 'admin.user_edit.card_title': 'Τίτλος χαρτοφυλακίου', 'admin.user_edit.card_description': 'Περιγραφή', 'admin.balance.topup.btn': 'Αναπλήρωση', 'admin.balance.withdraw.btn': 'Αφαίρεση', 'admin.balance.modal_hint': 'Οι αλλαγές ισχύουν άμεσα και καταγράφονται στο ιστορικό', 'admin.balance.topup.title': 'Αναπλήρωση υπολοίπου', 'admin.balance.topup.amount': 'Ποσό', 'admin.balance.topup.description': 'Σχόλιο', 'admin.balance.topup.description.placeholder': 'Για παράδειγμα: bonus ή χειροκίνητη αναπλήρωση', 'admin.balance.topup.submit': 'Αναπλήρωση υπολοίπου', 'admin.balance.withdraw.title': 'Αφαίρεση υπολοίπου', 'admin.balance.withdraw.amount': 'Ποσό', 'admin.balance.withdraw.description': 'Σχόλιο', 'admin.balance.withdraw.description.placeholder': 'Για παράδειγμα: επιστροφή ή χειροκίνητη χρέωση', 'admin.balance.withdraw.submit': 'Αφαίρεση από το υπόλοιπο', 'admin.user_edit.role.customer': 'Πελάτης', 'admin.user_edit.role.specialist': 'Ειδικός', 'admin.user_edit.role.admin': 'Διαχειριστής', 'common.refresh': 'Ανανέωση', 'common.back_home': 'Αρχική', 'admin.loc.hint': 'Διαχείριση πόλεων και συνοικιών', 'admin.loc.add_city': 'Νέα πόλη', 'admin.loc.add_district': 'Προσθήκη συνοικίας', 'admin.loc.new': 'Νέα τοποθεσία', 'admin.loc.edit': 'Επεξεργασία τοποθεσίας', 'admin.loc.district': 'συνοικία', 'admin.loc.empty': 'Δεν υπάρχουν τοποθεσίες', 'admin.loc.delete.confirm': 'Διαγραφή τοποθεσίας; Όλες οι συνοικίες θα διαγραφούν επίσης.', 'admin.cat.add_root': 'Νέα κατηγορία', 'admin.cat.add_sub': 'Υποκατηγορία', 'admin.cat.edit': 'Επεξεργασία', 'admin.cat.delete': 'Διαγραφή', 'admin.cat.delete.confirm': 'Διαγραφή κατηγορίας; Όλες οι υποκατηγορίες θα διαγραφούν επίσης.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Εικονίδιο', 'admin.cat.name_el': 'Ελληνικά', 'admin.cat.name_en': 'Αγγλικά', 'admin.cat.name_ru': 'Ρωσικά', 'admin.cat.order': 'Σειρά', 'admin.cat.active': 'Ενεργή', 'admin.cat.parent': 'Γονική κατηγορία', 'admin.cat.no_parent': 'Κορυφαίο επίπεδο', 'admin.cat.save': 'Αποθήκευση', 'admin.cat.cancel': 'Ακύρωση', 'admin.cat.empty': 'Δεν υπάρχουν κατηγορίες', 'admin.cat.hint': 'Διαχείριση κατηγοριών με πολυεπίπεδη ιεραρχία', 'admin.cat.new': 'Νέα κατηγορία', 'admin.cat.subcategory': 'υποκατηγορία', 'admin.cat.add_child': 'Προσθήκη υποκατηγορίας', 'admin.cat.inactive': 'Ανενεργή', 'admin.event.user_login': 'Σύνδεση', 'admin.event.user_register': 'Εγγραφή', 'admin.event.admin_user_deactivate': 'Αποκλεισμός χρήστη', 'admin.event.admin_user_activate': 'Ενεργοποίηση χρήστη', 'admin.event.admin_user_role_changed': 'Αλλαγή ρόλου', 'admin.event.admin_task_cancelled': 'Ακύρωση εργασίας', 'admin.event.admin_task_deleted': 'Διαγραφή εργασίας', 'admin.event.admin_report_reviewed': 'Αναφορά εξετάστηκε', 'admin.event.admin_report_dismissed': 'Αναφορά απορρίφθηκε', 'admin.event.task_created': 'Δημιουργία εργασίας', 'user.online': 'Σε σύνδεση', 'user.seen_minutes': 'ήταν εδώ πριν {n} λεπτά', 'user.seen_hours': 'ήταν εδώ πριν {n} ώρες', 'user.seen_yesterday': 'ήταν εδώ χθες', 'user.seen_days': 'ήταν εδώ πριν {n} μέρες', // Specialists 'specialists.title': 'Ειδικοί', 'specialists.search': 'Αναζήτηση ειδικού...', 'specialists.search.btn': 'Αναζήτηση', 'specialists.empty': 'Δεν βρέθηκαν ειδικοί', 'specialists.no_bio': 'Χωρίς περιγραφή', 'specialists.view': 'Προβολή προφίλ', 'specialists.reviews': 'αξιολογήσεις', 'specialist.favorite': 'Προσθήκη στα αγαπημένα', 'specialist.unfavorite': 'Αφαίρεση από αγαπημένα', 'specialist.site_link': 'Προσωπικό site', 'favorites.specialists.title': 'Αγαπημένοι ειδικοί', 'favorites.specialists.empty': 'Δεν έχετε αγαπημένους ειδικούς', 'nav.favorites': 'Αγαπημένα', 'nav.schedule': 'Πρόγραμμα', 'nav.find_tasks': 'Αναζήτηση εργασιών', 'schedule.title': 'Το πρόγραμμά μου', 'schedule.subtitle': 'Σημειώστε τις ημέρες που είστε ελεύθεροι ή απασχολημένοι — οι πελάτες θα δουν τη διαθεσιμότητά σας', 'schedule.available': 'Ελεύθερος', 'schedule.busy': 'Απασχολημένος', 'schedule.unset': 'Μη ορισμένο', 'schedule.click_hint': '← κλικ για εναλλαγή κατάστασης', 'schedule.range_mode': 'Επιλογή εύρους', 'schedule.range_from': 'Από {date} — επιλέξτε τελική ημερομηνία', 'schedule.click_to_set': 'Κλικ για ορισμό', 'schedule.free': 'ελεύθερα', 'schedule.busy_count': 'απασχολημένα', 'schedule.free_days': 'ελεύθερες ημέρες', 'schedule.googleCalendar': 'Google Calendar', 'schedule.connectGoogle': 'Σύνδεση με Google Calendar', 'schedule.disconnectGoogle': 'Αποσύνδεση', 'schedule.connectedAs': 'Συνδεδεμένο ως', 'schedule.importFromGoogle': 'Συγχρονισμός από Google', 'schedule.gcalConnected': '✓ Google Calendar συνδέθηκε', 'schedule.gcalError': 'Σφάλμα σύνδεσης Google Calendar', 'schedule.gcalImportDone': 'Εισήχθησαν {n} ημερ. από Google Calendar', 'schedule.gcalAutoSyncNote': 'Οι αλλαγές αποστέλλονται αυτόματα στο Google Calendar', 'schedule.gcalConnectDesc': 'Συνδέστε το Google Calendar για αυτόματο συγχρονισμό', 'schedule.gcalDisconnectConfirm': 'Αποσύνδεση Google Calendar;', 'find_tasks.title': 'Αναζήτηση εργασιών', 'find_tasks.for_me': 'Για μένα', 'find_tasks.all': 'Όλες οι εργασίες', 'find_tasks.by_category': 'Ανά κατηγορία', 'find_tasks.list': 'Λίστα', 'find_tasks.already_offered': 'Προσφορά υποβλήθηκε', 'find_tasks.offer_now': 'Υποβολή προσφοράς', 'find_tasks.empty_for_me': 'Δεν βρέθηκαν εργασίες στις κατηγορίες σας', 'find_tasks.banner_hint': 'Βρείτε εργασίες που ταιριάζουν με το χαρτοφυλάκιό σας', 'find_tasks.no_cards': 'Δημιουργήστε ένα χαρτοφυλάκιο ειδικού για να δείτε εργασίες για εσάς', 'find_tasks.add_card': 'Δημιουργία χαρτοφυλακίου', 'find_tasks.search': 'Αναζήτηση εργασιών...', 'find_tasks.tasks_count': 'εργασίες', // Footer 'footer.tagline': 'Η πλατφόρμα εργασιών για την Ελλάδα', 'footer.rights': 'Όλα τα δικαιώματα διατηρούνται.', // App download section 'app.download_title': 'Κατεβάστε την εφαρμογή CanHelp', 'app.download_desc': 'Όλο το CanHelp — πάντα μαζί σας. Διαθέσιμο για Android και iOS.', // Nav 'nav.pricing': 'Τιμές', // Pricing page 'pricing.title': 'Τιμολόγηση', 'pricing.subtitle': 'Επιλέξτε το κατάλληλο πρόγραμμα', 'pricing.role.customer': 'Πελάτης', 'pricing.role.specialist': 'Ειδικός', 'pricing.free': 'Δωρεάν', 'pricing.per_month': 'μήνα', 'pricing.duration': 'Διάρκεια', 'pricing.days': 'ημ.', 'pricing.current_plan': 'Το πρόγραμμά σας', 'pricing.popular': 'Δημοφιλές', 'pricing.choose': 'Επιλογή', 'pricing.your_plan': 'Ενεργό πρόγραμμα', 'pricing.free_default': 'Προεπιλογή', 'pricing.compare': 'Σύγκριση λειτουργιών', 'pricing.feature': 'Λειτουργία', 'pricing.faq_note': 'Η πληρωμή γίνεται από το υπόλοιπο CanHelp. Ανατροφοδότηση διαθέσιμη στην Πληρωμή.', 'pricing.feat.messages': 'Μηνύματα / ημέρα', 'pricing.feat.orders': 'Παραγγελίες / ημέρα', 'pricing.feat.contact_all': 'Επικοινωνία με όλους', 'pricing.feat.view_phone': 'Εμφάνιση τηλεφώνου', 'pricing.feat.show_contact': 'Εμφάνιση στοιχείων επαφής', 'pricing.feat.favorites': 'Αγαπημένα', 'pricing.feat.verified_badge': 'Επαληθευμένο badge', 'pricing.feat.google_calendar': 'Google Calendar', 'pricing.feat.personal_site': 'Προσωπικό site', 'pricing.feat.auto_response': 'Αυτόματη απάντηση', 'pricing.feat.auto_match': 'Αυτόματη αντιστοίχιση', 'pricing.feat.highlighted_reviews': 'Επισημασμένες αξιολογήσεις', 'pricing.feat.portfolio': 'Στοιχεία χαρτοφυλακίου', 'pricing.feat.cards': 'Κάρτες ειδικού', 'pricing.feat.notify_tasks': 'Ειδοποιήσεις νέων εργασιών', 'pricing.feat.video': 'Βίντεο στο χαρτοφυλάκιο', // Upgrade prompt 'upgrade.available_in': 'Διαθέσιμο στο', 'upgrade.cta': 'Αναβάθμιση', // Dashboard plan block 'dashboard.plan.title': 'Το πρόγραμμά μου', 'dashboard.plan.expires': 'Λήγει σε {n} ημέρες', 'dashboard.plan.upgrade': 'Αναβάθμιση προγράμματος', 'dashboard.plan.no_plan': 'Δωρεάν πρόγραμμα', 'dashboard.plan.messages': 'Μηνύματα σήμερα', 'dashboard.plan.orders': 'Παραγγελίες σήμερα', 'dashboard.plan.limits': 'Ημερήσια όρια', 'dashboard.plan.features': 'Λειτουργίες', 'dashboard.plan.stats': 'Στατιστικά', 'dashboard.stats.cards': 'Χαρτοφυλάκια', 'dashboard.stats.maxCards': 'Μέγ. χαρτοφυλάκια', 'dashboard.stats.portfolioItems': 'Στοιχεία portfolio', 'dashboard.stats.maxPortfolioItems': 'Μέγ. στοιχεία', 'dashboard.stats.activeOffers': 'Ενεργές προσφορές', 'dashboard.stats.reviewsReceived': 'Αξιολογήσεις', 'dashboard.stats.activeTasks': 'Ενεργές εργασίες', 'dashboard.stats.completedTasks': 'Ολοκληρωμένες', 'status.can_help_now': 'Είμαι διαθέσιμος τώρα', 'status.need_help': 'Χρειάζομαι βοήθεια', 'status.active': 'Ενεργό', 'status.toggle_on': 'Ενεργοποίηση', 'status.toggle_off': 'Απενεργοποίηση', // FOMO 'fomo.missed_orders': 'Χάσατε {n} παραγγελίες', 'fomo.missed_value': 'Αξία €{v}', 'fomo.upgrade_hint': 'Αναβαθμίστε για να λαμβάνετε περισσότερες παραγγελίες', 'fomo.conversion': 'Μετατροπές εργασιών', 'fomo.active': 'Ενεργές', 'fomo.with_offers': 'Με προσφορές', 'fomo.completed': 'Ολοκληρωμένες', 'fomo.already_offered': '{n} ειδικοί έχουν ήδη απαντήσει', 'fomo.specialist_missed': 'Χάσατε {n} παραγγελίες', 'fomo.top_categories': 'Κατηγορίες', 'fomo.offers_received': 'προσφορές ελήφθησαν', 'fomo.avg_offers': 'Μέσο {n}/εργασία', 'fomo.completion_rate': 'ολοκληρωμένες', // Task auto-match 'task.auto_match': 'Αυτόματη αντιστοίχιση', 'task.auto_match_results': 'Κορυφαίοι ειδικοί', 'task.no_offer_yet': 'Δεν έχετε στείλει προσφορά ακόμα', 'task.make_offer': 'Αποστολή προσφοράς', 'auto_response.title': 'Αυτόματη Απάντηση', 'auto_response.enabled': 'Ενεργοποίηση αυτόματης απάντησης', 'auto_response.min_budget': 'Ελάχ. προϋπολογισμός', 'auto_response.max_budget': 'Μέγ. προϋπολογισμός', 'auto_response.default_price': 'Προεπιλεγμένη τιμή', 'auto_response.default_message': 'Προεπιλεγμένο μήνυμα', 'auto_response.max_per_day': 'Μέγ. αυτόματες προσφορές/ημέρα', 'auto_response.save': 'Αποθήκευση', 'auto_response.saved': 'Αποθηκεύτηκε', 'auto_response.categories': 'Κατηγορίες', 'auto_response.locations': 'Τοποθεσίες', // Personal site 'profile.personal_site': 'Προσωπικό Site', 'profile.site_slug': 'Slug URL', 'profile.site_slug_hint': 'Μόνο λατινικοί χαρακτήρες, αριθμοί, - και _', 'profile.site_open': 'Άνοιγμα site', 'profile.site_preview': 'Το site σας', 'profile.show_contact': 'Εμφάνιση στοιχείων επαφής', 'profile.show_contact_hint': 'Πελάτες με Pro/Ultimate πρόγραμμα θα βλέπουν το τηλέφωνό σας', // Google Calendar plan gate 'gcal.upgrade_required': 'Το Google Calendar απαιτεί Pro ή Ultimate πρόγραμμα', // Chat limits 'chat.limit_warning': 'Απομένουν {n} μηνύματα σήμερα', 'chat.limit_reached': 'Εξαντλήθηκαν τα μηνύματα. Αναβαθμίστε το πρόγραμμά σας', 'chat.upgrade': 'Αναβάθμιση', // Site page 'site.member_since': 'Μαζί μας από', 'site.rating': 'Βαθμολογία', 'site.completed_tasks': 'Ολοκληρώθηκαν', 'site.languages': 'Γλώσσες', 'site.photos': 'φωτ.', 'site.contact_form': 'Επικοινωνία', 'site.contact_sent': 'Το μήνυμα στάλθηκε!', 'site.contact_sent_desc': 'Ο ειδικός θα επικοινωνήσει μαζί σας σύντομα', 'site.contact_name': 'Όνομα', 'site.contact_name_ph': 'Το όνομά σας', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Μήνυμα', 'site.contact_message_ph': 'Περιγράψτε την εργασία σας...', 'site.contact_send': 'Αποστολή', 'site.share': 'Κοινοποίηση', 'site.speaks_languages': 'Μιλάει', 'site.message_sent': 'Το μήνυμα εστάλη!', 'site.message_sent_desc': 'Ο ειδικός θα το λάβει στη συνομιλία', 'site.message_placeholder': 'Γράψτε το μήνυμά σας...', 'site.write_to_chat': 'Γράψτε στο chat', 'site.auth_required_title': 'Απαιτείται σύνδεση', 'site.auth_required_desc': 'Για να γράψετε στο chat, χρειάζεται να συνδεθείτε στο λογαριασμό σας.', 'site.auth_login_btn': 'Σύνδεση', 'site.auth_contact_form_btn': 'Επικοινωνία μέσω φόρμας', 'specialist.services': 'Υπηρεσίες', 'portfolio.title': 'Χαρτοφυλάκιο', 'common.not_found': 'Η σελίδα δεν βρέθηκε', 'common.anonymous': 'Ανώνυμα' }, en: { 'footer.slogan': 'Your task — our care! We solve any issue quickly and easily.', 'footer.links': 'Links', 'footer.socials': 'Socials', 'nav.home': 'Home', 'nav.tasks': 'Tasks', 'nav.post': '+ Post task', 'nav.dashboard': 'Dashboard', 'nav.chat': 'Messages', 'nav.notifications': 'Notifications', 'nav.profile': 'Profile', 'nav.admin': 'Admin Panel', 'nav.specialists': 'Specialists', 'nav.new_task': 'New task', 'nav.login': 'Login', 'nav.register': 'Register', 'nav.logout': 'Logout', 'hero.title': 'Find a specialist for any job', 'hero.subtitle': 'Post a task, receive offers and choose the best professional', 'hero.cta.post': 'Post a task', 'hero.cta.browse': 'Find work', 'hero.search.placeholder': 'What do you need? e.g. electrician, cleaning...', 'stats.specialists': 'specialists', 'stats.tasks': 'tasks', 'stats.categories': 'categories', 'stats.free': 'free sign-up', 'section.categories': 'Create a task in any category', 'section.how': 'How it works', 'section.recent': 'Recent tasks', 'section.all': 'See all →', 'section.more': 'more', 'section.cities': 'Cities & Districts', 'section.community': 'A community project for everyone', 'community.subtitle': 'CanHelp is not just a marketplace — it\'s a community of mutual help. Anyone with knowledge or a skill can find a client. Anyone with a problem can find a specialist.', 'community.point1.title': 'Are you good at something?', 'community.point1.desc': 'Repairs, tutoring, design, translation, care — every skill has value. Create a profile and find clients near you.', 'community.point2.title': 'Need help with something?', 'community.point2.desc': 'Post a task in under a minute and receive offers from verified specialists in your city.', 'community.point3.title': 'Help the project grow', 'community.point3.desc': 'CanHelp grows through communities. Share the link with friends and acquaintances — together we build something useful for everyone.', 'community.share': 'Share with friends', 'community.share.copied': 'Link copied!', // Referral section on home page 'section.referral': 'Referral Program', 'referral.home.subtitle': 'Share your link — every new user who signs up through it earns you a reward.', 'referral.home.step1.title': 'Sign up and get your link', 'referral.home.step1.desc': 'Create an account and find your unique referral link in your profile.', 'referral.home.step2.title': 'Share with friends', 'referral.home.step2.desc': 'Send the link to friends, acquaintances, or post it on social media.', 'referral.home.step3.title': 'Earn rewards', 'referral.home.step3.desc': 'Once your friend verifies their email, you automatically receive your reward.', 'referral.home.cta': 'Get your link', 'referral.home.badge': 'Referral Program', // FAQ section 'section.faq': 'Frequently Asked Questions', 'faq.q1': 'How does CanHelp work?', 'faq.a1': 'Post a task, receive offers from specialists, choose the best one and start working together. It\'s fast, simple and free for customers.', 'faq.q2': 'How much does it cost to use the platform?', 'faq.a2': 'Registration and task posting is completely free for customers. Specialists have access to a free plan as well as premium options.', 'faq.q3': 'How can I become a specialist?', 'faq.a3': 'Register, go to «Become a Specialist», fill in your profile with skills and categories, and start receiving tasks.', 'faq.q4': 'How do I choose the right specialist?', 'faq.a4': 'Check their reviews, experience, skills and portfolio. Chat with them through the platform and discuss the details before deciding.', 'faq.q5': 'What if I am not satisfied?', 'faq.a5': 'You can leave a review about the specialist and rate them from 1 to 5 stars. Reviews help other users find trusted professionals.', 'faq.q6': 'Can I contact a specialist before accepting their offer?', 'faq.a6': 'Yes. Once you receive an offer, you can open a chat with the specialist, ask questions and discuss all the details before making a decision.', 'faq.q7': 'How long does it take to receive offers?', 'faq.a7': 'Usually within a few hours. Specialists get notified about new tasks and can respond quickly.', 'faq.q8': 'Can I post a task in any city in Greece?', 'faq.a8': 'Yes! CanHelp covers all of Greece — Athens, Thessaloniki, Patras and more.', 'faq.q9': 'What types of tasks can I find on CanHelp?', 'faq.a9': 'Repairs, cleaning, electricians, tutoring, design, IT, moving, beauty and much more. Categories are constantly expanding.', 'faq.q10': 'Is there a mobile app?', 'faq.a10': 'Yes! CanHelp is available for Android and iOS. Download the app and manage everything from your phone.', 'how.step1.title': 'Post a task', 'how.step1.desc': 'Describe what you need and set your budget', 'how.step2.title': 'Receive offers', 'how.step2.desc': 'Specialists will send you offers with price and timeline', 'how.step3.title': 'Choose & start', 'how.step3.desc': 'Pick the best professional and start the collaboration', 'tasks.title': 'tasks', 'tasks.filters': 'Filters', 'tasks.search': 'Search', 'tasks.search.placeholder': 'Title or keyword...', 'tasks.search.btn': 'Search', 'tasks.publish': 'Post', 'tasks.category.all': 'All', 'tasks.category.all_in': 'All in', 'tasks.category.label': 'Category', 'tasks.location.label': 'City', 'tasks.location.placeholder': 'e.g. Athens', 'tasks.empty': 'No tasks found', 'tasks.empty.cta': 'Post the first one', 'task.status.open': 'Open', 'task.status.in_progress': 'In progress', 'task.status.completed': 'Completed', 'task.status.cancelled': 'Cancelled', 'task.status.draft': 'Draft', 'task.budget': 'Budget', 'task.location': 'Location', 'task.deadline': 'Start date', 'task.created_at': 'Created', 'task.customer': 'Customer', 'task.offer.btn': 'Submit offer', 'task.invite.banner_title': "You've been invited to this task", 'task.invite.banner_hint': 'The customer personally invited you', 'task.invite.accept': 'Send offer', 'task.invite.decline': 'Decline', 'offer.accept': 'Accept', 'offer.decline': 'Decline', 'task.complete': 'Complete task', 'task.complete.confirm': 'Mark this task as complete?', 'task.edit': 'Edit', 'task.status_label': 'Status', 'task.yours': 'Your task', 'task.offer.yours': 'Your offer', 'review.leave': 'Leave a review', 'review.rating': 'Rating', 'review.comment': 'Comment', 'review.comment.placeholder': 'Tell us about your experience...', 'review.submit': 'Submit review', 'review.submitting': 'Submitting...', 'review.done': 'Review submitted!', 'profile.reviews': 'Reviews', 'profile.no_reviews': 'No reviews yet', 'profile.rating': 'Rating', 'profile.skills.label': 'Skills', 'profile.member_since': 'Member since', 'task.offers': 'Offers', 'task.offers.none': 'No offers yet', 'create.title': 'Post a task', 'create.field.title': 'Title', 'create.field.description': 'Description', 'create.field.category': 'Category', 'create.field.category.select': 'Select...', 'create.field.location': 'Location', 'create.field.location.any': 'Anywhere', 'create.field.location.all': 'Entire city', 'create.field.budget': 'Budget (€)', 'create.field.deadline': 'Start date', 'create.field.budget_negotiable': 'Price is negotiable', 'create.field.time_slot': 'Time slot', 'create.field.time_slot.any': 'Anytime', 'create.field.time_slot.morning': 'Morning (08:00–13:00)', 'create.field.time_slot.afternoon': 'Afternoon (13:00–18:00)', 'create.field.time_slot.evening': 'Evening (18:00–22:00)', 'create.field.time_slot.weekend': 'Weekend', 'create.field.address': 'Address (optional)', 'create.field.address.district': 'District', 'create.field.address.street': 'Street', 'create.field.address.house': 'Number', 'create.field.confidential': 'Confidential note', 'create.field.confidential.placeholder': 'Details visible only to the assigned specialist...', 'create.field.confidential.hint': 'Not shown publicly', 'create.field.photos': 'Photos', 'create.field.photos.add': 'Add photo', 'create.field.photos.uploading': 'Uploading...', 'task.budget_negotiable': 'Price negotiable', 'task.time_slot': 'Time slot', 'task.confidential': 'Confidential note', 'create.field.title.placeholder': 'e.g. Clean 80sqm apartment', 'create.field.description.placeholder': 'Describe in detail what you need...', 'create.field.location.placeholder': 'e.g. Athens, Kolonaki', 'create.field.budget.placeholder': 'e.g. 100', 'create.submit': 'Post task', 'create.submitting': 'Posting...', 'login.title': 'Welcome back', 'login.subtitle': 'Sign in to CanHelp', 'login.email': 'Email', 'login.password': 'Password', 'login.submit': 'Sign in', 'login.submitting': 'Signing in...', 'login.error': 'Invalid email or password', 'login.unverified.title': 'Verify your email address', 'login.unverified.desc': 'We sent a verification link to your email. Check your inbox (or spam) and click the link.', 'login.unverified.resend': 'Resend verification email', 'login.unverified.sending': 'Sending...', 'login.unverified.sent': '✓ Sent — check your inbox', 'profile.email.verified': 'Email verified', 'profile.email.not_verified': 'Email not verified', 'login.no_account': "Don't have an account?", 'login.register_link': 'Register', 'login.forgot_password': 'Forgot password?', 'login.or_continue_with': 'or continue with', 'login.continue_google': 'Continue with Google', 'forgot.title': 'Forgot password', 'forgot.subtitle': 'Enter your email to receive a reset link', 'forgot.email': 'Email', 'forgot.submit': 'Send reset link', 'forgot.submitting': 'Sending...', 'forgot.sent.title': 'Check your inbox', 'forgot.sent.desc': 'If an account exists with that email, we\'ll send you a password reset link.', 'forgot.back_to_login': 'Back to sign in', 'forgot.error': 'Could not send reset link. Check the email address and try again.', 'forgot.error.not_found': 'No account found with this email address.', 'forgot.error.send_failed': 'Failed to send email. Please try again later.', 'reset.title': 'New password', 'reset.subtitle': 'Enter your new password', 'reset.password': 'New password', 'reset.confirm': 'Confirm password', 'reset.submit': 'Change password', 'reset.submitting': 'Saving...', 'reset.success': 'Password changed successfully. Redirecting to sign in...', 'reset.back_to_login': 'Back to sign in', 'reset.error.mismatch': 'Passwords do not match', 'reset.error.invalid': 'Invalid or expired link. Please request a new one.', 'register.title': 'Register', 'register.subtitle': 'Create a CanHelp account', 'register.first_name': 'First name', 'register.last_name': 'Last name', 'register.email': 'Email', 'register.password': 'Password (min 8 characters)', 'register.role': 'Role', 'register.role.customer': 'User', 'register.role.customer.desc': 'I post tasks', 'register.role.specialist': 'Specialist', 'register.role.specialist.desc': 'I take on tasks', 'register.submit': 'Create account', 'register.submitting': 'Registering...', 'register.has_account': 'Already have an account?', 'register.login_link': 'Sign in', 'register.continue_google': 'Continue with Google', 'register.check_email.title': 'Check your email', 'register.check_email.desc': 'We sent a verification link to your email address. Check your inbox (or spam) and click the link.', 'register.check_email.login': 'Back to sign in', 'dashboard.title': 'Dashboard', 'dashboard.new_task': '+ New task', 'dashboard.my_tasks': 'My tasks', 'dashboard.my_offers': 'My offers', 'dashboard.invitations': 'Job invitations', 'dashboard.offers_count': 'offers', 'dashboard.declined_count': 'declined', 'dashboard.completed_tasks': 'Completed tasks', 'dashboard.completed_offers': 'Completed offers', 'dashboard.review_pending': 'Review not yet submitted', 'tasks.new.top_specialists': 'Top specialists', 'tasks.new.select_category': 'Select a category to see matching specialists', 'tasks.new.invite': 'Offer work', 'tasks.new.invited': 'Selected ✓', 'reviews.count': 'reviews', 'filter.location': 'Location', 'filter.language': 'Languages', 'filter.language.any': 'Any language', 'filter.category.all': 'All categories', 'user.categories': 'Categories', 'user.work_area': 'Work area', 'dashboard.tasks.empty': "You haven't posted any tasks", 'dashboard.tasks.empty.cta': 'Post your first one', 'dashboard.tasks.add_new': 'Add a new task', 'dashboard.offers.empty': "You haven't submitted any offers", 'dashboard.offers.empty.cta': 'Find tasks', 'dashboard.customer.specialists_title': 'Looking for a specialist?', 'dashboard.customer.specialists_hint': 'Browse specialist profiles, read reviews and invite them to your tasks', 'dashboard.customer.specialists_cta': 'Find a specialist', 'dashboard.customer.how_title': 'How it works', 'dashboard.customer.step1': 'Create a task with a description and budget', 'dashboard.customer.step2': 'Specialists will send offers with price and timeline', 'dashboard.customer.step3': 'Choose the right one and start working', 'notif.title': 'Notifications', 'notif.mark_all': 'Mark all as read', 'notif.empty': 'No notifications', 'notif.type.new_offer': 'New offer', 'notif.type.offer_accepted': 'Your offer was accepted', 'notif.type.offer_declined': 'Your offer was declined', 'notif.type.task_completed': 'Task completed', 'notif.type.task_cancelled': 'Task cancelled', 'notif.type.new_message': 'New message', 'notif.type.new_review': 'New review', 'notif.type.task_invite': 'Job invitation', 'notif.body.new_offer': 'New offer for «{title}»', 'notif.body.offer_accepted': 'Your offer for «{title}» was accepted', 'notif.body.offer_declined': 'Your offer for «{title}» was declined', 'notif.body.task_invite': 'You\'ve been invited for «{title}»', 'notif.body.new_review': 'You received a {rating}★ review', 'offer.status.pending': 'Pending', 'offer.status.accepted': 'Accepted', 'offer.status.declined': 'Declined', 'offer.status.withdrawn': 'Withdrawn', 'offer.status.other_accepted': 'Another specialist was chosen', 'common.loading': 'Loading...', 'common.error': 'Error', 'common.save': 'Save', 'common.saving': 'Saving...', 'common.cancel': 'Cancel', 'common.add': 'Add', 'common.close': 'Close', 'common.edit': 'Edit', 'common.delete': 'Delete', 'common.from': 'by', 'common.currency': '€', 'common.greece': 'Greece', // Chat 'chat.connected': 'Connected', 'chat.disconnected': 'Disconnected', 'chat.no_rooms': 'No conversations yet', 'chat.task_fallback': 'Task', 'chat.select': 'Select a conversation', 'chat.no_messages': 'No messages yet', 'chat.placeholder': 'Write a message... (Enter to send)', 'chat.conversation_fallback': 'Conversation', 'chat.direct_chat': 'Direct chat', 'chat.linked_task': 'Linked task', 'chat.write_btn': 'Message', 'chat.just_now': 'just now', 'chat.min_ago': 'm', 'chat.write_specialist': 'Write to specialist', 'chat.write_customer': 'Write to customer', 'chat.notif_settings': 'Notification settings', 'chat.notif_messages': 'Notifications for new messages', 'chat.toast_title': 'New message', 'chat.toast_open': 'Open chat', // Offer form 'offer.price': 'Price', 'offer.price.placeholder': 'e.g. 80', 'offer.customer_budget': 'Client budget', 'offer.message': 'Message', 'offer.optional': 'optional', 'offer.message.placeholder': 'Introduce yourself, your experience and why you are the best choice...', 'offer.submitting': 'Sending...', // Profile 'profile.photo': 'Profile photo', 'profile.photo.change': 'Change photo', 'profile.photo.hint': 'JPEG, PNG, WebP · up to 5MB', 'profile.basic_info': 'Basic info', 'profile.phone': 'Phone', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Short bio', 'profile.bio.placeholder': 'Tell us a bit about yourself...', 'profile.language': 'Language', 'profile.language.hint': 'App interface and email notification language', 'profile.languages': 'Languages spoken', 'profile.languages.hint': 'Select all languages you speak', 'profile.skills': 'Skills', 'profile.skills.subtitle': 'Add the services you offer', 'profile.skills.placeholder': 'e.g. Cleaning, IT, Tutoring...', 'profile.role': 'Account role', 'profile.role.specialist': '🔧 Specialist', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 User', 'profile.role.change': 'To change your role please contact support.', 'profile.become_specialist': 'Become a Specialist', 'profile.become_specialist.desc': 'Upgrade to Specialist to take on tasks and build your profile.', 'become_specialist.hero.title': 'Earn money doing what you do best', 'become_specialist.hero.subtitle': 'Create a specialist profile and receive orders from clients across Greece', 'become_specialist.how.title': 'How it works', 'become_specialist.step1.title': 'Create a specialist portfolio', 'become_specialist.step1.desc': 'Set your categories, skills and coverage areas — the system will automatically match you with relevant tasks', 'become_specialist.step2.title': 'Find tasks', 'become_specialist.step2.desc': 'Discover tasks in your categories in the "Find Orders" section', 'become_specialist.step3.title': 'Send an offer & earn', 'become_specialist.step3.desc': 'Submit offers with price and timeline, chat with clients and complete tasks', 'become_specialist.benefits.title': 'Specialist profile advantages', 'become_specialist.benefit1': 'Task search filtered by your categories and location', 'become_specialist.benefit2': 'Public profile with client reviews', 'become_specialist.benefit3': 'Availability schedule visible to clients', 'become_specialist.benefit4': 'Saved to favourites by clients', 'become_specialist.cta': 'Become a Specialist — it\'s free', 'become_specialist.free_badge': 'Free registration', 'profile.tab.notifications': 'Notifications', 'profile.tab.reviews': 'Reviews', 'profile.tab.referral': 'Referrals', 'profile.tab.auto_response': 'Auto-response', 'profile.tab.site': 'Site', 'profile.site.title': 'Personal page', 'profile.site.url_label': 'Personal site', 'profile.site.copy': 'Copy', 'profile.site.copied': 'Copied', 'profile.site.visible_title': "What's on your page", 'profile.site.visible.name': 'Name and photo', 'profile.site.visible.bio': 'Bio', 'profile.site.visible.rating': 'Rating and reviews', 'profile.site.visible.portfolio': 'Portfolio / Cards', 'profile.site.visible.contacts': 'Contact info', 'profile.site.visible.full_last_name': 'Full last name', 'profile.site.visible.services': 'Service cards', 'profile.site.visible.reviews': 'Reviews section', 'profile.site.visible.status': '"Ready to help" status', 'profile.site.theme': 'Appearance theme', 'profile.site.theme.dark': 'Dark', 'profile.site.theme.light': 'Light', 'profile.site.slug_taken': 'This address is already taken', 'profile.site.stats.title': 'Site analytics', 'profile.site.stats.days': 'last 30 days', 'profile.site.stats.views': 'Views', 'profile.site.stats.unique': 'Unique visitors', 'profile.site.stats.messages': 'Messages', 'profile.site.stats.total_views': 'Total views', 'profile.site.stats.total_unique': 'Unique visitors', 'profile.site.stats.total_messages': 'Messages', 'profile.site.stats.empty': 'No data yet', 'profile.site.stats.loading': 'Loading analytics...', 'profile.site.stats.no_slug': 'Set your site URL to see analytics', 'profile.site.edit_bio_hint': 'Bio and photo are edited in the "Basic info" tab.', 'status.title': 'Status', 'status.can_help_now_hint': 'Your card is shown higher in search', 'status.need_help_hint': 'Specialists can offer you help', 'profile.referral.title': 'Referral program', 'profile.referral.desc': 'Share your link and earn rewards for every new user you invite.', 'profile.referral.link_label': 'Your referral link', 'profile.referral.copy': 'Copy', 'profile.referral.copied': 'Copied!', 'profile.referral.invited_count': 'successful referrals', 'profile.referral.no_code': 'Referral code is not available.', 'notifications.title': 'Notification settings', 'notifications.email.new_tasks': 'Email for new tasks', 'notifications.email.new_tasks.desc': 'Receive an email when a new task is posted in your categories', 'notifications.messages.desc': 'Receive a notification when a new message arrives', 'notifications.saved': 'Settings saved', 'notifications.plan_required': 'Not available in your plan', 'profile.tab.info': 'Basic info', 'profile.tab.finance': 'Finance', 'profile.tab.skills': 'Skills', 'profile.tab.categories': 'Categories', 'profile.tab.geography': 'Geography', 'profile.specialist.categories': 'Work categories', 'profile.specialist.categories.desc': 'Select the categories you work in', 'profile.specialist.geography': 'Coverage areas', 'profile.specialist.geography.desc': 'Select the cities / districts where you are active', 'profile.saving': 'Saving...', 'profile.upload.error': 'Error uploading photo', 'profile.saved': 'Saved', 'profile.tab.cards': 'Portfolio', 'profile.cards.count': 'Portfolio', 'profile.cards.add': 'Add portfolio', 'profile.cards.new_title': 'New portfolio title', 'profile.cards.placeholder': 'e.g. Plumbing', 'profile.cards.create': 'Create', 'profile.cards.cancel': 'Cancel', 'profile.cards.empty': 'No portfolio yet', 'profile.cards.create_first': 'Create your first portfolio', 'profile.cards.delete_confirm': 'Delete portfolio?', 'profile.card.tab.main': 'General', 'profile.card.tab.skills': 'Skills', 'profile.card.tab.categories': 'Categories', 'profile.card.tab.geography': 'Geography', 'profile.card.tab.portfolio': 'Portfolio', 'profile.card.active': 'Active', 'profile.card.save': 'Save', 'profile.card.saved': 'Saved', 'profile.card.delete': 'Delete', 'profile.card.skill.add': 'Add skill', 'profile.card.photo.add': 'Add photo', 'profile.card.photo.uploading': 'Uploading...', 'profile.card.photo.empty': 'No photos yet', 'profile.card.item.title': 'Title', 'profile.card.item.desc': 'Description', 'profile.card.item.save': 'Save', 'profile.card.item.cancel': 'Cancel', 'profile.card.item.edit': 'Edit', 'profile.upgrade.cards_limit': 'Portfolio limit reached', 'profile.upgrade.plan': 'Current plan:', 'profile.upgrade.contact': 'Contact the administrator to change your plan', 'profile.upgrade.ok': 'Got it', 'profile.plan.title': 'Subscription plan', 'profile.balance': 'Balance', 'profile.balance.topup': 'Top Up Balance', 'profile.balance.topup.title': 'Top Up Balance', 'profile.balance.topup.amount': 'Amount (EUR)', 'profile.balance.topup.hint': 'Choose a preset or enter a custom amount', 'profile.balance.topup.submit': 'Proceed to Payment', 'profile.balance.topup.loading': 'Redirecting...', 'profile.balance.topup.error': 'Payment initiation failed. Please try again.', 'payment.success.title': 'Payment Successful!', 'payment.success.desc': 'Your balance has been updated.', 'payment.cancelled.title': 'Payment Cancelled', 'payment.cancelled.desc': 'Payment was cancelled. No charges were made.', 'payment.pending.title': 'Processing...', 'payment.pending.desc': 'Your payment is being processed.', 'payment.back_to_profile': 'Back to Profile', 'profile.plan.basic': 'Basic (free)', 'profile.plan.contact_upgrade': 'Contact admin to upgrade your plan', 'profile.plan.cards_up_to': 'Portfolio: up to', 'profile.plan.cards_unlimited': 'Portfolio: unlimited', 'profile.plan.tasks_up_to': 'Tasks: up to', 'profile.plan.offers_up_to': 'Offers: up to', 'profile.plan.valid_until': 'Valid until', 'profile.plan.no_expiry': 'No expiry', // Create task 'create.error': 'Error posting task', // Tasks list extras 'tasks.category.general': 'General', 'tasks.budget.range': 'Range:', 'tasks.budget.from': 'from', 'tasks.budget.to': 'to', 'tasks.filter.reset': 'Reset filters', 'tasks.load_more': 'Load more', 'tasks.showing': 'Results:', 'tasks.field.budget': 'Budget, €', // Admin 'admin.title': 'Admin Panel', 'admin.tab.stats': 'Statistics', 'admin.tab.users': 'Users', 'admin.tab.tasks': 'Tasks', 'admin.tab.reports': 'Reports', 'admin.stats.users': 'Users', 'admin.stats.tasks': 'Tasks', 'admin.stats.offers': 'Offers', 'admin.stats.reviews': 'Reviews', 'admin.tasks.by_status': 'Tasks by status', 'admin.col.user': 'User', 'admin.col.email': 'Email', 'admin.col.role': 'Role', 'admin.col.registered': 'Registered', 'admin.col.status': 'Status', 'admin.col.title': 'Title', 'admin.col.budget': 'Budget', 'admin.col.created': 'Created', 'admin.users.active': 'Active', 'admin.users.inactive': 'Inactive', 'admin.users.deactivate': 'Deactivate', 'admin.users.activate': 'Activate', 'admin.tasks.cancel': 'Cancel', 'admin.reports.none': 'No reports', 'admin.reports.reviewed': 'Reviewed', 'admin.reports.dismiss': 'Dismiss', 'admin.pagination.total': 'Total', 'admin.users.role.change': 'Change role', 'admin.users.search.placeholder': 'Search name or email...', 'admin.tasks.delete': 'Delete', 'admin.tasks.delete.confirm': 'Permanently delete this task?', 'admin.tasks.search.placeholder': 'Search title...', 'admin.col.customer': 'Customer', 'admin.col.reporter': 'Reporter', 'admin.col.target': 'Target', 'admin.filter.all_roles': 'All roles', 'admin.filter.all_statuses': 'All statuses', 'admin.reports.target.task': 'Task', 'admin.reports.target.user': 'User', 'admin.tab.categories': 'Categories', 'admin.tab.locations': 'Cities & Districts', 'admin.tab.logs': 'Logs', 'admin.tab.plans': 'Plans', 'admin.tab.settings': 'Settings', 'admin.logs.subtab.ai': 'AI Logs', 'admin.logs.subtab.activity': 'Activity', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Notifications', 'admin.notif_logs.type': 'Type', 'admin.notif_logs.title': 'Title', 'admin.notif_logs.read': 'Read', 'admin.notif_logs.empty': 'No notification logs', 'admin.stats.notif_chart_title': 'Notifications per day', 'admin.stats.notif_label': 'Notifications', 'admin.stats.mail_chart_title': 'Emails per day', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'All', 'admin.stats.specialists': 'Specialists', 'admin.col.plan': 'Plan', 'admin.back_home': 'Home', 'admin.plans.title': 'Subscription plans', 'admin.plans.add': '+ New plan', 'admin.plans.empty': 'No plans created', 'admin.plans.form.new': 'New plan', 'admin.plans.form.edit': 'Edit plan', 'admin.plans.form.name': 'Name', 'admin.plans.form.price': 'Price (EUR)', 'admin.plans.form.old_price': 'Old price (EUR, optional)', 'admin.plans.form.max_offers': 'Max offers (empty = no limit)', 'admin.plans.form.max_cards': 'Max portfolio (empty = no limit)', 'admin.plans.form.duration_days': 'Duration (days, empty = no expiry)', 'admin.plans.form.description': 'Description', 'admin.plans.form.features': 'Features (one per line)', 'admin.plans.form.notify': 'Notify about new tasks', 'admin.plans.form.default': 'Default', 'admin.plans.form.active': 'Active', 'admin.plans.form.order': 'Order', 'admin.plans.form.role': 'Role', 'admin.plans.form.tier': 'Tier', 'admin.plans.form.role.customer': 'Customer', 'admin.plans.form.role.specialist': 'Specialist', 'admin.plans.form.tier.free': 'Free', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Limits (empty = unlimited)', 'admin.plans.form.max_messages_day': 'Max Messages/Day', 'admin.plans.form.max_orders_day': 'Max Orders/Day', 'admin.plans.form.max_skills': 'Max Skills', 'admin.plans.form.max_profiles': 'Max Profiles', 'admin.plans.form.max_portfolio': 'Max Portfolio Items', 'admin.plans.form.section.boost': 'Multipliers & Boost', 'admin.plans.form.search_boost': 'Search Boost', 'admin.plans.form.offers_multiplier': 'Offers Multiplier', 'admin.plans.form.section.contact': 'Contact Permissions', 'admin.plans.form.can_contact_free': 'Contact Free Plan users', 'admin.plans.form.can_contact_pro': 'Contact Pro Plan users', 'admin.plans.form.can_contact_all': 'Contact All users', 'admin.plans.form.can_show_contact': 'Show Contact Info', 'admin.plans.form.can_view_phone': 'View Phone', 'admin.plans.form.section.features': 'Feature Flags', 'admin.plans.form.upload_video': 'Upload Video', 'admin.plans.form.favorites': 'Favorites', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Verified Badge', 'admin.plans.form.highlighted_reviews': 'Highlighted Reviews', 'admin.plans.form.personal_site': 'Personal Site', 'admin.plans.form.can_help_now': 'Can Help Now Status', 'admin.plans.form.need_help': 'Need Help Status', 'admin.plans.form.auto_response': 'Auto Response', 'admin.plans.form.auto_match': 'Auto Match', 'admin.plans.form.instant_dispatch_free': 'Instant Dispatch (Free)', 'admin.plans.form.instant_dispatch_pro': 'Instant Dispatch (Pro)', 'admin.plans.badge.default': 'Default', 'admin.plans.badge.inactive': 'Inactive', 'admin.plans.make_default': 'Set as default', 'admin.plans.tasks': 'Tasks', 'admin.plans.offers': 'Offers', 'admin.plans.cards': 'Portfolio', 'admin.plans.notify_tasks': 'Task notifications', 'admin.plans.delete.confirm': 'Delete plan', 'admin.activity.title': 'Activity log', 'admin.activity.event': 'Event', 'admin.activity.all_events': 'All events', 'admin.activity.from': 'From', 'admin.activity.to': 'To', 'admin.activity.reset': 'Reset', 'admin.activity.total': 'Total', 'admin.activity.empty': 'No records', 'admin.mail.event': 'Email event', 'admin.mail.all_events': 'All email events', 'admin.mail.from': 'From', 'admin.mail.to': 'To', 'admin.mail.reset': 'Reset', 'admin.mail.total': 'Total', 'admin.mail.empty': 'No email logs', 'admin.mail.recipient': 'Recipient', 'admin.mail.provider': 'Provider', 'admin.mail.details': 'Details', 'admin.mail.status': 'Status', 'admin.mail.success': 'Success', 'admin.mail.failed': 'Failed', 'admin.event.email_sent': 'Email sent', 'admin.event.email_failed': 'Email failed', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Admin test email sent', 'admin.event.admin_email_test_failed': 'Admin test email failed', 'admin.logs.empty': 'No records', 'admin.logs.date': 'Date', 'admin.logs.provider': 'Provider', 'admin.logs.model': 'Model', 'admin.logs.action': 'Action', 'admin.logs.langs': 'Languages', 'admin.logs.in': 'In', 'admin.logs.out': 'Out', 'admin.logs.total': 'Total', 'admin.logs.ms': 'ms', 'admin.logs.status': 'Status', 'admin.stats.activity_30d': 'Activity over 30 days', 'admin.stats.tasks_label': 'Tasks', 'admin.stats.users_label': 'Users', 'admin.stats.specialists_label': 'Specialists', 'admin.stats.tokens_title': 'Token usage (by month)', 'admin.stats.tokens_out': 'Output', 'admin.stats.tokens_in': 'Input', 'admin.stats.tokens_out_label': 'Output tokens', 'admin.stats.tokens_in_label': 'Input tokens', 'admin.stats.cost_label': 'Cost (USD)', 'admin.stats.tasks_by_status': 'Tasks by status', 'admin.task_status.open': 'Open', 'admin.task_status.in_progress': 'In progress', 'admin.task_status.completed': 'Completed', 'admin.task_status.cancelled': 'Cancelled', 'admin.task_status.draft': 'Drafts', 'admin.settings.tab.general': 'General', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Notifications', 'admin.settings.tab.payment': 'Payment', 'admin.settings.tab.referral': 'Referrals', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO & Maintenance', 'admin.settings.seo.maintenance_label': 'Maintenance Mode', 'admin.settings.seo.maintenance_hint': 'Show a maintenance page to all visitors', 'admin.settings.seo.indexing_label': 'Search Engine Indexing', 'admin.settings.seo.indexing_hint': 'Allow search engines to index the site', 'admin.settings.seo.head_scripts_label': ' Scripts (JS)', 'admin.settings.seo.head_scripts_hint': 'Runs on every page (Google Tag Manager, analytics, etc.)', 'admin.settings.seo.site_title_label': 'Site Title', 'admin.settings.seo.site_description_label': 'Site Description (meta description)', 'admin.settings.referral.title': 'Referral program', 'admin.settings.referral.hint': 'Reward users who bring new registrations.', 'admin.settings.referral.enabled_label': 'Enabled', 'admin.settings.referral.enabled_hint': 'Enable / disable reward application', 'admin.settings.referral.customer_section': 'For customers', 'admin.settings.referral.specialist_section': 'For specialists', 'admin.settings.referral.plan_label': 'Reward plan', 'admin.settings.referral.no_plan': '— no plan —', 'admin.settings.referral.plan_hint': 'This plan will be assigned to the referrer. If their current plan is higher, only days will be added.', 'admin.settings.referral.days_label': 'Reward days', 'admin.settings.referral.days_hint': 'Number of days added to the plan expiry.', 'admin.settings.general.title': 'General settings', 'admin.settings.general.site_name': 'Site name', 'admin.settings.general.site_url': 'Site URL', 'admin.settings.general.contact_email': 'Contact email', 'admin.settings.general.support_phone': 'Support phone', 'admin.settings.smtp.title': 'SMTP settings', 'admin.settings.smtp.hint': 'Used to send email notifications.', 'admin.settings.smtp.host': 'SMTP Host', 'admin.settings.smtp.port': 'Port', 'admin.settings.smtp.encryption': 'Encryption', 'admin.settings.smtp.enc.none': 'None', 'admin.settings.smtp.enc.tls': 'STARTTLS (port 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (port 465)', 'admin.settings.smtp.username': 'Username', 'admin.settings.smtp.password': 'Password / App Password', 'admin.settings.smtp.from_name': 'Sender name', 'admin.settings.smtp.from_email': 'Sender email', 'admin.settings.smtp.test': 'Send test email', 'admin.settings.smtp.sending': 'Sending...', 'admin.settings.payment.hint': 'ePay Piraeus Bank credentials.', 'admin.settings.env.test': 'Test (sandbox)', 'admin.settings.env.prod': 'Production', 'admin.settings.env.label': 'Environment', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Active', 'admin.settings.saving': 'Saving...', 'admin.settings.saved': 'Saved', 'admin.notif.vars_hint': 'Available variables in templates', 'admin.notif.tmpl.not_set': 'Template not configured', 'admin.notif.tmpl.subject_label': 'Email subject', 'admin.notif.tmpl.body_label': 'Email body (HTML)', 'admin.notif.tmpl.save': 'Save', 'admin.notif.tmpl.close': 'Close', 'admin.notif.tmpl.translate': 'Auto-translate to other languages', 'admin.notif.tmpl.translating': 'Translating...', 'admin.notif.tmpl.saving': 'Saving...', 'admin.notif.email_verification': 'Email verification', 'admin.notif.registration_success': 'Successful registration', 'admin.notif.password_reset': 'Password reset', 'admin.notif.new_offer': 'New offer', 'admin.notif.new_task': 'New task', 'admin.notif.offer_accepted': 'Offer accepted', 'admin.notif.new_message': 'New message', 'admin.notif.offer_declined': 'Offer declined', 'admin.notif.offer_other_accepted': 'Another specialist chosen', 'admin.notif.task_updated': 'Task updated', 'admin.notif.deadline_reminder': 'Deadline reminder', 'admin.notif.task_archived': 'Task unpublished automatically', 'admin.notif.referral_reward': 'Referral reward', // Plan lifecycle email templates 'admin.email_template.plan_activated': 'Plan activated', 'admin.email_template.plan_upgraded': 'Plan upgraded', 'admin.email_template.plan_downgrade_scheduled': 'Downgrade scheduled', 'admin.email_template.plan_downgrade_applied': 'Downgrade applied', 'admin.email_template.plan_renewal_reminder': 'Renewal reminder', 'admin.email_template.plan_insufficient_funds': 'Insufficient funds warning', // Pricing confirm modal 'pricing.confirm.title': 'Confirm plan selection', 'pricing.confirm.plan': 'Plan', 'pricing.confirm.prorated': 'Prorated credit', 'pricing.confirm.effective_price': 'Amount due', 'pricing.confirm.your_balance': 'Your balance', 'pricing.confirm.downgrade_info': 'The switch to the new plan will happen automatically after the current period ends.', 'pricing.confirm.insufficient': 'Insufficient balance.', 'pricing.confirm.top_up': 'Top up', 'pricing.confirm.schedule_downgrade': 'Schedule downgrade', 'pricing.confirm.pay': 'Pay', 'admin.user_edit.title': 'Edit user', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Registered', 'admin.user_edit.last_seen': 'Last seen', 'admin.user_edit.lang': 'Language', 'admin.user_edit.first_name': 'First name', 'admin.user_edit.last_name': 'Last name', 'admin.user_edit.phone': 'Phone', 'admin.user_edit.bio': 'Bio', 'admin.user_edit.role': 'Role', 'admin.user_edit.plan': 'Plan', 'admin.user_edit.no_plan': '— No plan —', 'admin.user_edit.active': 'Active account', 'admin.user_edit.balance': 'Balance (EUR)', 'admin.user_edit.skills': 'Skills', 'admin.user_edit.tab.profile': 'Profile', 'admin.user_edit.tab.account': 'Account', 'admin.user_edit.tab.balance': 'Balance', 'admin.user_edit.tab.settings': 'Settings', 'admin.user_edit.tab.specialist': 'Portfolio', 'admin.user_edit.tab.site': 'Website', 'admin.user_edit.plan_expires': 'Plan expires', 'admin.user_edit.interface_lang': 'Interface language', 'admin.user_edit.comm_languages': 'Communication languages', 'admin.user_edit.personal_site_slug': 'Personal page', 'admin.user_edit.show_contact_info': 'Show contact info', 'admin.user_edit.show_contact_info.hint': 'Visible to customers', 'admin.user_edit.notify_new_tasks': 'Notify about new tasks', 'admin.user_edit.notify_new_tasks.hint': 'Push and email notifications', 'admin.user_edit.notif_messages': 'Message notifications', 'admin.user_edit.notif_messages.hint': 'New messages in chat', 'admin.user_edit.site_settings': 'Personal page settings', 'admin.user_edit.categories': 'Service categories', 'admin.user_edit.locations': 'Service areas', 'admin.user_edit.skill_placeholder': 'New skill...', 'admin.user_edit.add_category': '— Select category —', 'admin.user_edit.add_location': '— Select location —', 'admin.user_edit.specialist_cards': 'Portfolio', 'admin.user_edit.no_cards': 'No portfolio found', 'admin.user_edit.card_title': 'Portfolio title', 'admin.user_edit.card_description': 'Description', 'admin.balance.topup.btn': 'Top up', 'admin.balance.withdraw.btn': 'Withdraw', 'admin.balance.modal_hint': 'Changes take effect immediately and are recorded in history', 'admin.balance.topup.title': 'Top up balance', 'admin.balance.topup.amount': 'Amount', 'admin.balance.topup.description': 'Comment', 'admin.balance.topup.description.placeholder': 'For example: bonus or manual top-up', 'admin.balance.topup.submit': 'Top up balance', 'admin.balance.withdraw.title': 'Withdraw balance', 'admin.balance.withdraw.amount': 'Amount', 'admin.balance.withdraw.description': 'Comment', 'admin.balance.withdraw.description.placeholder': 'For example: refund or manual debit', 'admin.balance.withdraw.submit': 'Withdraw from balance', 'admin.user_edit.role.customer': 'Customer', 'admin.user_edit.role.specialist': 'Specialist', 'admin.user_edit.role.admin': 'Administrator', 'common.refresh': 'Refresh', 'common.back_home': 'Home', 'admin.loc.hint': 'Manage cities and districts', 'admin.loc.add_city': 'New city', 'admin.loc.add_district': 'Add district', 'admin.loc.new': 'New location', 'admin.loc.edit': 'Edit location', 'admin.loc.district': 'district', 'admin.loc.empty': 'No locations', 'admin.loc.delete.confirm': 'Delete location? All districts will also be deleted.', 'admin.cat.add_root': 'New category', 'admin.cat.add_sub': 'Subcategory', 'admin.cat.edit': 'Edit', 'admin.cat.delete': 'Delete', 'admin.cat.delete.confirm': 'Delete category? All subcategories will also be deleted.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Icon', 'admin.cat.name_el': 'Greek', 'admin.cat.name_en': 'English', 'admin.cat.name_ru': 'Russian', 'admin.cat.order': 'Order', 'admin.cat.active': 'Active', 'admin.cat.parent': 'Parent category', 'admin.cat.no_parent': 'Top level', 'admin.cat.save': 'Save', 'admin.cat.cancel': 'Cancel', 'admin.cat.empty': 'No categories', 'admin.cat.hint': 'Manage categories with multi-level hierarchy', 'admin.cat.new': 'New category', 'admin.cat.subcategory': 'subcategory', 'admin.cat.add_child': 'Add subcategory', 'admin.cat.inactive': 'Inactive', 'admin.event.user_login': 'Login', 'admin.event.user_register': 'Registration', 'admin.event.admin_user_deactivate': 'User blocked', 'admin.event.admin_user_activate': 'User activated', 'admin.event.admin_user_role_changed': 'Role changed', 'admin.event.admin_task_cancelled': 'Task cancelled', 'admin.event.admin_task_deleted': 'Task deleted', 'admin.event.admin_report_reviewed': 'Report reviewed', 'admin.event.admin_report_dismissed': 'Report dismissed', 'admin.event.task_created': 'Task created', // User status 'user.online': 'Online', 'user.seen_minutes': 'was here {n} min ago', 'user.seen_hours': 'was here {n} hr ago', 'user.seen_yesterday': 'was here yesterday', 'user.seen_days': 'was here {n} days ago', // Specialists 'specialists.title': 'Specialists', 'specialists.search': 'Search specialist...', 'specialists.search.btn': 'Search', 'specialists.empty': 'No specialists found', 'specialists.no_bio': 'No description', 'specialists.view': 'View profile', 'specialists.reviews': 'reviews', 'specialist.favorite': 'Add to favorites', 'specialist.unfavorite': 'Remove from favorites', 'specialist.site_link': 'Personal site', 'favorites.specialists.title': 'Favourite specialists', 'favorites.specialists.empty': 'No favourite specialists yet', 'nav.favorites': 'Favourites', 'nav.schedule': 'Schedule', 'nav.find_tasks': 'Find Orders', 'schedule.title': 'My Schedule', 'schedule.subtitle': 'Mark the days when you are free or busy — clients will see your availability', 'schedule.available': 'Available', 'schedule.busy': 'Busy', 'schedule.unset': 'Not set', 'schedule.click_hint': '← click to cycle status', 'schedule.range_mode': 'Select range', 'schedule.range_from': 'From {date} — select end date', 'schedule.click_to_set': 'Click to set', 'schedule.free': 'free', 'schedule.busy_count': 'busy', 'schedule.free_days': 'free days', 'schedule.googleCalendar': 'Google Calendar', 'schedule.connectGoogle': 'Connect Google Calendar', 'schedule.disconnectGoogle': 'Disconnect', 'schedule.connectedAs': 'Connected as', 'schedule.importFromGoogle': 'Sync from Google', 'schedule.gcalConnected': '\u2713 Google Calendar connected', 'schedule.gcalError': 'Google Calendar connection error', 'schedule.gcalImportDone': 'Imported {n} days from Google Calendar', 'schedule.gcalAutoSyncNote': 'Availability changes are automatically synced to Google Calendar', 'schedule.gcalConnectDesc': 'Connect Google Calendar to automatically sync your availability', 'schedule.gcalDisconnectConfirm': 'Disconnect Google Calendar?', 'find_tasks.title': 'Find Orders', 'find_tasks.for_me': 'For me', 'find_tasks.all': 'All orders', 'find_tasks.by_category': 'By category', 'find_tasks.list': 'List', 'find_tasks.already_offered': 'Offer sent', 'find_tasks.offer_now': 'Make an offer', 'find_tasks.empty_for_me': 'No tasks found in your categories', 'find_tasks.banner_hint': 'Find tasks matching your portfolio categories', 'find_tasks.no_cards': 'Create a specialist portfolio to see tasks matched to you', 'find_tasks.add_card': 'Create portfolio', 'find_tasks.search': 'Search tasks...', 'find_tasks.tasks_count': 'tasks', 'footer.tagline': 'The task platform for Greece', 'footer.rights': 'All rights reserved.', // App download section 'app.download_title': 'Download the CanHelp mobile app', 'app.download_desc': 'All of CanHelp — always at your fingertips. Available for Android and iOS.', // Nav 'nav.pricing': 'Pricing', // Pricing page 'pricing.title': 'Pricing', 'pricing.subtitle': 'Choose the right plan for you', 'pricing.role.customer': 'Customer', 'pricing.role.specialist': 'Specialist', 'pricing.free': 'Free', 'pricing.per_month': 'mo', 'pricing.duration': 'Duration', 'pricing.days': 'days', 'pricing.current_plan': 'Your plan', 'pricing.popular': 'Popular', 'pricing.choose': 'Choose', 'pricing.your_plan': 'Active plan', 'pricing.free_default': 'Default', 'pricing.compare': 'Compare features', 'pricing.feature': 'Feature', 'pricing.faq_note': 'Payment is deducted from your CanHelp balance. Top up available in Payments.', 'pricing.feat.messages': 'Messages / day', 'pricing.feat.orders': 'Orders / day', 'pricing.feat.contact_all': 'Contact everyone', 'pricing.feat.view_phone': 'View phone number', 'pricing.feat.show_contact': 'Show contact info', 'pricing.feat.favorites': 'Favorites', 'pricing.feat.verified_badge': 'Verified badge', 'pricing.feat.google_calendar': 'Google Calendar', 'pricing.feat.personal_site': 'Personal site', 'pricing.feat.auto_response': 'Auto-response', 'pricing.feat.auto_match': 'Auto-match', 'pricing.feat.highlighted_reviews': 'Highlighted reviews', 'pricing.feat.portfolio': 'Portfolio items', 'pricing.feat.cards': 'Specialist cards', 'pricing.feat.notify_tasks': 'New task notifications', 'pricing.feat.video': 'Video in portfolio', // Upgrade prompt 'upgrade.available_in': 'Available in', 'upgrade.cta': 'Upgrade', // Dashboard plan block 'dashboard.plan.title': 'My Plan', 'dashboard.plan.expires': 'Expires in {n} days', 'dashboard.plan.upgrade': 'Upgrade plan', 'dashboard.plan.no_plan': 'Free plan', 'dashboard.plan.messages': 'Messages today', 'dashboard.plan.orders': 'Orders today', 'dashboard.plan.limits': 'Daily limits', 'dashboard.plan.features': 'Features', 'dashboard.plan.stats': 'Stats', 'dashboard.stats.cards': 'Portfolios', 'dashboard.stats.maxCards': 'Max portfolios', 'dashboard.stats.portfolioItems': 'Portfolio items', 'dashboard.stats.maxPortfolioItems': 'Max items', 'dashboard.stats.activeOffers': 'Active offers', 'dashboard.stats.reviewsReceived': 'Reviews', 'dashboard.stats.activeTasks': 'Active tasks', 'dashboard.stats.completedTasks': 'Completed', 'status.need_help': 'I need help', 'status.active': 'Active', 'status.toggle_on': 'Enable', 'status.toggle_off': 'Disable', // FOMO 'fomo.missed_orders': 'Missed {n} orders', 'fomo.missed_value': 'Worth €{v}', 'fomo.upgrade_hint': 'Upgrade to receive more orders', 'fomo.conversion': 'Task conversion', 'fomo.active': 'Active', 'fomo.with_offers': 'With offers', 'fomo.completed': 'Completed', 'fomo.already_offered': '{n} specialists have already responded', 'fomo.specialist_missed': 'You missed {n} orders', 'fomo.top_categories': 'Categories', 'fomo.offers_received': 'offers received', 'fomo.avg_offers': 'Avg {n}/task', 'fomo.completion_rate': 'completed', // Task auto-match 'task.auto_match': 'Auto-match', 'task.auto_match_results': 'Top specialists', 'task.no_offer_yet': 'You haven\'t sent an offer yet', 'task.make_offer': 'Send offer', 'auto_response.title': 'Auto-Response', 'auto_response.enabled': 'Enable auto-response', 'auto_response.min_budget': 'Min budget', 'auto_response.max_budget': 'Max budget', 'auto_response.default_price': 'Default price', 'auto_response.default_message': 'Default message', 'auto_response.max_per_day': 'Max auto-offers per day', 'auto_response.save': 'Save', 'auto_response.saved': 'Saved', 'auto_response.categories': 'Categories', 'auto_response.locations': 'Locations', // Personal site 'profile.personal_site': 'Personal Site', 'profile.site_slug': 'URL slug', 'profile.site_slug_hint': 'Only latin letters, numbers, - and _', 'profile.site_open': 'Open site', 'profile.site_preview': 'Your site', 'profile.show_contact': 'Show contact info', 'profile.show_contact_hint': 'Customers with Pro/Ultimate plans will see your phone number', // Google Calendar plan gate 'gcal.upgrade_required': 'Google Calendar requires a Pro or Ultimate plan', // Chat limits 'chat.limit_warning': '{n} messages left today', 'chat.limit_reached': 'Message limit reached. Upgrade your plan', 'chat.upgrade': 'Upgrade', // Site page 'site.member_since': 'Member since', 'site.rating': 'Rating', 'site.completed_tasks': 'Completed', 'site.languages': 'Languages', 'site.photos': 'photos', 'site.contact_form': 'Get in touch', 'site.contact_sent': 'Message sent!', 'site.contact_sent_desc': 'The specialist will contact you soon', 'site.contact_name': 'Name', 'site.contact_name_ph': 'Your name', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Message', 'site.contact_message_ph': 'Describe your task...', 'site.contact_send': 'Send', 'site.share': 'Share', 'site.speaks_languages': 'Speaks', 'site.message_sent': 'Message sent!', 'site.message_sent_desc': 'The specialist will receive it in the chat', 'site.message_placeholder': 'Write your message...', 'site.write_to_chat': 'Write to chat', 'site.auth_required_title': 'Sign in required', 'site.auth_required_desc': 'To write in the chat, you need to sign in to your CanHelp account.', 'site.auth_login_btn': 'Sign in', 'site.auth_contact_form_btn': 'Contact via feedback form', 'specialist.services': 'Services', 'portfolio.title': 'Portfolio', 'status.can_help_now': 'Available now', 'common.not_found': 'Page not found', 'common.anonymous': 'Anonymous' }, ru: { 'footer.slogan': 'Ваша задача — наша забота! Решаем любые вопросы быстро и удобно.', 'footer.links': 'Ссылки', 'footer.socials': 'Мы в соцсетях', 'nav.home': 'Главная', 'nav.tasks': 'Задачи', 'nav.post': '+ Опубликовать', 'nav.dashboard': 'Панель управления', 'nav.chat': 'Сообщения', 'nav.notifications': 'Уведомления', 'nav.profile': 'Профиль', 'nav.admin': 'Админка', 'nav.specialists': 'Специалисты', 'nav.new_task': 'Новая задача', 'nav.login': 'Войти', 'nav.register': 'Регистрация', 'nav.logout': 'Выйти', 'hero.title': 'Найди специалиста для любой работы', 'hero.subtitle': 'Опубликуй задачу, получи предложения и выбери лучшего профессионала', 'hero.cta.post': 'Опубликовать задачу', 'hero.cta.browse': 'Найти работу', 'hero.search.placeholder': 'Что нужно? напр. электрик, уборка...', 'stats.specialists': 'специалистов', 'stats.tasks': 'задач', 'stats.categories': 'категорий', 'stats.free': 'бесплатная регистрация', 'section.categories': 'Создай задачу в любой категории', 'section.how': 'Как это работает', 'section.recent': 'Последние задачи', 'section.all': 'Смотреть все →', 'section.more': 'ещё', 'section.cities': 'Города и районы', 'section.community': 'Общественный проект для всех', 'community.subtitle': 'CanHelp — не просто маркетплейс, это сообщество взаимопомощи. Любой, у кого есть знания или навык, может найти клиента. Любой, у кого есть задача, может найти специалиста.', 'community.point1.title': 'Умеете что-то делать?', 'community.point1.desc': 'Ремонт, репетиторство, дизайн, переводы, уход — каждый навык имеет ценность. Создайте профиль и находите клиентов рядом с вами.', 'community.point2.title': 'Нужна помощь?', 'community.point2.desc': 'Опубликуйте задачу за минуту и получайте предложения от проверенных специалистов в вашем городе.', 'community.point3.title': 'Помогите проекту расти', 'community.point3.desc': 'CanHelp развивается благодаря сообществам. Поделитесь ссылкой с друзьями и знакомыми — вместе мы строим что-то полезное для всех.', 'community.share': 'Поделиться с друзьями', 'community.share.copied': 'Ссылка скопирована!', // Referral section on home page 'section.referral': 'Реферальная программа', 'referral.home.subtitle': 'Поделитесь ссылкой — каждый новый пользователь, зарегистрировавшийся по ней, принесёт вам награду.', 'referral.home.step1.title': 'Зарегистрируйтесь и получите ссылку', 'referral.home.step1.desc': 'Создайте аккаунт и найдите свою уникальную реферальную ссылку в профиле.', 'referral.home.step2.title': 'Поделитесь с друзьями', 'referral.home.step2.desc': 'Отправьте ссылку друзьям, знакомым или опубликуйте в социальных сетях.', 'referral.home.step3.title': 'Получайте награды', 'referral.home.step3.desc': 'Как только друг подтвердит email, вы автоматически получите свою награду.', 'referral.home.cta': 'Получить ссылку', 'referral.home.badge': 'Реферальная программа', // FAQ section 'section.faq': 'Частые вопросы', 'faq.q1': 'Как работает CanHelp?', 'faq.a1': 'Опубликуйте задачу, получите предложения от специалистов, выберите лучшего и начните сотрудничество. Это быстро, просто и бесплатно для клиентов.', 'faq.q2': 'Сколько стоит использование платформы?', 'faq.a2': 'Регистрация и публикация задач полностью бесплатны для клиентов. Специалисты имеют доступ к бесплатному плану, а также к премиум-опциям.', 'faq.q3': 'Как стать специалистом?', 'faq.a3': 'Зарегистрируйтесь, перейдите в «Стать специалистом», заполните профиль навыками и категориями и начните получать задачи.', 'faq.q4': 'Как выбрать подходящего специалиста?', 'faq.a4': 'Оцените отзывы, опыт, навыки и портфолио каждого специалиста. Общайтесь через чат платформы и уточняйте детали до принятия решения.', 'faq.q5': 'Что если я не доволен результатом?', 'faq.a5': 'Вы можете оставить отзыв о специалисте и поставить оценку от 1 до 5 звёзд. Отзывы помогают другим пользователям выбирать проверенных профессионалов.', 'faq.q6': 'Можно ли связаться со специалистом до принятия предложения?', 'faq.a6': 'Да. Как только вы получили предложение, можно открыть чат со специалистом, задать вопросы и уточнить все детали до принятия решения.', 'faq.q7': 'Сколько времени ждать предложений?', 'faq.a7': 'Как правило, в течение нескольких часов. Специалисты получают уведомление о новых задачах и могут быстро ответить.', 'faq.q8': 'Можно ли разместить задачу в любом городе Греции?', 'faq.a8': 'Да! CanHelp охватывает всю Грецию — Афины, Фессалоники, Патры и другие города.', 'faq.q9': 'Какие виды задач есть на CanHelp?', 'faq.a9': 'Ремонт, уборка, электрики, репетиторство, дизайн, IT, переезды, красота и многое другое. Категории постоянно расширяются.', 'faq.q10': 'Есть ли мобильное приложение?', 'faq.a10': 'Да! CanHelp доступно для Android и iOS. Скачайте приложение и управляйте всем со своего телефона.', 'how.step1.title': 'Опубликуй задачу', 'how.step1.desc': 'Опиши что нужно и установи бюджет', 'how.step2.title': 'Получи предложения', 'how.step2.desc': 'Специалисты пришлют предложения с ценой и сроками', 'how.step3.title': 'Выбери и начни', 'how.step3.desc': 'Выбери лучшего профессионала и начни сотрудничество', 'tasks.title': 'задач', 'tasks.filters': 'Фильтры', 'tasks.search': 'Поиск', 'tasks.search.placeholder': 'Название или ключевое слово...', 'tasks.search.btn': 'Поиск', 'tasks.publish': 'Опубликовать', 'tasks.category.all': 'Все', 'tasks.category.all_in': 'Все в', 'tasks.category.label': 'Категория', 'tasks.location.label': 'Город', 'tasks.location.placeholder': 'напр. Афины', 'tasks.empty': 'Задачи не найдены', 'tasks.empty.cta': 'Опубликуй первую', 'task.status.open': 'Открыта', 'task.status.in_progress': 'В работе', 'task.status.completed': 'Завершена', 'task.status.cancelled': 'Отменена', 'task.status.draft': 'Черновик', 'task.budget': 'Бюджет', 'task.location': 'Местоположение', 'task.deadline': 'Дата начала', 'task.created_at': 'Создано', 'task.customer': 'Заказчик', 'task.offer.btn': 'Отправить предложение', 'task.invite.banner_title': 'Вас пригласили на это задание', 'task.invite.banner_hint': 'Заказчик лично пригласил вас', 'task.invite.accept': 'Отправить предложение', 'task.invite.decline': 'Отказаться', 'offer.accept': 'Принять', 'offer.decline': 'Отклонить', 'task.complete': 'Завершить задачу', 'task.complete.confirm': 'Отметить задачу как выполненную?', 'task.edit': 'Редактировать', 'task.status_label': 'Статус', 'task.yours': 'Ваша задача', 'task.offer.yours': 'Ваше предложение', 'review.leave': 'Оставить отзыв', 'review.rating': 'Оценка', 'review.comment': 'Комментарий', 'review.comment.placeholder': 'Расскажите о своём опыте...', 'review.submit': 'Отправить отзыв', 'review.submitting': 'Отправка...', 'review.done': 'Отзыв отправлен!', 'profile.reviews': 'Отзывы', 'profile.no_reviews': 'Отзывов пока нет', 'profile.rating': 'Рейтинг', 'profile.skills.label': 'Навыки', 'profile.member_since': 'Участник с', 'task.offers': 'Предложения', 'task.offers.none': 'Предложений пока нет', 'create.title': 'Опубликовать задачу', 'create.field.title': 'Название', 'create.field.description': 'Описание', 'create.field.category': 'Категория', 'create.field.category.select': 'Выберите...', 'create.field.location': 'Местоположение', 'create.field.location.any': 'Где угодно', 'create.field.location.all': 'Весь город', 'create.field.budget': 'Бюджет (€)', 'create.field.deadline': 'Дата начала', 'create.field.budget_negotiable': 'Цена обсуждается', 'create.field.time_slot': 'Время выполнения', 'create.field.time_slot.any': 'В любое время', 'create.field.time_slot.morning': 'Утром (08:00–13:00)', 'create.field.time_slot.afternoon': 'Днём (13:00–18:00)', 'create.field.time_slot.evening': 'Вечером (18:00–22:00)', 'create.field.time_slot.weekend': 'Выходной', 'create.field.address': 'Адрес (необязательно)', 'create.field.address.district': 'Квартал', 'create.field.address.street': 'Улица', 'create.field.address.house': 'Дом', 'create.field.confidential': 'Конфиденциальная заметка', 'create.field.confidential.placeholder': 'Детали, видные только назначенному специалисту...', 'create.field.confidential.hint': 'Не отображается публично', 'create.field.photos': 'Фотографии', 'create.field.photos.add': 'Добавить фото', 'create.field.photos.uploading': 'Загрузка...', 'task.budget_negotiable': 'Цена обсуждается', 'task.time_slot': 'Время', 'task.confidential': 'Конфид. заметка', 'create.field.title.placeholder': 'напр. Уборка квартиры 80кв', 'create.field.description.placeholder': 'Подробно опишите что нужно...', 'create.field.location.placeholder': 'напр. Афины, Колонаки', 'create.field.budget.placeholder': 'напр. 100', 'create.submit': 'Опубликовать задачу', 'create.submitting': 'Публикация...', 'login.title': 'Добро пожаловать', 'login.subtitle': 'Вход в CanHelp', 'login.email': 'Email', 'login.password': 'Пароль', 'login.submit': 'Войти', 'login.submitting': 'Вход...', 'login.error': 'Неверный email или пароль', 'login.unverified.title': 'Подтвердите ваш email', 'login.unverified.desc': 'Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.', 'login.unverified.resend': 'Отправить письмо повторно', 'login.unverified.sending': 'Отправка...', 'login.unverified.sent': '✓ Отправлено — проверьте входящие', 'profile.email.verified': 'Email подтверждён', 'profile.email.not_verified': 'Email не подтверждён', 'login.no_account': 'Нет аккаунта?', 'login.register_link': 'Зарегистрироваться', 'login.forgot_password': 'Забыл пароль?', 'login.or_continue_with': 'или продолжите через', 'login.continue_google': 'Войти через Google', 'forgot.title': 'Забыл пароль', 'forgot.subtitle': 'Введите email для получения ссылки восстановления', 'forgot.email': 'Email', 'forgot.submit': 'Отправить ссылку', 'forgot.submitting': 'Отправка...', 'forgot.sent.title': 'Проверьте входящие', 'forgot.sent.desc': 'Если аккаунт с таким email существует, мы отправим ссылку для сброса пароля.', 'forgot.back_to_login': 'Вернуться ко входу', 'forgot.error': 'Не удалось отправить ссылку. Проверьте адрес и попробуйте снова.', 'forgot.error.not_found': 'Аккаунт с таким email не найден.', 'forgot.error.send_failed': 'Ошибка отправки письма. Попробуйте позже.', 'reset.title': 'Новый пароль', 'reset.subtitle': 'Введите новый пароль', 'reset.password': 'Новый пароль', 'reset.confirm': 'Подтвердите пароль', 'reset.submit': 'Изменить пароль', 'reset.submitting': 'Сохранение...', 'reset.success': 'Пароль успешно изменён. Перенаправление ко входу...', 'reset.back_to_login': 'Вернуться ко входу', 'reset.error.mismatch': 'Пароли не совпадают', 'reset.error.invalid': 'Недействительная или устаревшая ссылка. Запросите новую.', 'register.title': 'Регистрация', 'register.subtitle': 'Создать аккаунт в CanHelp', 'register.first_name': 'Имя', 'register.last_name': 'Фамилия', 'register.email': 'Email', 'register.password': 'Пароль (мин. 8 символов)', 'register.role': 'Роль', 'register.role.customer': 'Пользователь', 'register.role.customer.desc': 'Публикую задачи', 'register.role.specialist': 'Специалист', 'register.role.specialist.desc': 'Беру задачи', 'register.submit': 'Создать аккаунт', 'register.submitting': 'Регистрация...', 'register.has_account': 'Уже есть аккаунт?', 'register.login_link': 'Войти', 'register.continue_google': 'Зарегистрироваться через Google', 'register.check_email.title': 'Проверьте почту', 'register.check_email.desc': 'Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.', 'register.check_email.login': 'Вернуться к входу', 'dashboard.title': 'Панель управления', 'dashboard.new_task': '+ Новая задача', 'dashboard.my_tasks': 'Мои задачи', 'dashboard.my_offers': 'Мои предложения', 'dashboard.invitations': 'Приглашения на задания', 'dashboard.offers_count': 'предл.', 'dashboard.declined_count': 'откл.', 'dashboard.completed_tasks': 'Завершённые задачи', 'dashboard.completed_offers': 'Завершённые предложения', 'dashboard.review_pending': 'Оценка ещё не оставлена', 'tasks.new.top_specialists': 'Топ специалисты', 'tasks.new.select_category': 'Выберите категорию, чтобы увидеть специалистов', 'tasks.new.invite': 'Предложить работу', 'tasks.new.invited': 'Выбран ✓', 'reviews.count': 'отзывов', 'filter.location': 'Локация', 'filter.language': 'Языки', 'filter.language.any': 'Любой язык', 'filter.category.all': 'Все категории', 'user.categories': 'Категории', 'user.work_area': 'Район работы', 'dashboard.tasks.empty': 'Вы не публиковали задачи', 'dashboard.tasks.empty.cta': 'Опубликуйте первую', 'dashboard.tasks.add_new': 'Добавить новую задачу', 'dashboard.offers.empty': 'Вы не отправляли предложений', 'dashboard.offers.empty.cta': 'Найти задачи', 'dashboard.customer.specialists_title': 'Ищете исполнителя?', 'dashboard.customer.specialists_hint': 'Просматривайте профили специалистов, читайте отзывы и приглашайте их на свои задачи', 'dashboard.customer.specialists_cta': 'Найти исполнителя', 'dashboard.customer.how_title': 'Как это работает', 'dashboard.customer.step1': 'Создайте задачу с описанием и бюджетом', 'dashboard.customer.step2': 'Специалисты пришлют предложения с ценой и сроками', 'dashboard.customer.step3': 'Выберите подходящего и начните работу', 'notif.title': 'Уведомления', 'notif.mark_all': 'Отметить все как прочитанные', 'notif.empty': 'Нет уведомлений', 'notif.type.new_offer': 'Новое предложение', 'notif.type.offer_accepted': 'Ваше предложение принято', 'notif.type.offer_declined': 'Ваше предложение отклонено', 'notif.type.task_completed': 'Задание выполнено', 'notif.type.task_cancelled': 'Задание отменено', 'notif.type.new_message': 'Новое сообщение', 'notif.type.new_review': 'Новый отзыв', 'notif.type.task_invite': 'Приглашение на задание', 'notif.body.new_offer': 'Новое предложение на «{title}»', 'notif.body.offer_accepted': 'Ваше предложение на «{title}» принято', 'notif.body.offer_declined': 'Ваше предложение на «{title}» отклонено', 'notif.body.task_invite': 'Вас приглашают на «{title}»', 'notif.body.new_review': 'Вы получили оценку {rating}★', 'offer.status.pending': 'Ожидает', 'offer.status.accepted': 'Принято', 'offer.status.declined': 'Отклонено', 'offer.status.withdrawn': 'Отозвано', 'offer.status.other_accepted': 'Выбран другой исполнитель', 'common.loading': 'Загрузка...', 'common.error': 'Ошибка', 'common.save': 'Сохранить', 'common.saving': 'Сохранение...', 'common.cancel': 'Отмена', 'common.add': 'Добавить', 'common.close': 'Закрыть', 'common.edit': 'Редактировать', 'common.delete': 'Удалить', 'common.from': 'от', 'common.currency': '€', 'common.greece': 'Греция', // Chat 'chat.connected': 'Подключено', 'chat.disconnected': 'Отключено', 'chat.no_rooms': 'Переписок пока нет', 'chat.task_fallback': 'Задача', 'chat.select': 'Выберите переписку', 'chat.no_messages': 'Сообщений пока нет', 'chat.placeholder': 'Напишите сообщение... (Enter для отправки)', 'chat.conversation_fallback': 'Переписка', 'chat.direct_chat': 'Личный чат', 'chat.linked_task': 'Прикреплённый заказ', 'chat.write_btn': 'Написать', 'chat.just_now': 'только что', 'chat.min_ago': 'м', 'chat.write_specialist': 'Написать специалисту', 'chat.write_customer': 'Написать заказчику', 'chat.notif_settings': 'Настройки уведомлений', 'chat.notif_messages': 'Уведомления о новых сообщениях', 'chat.toast_title': 'Новое сообщение', 'chat.toast_open': 'Открыть чат', // Offer form 'offer.price': 'Цена', 'offer.price.placeholder': 'напр. 80', 'offer.customer_budget': 'Бюджет заказчика', 'offer.message': 'Сообщение', 'offer.optional': 'необязательно', 'offer.message.placeholder': 'Представьтесь, расскажите об опыте и почему вы лучший выбор...', 'offer.submitting': 'Отправка...', // Profile 'profile.photo': 'Фото профиля', 'profile.photo.change': 'Изменить фото', 'profile.photo.hint': 'JPEG, PNG, WebP · до 5MB', 'profile.basic_info': 'Основная информация', 'profile.phone': 'Телефон', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Краткое описание', 'profile.bio.placeholder': 'Расскажите немного о себе...', 'profile.language': 'Язык', 'profile.language.hint': 'Язык интерфейса и email-уведомлений', 'profile.languages': 'Языки общения', 'profile.languages.hint': 'Выберите все языки, на которых вы общаетесь', 'profile.skills': 'Навыки', 'profile.skills.subtitle': 'Добавьте услуги, которые вы предлагаете', 'profile.skills.placeholder': 'напр. Уборка, IT, Репетиторство...', 'profile.role': 'Роль аккаунта', 'profile.role.specialist': '🔧 Специалист', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 Пользователь', 'profile.role.change': 'Для смены роли обратитесь в службу поддержки.', 'profile.become_specialist': 'Стать специалистом', 'profile.become_specialist.desc': 'Перейдите в роль специалиста, чтобы брать задачи и наполнить профиль.', 'become_specialist.hero.title': 'Зарабатывай, делая то, что умеешь', 'become_specialist.hero.subtitle': 'Создай профиль специалиста и получай заказы от клиентов по всей Греции', 'become_specialist.how.title': 'Как это работает', 'become_specialist.step1.title': 'Создай портфолио специалиста', 'become_specialist.step1.desc': 'Укажи категории, навыки и зону покрытия — система автоматически подберёт подходящие заказы', 'become_specialist.step2.title': 'Ищи заказы', 'become_specialist.step2.desc': 'Просматривай задачи по своим категориям в разделе «Поиск заказов»', 'become_specialist.step3.title': 'Откликайся и зарабатывай', 'become_specialist.step3.desc': 'Отправляй предложения с ценой и сроками, общайся с клиентами и выполняй заказы', 'become_specialist.benefits.title': 'Преимущества профиля специалиста', 'become_specialist.benefit1': 'Поиск заказов по вашим категориям и локации', 'become_specialist.benefit2': 'Публичный профиль с отзывами клиентов', 'become_specialist.benefit3': 'Расписание доступности, видимое клиентам', 'become_specialist.benefit4': 'Добавление в избранное клиентами', 'become_specialist.cta': 'Стать специалистом — это бесплатно', 'become_specialist.free_badge': 'Бесплатная регистрация', 'profile.tab.notifications': 'Уведомления', 'profile.tab.reviews': 'Отзывы', 'profile.tab.referral': 'Рефералы', 'profile.tab.auto_response': 'Авто-ответ', 'profile.tab.site': 'Сайт', 'profile.site.title': 'Персональная страница', 'profile.site.url_label': 'Личный сайт', 'profile.site.copy': 'Копировать', 'profile.site.copied': 'Скопировано', 'profile.site.visible_title': 'Что отображается на вашей странице', 'profile.site.visible.name': 'Имя и фото', 'profile.site.visible.bio': 'Биография', 'profile.site.visible.rating': 'Рейтинг и отзывы', 'profile.site.visible.portfolio': 'Портфолио / Карточки', 'profile.site.visible.contacts': 'Контактные данные', 'profile.site.visible.full_last_name': 'Фамилия полностью', 'profile.site.visible.services': 'Карточки услуг', 'profile.site.visible.reviews': 'Раздел с отзывами', 'profile.site.visible.status': 'Статус «Готов помочь»', 'profile.site.theme': 'Тема оформления', 'profile.site.theme.dark': 'Тёмная', 'profile.site.theme.light': 'Светлая', 'profile.site.slug_taken': 'Этот адрес уже занят', 'profile.site.stats.title': 'Аналитика сайта', 'profile.site.stats.days': 'последние 30 дней', 'profile.site.stats.views': 'Просмотры', 'profile.site.stats.unique': 'Уникальные посетители', 'profile.site.stats.messages': 'Сообщения', 'profile.site.stats.total_views': 'Просмотры', 'profile.site.stats.total_unique': 'Уник. посетители', 'profile.site.stats.total_messages': 'Сообщения', 'profile.site.stats.empty': 'Данных пока нет', 'profile.site.stats.loading': 'Загрузка аналитики...', 'profile.site.stats.no_slug': 'Укажите адрес сайта, чтобы видеть статистику', 'profile.site.edit_bio_hint': 'Биография и фото настраиваются во вкладке «Основное».', 'status.title': 'Статус', 'status.can_help_now_hint': 'Ваша карточка показывается выше в поиске', 'status.need_help_hint': 'Специалисты могут предложить вам помощь', 'profile.referral.title': 'Партнёрская программа', 'profile.referral.desc': 'Поделитесь ссылкой и получайте награду за каждого привлечённого пользователя.', 'profile.referral.link_label': 'Ваша реферальная ссылка', 'profile.referral.copy': 'Копировать', 'profile.referral.copied': 'Скопировано!', 'profile.referral.invited_count': 'успешных приглашений', 'profile.referral.no_code': 'Реферальный код недоступен.', 'notifications.title': 'Настройки уведомлений', 'notifications.email.new_tasks': 'Email о новых заказах', 'notifications.email.new_tasks.desc': 'Получать email, когда в ваших категориях публикуется новый заказ', 'notifications.messages.desc': 'Получать уведомление при новом входящем сообщении', 'notifications.saved': 'Настройки сохранены', 'notifications.plan_required': 'Недоступно в вашем тарифе', 'profile.tab.info': 'Основное', 'profile.tab.finance': 'Финансы', 'profile.tab.skills': 'Навыки', 'profile.tab.categories': 'Категории', 'profile.tab.geography': 'География', 'profile.specialist.categories': 'Категории работ', 'profile.specialist.categories.desc': 'Выберите категории, в которых вы работаете', 'profile.specialist.geography': 'Города покрытия', 'profile.specialist.geography.desc': 'Выберите города / районы, где вы работаете', 'profile.saving': 'Сохранение...', 'profile.upload.error': 'Ошибка загрузки фото', 'profile.saved': 'Сохранено', 'profile.tab.cards': 'Портфолио', 'profile.cards.count': 'Портфолио', 'profile.cards.add': 'Добавить портфолио', 'profile.cards.new_title': 'Название нового портфолио', 'profile.cards.placeholder': 'Например: Сантехника', 'profile.cards.create': 'Создать', 'profile.cards.cancel': 'Отмена', 'profile.cards.empty': 'У вас нет портфолио', 'profile.cards.create_first': 'Создать первое портфолио', 'profile.cards.delete_confirm': 'Удалить портфолио?', 'profile.card.tab.main': 'Основное', 'profile.card.tab.skills': 'Навыки', 'profile.card.tab.categories': 'Категории', 'profile.card.tab.geography': 'География', 'profile.card.tab.portfolio': 'Галерея', 'profile.card.active': 'Активна', 'profile.card.save': 'Сохранить', 'profile.card.saved': 'Сохранено', 'profile.card.delete': 'Удалить', 'profile.card.skill.add': 'Добавить навык', 'profile.card.photo.add': 'Добавить фото', 'profile.card.photo.uploading': 'Загрузка...', 'profile.card.photo.empty': 'Нет фотографий', 'profile.card.item.title': 'Заголовок', 'profile.card.item.desc': 'Описание', 'profile.card.item.save': 'Сохранить', 'profile.card.item.cancel': 'Отмена', 'profile.card.item.edit': 'Описание работы', 'profile.upgrade.cards_limit': 'Лимит портфолио исчерпан', 'profile.upgrade.plan': 'Текущий тариф:', 'profile.upgrade.contact': 'Обратитесь к администратору для смены тарифа', 'profile.upgrade.ok': 'Понятно', 'profile.plan.title': 'Тарифный план', 'profile.balance': 'Баланс', 'profile.balance.topup': 'Пополнить баланс', 'profile.balance.topup.title': 'Пополнить баланс', 'profile.balance.topup.amount': 'Сумма (в EUR)', 'profile.balance.topup.hint': 'Выберите сумму или введите вручную', 'profile.balance.topup.submit': 'Перейти к оплате', 'profile.balance.topup.loading': 'Перенаправление...', 'profile.balance.topup.error': 'Ошибка инициализации платежа. Попробуйте снова.', 'payment.success.title': 'Оплата прошла успешно!', 'payment.success.desc': 'Ваш баланс обновлён.', 'payment.cancelled.title': 'Оплата отменена', 'payment.cancelled.desc': 'Оплата была отменена. Средства не списаны.', 'payment.pending.title': 'Обрабатывается...', 'payment.pending.desc': 'Ваш платёж в обработке.', 'payment.back_to_profile': 'Вернуться в профиль', 'profile.plan.basic': 'Базовый (бесплатный)', 'profile.plan.contact_upgrade': 'Обратитесь к администратору для подключения тарифа', 'profile.plan.cards_up_to': 'Портфолио: до', 'profile.plan.cards_unlimited': 'Портфолио: безлимитно', 'profile.plan.tasks_up_to': 'Задач: до', 'profile.plan.offers_up_to': 'Откликов: до', 'profile.plan.valid_until': 'Действителен до', 'profile.plan.no_expiry': 'Бессрочно', // Create task 'create.error': 'Ошибка при публикации', // Tasks list extras 'tasks.category.general': 'Общее', 'tasks.budget.range': 'Диапазон:', 'tasks.budget.from': 'от', 'tasks.budget.to': 'до', 'tasks.filter.reset': 'Сбросить фильтры', 'tasks.load_more': 'Загрузить ещё', 'tasks.showing': 'Результатов:', 'tasks.field.budget': 'Бюджет, €', // Admin 'admin.title': 'Панель администратора', 'admin.tab.stats': 'Статистика', 'admin.tab.users': 'Пользователи', 'admin.tab.tasks': 'Задачи', 'admin.tab.reports': 'Жалобы', 'admin.stats.users': 'Пользователи', 'admin.stats.tasks': 'Задачи', 'admin.stats.offers': 'Предложения', 'admin.stats.reviews': 'Отзывы', 'admin.tasks.by_status': 'Задачи по статусу', 'admin.col.user': 'Пользователь', 'admin.col.email': 'Email', 'admin.col.role': 'Роль', 'admin.col.registered': 'Регистрация', 'admin.col.status': 'Статус', 'admin.col.title': 'Название', 'admin.col.budget': 'Бюджет', 'admin.col.created': 'Создано', 'admin.users.active': 'Активен', 'admin.users.inactive': 'Неактивен', 'admin.users.deactivate': 'Деактивировать', 'admin.users.activate': 'Активировать', 'admin.tasks.cancel': 'Отменить', 'admin.reports.none': 'Жалоб нет', 'admin.reports.reviewed': 'Рассмотрено', 'admin.reports.dismiss': 'Отклонить', 'admin.pagination.total': 'Всего', 'admin.users.role.change': 'Изменить роль', 'admin.users.search.placeholder': 'Поиск по имени или email...', 'admin.tasks.delete': 'Удалить', 'admin.tasks.delete.confirm': 'Удалить эту задачу навсегда?', 'admin.tasks.search.placeholder': 'Поиск по названию...', 'admin.col.customer': 'Заказчик', 'admin.col.reporter': 'Жалобщик', 'admin.col.target': 'Цель', 'admin.filter.all_roles': 'Все роли', 'admin.filter.all_statuses': 'Все статусы', 'admin.reports.target.task': 'Задача', 'admin.reports.target.user': 'Пользователь', 'admin.tab.categories': 'Категории', 'admin.tab.locations': 'Города и районы', 'admin.tab.logs': 'Логи', 'admin.tab.plans': 'Тарифы', 'admin.tab.settings': 'Настройки', 'admin.logs.subtab.ai': 'AI логи', 'admin.logs.subtab.activity': 'Активность', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Уведомления', 'admin.notif_logs.type': 'Тип', 'admin.notif_logs.title': 'Заголовок', 'admin.notif_logs.read': 'Прочитано', 'admin.notif_logs.empty': 'Логи уведомлений пусты', 'admin.stats.notif_chart_title': 'Уведомления по дням', 'admin.stats.notif_label': 'Уведомления', 'admin.stats.mail_chart_title': 'Email по дням', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'Все', 'admin.stats.specialists': 'Исполнители', 'admin.col.plan': 'Тариф', 'admin.back_home': 'На главную', 'admin.plans.title': 'Тарифные пакеты', 'admin.plans.add': '+ Добавить тариф', 'admin.plans.empty': 'Тарифы не созданы', 'admin.plans.form.new': 'Новый тариф', 'admin.plans.form.edit': 'Редактировать тариф', 'admin.plans.form.name': 'Название', 'admin.plans.form.price': 'Цена (EUR)', 'admin.plans.form.old_price': 'Старая цена (EUR, необязательно)', 'admin.plans.form.max_offers': 'Макс. откликов (пусто = без лимита)', 'admin.plans.form.max_cards': 'Макс. портфолио (пусто = без лимита)', 'admin.plans.form.duration_days': 'Срок (дней, пусто = без истечения)', 'admin.plans.form.description': 'Описание', 'admin.plans.form.features': 'Возможности (по одной на строку)', 'admin.plans.form.notify': 'Уведомления о новых заказах', 'admin.plans.form.default': 'По умолчанию', 'admin.plans.form.active': 'Активен', 'admin.plans.form.order': 'Порядок', 'admin.plans.form.role': 'Роль', 'admin.plans.form.tier': 'Уровень', 'admin.plans.form.role.customer': 'Заказчик', 'admin.plans.form.role.specialist': 'Специалист', 'admin.plans.form.tier.free': 'Бесплатный', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Лимиты (пусто = без ограничений)', 'admin.plans.form.max_messages_day': 'Макс. сообщений/день', 'admin.plans.form.max_orders_day': 'Макс. заказов/день', 'admin.plans.form.max_skills': 'Макс. навыков', 'admin.plans.form.max_profiles': 'Макс. профилей', 'admin.plans.form.max_portfolio': 'Макс. элементов портфолио', 'admin.plans.form.section.boost': 'Множители & Буст', 'admin.plans.form.search_boost': 'Буст в поиске', 'admin.plans.form.offers_multiplier': 'Множитель откликов', 'admin.plans.form.section.contact': 'Права контактов', 'admin.plans.form.can_contact_free': 'Контакт с бесплатными пользователями', 'admin.plans.form.can_contact_pro': 'Контакт с Pro пользователями', 'admin.plans.form.can_contact_all': 'Контакт со всеми', 'admin.plans.form.can_show_contact': 'Показывать контакты', 'admin.plans.form.can_view_phone': 'Просмотр телефона', 'admin.plans.form.section.features': 'Возможности', 'admin.plans.form.upload_video': 'Загрузка видео', 'admin.plans.form.favorites': 'Избранное', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Знак верификации', 'admin.plans.form.highlighted_reviews': 'Выделенные отзывы', 'admin.plans.form.personal_site': 'Личный сайт', 'admin.plans.form.can_help_now': 'Статус «Могу помочь»', 'admin.plans.form.need_help': 'Статус «Нужна помощь»', 'admin.plans.form.auto_response': 'Автоответ', 'admin.plans.form.auto_match': 'Автоподбор', 'admin.plans.form.instant_dispatch_free': 'Мгновенная рассылка (бесплатно)', 'admin.plans.form.instant_dispatch_pro': 'Мгновенная рассылка (Pro)', 'admin.plans.badge.default': 'По умолчанию', 'admin.plans.badge.inactive': 'Неактивен', 'admin.plans.make_default': 'Сделать по умолчанию', 'admin.plans.tasks': 'Задач', 'admin.plans.offers': 'Откликов', 'admin.plans.cards': 'Портфолио', 'admin.plans.notify_tasks': 'Уведомления о заказах', 'admin.plans.delete.confirm': 'Удалить тариф', 'admin.activity.title': 'Журнал активности', 'admin.activity.event': 'Событие', 'admin.activity.all_events': 'Все события', 'admin.activity.from': 'От', 'admin.activity.to': 'До', 'admin.activity.reset': 'Сбросить', 'admin.activity.total': 'Всего', 'admin.activity.empty': 'Нет записей', 'admin.mail.event': 'Email событие', 'admin.mail.all_events': 'Все email события', 'admin.mail.from': 'От', 'admin.mail.to': 'До', 'admin.mail.reset': 'Сбросить', 'admin.mail.total': 'Всего', 'admin.mail.empty': 'Нет email логов', 'admin.mail.recipient': 'Получатель', 'admin.mail.provider': 'Провайдер', 'admin.mail.details': 'Детали', 'admin.mail.status': 'Статус', 'admin.mail.success': 'Успешно', 'admin.mail.failed': 'Ошибка', 'admin.event.email_sent': 'Email отправлен', 'admin.event.email_failed': 'Email не отправлен', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Тестовый email отправлен', 'admin.event.admin_email_test_failed': 'Тестовый email не отправлен', 'admin.logs.empty': 'Нет записей', 'admin.logs.date': 'Дата', 'admin.logs.provider': 'Провайдер', 'admin.logs.model': 'Модель', 'admin.logs.action': 'Действие', 'admin.logs.langs': 'Языки', 'admin.logs.in': 'Вход', 'admin.logs.out': 'Выход', 'admin.logs.total': 'Итого', 'admin.logs.ms': 'мс', 'admin.logs.status': 'Статус', 'admin.stats.activity_30d': 'Активность за 30 дней', 'admin.stats.tasks_label': 'Заявки', 'admin.stats.users_label': 'Пользователи', 'admin.stats.specialists_label': 'Исполнители', 'admin.stats.tokens_title': 'Расход токенов (по месяцам)', 'admin.stats.tokens_out': 'Исходящие', 'admin.stats.tokens_in': 'Входящие', 'admin.stats.tokens_out_label': 'Исходящие токены', 'admin.stats.tokens_in_label': 'Входящие токены', 'admin.stats.cost_label': 'Стоимость (USD)', 'admin.stats.tasks_by_status': 'Заявки по статусам', 'admin.task_status.open': 'Открытые', 'admin.task_status.in_progress': 'В работе', 'admin.task_status.completed': 'Завершённые', 'admin.task_status.cancelled': 'Отменённые', 'admin.task_status.draft': 'Черновики', 'admin.settings.tab.general': 'Общие', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Уведомления', 'admin.settings.tab.payment': 'Оплата', 'admin.settings.tab.referral': 'Реферальная', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO и обслуживание', 'admin.settings.seo.maintenance_label': 'Режим обслуживания', 'admin.settings.seo.maintenance_hint': 'Показывать страницу обслуживания всем посетителям', 'admin.settings.seo.indexing_label': 'Индексация поисковыми системами', 'admin.settings.seo.indexing_hint': 'Разрешить поисковым системам индексировать сайт', 'admin.settings.seo.head_scripts_label': 'Скрипты в (JS)', 'admin.settings.seo.head_scripts_hint': 'Выполняется на каждой странице (Google Tag Manager, аналитика и т.д.)', 'admin.settings.seo.site_title_label': 'Заголовок сайта', 'admin.settings.seo.site_description_label': 'Описание сайта (meta description)', 'admin.settings.referral.title': 'Партнёрская программа', 'admin.settings.referral.hint': 'Награждайте пользователей, приводящих новых участников.', 'admin.settings.referral.enabled_label': 'Включено', 'admin.settings.referral.enabled_hint': 'Включить / отключить выдачу наград', 'admin.settings.referral.customer_section': 'Для клиентов', 'admin.settings.referral.specialist_section': 'Для специалистов', 'admin.settings.referral.plan_label': 'Тарифный план за реферала', 'admin.settings.referral.no_plan': '— без плана —', 'admin.settings.referral.plan_hint': 'Этот план будет назначен пригласившему. Если его текущий план выше — добавятся только дни.', 'admin.settings.referral.days_label': 'Дней награды', 'admin.settings.referral.days_hint': 'Количество дней, добавляемых к сроку действия плана.', 'admin.settings.general.title': 'Общие настройки', 'admin.settings.general.site_name': 'Название сайта', 'admin.settings.general.site_url': 'URL сайта', 'admin.settings.general.contact_email': 'Email для связи', 'admin.settings.general.support_phone': 'Телефон поддержки', 'admin.settings.smtp.title': 'Настройки SMTP сервера', 'admin.settings.smtp.hint': 'Используется для отправки email-уведомлений.', 'admin.settings.smtp.host': 'SMTP Хост', 'admin.settings.smtp.port': 'Порт', 'admin.settings.smtp.encryption': 'Шифрование', 'admin.settings.smtp.enc.none': 'Нет', 'admin.settings.smtp.enc.tls': 'STARTTLS (порт 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (порт 465)', 'admin.settings.smtp.username': 'Имя пользователя', 'admin.settings.smtp.password': 'Пароль / App Password', 'admin.settings.smtp.from_name': 'Имя отправителя', 'admin.settings.smtp.from_email': 'Email отправителя', 'admin.settings.smtp.test': 'Отправить тестовый email', 'admin.settings.smtp.sending': 'Отправка...', 'admin.settings.payment.hint': 'Данные для подключения к ePay Piraeus Bank.', 'admin.settings.env.test': 'Тест (sandbox)', 'admin.settings.env.prod': 'Боевой режим', 'admin.settings.env.label': 'Среда', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Активен', 'admin.settings.saving': 'Сохранение...', 'admin.settings.saved': 'Сохранено', 'admin.notif.vars_hint': 'Доступные переменные в шаблонах', 'admin.notif.tmpl.not_set': 'Шаблон не настроен', 'admin.notif.tmpl.subject_label': 'Тема письма', 'admin.notif.tmpl.body_label': 'Текст письма (HTML)', 'admin.notif.tmpl.save': 'Сохранить', 'admin.notif.tmpl.close': 'Закрыть', 'admin.notif.tmpl.translate': 'Авто-перевод на другие языки', 'admin.notif.tmpl.translating': 'Перевод...', 'admin.notif.tmpl.saving': 'Сохранение...', 'admin.notif.email_verification': 'Подтверждение email адреса', 'admin.notif.registration_success': 'Успешная регистрация', 'admin.notif.password_reset': 'Восстановление пароля', 'admin.notif.new_offer': 'Новое предложение', 'admin.notif.new_task': 'Новая задача', 'admin.notif.offer_accepted': 'Предложение принято', 'admin.notif.new_message': 'Новое сообщение', 'admin.notif.offer_declined': 'Отклонение предложения', 'admin.notif.offer_other_accepted': 'Выбран другой исполнитель', 'admin.notif.task_updated': 'Изменение задания', 'admin.notif.deadline_reminder': 'Напоминание о дедлайне', 'admin.notif.task_archived': 'Автоснятие задания', 'admin.notif.referral_reward': 'Реферальная награда', // Шаблоны email для тарифов 'admin.email_template.plan_activated': 'Тарифы — активация тарифа', 'admin.email_template.plan_upgraded': 'Тарифы — повышение тарифа', 'admin.email_template.plan_downgrade_scheduled': 'Тарифы — запланированное понижение', 'admin.email_template.plan_downgrade_applied': 'Тарифы — применение понижения', 'admin.email_template.plan_renewal_reminder': 'Тарифы — напоминание о продлении', 'admin.email_template.plan_insufficient_funds': 'Тарифы — нехватка средств', // Модальное окно подтверждения тарифа 'pricing.confirm.title': 'Подтвердите выбор тарифа', 'pricing.confirm.plan': 'Тариф', 'pricing.confirm.prorated': 'Зачёт остатка', 'pricing.confirm.effective_price': 'К оплате', 'pricing.confirm.your_balance': 'Ваш баланс', 'pricing.confirm.downgrade_info': 'Переход на новый тариф произойдёт автоматически после окончания текущего периода.', 'pricing.confirm.insufficient': 'Недостаточно средств на балансе.', 'pricing.confirm.top_up': 'Пополнить', 'pricing.confirm.schedule_downgrade': 'Запланировать переход', 'pricing.confirm.pay': 'Оплатить', 'admin.user_edit.title': 'Редактирование пользователя', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Регистрация', 'admin.user_edit.last_seen': 'Последний визит', 'admin.user_edit.lang': 'Язык', 'admin.user_edit.first_name': 'Имя', 'admin.user_edit.last_name': 'Фамилия', 'admin.user_edit.phone': 'Телефон', 'admin.user_edit.bio': 'О себе', 'admin.user_edit.role': 'Роль', 'admin.user_edit.plan': 'Тариф', 'admin.user_edit.no_plan': '— Без тарифа —', 'admin.user_edit.active': 'Активный аккаунт', 'admin.user_edit.balance': 'Баланс (EUR)', 'admin.user_edit.skills': 'Навыки', 'admin.user_edit.tab.profile': 'Профиль', 'admin.user_edit.tab.account': 'Аккаунт', 'admin.user_edit.tab.balance': 'Баланс', 'admin.user_edit.tab.settings': 'Настройки', 'admin.user_edit.tab.specialist': 'Портфолио', 'admin.user_edit.tab.site': 'Сайт', 'admin.user_edit.plan_expires': 'Тариф истекает', 'admin.user_edit.interface_lang': 'Язык интерфейса', 'admin.user_edit.comm_languages': 'Языки общения', 'admin.user_edit.personal_site_slug': 'Персональная страница', 'admin.user_edit.show_contact_info': 'Показывать контакты', 'admin.user_edit.show_contact_info.hint': 'Видно заказчикам', 'admin.user_edit.notify_new_tasks': 'Уведомлять о новых задачах', 'admin.user_edit.notify_new_tasks.hint': 'Push и email уведомления', 'admin.user_edit.notif_messages': 'Уведомления о сообщениях', 'admin.user_edit.notif_messages.hint': 'Новые сообщения в чате', 'admin.user_edit.site_settings': 'Настройки персональной страницы', 'admin.user_edit.categories': 'Категории услуг', 'admin.user_edit.locations': 'Районы обслуживания', 'admin.user_edit.skill_placeholder': 'Новый навык...', 'admin.user_edit.add_category': '— Выберите категорию —', 'admin.user_edit.add_location': '— Выберите район —', 'admin.user_edit.specialist_cards': 'Портфолио специалиста', 'admin.user_edit.no_cards': 'Портфолио не найдено', 'admin.user_edit.card_title': 'Заголовок портфолио', 'admin.user_edit.card_description': 'Описание', 'admin.balance.topup.btn': 'Пополнить', 'admin.balance.withdraw.btn': 'Списать', 'admin.balance.modal_hint': 'Изменения применяются сразу и фиксируются в истории', 'admin.balance.topup.title': 'Пополнение баланса', 'admin.balance.topup.amount': 'Сумма', 'admin.balance.topup.description': 'Комментарий', 'admin.balance.topup.description.placeholder': 'Например: бонус или ручное пополнение', 'admin.balance.topup.submit': 'Пополнить баланс', 'admin.balance.withdraw.title': 'Снятие баланса', 'admin.balance.withdraw.amount': 'Сумма', 'admin.balance.withdraw.description': 'Комментарий', 'admin.balance.withdraw.description.placeholder': 'Например: возврат или ручное списание', 'admin.balance.withdraw.submit': 'Списать баланс', 'admin.user_edit.role.customer': 'Заказчик', 'admin.user_edit.role.specialist': 'Исполнитель', 'admin.user_edit.role.admin': 'Администратор', 'common.refresh': 'Обновить', 'common.back_home': 'На главную', 'admin.loc.hint': 'Управление городами и районами', 'admin.loc.add_city': 'Новый город', 'admin.loc.add_district': 'Добавить район', 'admin.loc.new': 'Новая локация', 'admin.loc.edit': 'Редактировать локацию', 'admin.loc.district': 'район', 'admin.loc.empty': 'Нет локаций', 'admin.loc.delete.confirm': 'Удалить локацию? Все районы также будут удалены.', 'admin.cat.add_root': 'Новая категория', 'admin.cat.add_sub': 'Подкатегория', 'admin.cat.edit': 'Редактировать', 'admin.cat.delete': 'Удалить', 'admin.cat.delete.confirm': 'Удалить категорию? Все подкатегории также будут удалены.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Иконка', 'admin.cat.name_el': 'Греческий', 'admin.cat.name_en': 'Английский', 'admin.cat.name_ru': 'Русский', 'admin.cat.order': 'Порядок', 'admin.cat.active': 'Активна', 'admin.cat.parent': 'Родительская категория', 'admin.cat.no_parent': 'Верхний уровень', 'admin.cat.save': 'Сохранить', 'admin.cat.cancel': 'Отмена', 'admin.cat.empty': 'Нет категорий', 'admin.cat.hint': 'Управление категориями с многоуровневой иерархией', 'admin.cat.new': 'Новая категория', 'admin.cat.subcategory': 'подкатегория', 'admin.cat.add_child': 'Добавить подкатегорию', 'admin.cat.inactive': 'Неактивна', 'admin.event.user_login': 'Вход', 'admin.event.user_register': 'Регистрация', 'admin.event.admin_user_deactivate': 'Блокировка юзера', 'admin.event.admin_user_activate': 'Разблокировка юзера', 'admin.event.admin_user_role_changed': 'Смена роли', 'admin.event.admin_task_cancelled': 'Отмена задачи', 'admin.event.admin_task_deleted': 'Удаление задачи', 'admin.event.admin_report_reviewed': 'Жалоба рассмотрена', 'admin.event.admin_report_dismissed': 'Жалоба отклонена', 'admin.event.task_created': 'Создана задача', // User status 'user.online': 'Онлайн', 'user.seen_minutes': 'был здесь {n} мин назад', 'user.seen_hours': 'был здесь {n} ч назад', 'user.seen_yesterday': 'был здесь вчера', 'user.seen_days': 'был здесь {n} дн назад', // Specialists 'specialists.title': 'Специалисты', 'specialists.search': 'Поиск специалиста...', 'specialists.search.btn': 'Поиск', 'specialists.empty': 'Специалисты не найдены', 'specialists.no_bio': 'Без описания', 'specialists.view': 'Смотреть профиль', 'specialists.reviews': 'отзывов', 'specialist.favorite': 'Добавить в избранное', 'specialist.unfavorite': 'Убрать из избранного', 'specialist.site_link': 'Личный сайт', 'favorites.specialists.title': 'Избранные специалисты', 'favorites.specialists.empty': 'Вы ещё не добавили специалистов в избранное', 'nav.favorites': 'Избранное', 'nav.schedule': 'Расписание', 'nav.find_tasks': 'Поиск заказов', 'schedule.title': 'Моё расписание', 'schedule.subtitle': 'Отмечайте дни когда вы свободны или заняты — заказчики увидят вашу доступность', 'schedule.available': 'Свободен', 'schedule.busy': 'Занят', 'schedule.unset': 'Не указано', 'schedule.click_hint': '← клик меняет статус по кругу', 'schedule.range_mode': 'Выделить диапазон', 'schedule.range_from': 'С {date} — выберите конечную дату', 'schedule.click_to_set': 'Нажмите чтобы отметить', 'schedule.free': 'свободно', 'schedule.busy_count': 'занято', 'schedule.free_days': 'свободных дней', 'schedule.googleCalendar': 'Google Календарь', 'schedule.connectGoogle': 'Подключить Google Календарь', 'schedule.disconnectGoogle': 'Отключить', 'schedule.connectedAs': 'Подключено как', 'schedule.importFromGoogle': 'Синхр. из Google', 'schedule.gcalConnected': '\u2713 Google Календарь подключён', 'schedule.gcalError': 'Ошибка подключения Google Календарь', 'schedule.gcalImportDone': 'Импортировано {n} дней из Google Календарь', 'schedule.gcalAutoSyncNote': 'Изменения доступности автоматически отправляются в Google Календарь', 'schedule.gcalConnectDesc': 'Подключите Google Календарь для автоматической синхронизации расписания', 'schedule.gcalDisconnectConfirm': 'Отключить Google Календарь?', 'find_tasks.title': 'Поиск заказов', 'find_tasks.for_me': 'Для меня', 'find_tasks.all': 'Все заказы', 'find_tasks.by_category': 'По категориям', 'find_tasks.list': 'Списком', 'find_tasks.already_offered': 'Предложение отправлено', 'find_tasks.offer_now': 'Откликнуться', 'find_tasks.empty_for_me': 'Нет заказов в ваших категориях', 'find_tasks.banner_hint': 'Найдите заказы по категориям вашего портфолио', 'find_tasks.no_cards': 'Создайте портфолио специалиста, чтобы видеть подходящие заказы', 'find_tasks.add_card': 'Создать портфолио', 'find_tasks.search': 'Поиск заказов...', 'find_tasks.tasks_count': 'заданий', 'footer.tagline': 'Платформа задач для Греции', 'footer.rights': 'Все права защищены.', // App download section 'app.download_title': 'Скачайте мобильное приложение CanHelp', 'app.download_desc': 'Всё CanHelp — всегда под рукой. Доступно для Android и iOS.', // Nav 'nav.pricing': 'Тарифы', // Pricing page 'pricing.title': 'Тарифы', 'pricing.subtitle': 'Выберите подходящий план', 'pricing.role.customer': 'Заказчик', 'pricing.role.specialist': 'Специалист', 'pricing.free': 'Бесплатно', 'pricing.per_month': 'мес', 'pricing.duration': 'Срок', 'pricing.days': 'дн.', 'pricing.current_plan': 'Ваш план', 'pricing.popular': 'Популярный', 'pricing.choose': 'Выбрать', 'pricing.your_plan': 'Активный план', 'pricing.free_default': 'По умолчанию', 'pricing.compare': 'Сравнение функций', 'pricing.feature': 'Функция', 'pricing.faq_note': 'Оплата списывается с баланса CanHelp. Пополнение доступно в разделе Оплата.', 'pricing.feat.messages': 'Сообщений / день', 'pricing.feat.orders': 'Заказов / день', 'pricing.feat.contact_all': 'Связь со всеми', 'pricing.feat.view_phone': 'Просмотр телефона', 'pricing.feat.show_contact': 'Показывать контакты', 'pricing.feat.favorites': 'Избранное', 'pricing.feat.verified_badge': 'Верифицированный бейдж', 'pricing.feat.google_calendar': 'Google Календарь', 'pricing.feat.personal_site': 'Персональный сайт', 'pricing.feat.auto_response': 'Авто-ответ', 'pricing.feat.auto_match': 'Авто-подбор', 'pricing.feat.highlighted_reviews': 'Выделенные отзывы', 'pricing.feat.portfolio': 'Элементов портфолио', 'pricing.feat.cards': 'Карточки специалиста', 'pricing.feat.notify_tasks': 'Уведомления о новых задачах', 'pricing.feat.video': 'Видео в портфолио', // Upgrade prompt 'upgrade.available_in': 'Доступно в', 'upgrade.cta': 'Улучшить', // Dashboard plan block 'dashboard.plan.title': 'Мой план', 'dashboard.plan.expires': 'Истекает через {n} дней', 'dashboard.plan.upgrade': 'Улучшить план', 'dashboard.plan.no_plan': 'Бесплатный план', 'dashboard.plan.messages': 'Сообщений сегодня', 'dashboard.plan.orders': 'Заказов сегодня', 'dashboard.plan.limits': 'Дневные лимиты', 'dashboard.plan.features': 'Функции', 'dashboard.plan.stats': 'Статистика', 'dashboard.stats.cards': 'Портфолио', 'dashboard.stats.maxCards': 'Макс. портфолио', 'dashboard.stats.portfolioItems': 'Элементы портфолио', 'dashboard.stats.maxPortfolioItems': 'Макс. элементы', 'dashboard.stats.activeOffers': 'Активные отклики', 'dashboard.stats.reviewsReceived': 'Отзывы', 'dashboard.stats.activeTasks': 'Активные задачи', 'dashboard.stats.completedTasks': 'Завершённые', 'status.need_help': 'Нужна помощь', 'status.active': 'Активен', 'status.toggle_on': 'Включить', 'status.toggle_off': 'Выключить', // FOMO 'fomo.missed_orders': 'Пропущено {n} заказов', 'fomo.missed_value': 'На сумму €{v}', 'fomo.upgrade_hint': 'Улучшите план — получайте больше заказов', 'fomo.conversion': 'Конверсия задач', 'fomo.active': 'Активные', 'fomo.with_offers': 'С офертами', 'fomo.completed': 'Завершённые', 'fomo.already_offered': '{n} специалистов уже откликнулись', 'fomo.specialist_missed': 'Вы пропустили {n} заказов', 'fomo.top_categories': 'Категории', 'fomo.offers_received': 'предложений получено', 'fomo.avg_offers': 'В среднем {n}/задача', 'fomo.completion_rate': 'завершено', // Task auto-match 'task.auto_match': 'Авто-матч', 'task.auto_match_results': 'Топ специалисты', 'task.no_offer_yet': 'Вы ещё не отправили предложение', 'task.make_offer': 'Отправить предложение', 'auto_response.title': 'Авто-ответ', 'auto_response.enabled': 'Включить авто-ответ', 'auto_response.min_budget': 'Мин. бюджет', 'auto_response.max_budget': 'Макс. бюджет', 'auto_response.default_price': 'Цена по умолчанию', 'auto_response.default_message': 'Сообщение по умолчанию', 'auto_response.max_per_day': 'Макс. авто-офертов в день', 'auto_response.save': 'Сохранить', 'auto_response.saved': 'Сохранено', 'auto_response.categories': 'Категории', 'auto_response.locations': 'Локации', // Personal site 'profile.personal_site': 'Персональный сайт', 'profile.site_slug': 'URL slug', 'profile.site_slug_hint': 'Только латинские буквы, цифры, - и _', 'profile.site_open': 'Открыть сайт', 'profile.site_preview': 'Ваш сайт', 'profile.show_contact': 'Показывать контакты', 'profile.show_contact_hint': 'Заказчики с Pro/Ultimate-планом увидят ваш телефон', // Google Calendar plan gate 'gcal.upgrade_required': 'Google Календарь требует план Pro или Ultimate', // Chat limits 'chat.limit_warning': 'Осталось {n} сообщений сегодня', 'chat.limit_reached': 'Лимит сообщений исчерпан. Улучшите план', 'chat.upgrade': 'Улучшить', // Site page 'site.member_since': 'С нами с', 'site.rating': 'Рейтинг', 'site.completed_tasks': 'Выполнено', 'site.languages': 'Языков', 'site.photos': 'фото', 'site.contact_form': 'Связаться', 'site.contact_sent': 'Сообщение отправлено!', 'site.contact_sent_desc': 'Специалист свяжется с вами в ближайшее время', 'site.contact_name': 'Имя', 'site.contact_name_ph': 'Ваше имя', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Сообщение', 'site.contact_message_ph': 'Опишите вашу задачу...', 'site.contact_send': 'Отправить', 'site.share': 'Поделиться', 'site.speaks_languages': 'Говорит на языках', 'site.message_sent': 'Сообщение отправлено!', 'site.message_sent_desc': 'Специалист получит его в чате', 'site.message_placeholder': 'Напишите сообщение...', 'site.write_to_chat': 'Написать в чат', 'site.auth_required_title': 'Нужна авторизация', 'site.auth_required_desc': 'Чтобы написать в чат, необходимо войти в аккаунт CanHelp.', 'site.auth_login_btn': 'Войти в аккаунт', 'site.auth_contact_form_btn': 'Написать через форму обратной связи', 'specialist.services': 'Услуги', 'portfolio.title': 'Портфолио', 'status.can_help_now': 'Готов помочь', 'common.not_found': 'Страница не найдена', 'common.anonymous': 'Анонимно' } }; function getTranslations(locale) { const t = translations[locale] ?? translations.el; return (key, fallback)=>t[key] ?? translations.el[key] ?? fallback ?? key; } {"finalSource":true}mapbufferedMap ConcatSourceRawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $: () => (/* binding */ getTranslations), /* harmony export */ YZ: () => (/* binding */ LOCALES) /* harmony export */ }); /* unused harmony export translations */ ReplaceSourceRawSource:export const LOCALES = [ { code: 'el', label: 'Ελληνικά', flag: '🇬🇷' }, { code: 'en', label: 'English', flag: '🇬🇧' }, { code: 'ru', label: 'Русский', flag: '🇷🇺' } ]; export const translations = { el: { 'footer.slogan': 'Η εργασία σου — η φροντίδα μας! Λύνουμε κάθε ζήτημα γρήγορα και εύκολα.', 'footer.links': 'Σύνδεσμοι', 'footer.socials': 'Στα κοινωνικά δίκτυα', // Nav 'nav.home': 'Αρχική', 'nav.tasks': 'Εργασίες', 'nav.post': '+ Δημοσίευση', 'nav.dashboard': 'Πίνακας', 'nav.chat': 'Μηνύματα', 'nav.notifications': 'Ειδοποιήσεις', 'nav.profile': 'Προφίλ', 'nav.admin': 'Διαχείριση', 'nav.specialists': 'Ειδικοί', 'nav.new_task': 'Νέα εργασία', 'nav.login': 'Σύνδεση', 'nav.register': 'Εγγραφή', 'nav.logout': 'Έξοδος', // Hero 'hero.title': 'Βρες ειδικό για κάθε δουλειά', 'hero.subtitle': 'Δημοσίευσε εργασία, λάβε προσφορές και επίλεξε τον καλύτερο επαγγελματία', 'hero.cta.post': 'Δημοσίευσε εργασία', 'hero.cta.browse': 'Βρες εργασία', 'hero.search.placeholder': 'Τι χρειάζεσαι; π.χ. ηλεκτρολόγος, καθαρισμός...', 'stats.specialists': 'ειδικοί', 'stats.tasks': 'εργασίες', 'stats.categories': 'κατηγορίες', 'stats.free': 'δωρεάν εγγραφή', // Sections 'section.categories': 'Δημιούργησε εργασία σε οποιαδήποτε κατηγορία', 'section.how': 'Πώς λειτουργεί', 'section.recent': 'Πρόσφατες εργασίες', 'section.all': 'Δες όλες →', 'section.more': 'ακόμα', 'section.cities': 'Πόλεις & Περιοχές', 'section.community': 'Ένα κοινοτικό έργο για όλους', 'community.subtitle': 'Το CanHelp δεν είναι απλώς μια αγορά — είναι μια κοινότητα αμοιβαίας βοήθειας. Οποιοσδήποτε έχει γνώση ή δεξιότητα μπορεί να βρει έναν πελάτη. Οποιοσδήποτε έχει ένα πρόβλημα μπορεί να βρει έναν ειδικό.', 'community.point1.title': 'Είσαι ειδικός σε κάτι;', 'community.point1.desc': 'Επισκευές, μαθήματα, σχεδιασμός, μεταφράσεις, φροντίδα — κάθε δεξιότητα αξίζει. Δημιούργησε προφίλ και βρες πελάτες κοντά σου.', 'community.point2.title': 'Χρειάζεσαι βοήθεια;', 'community.point2.desc': 'Δημοσίευσε εργασία σε λιγότερο από ένα λεπτό και λάβε προσφορές από επαληθευμένους ειδικούς στην πόλη σου.', 'community.point3.title': 'Βοήθησε το έργο να αναπτυχθεί', 'community.point3.desc': 'Το CanHelp αναπτύσσεται χάρη στις κοινότητες. Μοιράσου το σύνδεσμο με φίλους και γνωστούς — μαζί χτίζουμε κάτι χρήσιμο για όλους.', 'community.share': 'Μοιράσου με φίλους', 'community.share.copied': 'Σύνδεσμος αντιγράφηκε!', // Referral section on home page 'section.referral': 'Πρόγραμμα παραπομπών', 'referral.home.subtitle': 'Μοιράσου τον σύνδεσμό σου — κάθε νέος χρήστης που εγγράφεται μέσα από αυτόν σου αποφέρει ανταμοιβή.', 'referral.home.step1.title': 'Εγγραφείσε και λάβε σύνδεσμο', 'referral.home.step1.desc': 'Δημιούργησε λογαριασμό και βρες τον μοναδικό σου σύνδεσμο παραπομπής στο προφίλ σου.', 'referral.home.step2.title': 'Μοιράσου με φίλους', 'referral.home.step2.desc': 'Στείλε τον σύνδεσμο σε φίλους, γνωστούς ή δημοσίευσέ τον στα social media.', 'referral.home.step3.title': 'Κέρδισε ανταμοιβές', 'referral.home.step3.desc': 'Μόλις ο φίλος σου επαληθεύσει το email του, λαμβάνεις αυτόματα την ανταμοιβή σου.', 'referral.home.cta': 'Πάρε τον σύνδεσμό σου', 'referral.home.badge': 'Πρόγραμμα παραπομπών', // FAQ section 'section.faq': 'Συχνές Ερωτήσεις', 'faq.q1': 'Πώς λειτουργεί το CanHelp;', 'faq.a1': 'Δημοσίευσε μια εργασία, λάβε προσφορές από ειδικούς, επέλεξε τον καλύτερο και ξεκίνα τη συνεργασία. Είναι γρήγορο, απλό και δωρεάν για πελάτες.', 'faq.q2': 'Πόσο κοστίζει η χρήση της πλατφόρμας;', 'faq.a2': 'Η εγγραφή και η δημοσίευση εργασιών είναι εντελώς δωρεάν για πελάτες. Οι ειδικοί έχουν στη διάθεσή τους δωρεάν πλάνο καθώς και premium επιλογές.', 'faq.q3': 'Πώς μπορώ να γίνω ειδικός;', 'faq.a3': 'Κάνε εγγραφή, πήγαινε στο «Γίνε Ειδικός», συμπλήρωσε το προφίλ σου με δεξιότητες και κατηγορίες και αρχίνισε να λαμβάνεις εργασίες.', 'faq.q4': 'Πώς επιλέγω τον κατάλληλο ειδικό;', 'faq.a4': 'Δες τις αξιολογήσεις, την εμπειρία, τις δεξιότητες και το χαρτοφυλάκιο κάθε ειδικού. Επικοινώνησε μαζί του μέσω chat και συζήτα τις λεπτομέρειες πριν αποφασίσεις.', 'faq.q5': 'Τι γίνεται αν δεν είμαι ικανοποιημένος;', 'faq.a5': 'Μπορείς να αφήσεις αξιολόγηση για τον ειδικό και να τον βαθμολογήσεις από 1 έως 5 αστέρια. Οι αξιολογήσεις βοηθούν άλλους χρήστες να επιλέξουν έμπιστους επαγγελματίες.', 'faq.q6': 'Μπορώ να επικοινωνήσω με τον ειδικό πριν την αποδοχή;', 'faq.a6': 'Ναι. Μόλις λάβεις μια προσφορά, μπορείς να ανοίξεις chat με τον ειδικό, να κάνεις ερωτήσεις και να συντονίσεις τις λεπτομέρειες πριν αποφασίσεις.', 'faq.q7': 'Πόσος χρόνος χρειάζεται για να λάβω προσφορές;', 'faq.a7': 'Συνήθως μέσα σε λίγες ώρες. Οι ειδικοί λαμβάνουν ειδοποίηση για νέες εργασίες και μπορούν να απαντήσουν γρήγορα.', 'faq.q8': 'Μπορώ να δημοσιεύσω εργασία σε οποιαδήποτε πόλη της Ελλάδας;', 'faq.a8': 'Ναι! Το CanHelp καλύπτει όλη την Ελλάδα. Μπορείς να βρεις ειδικούς στην Αθήνα, στη Θεσσαλονίκη, στην Πάτρα και αλλού.', 'faq.q9': 'Τι είδη εργασιών μπορώ να βρω στο CanHelp;', 'faq.a9': 'Επισκευές, καθαρισμό, ηλεκτρολόγους, μαθήματα, σχεδιασμό, IT, μετακομίσεις, ομορφιά και πολλά άλλα. Οι κατηγορίες αυξάνονται συνεχώς.', 'faq.q10': 'Υπάρχει εφαρμογή για κινητό;', 'faq.a10': 'Ναι! Το CanHelp διατίθεται για Android και iOS. Κατέβασε την εφαρμογή και διαχειρίσου τα πάντα από το τηλέφωνό σου.', // How it works 'how.step1.title': 'Δημοσίευσε εργασία', 'how.step1.desc': 'Περίγραψε τι χρειάζεσαι και ορίζε τον προϋπολογισμό σου', 'how.step2.title': 'Λάβε προσφορές', 'how.step2.desc': 'Ειδικοί θα σου στείλουν προσφορές με τιμή και χρόνο', 'how.step3.title': 'Επίλεξε & ξεκίνα', 'how.step3.desc': 'Επέλεξε τον καλύτερο επαγγελματία και ξεκίνα τη συνεργασία', // Tasks page 'tasks.title': 'εργασίες', 'tasks.filters': 'Φίλτρα', 'tasks.search': 'Αναζήτηση', 'tasks.search.placeholder': 'Τίτλος ή λέξη κλειδί...', 'tasks.search.btn': 'Αναζήτηση', 'tasks.publish': 'Δημοσίευση', 'tasks.category.all': 'Όλες', 'tasks.category.all_in': 'Όλα στην', 'tasks.category.label': 'Κατηγορία', 'tasks.location.label': 'Πόλη', 'tasks.location.placeholder': 'π.χ. Αθήνα', 'tasks.empty': 'Δεν βρέθηκαν εργασίες', 'tasks.empty.cta': 'Δημοσίευσε την πρώτη', // Task detail 'task.status.open': 'Ανοιχτή', 'task.status.in_progress': 'Σε εξέλιξη', 'task.status.completed': 'Ολοκληρωμένη', 'task.status.cancelled': 'Ακυρωμένη', 'task.status.draft': 'Πρόχειρο', 'task.budget': 'Προϋπολογισμός', 'task.location': 'Τοποθεσία', 'task.deadline': 'Ημερομηνία έναρξης', 'task.created_at': 'Δημιουργήθηκε', 'task.customer': 'Πελάτης', 'task.offer.btn': 'Υποβολή προσφοράς', 'task.invite.banner_title': 'Σας προσκαλούν σε αυτήν την εργασία', 'task.invite.banner_hint': 'Ο πελάτης σας πρόσκαλεσε προσωπικά', 'task.invite.accept': 'Αποστολή προσφοράς', 'task.invite.decline': 'Άρνηση', 'offer.accept': 'Αποδοχή', 'offer.decline': 'Απόρριψη', 'task.complete': 'Ολοκλήρωση εργασίας', 'task.complete.confirm': 'Να ολοκληρωθεί η εργασία;', 'task.edit': 'Επεξεργασία', 'task.status_label': 'Κατάσταση', 'task.yours': 'Η εργασία σου', 'task.offer.yours': 'Η προσφορά σου', 'review.leave': 'Άφησε αξιολόγηση', 'review.rating': 'Βαθμολογία', 'review.comment': 'Σχόλιο', 'review.comment.placeholder': 'Πες μας για την εμπειρία σου...', 'review.submit': 'Υποβολή αξιολόγησης', 'review.submitting': 'Αποστολή...', 'review.done': 'Η αξιολόγηση καταχωρήθηκε!', 'profile.reviews': 'Αξιολογήσεις', 'profile.no_reviews': 'Δεν υπάρχουν αξιολογήσεις ακόμα', 'profile.rating': 'Βαθμολογία', 'profile.skills.label': 'Δεξιότητες', 'profile.member_since': 'Μέλος από', 'task.offers': 'Προσφορές', 'task.offers.none': 'Δεν υπάρχουν ακόμα προσφορές', // Create task 'create.title': 'Δημοσίευση εργασίας', 'create.field.title': 'Τίτλος', 'create.field.description': 'Περιγραφή', 'create.field.category': 'Κατηγορία', 'create.field.category.select': 'Επιλέξτε...', 'create.field.location': 'Τοποθεσία', 'create.field.location.any': 'Οπουδήποτε', 'create.field.location.all': 'Ολόκληρη η πόλη', 'create.field.budget': 'Προϋπολογισμός (€)', 'create.field.deadline': 'Ημερομηνία έναρξης', 'create.field.budget_negotiable': 'Η τιμή είναι διαπραγματεύσιμη', 'create.field.time_slot': 'Χρόνος εκτέλεσης', 'create.field.time_slot.any': 'Οποιαδήποτε', 'create.field.time_slot.morning': 'Πρωινό (08:00–13:00)', 'create.field.time_slot.afternoon': 'Μεσημέρι (13:00–18:00)', 'create.field.time_slot.evening': 'Βράδυ (18:00–22:00)', 'create.field.time_slot.weekend': 'Σαββατοκύριακο', 'create.field.address': 'Διεύθυνση (προαιρετικά)', 'create.field.address.district': 'Συνοικία', 'create.field.address.street': 'Οδός', 'create.field.address.house': 'Αριθμός', 'create.field.confidential': 'Εμπιστευτική σημείωση', 'create.field.confidential.placeholder': 'Λεπτομέρειες που θα δει μόνο ο αναδοχόμενος...', 'create.field.confidential.hint': 'Δεν εμφανίζεται δημόσια', 'create.field.photos': 'Φωτογραφίες', 'create.field.photos.add': 'Προσθήκη φωτογραφίας', 'create.field.photos.uploading': 'Ανέβασμα...', 'task.budget_negotiable': 'Τιμή διαπραγματεύσιμη', 'task.time_slot': 'Χρόνος', 'task.confidential': 'Εμπιστευτική σημείωση', 'create.field.title.placeholder': 'π.χ. Καθαρισμός διαμερίσματος 80τμ', 'create.field.description.placeholder': 'Περίγραψε λεπτομερώς τι χρειάζεσαι...', 'create.field.location.placeholder': 'π.χ. Αθήνα, Κολωνάκι', 'create.field.budget.placeholder': 'π.χ. 100', 'create.submit': 'Δημοσίευση εργασίας', 'create.submitting': 'Δημοσίευση...', // Auth 'login.title': 'Καλωσόρισες', 'login.subtitle': 'Σύνδεση στο CanHelp', 'login.email': 'Email', 'login.password': 'Κωδικός', 'login.submit': 'Σύνδεση', 'login.submitting': 'Σύνδεση...', 'login.error': 'Λάθος email ή κωδικός', 'login.unverified.title': 'Επιβεβαιώστε το email σας', 'login.unverified.desc': 'Στείλαμε σύνδεσμο επαλήθευσης στο email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε το σύνδεσμο.', 'login.unverified.resend': 'Αποστολή νέου email επαλήθευσης', 'login.unverified.sending': 'Αποστολή...', 'login.unverified.sent': '✓ Εστάλη — ελέγξτε τα εισερχόμενα', 'profile.email.verified': 'Email επαληθεύτηκε', 'profile.email.not_verified': 'Email δεν επαληθεύτηκε', 'login.no_account': 'Δεν έχεις λογαριασμό;', 'login.register_link': 'Εγγραφή', 'login.forgot_password': 'Ξέχασα τον κωδικό', 'login.or_continue_with': 'ή συνεχίστε με', 'login.continue_google': 'Σύνδεση με Google', 'forgot.title': 'Ξέχασα τον κωδικό', 'forgot.subtitle': 'Εισάγετε το email σας για να λάβετε σύνδεσμο ανάκτησης', 'forgot.email': 'Email', 'forgot.submit': 'Αποστολή', 'forgot.submitting': 'Αποστολή...', 'forgot.sent.title': 'Ελέγξτε τα εισερχόμενά σας', 'forgot.sent.desc': 'Αν υπάρχει λογαριασμός με αυτό το email, θα σας στείλουμε σύνδεσμο ανάκτησης κωδικού.', 'forgot.back_to_login': 'Επιστροφή στη σύνδεση', 'forgot.error': 'Αποτυχία αποστολής. Ελέγξτε το email σας ή δοκιμάστε ξανά.', 'forgot.error.not_found': 'Δεν βρέθηκε λογαριασμός με αυτό το email.', 'forgot.error.send_failed': 'Αποτυχία αποστολής email. Δοκιμάστε ξανά αργότερα', 'reset.title': 'Νέος κωδικός', 'reset.subtitle': 'Εισάγετε τον νέο σας κωδικό', 'reset.password': 'Νέος κωδικός', 'reset.confirm': 'Επιβεβαίωση κωδικού', 'reset.submit': 'Αλλαγή κωδικού', 'reset.submitting': 'Αποθήκευση...', 'reset.success': 'Ο κωδικός άλλαξε επιτυχώς. Ανακατεύθυνση στη σύνδεση...', 'reset.back_to_login': 'Επιστροφή στη σύνδεση', 'reset.error.mismatch': 'Οι κωδικοί δεν ταιριάζουν', 'reset.error.invalid': 'Μη έγκυρος σύνδεσμος. Παρακαλώ ζητήστε νέο.', 'register.title': 'Εγγραφή', 'register.subtitle': 'Δημιουργία λογαριασμού στο CanHelp', 'register.first_name': 'Όνομα', 'register.last_name': 'Επώνυμο', 'register.email': 'Email', 'register.password': 'Κωδικός (min 8 χαρακτήρες)', 'register.role': 'Ρόλος', 'register.role.customer': 'Χρήστης', 'register.role.customer.desc': 'Δημοσιεύω εργασίες', 'register.role.specialist': 'Ειδικός', 'register.role.specialist.desc': 'Αναλαμβάνω εργασίες', 'register.submit': 'Δημιουργία λογαριασμού', 'register.submitting': 'Εγγραφή...', 'register.has_account': 'Έχεις ήδη λογαριασμό;', 'register.login_link': 'Σύνδεση', 'register.continue_google': 'Εγγραφή με Google', 'register.check_email.title': 'Ελέγξτε το email σας', 'register.check_email.desc': 'Στείλαμε σύνδεσμο επαλήθευσης στη διεύθυνση email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε τον σύνδεσμο.', 'register.check_email.login': 'Επιστροφή στη σύνδεση', // Dashboard 'dashboard.title': 'Πίνακας ελέγχου', 'dashboard.new_task': '+ Νέα εργασία', 'dashboard.my_tasks': 'Οι εργασίες μου', 'dashboard.my_offers': 'Οι προσφορές μου', 'dashboard.invitations': 'Προσκλήσεις για εργασία', 'dashboard.offers_count': 'προσφορές', 'dashboard.declined_count': 'απορρίφθηκαν', 'dashboard.completed_tasks': 'Ολοκληρωμένες εργασίες', 'dashboard.completed_offers': 'Ολοκληρωμένες προσφορές', 'dashboard.review_pending': 'Η αξιολόγηση δεν έχει υποβληθεί ακόμα', 'tasks.new.top_specialists': 'Κορυφαίοι ειδικοί', 'tasks.new.select_category': 'Επιλέξτε κατηγορία για να δείτε ειδικούς', 'tasks.new.invite': 'Πρόσκληση', 'tasks.new.invited': 'Επιλέχθηκε ✓', 'reviews.count': 'αξιολογήσεις', 'filter.location': 'Τοποθεσία', 'filter.language': 'Γλώσσες', 'filter.language.any': 'Οποιαδήποτε γλώσσα', 'filter.category.all': 'Όλες οι κατηγορίες', 'user.categories': 'Κατηγορίες', 'user.work_area': 'Περιοχή εργασίας', 'dashboard.tasks.empty': 'Δεν έχεις δημοσιεύσει εργασίες', 'dashboard.tasks.empty.cta': 'Δημοσίευσε την πρώτη σου', 'dashboard.tasks.add_new': 'Πρόσθεσε νέα εργασία', 'dashboard.offers.empty': 'Δεν έχεις υποβάλλει προσφορές', 'dashboard.offers.empty.cta': 'Βρες εργασίες', 'dashboard.customer.specialists_title': 'Ψάχνεις εκτελεστή;', 'dashboard.customer.specialists_hint': 'Δες προφίλ ειδικών, διάβασε αξιολογήσεις και κάλεσέ τους στις εργασίες σου', 'dashboard.customer.specialists_cta': 'Βρες ειδικό', 'dashboard.customer.how_title': 'Πώς λειτουργεί', 'dashboard.customer.step1': 'Δημιούργησε εργασία με περιγραφή και προϋπολογισμό', 'dashboard.customer.step2': 'Οι ειδικοί θα στείλουν προσφορές με τιμή και χρόνο', 'dashboard.customer.step3': 'Επίλεξε τον κατάλληλο και ξεκίνα τη συνεργασία', // Notifications 'notif.title': 'Ειδοποιήσεις', 'notif.mark_all': 'Σήμανση όλων ως αναγνωσμένα', 'notif.empty': 'Δεν υπάρχουν ειδοποιήσεις', 'notif.type.new_offer': 'Νέα προσφορά', 'notif.type.offer_accepted': 'Η προσφορά σας έγινε δεκτή', 'notif.type.offer_declined': 'Η προσφορά σας απορρίφθηκε', 'notif.type.task_completed': 'Η εργασία ολοκληρώθηκε', 'notif.type.task_cancelled': 'Η εργασία ακυρώθηκε', 'notif.type.new_message': 'Νέο μήνυμα', 'notif.type.new_review': 'Νέα αξιολόγηση', 'notif.type.task_invite': 'Πρόσκληση σε εργασία', 'notif.body.new_offer': 'Νέα προσφορά για «{title}»', 'notif.body.offer_accepted': 'Η προσφορά σας για «{title}» έγινε δεκτή', 'notif.body.offer_declined': 'Η προσφορά σας για «{title}» απορρίφθηκε', 'notif.body.task_invite': 'Σας προσκαλούν για «{title}»', 'notif.body.new_review': 'Λάβατε αξιολόγηση {rating}★', // Offer status 'offer.status.pending': 'Εκκρεμεί', 'offer.status.accepted': 'Αποδεκτή', 'offer.status.declined': 'Απορρίφθηκε', 'offer.status.withdrawn': 'Αποσύρθηκε', 'offer.status.other_accepted': 'Επιλέχθηκε άλλος ειδικός', // Common 'common.loading': 'Φόρτωση...', 'common.error': 'Σφάλμα', 'common.save': 'Αποθήκευση', 'common.saving': 'Αποθήκευση...', 'common.cancel': 'Ακύρωση', 'common.add': 'Προσθήκη', 'common.close': 'Κλείσιμο', 'common.edit': 'Επεξεργασία', 'common.delete': 'Διαγραφή', 'common.from': 'από', 'common.currency': '€', 'common.greece': 'Ελλάδα', // Chat 'chat.connected': 'Συνδεδεμένος', 'chat.disconnected': 'Αποσυνδεδεμένος', 'chat.no_rooms': 'Δεν υπάρχουν συνομιλίες ακόμα', 'chat.task_fallback': 'Εργασία', 'chat.select': 'Επίλεξε συνομιλία', 'chat.no_messages': 'Δεν υπάρχουν μηνύματα', 'chat.placeholder': 'Γράψε μήνυμα... (Enter για αποστολή)', 'chat.conversation_fallback': 'Συνομιλία', 'chat.direct_chat': 'Απευθείας συνομιλία', 'chat.linked_task': 'Συνδεδεμένη εργασία', 'chat.write_btn': 'Μήνυμα', 'chat.just_now': 'μόλις τώρα', 'chat.min_ago': 'λ', 'chat.write_specialist': 'Γράψε στον ειδικό', 'chat.write_customer': 'Γράψε στον πελάτη', 'chat.notif_settings': 'Ρυθμίσεις ειδοποιήσεων', 'chat.notif_messages': 'Ειδοποιήσεις για νέα μηνύματα', 'chat.toast_title': 'Νέο μήνυμα', 'chat.toast_open': 'Άνοιγμα συνομιλίας', // Offer form 'offer.price': 'Τιμή', 'offer.price.placeholder': 'π.χ. 80', 'offer.customer_budget': 'Προϋπολογισμός πελάτη', 'offer.message': 'Μήνυμα', 'offer.optional': 'προαιρετικό', 'offer.message.placeholder': 'Παρουσίασε τον εαυτό σου, την εμπειρία σου και γιατί είσαι η καλύτερη επιλογή...', 'offer.submitting': 'Αποστολή...', // Profile 'profile.photo': 'Φωτογραφία προφίλ', 'profile.photo.change': 'Αλλαγή φωτογραφίας', 'profile.photo.hint': 'JPEG, PNG, WebP · έως 5MB', 'profile.basic_info': 'Βασικά στοιχεία', 'profile.phone': 'Τηλέφωνο', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Σύντομη περιγραφή', 'profile.bio.placeholder': 'Πες μας λίγα λόγια για εσένα...', 'profile.language': 'Γλώσσα', 'profile.language.hint': 'Γλώσσα διεπαφής και email ειδοποιήσεων', 'profile.languages': 'Γλώσσες επικοινωνίας', 'profile.languages.hint': 'Επιλέξτε όλες τις γλώσσες που μιλάτε', 'profile.skills': 'Δεξιότητες', 'profile.skills.subtitle': 'Προσθέσε τις υπηρεσίες που προσφέρεις', 'profile.skills.placeholder': 'π.χ. Καθαρισμός, IT, Μαθήματα...', 'profile.role': 'Ρόλος λογαριασμού', 'profile.role.specialist': '🔧 Ειδικός', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 Χρήστης', 'profile.role.change': 'Για αλλαγή ρόλου επικοινωνήστε με την υποστήριξη.', 'profile.become_specialist': 'Γίνε Ειδικός', 'profile.become_specialist.desc': 'Αναβαθμίσου σε Ειδικό για να δέχεσαι εργασίες και να δημιουργήσεις το προφίλ σου.', 'become_specialist.hero.title': 'Κέρδισε χρήματα κάνοντας αυτό που ξέρεις', 'become_specialist.hero.subtitle': 'Δημιούργησε προφίλ ειδικού και λάβε παραγγελίες από πελάτες σε όλη την Ελλάδα', 'become_specialist.how.title': 'Πώς λειτουργεί', 'become_specialist.step1.title': 'Δημιούργησε κάρτα ειδικού', 'become_specialist.step1.desc': 'Δήλωσε κατηγορίες, δεξιότητες και περιοχές κάλυψης — το σύστημα θα βρει τις κατάλληλες εργασίες για σένα αυτόματα', 'become_specialist.step2.title': 'Βρες εργασίες', 'become_specialist.step2.desc': 'Ανακάλυψε εργασίες στις κατηγορίες σου στην ενότητα «Αναζήτηση εργασιών»', 'become_specialist.step3.title': 'Στείλε προσφορά & κέρδισε', 'become_specialist.step3.desc': 'Υποβάλε προσφορές με τιμή και χρόνο, επικοινωνήσε με πελάτες και ολοκλήρωσε εργασίες', 'become_specialist.benefits.title': 'Πλεονεκτήματα προφίλ ειδικού', 'become_specialist.benefit1': 'Αναζήτηση εργασιών ανά κατηγορία και τοποθεσία', 'become_specialist.benefit2': 'Δημόσιο προφίλ με αξιολογήσεις πελατών', 'become_specialist.benefit3': 'Πρόγραμμα διαθεσιμότητας ορατό στους πελάτες', 'become_specialist.benefit4': 'Προσθήκη σε αγαπημένα από πελάτες', 'become_specialist.cta': 'Γίνε Ειδικός — είναι δωρεάν', 'become_specialist.free_badge': 'Δωρεάν εγγραφή', 'profile.tab.notifications': 'Ειδοποιήσεις', 'profile.tab.reviews': 'Αξιολογήσεις', 'profile.tab.referral': 'Παραπομπές', 'profile.tab.auto_response': 'Αυτόματη απάντηση', 'profile.tab.site': 'Site', 'profile.site.title': 'Προσωπική σελίδα', 'profile.site.url_label': 'Προσωπικό site', 'profile.site.copy': 'Αντιγραφή', 'profile.site.copied': 'Αντιγράφηκε', 'profile.site.visible_title': 'Τι εμφανίζεται στη σελίδα σας', 'profile.site.visible.name': 'Όνομα και φωτογραφία', 'profile.site.visible.bio': 'Βιογραφικό', 'profile.site.visible.rating': 'Αξιολόγηση και κριτικές', 'profile.site.visible.portfolio': 'Χαρτοφυλάκιο / Κάρτες', 'profile.site.visible.contacts': 'Στοιχεία επικοινωνίας', 'profile.site.visible.full_last_name': 'Πλήρες επώνυμο', 'profile.site.visible.services': 'Κάρτες υπηρεσιών', 'profile.site.visible.reviews': 'Ενότητα κριτικών', 'profile.site.visible.status': 'Κατάσταση «Έτοιμος να βοηθήσω»', 'profile.site.theme': 'Θέμα εμφάνισης', 'profile.site.theme.dark': 'Σκοτεινό', 'profile.site.theme.light': 'Φωτεινό', 'profile.site.slug_taken': 'Αυτή η διεύθυνση είναι ήδη κατειλημμένη', 'profile.site.stats.title': 'Στατιστικά επισκεψιμότητας', 'profile.site.stats.days': 'τελευταίες 30 ημέρες', 'profile.site.stats.views': 'Προβολές', 'profile.site.stats.unique': 'Μοναδικοί επισκέπτες', 'profile.site.stats.messages': 'Μηνύματα', 'profile.site.stats.total_views': 'Συνολικές προβολές', 'profile.site.stats.total_unique': 'Μοναδικοί επισκέπτες', 'profile.site.stats.total_messages': 'Μηνύματα', 'profile.site.stats.empty': 'Δεν υπάρχουν δεδομένα ακόμη', 'profile.site.stats.loading': 'Φόρτωση στατιστικών...', 'profile.site.stats.no_slug': 'Ορίστε τη διεύθυνση του site για να δείτε στατιστικά', 'profile.site.edit_bio_hint': 'Το βιογραφικό και η φωτογραφία ρυθμίζονται στην καρτέλα «Βασικά».', 'status.can_help_now_hint': 'Η κάρτα σου εμφανίζεται ψηλότερα', 'status.need_help_hint': 'Οι ειδικοί μπορούν να σε βοηθήσουν', 'profile.referral.title': 'Πρόγραμμα παραπομπών', 'profile.referral.desc': 'Μοιράσου τον σύνδεσμο σου και κέρδισε ανταμοιβές για κάθε νέο χρήστη.', 'profile.referral.link_label': 'Ο σύνδεσμος παραπομπής σου', 'profile.referral.copy': 'Αντιγραφή', 'profile.referral.copied': 'Αντιγράφηκε!', 'profile.referral.invited_count': 'επιτυχείς παραπομπές', 'profile.referral.no_code': 'Ο κωδικός παραπομπής δεν είναι διαθέσιμος.', 'notifications.title': 'Ρυθμίσεις ειδοποιήσεων', 'notifications.email.new_tasks': 'Email για νέες εργασίες', 'notifications.email.new_tasks.desc': 'Λάβε email όταν δημοσιευτεί νέα εργασία στις κατηγορίες σου', 'notifications.messages.desc': 'Λαμβάνεις ειδοποίηση όταν έρθει νέο μήνυμα', 'notifications.saved': 'Ρυθμίσεις αποθηκεύτηκαν', 'notifications.plan_required': 'Συνδρομή απαιτείται για αυτή τη λειτουργία', 'profile.tab.info': 'Βασικά στοιχεία', 'profile.tab.finance': 'Οικονομικά', 'profile.tab.skills': 'Δεξιότητες', 'profile.tab.categories': 'Κατηγορίες', 'profile.tab.geography': 'Γεωγραφία', 'profile.specialist.categories': 'Κατηγορίες εργασιών', 'profile.specialist.categories.desc': 'Επίλεξε τις κατηγορίες στις οποίες εργάζεσαι', 'profile.specialist.geography': 'Περιοχές κάλυψης', 'profile.specialist.geography.desc': 'Επίλεξε τις πόλεις / περιοχές όπου δραστηριοποιείσαι', 'profile.saving': 'Αποθήκευση...', 'profile.upload.error': 'Σφάλμα κατά την αναφόρτωση', 'profile.saved': 'Αποθηκεύτηκε', 'profile.tab.cards': 'Χαρτοφυλάκιο', 'profile.cards.count': 'Χαρτοφυλάκια', 'profile.cards.add': 'Νέο χαρτοφυλάκιο', 'profile.cards.new_title': 'Τίτλος νέου χαρτοφυλακίου', 'profile.cards.placeholder': 'π.χ. Υδραυλικά', 'profile.cards.create': 'Δημιουργία', 'profile.cards.cancel': 'Ακύρωση', 'profile.cards.empty': 'Δεν έχετε χαρτοφυλάκιο', 'profile.cards.create_first': 'Δημιουργήστε το πρώτο σας χαρτοφυλάκιο', 'profile.cards.delete_confirm': 'Διαγραφή χαρτοφυλακίου;', 'profile.card.tab.main': 'Γενικά', 'profile.card.tab.skills': 'Δεξιότητες', 'profile.card.tab.categories': 'Κατηγορίες', 'profile.card.tab.geography': 'Γεωγραφία', 'profile.card.tab.portfolio': 'Γκαλερί', 'profile.card.active': 'Ενεργή', 'profile.card.save': 'Αποθήκευση', 'profile.card.saved': 'Αποθηκεύτηκε', 'profile.card.delete': 'Διαγραφή', 'profile.card.skill.add': 'Προσθήκη δεξιότητας', 'profile.card.photo.add': 'Προσθήκη φωτογραφίας', 'profile.card.photo.uploading': 'Μεταφόρτωση...', 'profile.card.photo.empty': 'Δεν υπάρχουν φωτογραφίες', 'profile.card.item.title': 'Τίτλος', 'profile.card.item.desc': 'Περιγραφή', 'profile.card.item.save': 'Αποθήκευση', 'profile.card.item.cancel': 'Ακύρωση', 'profile.card.item.edit': 'Επεξεργασία', 'profile.upgrade.cards_limit': 'Όριο χαρτοφυλακίων εξαντλήθηκε', 'profile.upgrade.plan': 'Τρέχον πλάνο:', 'profile.upgrade.contact': 'Επικοινωνήστε με τον διαχειριστή για αλλαγή πλάνου', 'profile.upgrade.ok': 'Εντάξει', 'profile.plan.title': 'Πλάνο συνδρομής', 'profile.balance': 'Υπόλοιπο', 'profile.balance.topup': 'Αναπλήρωση υπολοίπου', 'profile.balance.topup.title': 'Αναπλήρωση υπολοίπου', 'profile.balance.topup.amount': 'Ποσό (σε EUR)', 'profile.balance.topup.hint': 'Επιλέξτε ποσό ή εισαγάγετε μανούαλα', 'profile.balance.topup.submit': 'Πληρωμή', 'profile.balance.topup.loading': 'Ρεδιρεκτάρισμα...', 'profile.balance.topup.error': 'Σφάλμα μετάβασης στην πληρωμή. Προσπαθήστε ξανά.', 'payment.success.title': 'Πληρωμή επιτυχής!', 'payment.success.desc': 'Το υπόλοιπό σας ενημερώθηκε.', 'payment.cancelled.title': 'Ακύρωση πληρωμής', 'payment.cancelled.desc': 'Η πληρωμή ακυρώθηκε. Κανένα χρήμα δεν χρεώθηκε.', 'payment.pending.title': 'Σε εξέλιξη...', 'payment.pending.desc': 'Επεξεργαζόμαστε την πληρωμή σας.', 'payment.back_to_profile': 'Επιστροφή στο προφίλ', 'profile.plan.basic': 'Βασικό (δωρεάν)', 'profile.plan.contact_upgrade': 'Επικοινωνήστε με τον διαχειριστή για αναβάθμιση', 'profile.plan.cards_up_to': 'Χαρτοφυλάκια: έως', 'profile.plan.cards_unlimited': 'Χαρτοφυλάκια: απεριόριστα', 'profile.plan.tasks_up_to': 'Εργασίες: έως', 'profile.plan.offers_up_to': 'Προσφορές: έως', 'profile.plan.valid_until': 'Ισχύει έως', 'profile.plan.no_expiry': 'Δεν λήγει', // Create task 'create.error': 'Σφάλμα κατά τη δημοσίευση', // Tasks list extras 'tasks.category.general': 'Γενικά', 'tasks.budget.range': 'Εύρος:', 'tasks.budget.from': 'από', 'tasks.budget.to': 'έως', 'tasks.filter.reset': 'Εκκαθάριση φίλτρων', 'tasks.load_more': 'Φόρτωση ακόμα', 'tasks.showing': 'Αποτελέσματα:', 'tasks.field.budget': 'Προϋπολογισμός, €', // Admin 'admin.title': 'Πίνακας Διαχείρισης', 'admin.tab.stats': 'Στατιστικά', 'admin.tab.users': 'Χρήστες', 'admin.tab.tasks': 'Εργασίες', 'admin.tab.reports': 'Αναφορές', 'admin.stats.users': 'Χρήστες', 'admin.stats.tasks': 'Εργασίες', 'admin.stats.offers': 'Προσφορές', 'admin.stats.reviews': 'Αξιολογήσεις', 'admin.tasks.by_status': 'Εργασίες ανά κατάσταση', 'admin.col.user': 'Χρήστης', 'admin.col.email': 'Email', 'admin.col.role': 'Ρόλος', 'admin.col.registered': 'Εγγραφή', 'admin.col.status': 'Κατάσταση', 'admin.col.title': 'Τίτλος', 'admin.col.budget': 'Προϋπολογισμός', 'admin.col.created': 'Δημιουργία', 'admin.users.active': 'Ενεργός', 'admin.users.inactive': 'Ανενεργός', 'admin.users.deactivate': 'Απενεργοποίηση', 'admin.users.activate': 'Ενεργοποίηση', 'admin.tasks.cancel': 'Ακύρωση', 'admin.reports.none': 'Δεν υπάρχουν αναφορές', 'admin.reports.reviewed': 'Αναθεωρήθηκε', 'admin.reports.dismiss': 'Απόρριψη', 'admin.pagination.total': 'Σύνολο', 'admin.users.role.change': 'Αλλαγή ρόλου', 'admin.users.search.placeholder': 'Αναζήτηση ονόματος ή email...', 'admin.tasks.delete': 'Διαγραφή', 'admin.tasks.delete.confirm': 'Διαγραφή αυτής της εργασίας μόνιμα;', 'admin.tasks.search.placeholder': 'Αναζήτηση τίτλου...', 'admin.col.customer': 'Πελάτης', 'admin.col.reporter': 'Καταγγέλλων', 'admin.col.target': 'Στόχος', 'admin.filter.all_roles': 'Όλοι οι ρόλοι', 'admin.filter.all_statuses': 'Όλες οι καταστάσεις', 'admin.reports.target.task': 'Εργασία', 'admin.reports.target.user': 'Χρήστης', 'admin.tab.categories': 'Κατηγορίες', 'admin.tab.locations': 'Πόλεις & Περιοχές', 'admin.tab.logs': 'Αρχεία', 'admin.tab.plans': 'Πακέτα', 'admin.tab.settings': 'Ρυθμίσεις', 'admin.logs.subtab.ai': 'AI Logs', 'admin.logs.subtab.activity': 'Δραστηριότητα', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Ειδοποιήσεις', 'admin.notif_logs.type': 'Τύπος', 'admin.notif_logs.title': 'Τίτλος', 'admin.notif_logs.read': 'Διαβασμένο', 'admin.notif_logs.empty': 'Δεν υπάρχουν αρχεία ειδοποιήσεων', 'admin.stats.notif_chart_title': 'Ειδοποιήσεις ανά ημέρα', 'admin.stats.notif_label': 'Ειδοποιήσεις', 'admin.stats.mail_chart_title': 'Emails ανά ημέρα', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'Όλα', 'admin.stats.specialists': 'Ειδικοί', 'admin.col.plan': 'Πακέτο', 'admin.back_home': 'Αρχική', 'admin.plans.title': 'Πακέτα συνδρομής', 'admin.plans.add': '+ Νέο πακέτο', 'admin.plans.empty': 'Δεν υπάρχουν πακέτα', 'admin.plans.form.new': 'Νέο πακέτο', 'admin.plans.form.edit': 'Επεξεργασία πακέτου', 'admin.plans.form.name': 'Όνομα', 'admin.plans.form.price': 'Τιμή (EUR)', 'admin.plans.form.old_price': 'Παλιά τιμή (EUR, προαιρετικό)', 'admin.plans.form.max_offers': 'Μέγ. προσφορές (κενό = χωρίς όριο)', 'admin.plans.form.max_cards': 'Μέγ. χαρτοφυλάκιο (κενό = χωρίς όριο)', 'admin.plans.form.duration_days': 'Διάρκεια (ημέρες, κενό = χωρίς λήξη)', 'admin.plans.form.description': 'Περιγραφή', 'admin.plans.form.features': 'Δυνατότητες (μία ανά γραμμή)', 'admin.plans.form.notify': 'Ειδοποιήσεις νέων εργασιών', 'admin.plans.form.default': 'Προεπιλογή', 'admin.plans.form.active': 'Ενεργό', 'admin.plans.form.order': 'Σειρά', 'admin.plans.form.role': 'Ρόλος', 'admin.plans.form.tier': 'Επίπεδο', 'admin.plans.form.role.customer': 'Πελάτης', 'admin.plans.form.role.specialist': 'Ειδικός', 'admin.plans.form.tier.free': 'Δωρεάν', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Όρια (κενό = χωρίς όριο)', 'admin.plans.form.max_messages_day': 'Μέγ. μηνύματα/ημέρα', 'admin.plans.form.max_orders_day': 'Μέγ. παραγγελίες/ημέρα', 'admin.plans.form.max_skills': 'Μέγ. δεξιότητες', 'admin.plans.form.max_profiles': 'Μέγ. προφίλ', 'admin.plans.form.max_portfolio': 'Μέγ. στοιχεία χαρτοφυλακίου', 'admin.plans.form.section.boost': 'Πολλαπλασιαστές & Ενίσχυση', 'admin.plans.form.search_boost': 'Ενίσχυση αναζήτησης', 'admin.plans.form.offers_multiplier': 'Πολλαπλασιαστής προσφορών', 'admin.plans.form.section.contact': 'Δικαιώματα επικοινωνίας', 'admin.plans.form.can_contact_free': 'Επικοινωνία με δωρεάν χρήστες', 'admin.plans.form.can_contact_pro': 'Επικοινωνία με Pro χρήστες', 'admin.plans.form.can_contact_all': 'Επικοινωνία με όλους', 'admin.plans.form.can_show_contact': 'Εμφάνιση στοιχείων επικοινωνίας', 'admin.plans.form.can_view_phone': 'Προβολή τηλεφώνου', 'admin.plans.form.section.features': 'Λειτουργίες', 'admin.plans.form.upload_video': 'Μεταφόρτωση βίντεο', 'admin.plans.form.favorites': 'Αγαπημένα', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Σήμα επαλήθευσης', 'admin.plans.form.highlighted_reviews': 'Προβεβλημένες κριτικές', 'admin.plans.form.personal_site': 'Προσωπική σελίδα', 'admin.plans.form.can_help_now': 'Κατάσταση «Μπορώ να βοηθήσω»', 'admin.plans.form.need_help': 'Κατάσταση «Χρειάζομαι βοήθεια»', 'admin.plans.form.auto_response': 'Αυτόματη απάντηση', 'admin.plans.form.auto_match': 'Αυτόματη αντιστοίχιση', 'admin.plans.form.instant_dispatch_free': 'Άμεση αποστολή (δωρεάν)', 'admin.plans.form.instant_dispatch_pro': 'Άμεση αποστολή (Pro)', 'admin.plans.badge.default': 'Προεπιλογή', 'admin.plans.badge.inactive': 'Ανενεργό', 'admin.plans.make_default': 'Ορισμός ως προεπιλογή', 'admin.plans.tasks': 'Εργασίες', 'admin.plans.offers': 'Προσφορές', 'admin.plans.cards': 'Χαρτοφυλάκιο', 'admin.plans.notify_tasks': 'Ειδοποιήσεις εργασιών', 'admin.plans.delete.confirm': 'Διαγραφή πακέτου', 'admin.activity.title': 'Αρχείο δραστηριότητας', 'admin.activity.event': 'Γεγονός', 'admin.activity.all_events': 'Όλα τα γεγονότα', 'admin.activity.from': 'Από', 'admin.activity.to': 'Έως', 'admin.activity.reset': 'Επαναφορά', 'admin.activity.total': 'Σύνολο', 'admin.activity.empty': 'Δεν υπάρχουν εγγραφές', 'admin.mail.event': 'Συμβάν email', 'admin.mail.all_events': 'Όλα τα email συμβάντα', 'admin.mail.from': 'Από', 'admin.mail.to': 'Έως', 'admin.mail.reset': 'Επαναφορά', 'admin.mail.total': 'Σύνολο', 'admin.mail.empty': 'Δεν υπάρχουν email logs', 'admin.mail.recipient': 'Παραλήπτης', 'admin.mail.provider': 'Πάροχος', 'admin.mail.details': 'Λεπτομέρειες', 'admin.mail.status': 'Κατάσταση', 'admin.mail.success': 'Επιτυχία', 'admin.mail.failed': 'Σφάλμα', 'admin.event.email_sent': 'Email sent', 'admin.event.email_failed': 'Email failed', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Admin test email sent', 'admin.event.admin_email_test_failed': 'Admin test email failed', 'admin.logs.empty': 'Δεν υπάρχουν εγγραφές', 'admin.logs.date': 'Ημερομηνία', 'admin.logs.provider': 'Πάροχος', 'admin.logs.model': 'Μοντέλο', 'admin.logs.action': 'Ενέργεια', 'admin.logs.langs': 'Γλώσσες', 'admin.logs.in': 'Είσοδος', 'admin.logs.out': 'Έξοδος', 'admin.logs.total': 'Σύνολο', 'admin.logs.ms': 'ms', 'admin.logs.status': 'Κατάσταση', 'admin.stats.activity_30d': 'Δραστηριότητα 30 ημερών', 'admin.stats.tasks_label': 'Εργασίες', 'admin.stats.users_label': 'Χρήστες', 'admin.stats.specialists_label': 'Ειδικοί', 'admin.stats.tokens_title': 'Χρήση tokens (ανά μήνα)', 'admin.stats.tokens_out': 'Εξερχόμενα', 'admin.stats.tokens_in': 'Εισερχόμενα', 'admin.stats.tokens_out_label': 'Εξερχόμενα tokens', 'admin.stats.tokens_in_label': 'Εισερχόμενα tokens', 'admin.stats.cost_label': 'Κόστος (USD)', 'admin.stats.tasks_by_status': 'Εργασίες ανά κατάσταση', 'admin.task_status.open': 'Ανοιχτές', 'admin.task_status.in_progress': 'Σε εξέλιξη', 'admin.task_status.completed': 'Ολοκληρωμένες', 'admin.task_status.cancelled': 'Ακυρωμένες', 'admin.task_status.draft': 'Προσχέδια', 'admin.settings.tab.general': 'Γενικά', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Ειδοποιήσεις', 'admin.settings.tab.payment': 'Πληρωμή', 'admin.settings.tab.referral': 'Παραπομπές', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO & Συντήρηση', 'admin.settings.seo.maintenance_label': 'Λειτουργία συντήρησης', 'admin.settings.seo.maintenance_hint': 'Εμφάνιση σελίδας συντήρησης σε όλους τους επισκέπτες', 'admin.settings.seo.indexing_label': 'Ευρετηρίαση από μηχανές αναζήτησης', 'admin.settings.seo.indexing_hint': 'Επιτρέπει στις μηχανές αναζήτησης να ευρετηριάσουν τον ιστότοπο', 'admin.settings.seo.head_scripts_label': 'Scripts στο (JS)', 'admin.settings.seo.head_scripts_hint': 'Εκτελείται σε κάθε σελίδα (Google Tag Manager, analytics κ.λπ.)', 'admin.settings.seo.site_title_label': 'Τίτλος ιστότοπου', 'admin.settings.seo.site_description_label': 'Περιγραφή ιστότοπου (meta description)', 'admin.settings.referral.title': 'Πρόγραμμα παραπομπών', 'admin.settings.referral.hint': 'Επιβράβευσε χρήστες που φέρνουν νέους εγγεγραμμένους.', 'admin.settings.referral.enabled_label': 'Ενεργό', 'admin.settings.referral.enabled_hint': 'Ενεργοποίηση / απενεργοποίηση εφαρμογής ανταμοιβών', 'admin.settings.referral.customer_section': 'Για πελάτες', 'admin.settings.referral.specialist_section': 'Για ειδικούς', 'admin.settings.referral.plan_label': 'Πλάνο ανταμοιβής', 'admin.settings.referral.no_plan': '— χωρίς πλάνο —', 'admin.settings.referral.plan_hint': 'Αυτό το πλάνο θα ανατεθεί στον χρήστη που έφερε νέους. Εάν το τρέχον πλάνο του είναι υψηλότερο, θα προστεθούν μόνο οι μέρες.', 'admin.settings.referral.days_label': 'Ημέρες ανταμοιβής', 'admin.settings.referral.days_hint': 'Αριθμός ημερών που θα προστεθούν στη λήξη του πλάνου.', 'admin.settings.general.title': 'Γενικές ρυθμίσεις', 'admin.settings.general.site_name': 'Όνομα ιστότοπου', 'admin.settings.general.site_url': 'URL ιστότοπου', 'admin.settings.general.contact_email': 'Email επικοινωνίας', 'admin.settings.general.support_phone': 'Τηλέφωνο υποστήριξης', 'admin.settings.smtp.title': 'Ρυθμίσεις SMTP', 'admin.settings.smtp.hint': 'Χρησιμοποιείται για αποστολή ειδοποιήσεων email.', 'admin.settings.smtp.host': 'SMTP Host', 'admin.settings.smtp.port': 'Θύρα', 'admin.settings.smtp.encryption': 'Κρυπτογράφηση', 'admin.settings.smtp.enc.none': 'Χωρίς', 'admin.settings.smtp.enc.tls': 'STARTTLS (θύρα 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (θύρα 465)', 'admin.settings.smtp.username': 'Όνομα χρήστη', 'admin.settings.smtp.password': 'Κωδικός / App Password', 'admin.settings.smtp.from_name': 'Όνομα αποστολέα', 'admin.settings.smtp.from_email': 'Email αποστολέα', 'admin.settings.smtp.test': 'Αποστολή δοκιμαστικού email', 'admin.settings.smtp.sending': 'Αποστολή...', 'admin.settings.payment.hint': 'Τα στοιχεία για ePay Piraeus Bank.', 'admin.settings.env.test': 'Δοκιμαστικό (sandbox)', 'admin.settings.env.prod': 'Παραγωγή', 'admin.settings.env.label': 'Περιβάλλον', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Ενεργό', 'admin.settings.saving': 'Αποθήκευση...', 'admin.settings.saved': '✓ Αποθηκεύτηκε', 'admin.notif.vars_hint': 'Διαθέσιμες μεταβλητές στα πρότυπα', 'admin.notif.tmpl.not_set': 'Πρότυπο δεν έχει οριστεί', 'admin.notif.tmpl.subject_label': 'Θέμα email', 'admin.notif.tmpl.body_label': 'Κείμενο email (HTML)', 'admin.notif.tmpl.save': 'Αποθήκευση', 'admin.notif.tmpl.close': 'Κλείσιμο', 'admin.notif.tmpl.translate': 'Αυτόματη μετάφραση', 'admin.notif.tmpl.translating': 'Μετάφραση...', 'admin.notif.tmpl.saving': 'Αποθήκευση...', 'admin.notif.email_verification': 'Επαλήθευση email', 'admin.notif.registration_success': 'Επιτυχής εγγραφή', 'admin.notif.password_reset': 'Επαναφορά κωδικού', 'admin.notif.new_offer': 'Νέα προσφορά', 'admin.notif.new_task': 'Νέα εργασία', 'admin.notif.offer_accepted': 'Προσφορά αποδεκτή', 'admin.notif.new_message': 'Νέο μήνυμα', 'admin.notif.offer_declined': 'Απόρριψη προσφοράς', 'admin.notif.offer_other_accepted': 'Επιλέχθηκε άλλος ειδικός', 'admin.notif.task_updated': 'Ενημέρωση εργασίας', 'admin.notif.deadline_reminder': 'Υπενθύμιση προθεσμίας', 'admin.notif.task_archived': 'Αυτόματη απόσυρση εργασίας', 'admin.notif.referral_reward': 'Ανταμοιβή παραπομπής', // Plan lifecycle email templates 'admin.email_template.plan_activated': 'Τιμολόγιο — ενεργοποίηση πλάνου', 'admin.email_template.plan_upgraded': 'Τιμολόγιο — αναβάθμιση πλάνου', 'admin.email_template.plan_downgrade_scheduled': 'Τιμολόγιο — προγραμματισμένη υποβάθμιση', 'admin.email_template.plan_downgrade_applied': 'Τιμολόγιο — εφαρμογή υποβάθμισης', 'admin.email_template.plan_renewal_reminder': 'Τιμολόγιο — υπενθύμιση ανανέωσης', 'admin.email_template.plan_insufficient_funds': 'Τιμολόγιο — ανεπαρκές υπόλοιπο', // Pricing confirm modal 'pricing.confirm.title': 'Επιβεβαίωση επιλογής πλάνου', 'pricing.confirm.plan': 'Πλάνο', 'pricing.confirm.prorated': 'Αναλογική έκπτωση', 'pricing.confirm.effective_price': 'Προς πληρωμή', 'pricing.confirm.your_balance': 'Το υπόλοιπό σας', 'pricing.confirm.downgrade_info': 'Η μετάβαση στο νέο πλάνο θα γίνει αυτόματα μετά τη λήξη της τρέχουσας περιόδου.', 'pricing.confirm.insufficient': 'Ανεπαρκές υπόλοιπο.', 'pricing.confirm.top_up': 'Ανανέωση', 'pricing.confirm.schedule_downgrade': 'Προγραμματισμός μετάβασης', 'pricing.confirm.pay': 'Πληρωμή', 'admin.user_edit.title': 'Επεξεργασία χρήστη', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Εγγραφή', 'admin.user_edit.last_seen': 'Τελευταία σύνδεση', 'admin.user_edit.lang': 'Γλώσσα', 'admin.user_edit.first_name': 'Όνομα', 'admin.user_edit.last_name': 'Επώνυμο', 'admin.user_edit.phone': 'Τηλέφωνο', 'admin.user_edit.bio': 'Βιογραφικό', 'admin.user_edit.role': 'Ρόλος', 'admin.user_edit.plan': 'Πακέτο', 'admin.user_edit.no_plan': '— Χωρίς πακέτο —', 'admin.user_edit.active': 'Ενεργός λογαριασμός', 'admin.user_edit.balance': 'Υπόλοιπο (EUR)', 'admin.user_edit.skills': 'Δεξιότητες', 'admin.user_edit.tab.profile': 'Προφίλ', 'admin.user_edit.tab.account': 'Λογαριασμός', 'admin.user_edit.tab.balance': 'Υπόλοιπο', 'admin.user_edit.tab.settings': 'Ρυθμίσεις', 'admin.user_edit.tab.specialist': 'Χαρτοφυλάκιο', 'admin.user_edit.tab.site': 'Ιστοσελίδα', 'admin.user_edit.plan_expires': 'Λήξη πλάνου', 'admin.user_edit.interface_lang': 'Γλώσσα διεπαφής', 'admin.user_edit.comm_languages': 'Γλώσσες επικοινωνίας', 'admin.user_edit.personal_site_slug': 'Προσωπική σελίδα', 'admin.user_edit.show_contact_info': 'Εμφάνιση στοιχείων επικοινωνίας', 'admin.user_edit.show_contact_info.hint': 'Ορατό στους πελάτες', 'admin.user_edit.notify_new_tasks': 'Ειδοποίηση για νέες εργασίες', 'admin.user_edit.notify_new_tasks.hint': 'Push και email ειδοποιήσεις', 'admin.user_edit.notif_messages': 'Ειδοποιήσεις μηνυμάτων', 'admin.user_edit.notif_messages.hint': 'Νέα μηνύματα στη συνομιλία', 'admin.user_edit.site_settings': 'Ρυθμίσεις προσωπικής σελίδας', 'admin.user_edit.categories': 'Κατηγορίες υπηρεσιών', 'admin.user_edit.locations': 'Περιοχές εξυπηρέτησης', 'admin.user_edit.skill_placeholder': 'Νέα δεξιότητα...', 'admin.user_edit.add_category': '— Επιλέξτε κατηγορία —', 'admin.user_edit.add_location': '— Επιλέξτε περιοχή —', 'admin.user_edit.specialist_cards': 'Χαρτοφυλάκιο ειδικού', 'admin.user_edit.no_cards': 'Δεν βρέθηκαν στοιχεία χαρτοφυλακίου', 'admin.user_edit.card_title': 'Τίτλος χαρτοφυλακίου', 'admin.user_edit.card_description': 'Περιγραφή', 'admin.balance.topup.btn': 'Αναπλήρωση', 'admin.balance.withdraw.btn': 'Αφαίρεση', 'admin.balance.modal_hint': 'Οι αλλαγές ισχύουν άμεσα και καταγράφονται στο ιστορικό', 'admin.balance.topup.title': 'Αναπλήρωση υπολοίπου', 'admin.balance.topup.amount': 'Ποσό', 'admin.balance.topup.description': 'Σχόλιο', 'admin.balance.topup.description.placeholder': 'Για παράδειγμα: bonus ή χειροκίνητη αναπλήρωση', 'admin.balance.topup.submit': 'Αναπλήρωση υπολοίπου', 'admin.balance.withdraw.title': 'Αφαίρεση υπολοίπου', 'admin.balance.withdraw.amount': 'Ποσό', 'admin.balance.withdraw.description': 'Σχόλιο', 'admin.balance.withdraw.description.placeholder': 'Για παράδειγμα: επιστροφή ή χειροκίνητη χρέωση', 'admin.balance.withdraw.submit': 'Αφαίρεση από το υπόλοιπο', 'admin.user_edit.role.customer': 'Πελάτης', 'admin.user_edit.role.specialist': 'Ειδικός', 'admin.user_edit.role.admin': 'Διαχειριστής', 'common.refresh': 'Ανανέωση', 'common.back_home': 'Αρχική', 'admin.loc.hint': 'Διαχείριση πόλεων και συνοικιών', 'admin.loc.add_city': 'Νέα πόλη', 'admin.loc.add_district': 'Προσθήκη συνοικίας', 'admin.loc.new': 'Νέα τοποθεσία', 'admin.loc.edit': 'Επεξεργασία τοποθεσίας', 'admin.loc.district': 'συνοικία', 'admin.loc.empty': 'Δεν υπάρχουν τοποθεσίες', 'admin.loc.delete.confirm': 'Διαγραφή τοποθεσίας; Όλες οι συνοικίες θα διαγραφούν επίσης.', 'admin.cat.add_root': 'Νέα κατηγορία', 'admin.cat.add_sub': 'Υποκατηγορία', 'admin.cat.edit': 'Επεξεργασία', 'admin.cat.delete': 'Διαγραφή', 'admin.cat.delete.confirm': 'Διαγραφή κατηγορίας; Όλες οι υποκατηγορίες θα διαγραφούν επίσης.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Εικονίδιο', 'admin.cat.name_el': 'Ελληνικά', 'admin.cat.name_en': 'Αγγλικά', 'admin.cat.name_ru': 'Ρωσικά', 'admin.cat.order': 'Σειρά', 'admin.cat.active': 'Ενεργή', 'admin.cat.parent': 'Γονική κατηγορία', 'admin.cat.no_parent': 'Κορυφαίο επίπεδο', 'admin.cat.save': 'Αποθήκευση', 'admin.cat.cancel': 'Ακύρωση', 'admin.cat.empty': 'Δεν υπάρχουν κατηγορίες', 'admin.cat.hint': 'Διαχείριση κατηγοριών με πολυεπίπεδη ιεραρχία', 'admin.cat.new': 'Νέα κατηγορία', 'admin.cat.subcategory': 'υποκατηγορία', 'admin.cat.add_child': 'Προσθήκη υποκατηγορίας', 'admin.cat.inactive': 'Ανενεργή', 'admin.event.user_login': 'Σύνδεση', 'admin.event.user_register': 'Εγγραφή', 'admin.event.admin_user_deactivate': 'Αποκλεισμός χρήστη', 'admin.event.admin_user_activate': 'Ενεργοποίηση χρήστη', 'admin.event.admin_user_role_changed': 'Αλλαγή ρόλου', 'admin.event.admin_task_cancelled': 'Ακύρωση εργασίας', 'admin.event.admin_task_deleted': 'Διαγραφή εργασίας', 'admin.event.admin_report_reviewed': 'Αναφορά εξετάστηκε', 'admin.event.admin_report_dismissed': 'Αναφορά απορρίφθηκε', 'admin.event.task_created': 'Δημιουργία εργασίας', 'user.online': 'Σε σύνδεση', 'user.seen_minutes': 'ήταν εδώ πριν {n} λεπτά', 'user.seen_hours': 'ήταν εδώ πριν {n} ώρες', 'user.seen_yesterday': 'ήταν εδώ χθες', 'user.seen_days': 'ήταν εδώ πριν {n} μέρες', // Specialists 'specialists.title': 'Ειδικοί', 'specialists.search': 'Αναζήτηση ειδικού...', 'specialists.search.btn': 'Αναζήτηση', 'specialists.empty': 'Δεν βρέθηκαν ειδικοί', 'specialists.no_bio': 'Χωρίς περιγραφή', 'specialists.view': 'Προβολή προφίλ', 'specialists.reviews': 'αξιολογήσεις', 'specialist.favorite': 'Προσθήκη στα αγαπημένα', 'specialist.unfavorite': 'Αφαίρεση από αγαπημένα', 'specialist.site_link': 'Προσωπικό site', 'favorites.specialists.title': 'Αγαπημένοι ειδικοί', 'favorites.specialists.empty': 'Δεν έχετε αγαπημένους ειδικούς', 'nav.favorites': 'Αγαπημένα', 'nav.schedule': 'Πρόγραμμα', 'nav.find_tasks': 'Αναζήτηση εργασιών', 'schedule.title': 'Το πρόγραμμά μου', 'schedule.subtitle': 'Σημειώστε τις ημέρες που είστε ελεύθεροι ή απασχολημένοι — οι πελάτες θα δουν τη διαθεσιμότητά σας', 'schedule.available': 'Ελεύθερος', 'schedule.busy': 'Απασχολημένος', 'schedule.unset': 'Μη ορισμένο', 'schedule.click_hint': '← κλικ για εναλλαγή κατάστασης', 'schedule.range_mode': 'Επιλογή εύρους', 'schedule.range_from': 'Από {date} — επιλέξτε τελική ημερομηνία', 'schedule.click_to_set': 'Κλικ για ορισμό', 'schedule.free': 'ελεύθερα', 'schedule.busy_count': 'απασχολημένα', 'schedule.free_days': 'ελεύθερες ημέρες', 'schedule.googleCalendar': 'Google Calendar', 'schedule.connectGoogle': 'Σύνδεση με Google Calendar', 'schedule.disconnectGoogle': 'Αποσύνδεση', 'schedule.connectedAs': 'Συνδεδεμένο ως', 'schedule.importFromGoogle': 'Συγχρονισμός από Google', 'schedule.gcalConnected': '✓ Google Calendar συνδέθηκε', 'schedule.gcalError': 'Σφάλμα σύνδεσης Google Calendar', 'schedule.gcalImportDone': 'Εισήχθησαν {n} ημερ. από Google Calendar', 'schedule.gcalAutoSyncNote': 'Οι αλλαγές αποστέλλονται αυτόματα στο Google Calendar', 'schedule.gcalConnectDesc': 'Συνδέστε το Google Calendar για αυτόματο συγχρονισμό', 'schedule.gcalDisconnectConfirm': 'Αποσύνδεση Google Calendar;', 'find_tasks.title': 'Αναζήτηση εργασιών', 'find_tasks.for_me': 'Για μένα', 'find_tasks.all': 'Όλες οι εργασίες', 'find_tasks.by_category': 'Ανά κατηγορία', 'find_tasks.list': 'Λίστα', 'find_tasks.already_offered': 'Προσφορά υποβλήθηκε', 'find_tasks.offer_now': 'Υποβολή προσφοράς', 'find_tasks.empty_for_me': 'Δεν βρέθηκαν εργασίες στις κατηγορίες σας', 'find_tasks.banner_hint': 'Βρείτε εργασίες που ταιριάζουν με το χαρτοφυλάκιό σας', 'find_tasks.no_cards': 'Δημιουργήστε ένα χαρτοφυλάκιο ειδικού για να δείτε εργασίες για εσάς', 'find_tasks.add_card': 'Δημιουργία χαρτοφυλακίου', 'find_tasks.search': 'Αναζήτηση εργασιών...', 'find_tasks.tasks_count': 'εργασίες', // Footer 'footer.tagline': 'Η πλατφόρμα εργασιών για την Ελλάδα', 'footer.rights': 'Όλα τα δικαιώματα διατηρούνται.', // App download section 'app.download_title': 'Κατεβάστε την εφαρμογή CanHelp', 'app.download_desc': 'Όλο το CanHelp — πάντα μαζί σας. Διαθέσιμο για Android και iOS.', // Nav 'nav.pricing': 'Τιμές', // Pricing page 'pricing.title': 'Τιμολόγηση', 'pricing.subtitle': 'Επιλέξτε το κατάλληλο πρόγραμμα', 'pricing.role.customer': 'Πελάτης', 'pricing.role.specialist': 'Ειδικός', 'pricing.free': 'Δωρεάν', 'pricing.per_month': 'μήνα', 'pricing.duration': 'Διάρκεια', 'pricing.days': 'ημ.', 'pricing.current_plan': 'Το πρόγραμμά σας', 'pricing.popular': 'Δημοφιλές', 'pricing.choose': 'Επιλογή', 'pricing.your_plan': 'Ενεργό πρόγραμμα', 'pricing.free_default': 'Προεπιλογή', 'pricing.compare': 'Σύγκριση λειτουργιών', 'pricing.feature': 'Λειτουργία', 'pricing.faq_note': 'Η πληρωμή γίνεται από το υπόλοιπο CanHelp. Ανατροφοδότηση διαθέσιμη στην Πληρωμή.', 'pricing.feat.messages': 'Μηνύματα / ημέρα', 'pricing.feat.orders': 'Παραγγελίες / ημέρα', 'pricing.feat.contact_all': 'Επικοινωνία με όλους', 'pricing.feat.view_phone': 'Εμφάνιση τηλεφώνου', 'pricing.feat.show_contact': 'Εμφάνιση στοιχείων επαφής', 'pricing.feat.favorites': 'Αγαπημένα', 'pricing.feat.verified_badge': 'Επαληθευμένο badge', 'pricing.feat.google_calendar': 'Google Calendar', 'pricing.feat.personal_site': 'Προσωπικό site', 'pricing.feat.auto_response': 'Αυτόματη απάντηση', 'pricing.feat.auto_match': 'Αυτόματη αντιστοίχιση', 'pricing.feat.highlighted_reviews': 'Επισημασμένες αξιολογήσεις', 'pricing.feat.portfolio': 'Στοιχεία χαρτοφυλακίου', 'pricing.feat.cards': 'Κάρτες ειδικού', 'pricing.feat.notify_tasks': 'Ειδοποιήσεις νέων εργασιών', 'pricing.feat.video': 'Βίντεο στο χαρτοφυλάκιο', // Upgrade prompt 'upgrade.available_in': 'Διαθέσιμο στο', 'upgrade.cta': 'Αναβάθμιση', // Dashboard plan block 'dashboard.plan.title': 'Το πρόγραμμά μου', 'dashboard.plan.expires': 'Λήγει σε {n} ημέρες', 'dashboard.plan.upgrade': 'Αναβάθμιση προγράμματος', 'dashboard.plan.no_plan': 'Δωρεάν πρόγραμμα', 'dashboard.plan.messages': 'Μηνύματα σήμερα', 'dashboard.plan.orders': 'Παραγγελίες σήμερα', 'dashboard.plan.limits': 'Ημερήσια όρια', 'dashboard.plan.features': 'Λειτουργίες', 'dashboard.plan.stats': 'Στατιστικά', 'dashboard.stats.cards': 'Χαρτοφυλάκια', 'dashboard.stats.maxCards': 'Μέγ. χαρτοφυλάκια', 'dashboard.stats.portfolioItems': 'Στοιχεία portfolio', 'dashboard.stats.maxPortfolioItems': 'Μέγ. στοιχεία', 'dashboard.stats.activeOffers': 'Ενεργές προσφορές', 'dashboard.stats.reviewsReceived': 'Αξιολογήσεις', 'dashboard.stats.activeTasks': 'Ενεργές εργασίες', 'dashboard.stats.completedTasks': 'Ολοκληρωμένες', 'status.can_help_now': 'Είμαι διαθέσιμος τώρα', 'status.need_help': 'Χρειάζομαι βοήθεια', 'status.active': 'Ενεργό', 'status.toggle_on': 'Ενεργοποίηση', 'status.toggle_off': 'Απενεργοποίηση', // FOMO 'fomo.missed_orders': 'Χάσατε {n} παραγγελίες', 'fomo.missed_value': 'Αξία €{v}', 'fomo.upgrade_hint': 'Αναβαθμίστε για να λαμβάνετε περισσότερες παραγγελίες', 'fomo.conversion': 'Μετατροπές εργασιών', 'fomo.active': 'Ενεργές', 'fomo.with_offers': 'Με προσφορές', 'fomo.completed': 'Ολοκληρωμένες', 'fomo.already_offered': '{n} ειδικοί έχουν ήδη απαντήσει', 'fomo.specialist_missed': 'Χάσατε {n} παραγγελίες', 'fomo.top_categories': 'Κατηγορίες', 'fomo.offers_received': 'προσφορές ελήφθησαν', 'fomo.avg_offers': 'Μέσο {n}/εργασία', 'fomo.completion_rate': 'ολοκληρωμένες', // Task auto-match 'task.auto_match': 'Αυτόματη αντιστοίχιση', 'task.auto_match_results': 'Κορυφαίοι ειδικοί', 'task.no_offer_yet': 'Δεν έχετε στείλει προσφορά ακόμα', 'task.make_offer': 'Αποστολή προσφοράς', 'auto_response.title': 'Αυτόματη Απάντηση', 'auto_response.enabled': 'Ενεργοποίηση αυτόματης απάντησης', 'auto_response.min_budget': 'Ελάχ. προϋπολογισμός', 'auto_response.max_budget': 'Μέγ. προϋπολογισμός', 'auto_response.default_price': 'Προεπιλεγμένη τιμή', 'auto_response.default_message': 'Προεπιλεγμένο μήνυμα', 'auto_response.max_per_day': 'Μέγ. αυτόματες προσφορές/ημέρα', 'auto_response.save': 'Αποθήκευση', 'auto_response.saved': 'Αποθηκεύτηκε', 'auto_response.categories': 'Κατηγορίες', 'auto_response.locations': 'Τοποθεσίες', // Personal site 'profile.personal_site': 'Προσωπικό Site', 'profile.site_slug': 'Slug URL', 'profile.site_slug_hint': 'Μόνο λατινικοί χαρακτήρες, αριθμοί, - και _', 'profile.site_open': 'Άνοιγμα site', 'profile.site_preview': 'Το site σας', 'profile.show_contact': 'Εμφάνιση στοιχείων επαφής', 'profile.show_contact_hint': 'Πελάτες με Pro/Ultimate πρόγραμμα θα βλέπουν το τηλέφωνό σας', // Google Calendar plan gate 'gcal.upgrade_required': 'Το Google Calendar απαιτεί Pro ή Ultimate πρόγραμμα', // Chat limits 'chat.limit_warning': 'Απομένουν {n} μηνύματα σήμερα', 'chat.limit_reached': 'Εξαντλήθηκαν τα μηνύματα. Αναβαθμίστε το πρόγραμμά σας', 'chat.upgrade': 'Αναβάθμιση', // Site page 'site.member_since': 'Μαζί μας από', 'site.rating': 'Βαθμολογία', 'site.completed_tasks': 'Ολοκληρώθηκαν', 'site.languages': 'Γλώσσες', 'site.photos': 'φωτ.', 'site.contact_form': 'Επικοινωνία', 'site.contact_sent': 'Το μήνυμα στάλθηκε!', 'site.contact_sent_desc': 'Ο ειδικός θα επικοινωνήσει μαζί σας σύντομα', 'site.contact_name': 'Όνομα', 'site.contact_name_ph': 'Το όνομά σας', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Μήνυμα', 'site.contact_message_ph': 'Περιγράψτε την εργασία σας...', 'site.contact_send': 'Αποστολή', 'site.share': 'Κοινοποίηση', 'site.speaks_languages': 'Μιλάει', 'site.message_sent': 'Το μήνυμα εστάλη!', 'site.message_sent_desc': 'Ο ειδικός θα το λάβει στη συνομιλία', 'site.message_placeholder': 'Γράψτε το μήνυμά σας...', 'site.write_to_chat': 'Γράψτε στο chat', 'site.auth_required_title': 'Απαιτείται σύνδεση', 'site.auth_required_desc': 'Για να γράψετε στο chat, χρειάζεται να συνδεθείτε στο λογαριασμό σας.', 'site.auth_login_btn': 'Σύνδεση', 'site.auth_contact_form_btn': 'Επικοινωνία μέσω φόρμας', 'specialist.services': 'Υπηρεσίες', 'portfolio.title': 'Χαρτοφυλάκιο', 'common.not_found': 'Η σελίδα δεν βρέθηκε', 'common.anonymous': 'Ανώνυμα' }, en: { 'footer.slogan': 'Your task — our care! We solve any issue quickly and easily.', 'footer.links': 'Links', 'footer.socials': 'Socials', 'nav.home': 'Home', 'nav.tasks': 'Tasks', 'nav.post': '+ Post task', 'nav.dashboard': 'Dashboard', 'nav.chat': 'Messages', 'nav.notifications': 'Notifications', 'nav.profile': 'Profile', 'nav.admin': 'Admin Panel', 'nav.specialists': 'Specialists', 'nav.new_task': 'New task', 'nav.login': 'Login', 'nav.register': 'Register', 'nav.logout': 'Logout', 'hero.title': 'Find a specialist for any job', 'hero.subtitle': 'Post a task, receive offers and choose the best professional', 'hero.cta.post': 'Post a task', 'hero.cta.browse': 'Find work', 'hero.search.placeholder': 'What do you need? e.g. electrician, cleaning...', 'stats.specialists': 'specialists', 'stats.tasks': 'tasks', 'stats.categories': 'categories', 'stats.free': 'free sign-up', 'section.categories': 'Create a task in any category', 'section.how': 'How it works', 'section.recent': 'Recent tasks', 'section.all': 'See all →', 'section.more': 'more', 'section.cities': 'Cities & Districts', 'section.community': 'A community project for everyone', 'community.subtitle': 'CanHelp is not just a marketplace — it\'s a community of mutual help. Anyone with knowledge or a skill can find a client. Anyone with a problem can find a specialist.', 'community.point1.title': 'Are you good at something?', 'community.point1.desc': 'Repairs, tutoring, design, translation, care — every skill has value. Create a profile and find clients near you.', 'community.point2.title': 'Need help with something?', 'community.point2.desc': 'Post a task in under a minute and receive offers from verified specialists in your city.', 'community.point3.title': 'Help the project grow', 'community.point3.desc': 'CanHelp grows through communities. Share the link with friends and acquaintances — together we build something useful for everyone.', 'community.share': 'Share with friends', 'community.share.copied': 'Link copied!', // Referral section on home page 'section.referral': 'Referral Program', 'referral.home.subtitle': 'Share your link — every new user who signs up through it earns you a reward.', 'referral.home.step1.title': 'Sign up and get your link', 'referral.home.step1.desc': 'Create an account and find your unique referral link in your profile.', 'referral.home.step2.title': 'Share with friends', 'referral.home.step2.desc': 'Send the link to friends, acquaintances, or post it on social media.', 'referral.home.step3.title': 'Earn rewards', 'referral.home.step3.desc': 'Once your friend verifies their email, you automatically receive your reward.', 'referral.home.cta': 'Get your link', 'referral.home.badge': 'Referral Program', // FAQ section 'section.faq': 'Frequently Asked Questions', 'faq.q1': 'How does CanHelp work?', 'faq.a1': 'Post a task, receive offers from specialists, choose the best one and start working together. It\'s fast, simple and free for customers.', 'faq.q2': 'How much does it cost to use the platform?', 'faq.a2': 'Registration and task posting is completely free for customers. Specialists have access to a free plan as well as premium options.', 'faq.q3': 'How can I become a specialist?', 'faq.a3': 'Register, go to «Become a Specialist», fill in your profile with skills and categories, and start receiving tasks.', 'faq.q4': 'How do I choose the right specialist?', 'faq.a4': 'Check their reviews, experience, skills and portfolio. Chat with them through the platform and discuss the details before deciding.', 'faq.q5': 'What if I am not satisfied?', 'faq.a5': 'You can leave a review about the specialist and rate them from 1 to 5 stars. Reviews help other users find trusted professionals.', 'faq.q6': 'Can I contact a specialist before accepting their offer?', 'faq.a6': 'Yes. Once you receive an offer, you can open a chat with the specialist, ask questions and discuss all the details before making a decision.', 'faq.q7': 'How long does it take to receive offers?', 'faq.a7': 'Usually within a few hours. Specialists get notified about new tasks and can respond quickly.', 'faq.q8': 'Can I post a task in any city in Greece?', 'faq.a8': 'Yes! CanHelp covers all of Greece — Athens, Thessaloniki, Patras and more.', 'faq.q9': 'What types of tasks can I find on CanHelp?', 'faq.a9': 'Repairs, cleaning, electricians, tutoring, design, IT, moving, beauty and much more. Categories are constantly expanding.', 'faq.q10': 'Is there a mobile app?', 'faq.a10': 'Yes! CanHelp is available for Android and iOS. Download the app and manage everything from your phone.', 'how.step1.title': 'Post a task', 'how.step1.desc': 'Describe what you need and set your budget', 'how.step2.title': 'Receive offers', 'how.step2.desc': 'Specialists will send you offers with price and timeline', 'how.step3.title': 'Choose & start', 'how.step3.desc': 'Pick the best professional and start the collaboration', 'tasks.title': 'tasks', 'tasks.filters': 'Filters', 'tasks.search': 'Search', 'tasks.search.placeholder': 'Title or keyword...', 'tasks.search.btn': 'Search', 'tasks.publish': 'Post', 'tasks.category.all': 'All', 'tasks.category.all_in': 'All in', 'tasks.category.label': 'Category', 'tasks.location.label': 'City', 'tasks.location.placeholder': 'e.g. Athens', 'tasks.empty': 'No tasks found', 'tasks.empty.cta': 'Post the first one', 'task.status.open': 'Open', 'task.status.in_progress': 'In progress', 'task.status.completed': 'Completed', 'task.status.cancelled': 'Cancelled', 'task.status.draft': 'Draft', 'task.budget': 'Budget', 'task.location': 'Location', 'task.deadline': 'Start date', 'task.created_at': 'Created', 'task.customer': 'Customer', 'task.offer.btn': 'Submit offer', 'task.invite.banner_title': "You've been invited to this task", 'task.invite.banner_hint': 'The customer personally invited you', 'task.invite.accept': 'Send offer', 'task.invite.decline': 'Decline', 'offer.accept': 'Accept', 'offer.decline': 'Decline', 'task.complete': 'Complete task', 'task.complete.confirm': 'Mark this task as complete?', 'task.edit': 'Edit', 'task.status_label': 'Status', 'task.yours': 'Your task', 'task.offer.yours': 'Your offer', 'review.leave': 'Leave a review', 'review.rating': 'Rating', 'review.comment': 'Comment', 'review.comment.placeholder': 'Tell us about your experience...', 'review.submit': 'Submit review', 'review.submitting': 'Submitting...', 'review.done': 'Review submitted!', 'profile.reviews': 'Reviews', 'profile.no_reviews': 'No reviews yet', 'profile.rating': 'Rating', 'profile.skills.label': 'Skills', 'profile.member_since': 'Member since', 'task.offers': 'Offers', 'task.offers.none': 'No offers yet', 'create.title': 'Post a task', 'create.field.title': 'Title', 'create.field.description': 'Description', 'create.field.category': 'Category', 'create.field.category.select': 'Select...', 'create.field.location': 'Location', 'create.field.location.any': 'Anywhere', 'create.field.location.all': 'Entire city', 'create.field.budget': 'Budget (€)', 'create.field.deadline': 'Start date', 'create.field.budget_negotiable': 'Price is negotiable', 'create.field.time_slot': 'Time slot', 'create.field.time_slot.any': 'Anytime', 'create.field.time_slot.morning': 'Morning (08:00–13:00)', 'create.field.time_slot.afternoon': 'Afternoon (13:00–18:00)', 'create.field.time_slot.evening': 'Evening (18:00–22:00)', 'create.field.time_slot.weekend': 'Weekend', 'create.field.address': 'Address (optional)', 'create.field.address.district': 'District', 'create.field.address.street': 'Street', 'create.field.address.house': 'Number', 'create.field.confidential': 'Confidential note', 'create.field.confidential.placeholder': 'Details visible only to the assigned specialist...', 'create.field.confidential.hint': 'Not shown publicly', 'create.field.photos': 'Photos', 'create.field.photos.add': 'Add photo', 'create.field.photos.uploading': 'Uploading...', 'task.budget_negotiable': 'Price negotiable', 'task.time_slot': 'Time slot', 'task.confidential': 'Confidential note', 'create.field.title.placeholder': 'e.g. Clean 80sqm apartment', 'create.field.description.placeholder': 'Describe in detail what you need...', 'create.field.location.placeholder': 'e.g. Athens, Kolonaki', 'create.field.budget.placeholder': 'e.g. 100', 'create.submit': 'Post task', 'create.submitting': 'Posting...', 'login.title': 'Welcome back', 'login.subtitle': 'Sign in to CanHelp', 'login.email': 'Email', 'login.password': 'Password', 'login.submit': 'Sign in', 'login.submitting': 'Signing in...', 'login.error': 'Invalid email or password', 'login.unverified.title': 'Verify your email address', 'login.unverified.desc': 'We sent a verification link to your email. Check your inbox (or spam) and click the link.', 'login.unverified.resend': 'Resend verification email', 'login.unverified.sending': 'Sending...', 'login.unverified.sent': '✓ Sent — check your inbox', 'profile.email.verified': 'Email verified', 'profile.email.not_verified': 'Email not verified', 'login.no_account': "Don't have an account?", 'login.register_link': 'Register', 'login.forgot_password': 'Forgot password?', 'login.or_continue_with': 'or continue with', 'login.continue_google': 'Continue with Google', 'forgot.title': 'Forgot password', 'forgot.subtitle': 'Enter your email to receive a reset link', 'forgot.email': 'Email', 'forgot.submit': 'Send reset link', 'forgot.submitting': 'Sending...', 'forgot.sent.title': 'Check your inbox', 'forgot.sent.desc': 'If an account exists with that email, we\'ll send you a password reset link.', 'forgot.back_to_login': 'Back to sign in', 'forgot.error': 'Could not send reset link. Check the email address and try again.', 'forgot.error.not_found': 'No account found with this email address.', 'forgot.error.send_failed': 'Failed to send email. Please try again later.', 'reset.title': 'New password', 'reset.subtitle': 'Enter your new password', 'reset.password': 'New password', 'reset.confirm': 'Confirm password', 'reset.submit': 'Change password', 'reset.submitting': 'Saving...', 'reset.success': 'Password changed successfully. Redirecting to sign in...', 'reset.back_to_login': 'Back to sign in', 'reset.error.mismatch': 'Passwords do not match', 'reset.error.invalid': 'Invalid or expired link. Please request a new one.', 'register.title': 'Register', 'register.subtitle': 'Create a CanHelp account', 'register.first_name': 'First name', 'register.last_name': 'Last name', 'register.email': 'Email', 'register.password': 'Password (min 8 characters)', 'register.role': 'Role', 'register.role.customer': 'User', 'register.role.customer.desc': 'I post tasks', 'register.role.specialist': 'Specialist', 'register.role.specialist.desc': 'I take on tasks', 'register.submit': 'Create account', 'register.submitting': 'Registering...', 'register.has_account': 'Already have an account?', 'register.login_link': 'Sign in', 'register.continue_google': 'Continue with Google', 'register.check_email.title': 'Check your email', 'register.check_email.desc': 'We sent a verification link to your email address. Check your inbox (or spam) and click the link.', 'register.check_email.login': 'Back to sign in', 'dashboard.title': 'Dashboard', 'dashboard.new_task': '+ New task', 'dashboard.my_tasks': 'My tasks', 'dashboard.my_offers': 'My offers', 'dashboard.invitations': 'Job invitations', 'dashboard.offers_count': 'offers', 'dashboard.declined_count': 'declined', 'dashboard.completed_tasks': 'Completed tasks', 'dashboard.completed_offers': 'Completed offers', 'dashboard.review_pending': 'Review not yet submitted', 'tasks.new.top_specialists': 'Top specialists', 'tasks.new.select_category': 'Select a category to see matching specialists', 'tasks.new.invite': 'Offer work', 'tasks.new.invited': 'Selected ✓', 'reviews.count': 'reviews', 'filter.location': 'Location', 'filter.language': 'Languages', 'filter.language.any': 'Any language', 'filter.category.all': 'All categories', 'user.categories': 'Categories', 'user.work_area': 'Work area', 'dashboard.tasks.empty': "You haven't posted any tasks", 'dashboard.tasks.empty.cta': 'Post your first one', 'dashboard.tasks.add_new': 'Add a new task', 'dashboard.offers.empty': "You haven't submitted any offers", 'dashboard.offers.empty.cta': 'Find tasks', 'dashboard.customer.specialists_title': 'Looking for a specialist?', 'dashboard.customer.specialists_hint': 'Browse specialist profiles, read reviews and invite them to your tasks', 'dashboard.customer.specialists_cta': 'Find a specialist', 'dashboard.customer.how_title': 'How it works', 'dashboard.customer.step1': 'Create a task with a description and budget', 'dashboard.customer.step2': 'Specialists will send offers with price and timeline', 'dashboard.customer.step3': 'Choose the right one and start working', 'notif.title': 'Notifications', 'notif.mark_all': 'Mark all as read', 'notif.empty': 'No notifications', 'notif.type.new_offer': 'New offer', 'notif.type.offer_accepted': 'Your offer was accepted', 'notif.type.offer_declined': 'Your offer was declined', 'notif.type.task_completed': 'Task completed', 'notif.type.task_cancelled': 'Task cancelled', 'notif.type.new_message': 'New message', 'notif.type.new_review': 'New review', 'notif.type.task_invite': 'Job invitation', 'notif.body.new_offer': 'New offer for «{title}»', 'notif.body.offer_accepted': 'Your offer for «{title}» was accepted', 'notif.body.offer_declined': 'Your offer for «{title}» was declined', 'notif.body.task_invite': 'You\'ve been invited for «{title}»', 'notif.body.new_review': 'You received a {rating}★ review', 'offer.status.pending': 'Pending', 'offer.status.accepted': 'Accepted', 'offer.status.declined': 'Declined', 'offer.status.withdrawn': 'Withdrawn', 'offer.status.other_accepted': 'Another specialist was chosen', 'common.loading': 'Loading...', 'common.error': 'Error', 'common.save': 'Save', 'common.saving': 'Saving...', 'common.cancel': 'Cancel', 'common.add': 'Add', 'common.close': 'Close', 'common.edit': 'Edit', 'common.delete': 'Delete', 'common.from': 'by', 'common.currency': '€', 'common.greece': 'Greece', // Chat 'chat.connected': 'Connected', 'chat.disconnected': 'Disconnected', 'chat.no_rooms': 'No conversations yet', 'chat.task_fallback': 'Task', 'chat.select': 'Select a conversation', 'chat.no_messages': 'No messages yet', 'chat.placeholder': 'Write a message... (Enter to send)', 'chat.conversation_fallback': 'Conversation', 'chat.direct_chat': 'Direct chat', 'chat.linked_task': 'Linked task', 'chat.write_btn': 'Message', 'chat.just_now': 'just now', 'chat.min_ago': 'm', 'chat.write_specialist': 'Write to specialist', 'chat.write_customer': 'Write to customer', 'chat.notif_settings': 'Notification settings', 'chat.notif_messages': 'Notifications for new messages', 'chat.toast_title': 'New message', 'chat.toast_open': 'Open chat', // Offer form 'offer.price': 'Price', 'offer.price.placeholder': 'e.g. 80', 'offer.customer_budget': 'Client budget', 'offer.message': 'Message', 'offer.optional': 'optional', 'offer.message.placeholder': 'Introduce yourself, your experience and why you are the best choice...', 'offer.submitting': 'Sending...', // Profile 'profile.photo': 'Profile photo', 'profile.photo.change': 'Change photo', 'profile.photo.hint': 'JPEG, PNG, WebP · up to 5MB', 'profile.basic_info': 'Basic info', 'profile.phone': 'Phone', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Short bio', 'profile.bio.placeholder': 'Tell us a bit about yourself...', 'profile.language': 'Language', 'profile.language.hint': 'App interface and email notification language', 'profile.languages': 'Languages spoken', 'profile.languages.hint': 'Select all languages you speak', 'profile.skills': 'Skills', 'profile.skills.subtitle': 'Add the services you offer', 'profile.skills.placeholder': 'e.g. Cleaning, IT, Tutoring...', 'profile.role': 'Account role', 'profile.role.specialist': '🔧 Specialist', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 User', 'profile.role.change': 'To change your role please contact support.', 'profile.become_specialist': 'Become a Specialist', 'profile.become_specialist.desc': 'Upgrade to Specialist to take on tasks and build your profile.', 'become_specialist.hero.title': 'Earn money doing what you do best', 'become_specialist.hero.subtitle': 'Create a specialist profile and receive orders from clients across Greece', 'become_specialist.how.title': 'How it works', 'become_specialist.step1.title': 'Create a specialist portfolio', 'become_specialist.step1.desc': 'Set your categories, skills and coverage areas — the system will automatically match you with relevant tasks', 'become_specialist.step2.title': 'Find tasks', 'become_specialist.step2.desc': 'Discover tasks in your categories in the "Find Orders" section', 'become_specialist.step3.title': 'Send an offer & earn', 'become_specialist.step3.desc': 'Submit offers with price and timeline, chat with clients and complete tasks', 'become_specialist.benefits.title': 'Specialist profile advantages', 'become_specialist.benefit1': 'Task search filtered by your categories and location', 'become_specialist.benefit2': 'Public profile with client reviews', 'become_specialist.benefit3': 'Availability schedule visible to clients', 'become_specialist.benefit4': 'Saved to favourites by clients', 'become_specialist.cta': 'Become a Specialist — it\'s free', 'become_specialist.free_badge': 'Free registration', 'profile.tab.notifications': 'Notifications', 'profile.tab.reviews': 'Reviews', 'profile.tab.referral': 'Referrals', 'profile.tab.auto_response': 'Auto-response', 'profile.tab.site': 'Site', 'profile.site.title': 'Personal page', 'profile.site.url_label': 'Personal site', 'profile.site.copy': 'Copy', 'profile.site.copied': 'Copied', 'profile.site.visible_title': "What's on your page", 'profile.site.visible.name': 'Name and photo', 'profile.site.visible.bio': 'Bio', 'profile.site.visible.rating': 'Rating and reviews', 'profile.site.visible.portfolio': 'Portfolio / Cards', 'profile.site.visible.contacts': 'Contact info', 'profile.site.visible.full_last_name': 'Full last name', 'profile.site.visible.services': 'Service cards', 'profile.site.visible.reviews': 'Reviews section', 'profile.site.visible.status': '"Ready to help" status', 'profile.site.theme': 'Appearance theme', 'profile.site.theme.dark': 'Dark', 'profile.site.theme.light': 'Light', 'profile.site.slug_taken': 'This address is already taken', 'profile.site.stats.title': 'Site analytics', 'profile.site.stats.days': 'last 30 days', 'profile.site.stats.views': 'Views', 'profile.site.stats.unique': 'Unique visitors', 'profile.site.stats.messages': 'Messages', 'profile.site.stats.total_views': 'Total views', 'profile.site.stats.total_unique': 'Unique visitors', 'profile.site.stats.total_messages': 'Messages', 'profile.site.stats.empty': 'No data yet', 'profile.site.stats.loading': 'Loading analytics...', 'profile.site.stats.no_slug': 'Set your site URL to see analytics', 'profile.site.edit_bio_hint': 'Bio and photo are edited in the "Basic info" tab.', 'status.title': 'Status', 'status.can_help_now_hint': 'Your card is shown higher in search', 'status.need_help_hint': 'Specialists can offer you help', 'profile.referral.title': 'Referral program', 'profile.referral.desc': 'Share your link and earn rewards for every new user you invite.', 'profile.referral.link_label': 'Your referral link', 'profile.referral.copy': 'Copy', 'profile.referral.copied': 'Copied!', 'profile.referral.invited_count': 'successful referrals', 'profile.referral.no_code': 'Referral code is not available.', 'notifications.title': 'Notification settings', 'notifications.email.new_tasks': 'Email for new tasks', 'notifications.email.new_tasks.desc': 'Receive an email when a new task is posted in your categories', 'notifications.messages.desc': 'Receive a notification when a new message arrives', 'notifications.saved': 'Settings saved', 'notifications.plan_required': 'Not available in your plan', 'profile.tab.info': 'Basic info', 'profile.tab.finance': 'Finance', 'profile.tab.skills': 'Skills', 'profile.tab.categories': 'Categories', 'profile.tab.geography': 'Geography', 'profile.specialist.categories': 'Work categories', 'profile.specialist.categories.desc': 'Select the categories you work in', 'profile.specialist.geography': 'Coverage areas', 'profile.specialist.geography.desc': 'Select the cities / districts where you are active', 'profile.saving': 'Saving...', 'profile.upload.error': 'Error uploading photo', 'profile.saved': 'Saved', 'profile.tab.cards': 'Portfolio', 'profile.cards.count': 'Portfolio', 'profile.cards.add': 'Add portfolio', 'profile.cards.new_title': 'New portfolio title', 'profile.cards.placeholder': 'e.g. Plumbing', 'profile.cards.create': 'Create', 'profile.cards.cancel': 'Cancel', 'profile.cards.empty': 'No portfolio yet', 'profile.cards.create_first': 'Create your first portfolio', 'profile.cards.delete_confirm': 'Delete portfolio?', 'profile.card.tab.main': 'General', 'profile.card.tab.skills': 'Skills', 'profile.card.tab.categories': 'Categories', 'profile.card.tab.geography': 'Geography', 'profile.card.tab.portfolio': 'Portfolio', 'profile.card.active': 'Active', 'profile.card.save': 'Save', 'profile.card.saved': 'Saved', 'profile.card.delete': 'Delete', 'profile.card.skill.add': 'Add skill', 'profile.card.photo.add': 'Add photo', 'profile.card.photo.uploading': 'Uploading...', 'profile.card.photo.empty': 'No photos yet', 'profile.card.item.title': 'Title', 'profile.card.item.desc': 'Description', 'profile.card.item.save': 'Save', 'profile.card.item.cancel': 'Cancel', 'profile.card.item.edit': 'Edit', 'profile.upgrade.cards_limit': 'Portfolio limit reached', 'profile.upgrade.plan': 'Current plan:', 'profile.upgrade.contact': 'Contact the administrator to change your plan', 'profile.upgrade.ok': 'Got it', 'profile.plan.title': 'Subscription plan', 'profile.balance': 'Balance', 'profile.balance.topup': 'Top Up Balance', 'profile.balance.topup.title': 'Top Up Balance', 'profile.balance.topup.amount': 'Amount (EUR)', 'profile.balance.topup.hint': 'Choose a preset or enter a custom amount', 'profile.balance.topup.submit': 'Proceed to Payment', 'profile.balance.topup.loading': 'Redirecting...', 'profile.balance.topup.error': 'Payment initiation failed. Please try again.', 'payment.success.title': 'Payment Successful!', 'payment.success.desc': 'Your balance has been updated.', 'payment.cancelled.title': 'Payment Cancelled', 'payment.cancelled.desc': 'Payment was cancelled. No charges were made.', 'payment.pending.title': 'Processing...', 'payment.pending.desc': 'Your payment is being processed.', 'payment.back_to_profile': 'Back to Profile', 'profile.plan.basic': 'Basic (free)', 'profile.plan.contact_upgrade': 'Contact admin to upgrade your plan', 'profile.plan.cards_up_to': 'Portfolio: up to', 'profile.plan.cards_unlimited': 'Portfolio: unlimited', 'profile.plan.tasks_up_to': 'Tasks: up to', 'profile.plan.offers_up_to': 'Offers: up to', 'profile.plan.valid_until': 'Valid until', 'profile.plan.no_expiry': 'No expiry', // Create task 'create.error': 'Error posting task', // Tasks list extras 'tasks.category.general': 'General', 'tasks.budget.range': 'Range:', 'tasks.budget.from': 'from', 'tasks.budget.to': 'to', 'tasks.filter.reset': 'Reset filters', 'tasks.load_more': 'Load more', 'tasks.showing': 'Results:', 'tasks.field.budget': 'Budget, €', // Admin 'admin.title': 'Admin Panel', 'admin.tab.stats': 'Statistics', 'admin.tab.users': 'Users', 'admin.tab.tasks': 'Tasks', 'admin.tab.reports': 'Reports', 'admin.stats.users': 'Users', 'admin.stats.tasks': 'Tasks', 'admin.stats.offers': 'Offers', 'admin.stats.reviews': 'Reviews', 'admin.tasks.by_status': 'Tasks by status', 'admin.col.user': 'User', 'admin.col.email': 'Email', 'admin.col.role': 'Role', 'admin.col.registered': 'Registered', 'admin.col.status': 'Status', 'admin.col.title': 'Title', 'admin.col.budget': 'Budget', 'admin.col.created': 'Created', 'admin.users.active': 'Active', 'admin.users.inactive': 'Inactive', 'admin.users.deactivate': 'Deactivate', 'admin.users.activate': 'Activate', 'admin.tasks.cancel': 'Cancel', 'admin.reports.none': 'No reports', 'admin.reports.reviewed': 'Reviewed', 'admin.reports.dismiss': 'Dismiss', 'admin.pagination.total': 'Total', 'admin.users.role.change': 'Change role', 'admin.users.search.placeholder': 'Search name or email...', 'admin.tasks.delete': 'Delete', 'admin.tasks.delete.confirm': 'Permanently delete this task?', 'admin.tasks.search.placeholder': 'Search title...', 'admin.col.customer': 'Customer', 'admin.col.reporter': 'Reporter', 'admin.col.target': 'Target', 'admin.filter.all_roles': 'All roles', 'admin.filter.all_statuses': 'All statuses', 'admin.reports.target.task': 'Task', 'admin.reports.target.user': 'User', 'admin.tab.categories': 'Categories', 'admin.tab.locations': 'Cities & Districts', 'admin.tab.logs': 'Logs', 'admin.tab.plans': 'Plans', 'admin.tab.settings': 'Settings', 'admin.logs.subtab.ai': 'AI Logs', 'admin.logs.subtab.activity': 'Activity', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Notifications', 'admin.notif_logs.type': 'Type', 'admin.notif_logs.title': 'Title', 'admin.notif_logs.read': 'Read', 'admin.notif_logs.empty': 'No notification logs', 'admin.stats.notif_chart_title': 'Notifications per day', 'admin.stats.notif_label': 'Notifications', 'admin.stats.mail_chart_title': 'Emails per day', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'All', 'admin.stats.specialists': 'Specialists', 'admin.col.plan': 'Plan', 'admin.back_home': 'Home', 'admin.plans.title': 'Subscription plans', 'admin.plans.add': '+ New plan', 'admin.plans.empty': 'No plans created', 'admin.plans.form.new': 'New plan', 'admin.plans.form.edit': 'Edit plan', 'admin.plans.form.name': 'Name', 'admin.plans.form.price': 'Price (EUR)', 'admin.plans.form.old_price': 'Old price (EUR, optional)', 'admin.plans.form.max_offers': 'Max offers (empty = no limit)', 'admin.plans.form.max_cards': 'Max portfolio (empty = no limit)', 'admin.plans.form.duration_days': 'Duration (days, empty = no expiry)', 'admin.plans.form.description': 'Description', 'admin.plans.form.features': 'Features (one per line)', 'admin.plans.form.notify': 'Notify about new tasks', 'admin.plans.form.default': 'Default', 'admin.plans.form.active': 'Active', 'admin.plans.form.order': 'Order', 'admin.plans.form.role': 'Role', 'admin.plans.form.tier': 'Tier', 'admin.plans.form.role.customer': 'Customer', 'admin.plans.form.role.specialist': 'Specialist', 'admin.plans.form.tier.free': 'Free', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Limits (empty = unlimited)', 'admin.plans.form.max_messages_day': 'Max Messages/Day', 'admin.plans.form.max_orders_day': 'Max Orders/Day', 'admin.plans.form.max_skills': 'Max Skills', 'admin.plans.form.max_profiles': 'Max Profiles', 'admin.plans.form.max_portfolio': 'Max Portfolio Items', 'admin.plans.form.section.boost': 'Multipliers & Boost', 'admin.plans.form.search_boost': 'Search Boost', 'admin.plans.form.offers_multiplier': 'Offers Multiplier', 'admin.plans.form.section.contact': 'Contact Permissions', 'admin.plans.form.can_contact_free': 'Contact Free Plan users', 'admin.plans.form.can_contact_pro': 'Contact Pro Plan users', 'admin.plans.form.can_contact_all': 'Contact All users', 'admin.plans.form.can_show_contact': 'Show Contact Info', 'admin.plans.form.can_view_phone': 'View Phone', 'admin.plans.form.section.features': 'Feature Flags', 'admin.plans.form.upload_video': 'Upload Video', 'admin.plans.form.favorites': 'Favorites', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Verified Badge', 'admin.plans.form.highlighted_reviews': 'Highlighted Reviews', 'admin.plans.form.personal_site': 'Personal Site', 'admin.plans.form.can_help_now': 'Can Help Now Status', 'admin.plans.form.need_help': 'Need Help Status', 'admin.plans.form.auto_response': 'Auto Response', 'admin.plans.form.auto_match': 'Auto Match', 'admin.plans.form.instant_dispatch_free': 'Instant Dispatch (Free)', 'admin.plans.form.instant_dispatch_pro': 'Instant Dispatch (Pro)', 'admin.plans.badge.default': 'Default', 'admin.plans.badge.inactive': 'Inactive', 'admin.plans.make_default': 'Set as default', 'admin.plans.tasks': 'Tasks', 'admin.plans.offers': 'Offers', 'admin.plans.cards': 'Portfolio', 'admin.plans.notify_tasks': 'Task notifications', 'admin.plans.delete.confirm': 'Delete plan', 'admin.activity.title': 'Activity log', 'admin.activity.event': 'Event', 'admin.activity.all_events': 'All events', 'admin.activity.from': 'From', 'admin.activity.to': 'To', 'admin.activity.reset': 'Reset', 'admin.activity.total': 'Total', 'admin.activity.empty': 'No records', 'admin.mail.event': 'Email event', 'admin.mail.all_events': 'All email events', 'admin.mail.from': 'From', 'admin.mail.to': 'To', 'admin.mail.reset': 'Reset', 'admin.mail.total': 'Total', 'admin.mail.empty': 'No email logs', 'admin.mail.recipient': 'Recipient', 'admin.mail.provider': 'Provider', 'admin.mail.details': 'Details', 'admin.mail.status': 'Status', 'admin.mail.success': 'Success', 'admin.mail.failed': 'Failed', 'admin.event.email_sent': 'Email sent', 'admin.event.email_failed': 'Email failed', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Admin test email sent', 'admin.event.admin_email_test_failed': 'Admin test email failed', 'admin.logs.empty': 'No records', 'admin.logs.date': 'Date', 'admin.logs.provider': 'Provider', 'admin.logs.model': 'Model', 'admin.logs.action': 'Action', 'admin.logs.langs': 'Languages', 'admin.logs.in': 'In', 'admin.logs.out': 'Out', 'admin.logs.total': 'Total', 'admin.logs.ms': 'ms', 'admin.logs.status': 'Status', 'admin.stats.activity_30d': 'Activity over 30 days', 'admin.stats.tasks_label': 'Tasks', 'admin.stats.users_label': 'Users', 'admin.stats.specialists_label': 'Specialists', 'admin.stats.tokens_title': 'Token usage (by month)', 'admin.stats.tokens_out': 'Output', 'admin.stats.tokens_in': 'Input', 'admin.stats.tokens_out_label': 'Output tokens', 'admin.stats.tokens_in_label': 'Input tokens', 'admin.stats.cost_label': 'Cost (USD)', 'admin.stats.tasks_by_status': 'Tasks by status', 'admin.task_status.open': 'Open', 'admin.task_status.in_progress': 'In progress', 'admin.task_status.completed': 'Completed', 'admin.task_status.cancelled': 'Cancelled', 'admin.task_status.draft': 'Drafts', 'admin.settings.tab.general': 'General', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Notifications', 'admin.settings.tab.payment': 'Payment', 'admin.settings.tab.referral': 'Referrals', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO & Maintenance', 'admin.settings.seo.maintenance_label': 'Maintenance Mode', 'admin.settings.seo.maintenance_hint': 'Show a maintenance page to all visitors', 'admin.settings.seo.indexing_label': 'Search Engine Indexing', 'admin.settings.seo.indexing_hint': 'Allow search engines to index the site', 'admin.settings.seo.head_scripts_label': ' Scripts (JS)', 'admin.settings.seo.head_scripts_hint': 'Runs on every page (Google Tag Manager, analytics, etc.)', 'admin.settings.seo.site_title_label': 'Site Title', 'admin.settings.seo.site_description_label': 'Site Description (meta description)', 'admin.settings.referral.title': 'Referral program', 'admin.settings.referral.hint': 'Reward users who bring new registrations.', 'admin.settings.referral.enabled_label': 'Enabled', 'admin.settings.referral.enabled_hint': 'Enable / disable reward application', 'admin.settings.referral.customer_section': 'For customers', 'admin.settings.referral.specialist_section': 'For specialists', 'admin.settings.referral.plan_label': 'Reward plan', 'admin.settings.referral.no_plan': '— no plan —', 'admin.settings.referral.plan_hint': 'This plan will be assigned to the referrer. If their current plan is higher, only days will be added.', 'admin.settings.referral.days_label': 'Reward days', 'admin.settings.referral.days_hint': 'Number of days added to the plan expiry.', 'admin.settings.general.title': 'General settings', 'admin.settings.general.site_name': 'Site name', 'admin.settings.general.site_url': 'Site URL', 'admin.settings.general.contact_email': 'Contact email', 'admin.settings.general.support_phone': 'Support phone', 'admin.settings.smtp.title': 'SMTP settings', 'admin.settings.smtp.hint': 'Used to send email notifications.', 'admin.settings.smtp.host': 'SMTP Host', 'admin.settings.smtp.port': 'Port', 'admin.settings.smtp.encryption': 'Encryption', 'admin.settings.smtp.enc.none': 'None', 'admin.settings.smtp.enc.tls': 'STARTTLS (port 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (port 465)', 'admin.settings.smtp.username': 'Username', 'admin.settings.smtp.password': 'Password / App Password', 'admin.settings.smtp.from_name': 'Sender name', 'admin.settings.smtp.from_email': 'Sender email', 'admin.settings.smtp.test': 'Send test email', 'admin.settings.smtp.sending': 'Sending...', 'admin.settings.payment.hint': 'ePay Piraeus Bank credentials.', 'admin.settings.env.test': 'Test (sandbox)', 'admin.settings.env.prod': 'Production', 'admin.settings.env.label': 'Environment', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Active', 'admin.settings.saving': 'Saving...', 'admin.settings.saved': 'Saved', 'admin.notif.vars_hint': 'Available variables in templates', 'admin.notif.tmpl.not_set': 'Template not configured', 'admin.notif.tmpl.subject_label': 'Email subject', 'admin.notif.tmpl.body_label': 'Email body (HTML)', 'admin.notif.tmpl.save': 'Save', 'admin.notif.tmpl.close': 'Close', 'admin.notif.tmpl.translate': 'Auto-translate to other languages', 'admin.notif.tmpl.translating': 'Translating...', 'admin.notif.tmpl.saving': 'Saving...', 'admin.notif.email_verification': 'Email verification', 'admin.notif.registration_success': 'Successful registration', 'admin.notif.password_reset': 'Password reset', 'admin.notif.new_offer': 'New offer', 'admin.notif.new_task': 'New task', 'admin.notif.offer_accepted': 'Offer accepted', 'admin.notif.new_message': 'New message', 'admin.notif.offer_declined': 'Offer declined', 'admin.notif.offer_other_accepted': 'Another specialist chosen', 'admin.notif.task_updated': 'Task updated', 'admin.notif.deadline_reminder': 'Deadline reminder', 'admin.notif.task_archived': 'Task unpublished automatically', 'admin.notif.referral_reward': 'Referral reward', // Plan lifecycle email templates 'admin.email_template.plan_activated': 'Plan activated', 'admin.email_template.plan_upgraded': 'Plan upgraded', 'admin.email_template.plan_downgrade_scheduled': 'Downgrade scheduled', 'admin.email_template.plan_downgrade_applied': 'Downgrade applied', 'admin.email_template.plan_renewal_reminder': 'Renewal reminder', 'admin.email_template.plan_insufficient_funds': 'Insufficient funds warning', // Pricing confirm modal 'pricing.confirm.title': 'Confirm plan selection', 'pricing.confirm.plan': 'Plan', 'pricing.confirm.prorated': 'Prorated credit', 'pricing.confirm.effective_price': 'Amount due', 'pricing.confirm.your_balance': 'Your balance', 'pricing.confirm.downgrade_info': 'The switch to the new plan will happen automatically after the current period ends.', 'pricing.confirm.insufficient': 'Insufficient balance.', 'pricing.confirm.top_up': 'Top up', 'pricing.confirm.schedule_downgrade': 'Schedule downgrade', 'pricing.confirm.pay': 'Pay', 'admin.user_edit.title': 'Edit user', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Registered', 'admin.user_edit.last_seen': 'Last seen', 'admin.user_edit.lang': 'Language', 'admin.user_edit.first_name': 'First name', 'admin.user_edit.last_name': 'Last name', 'admin.user_edit.phone': 'Phone', 'admin.user_edit.bio': 'Bio', 'admin.user_edit.role': 'Role', 'admin.user_edit.plan': 'Plan', 'admin.user_edit.no_plan': '— No plan —', 'admin.user_edit.active': 'Active account', 'admin.user_edit.balance': 'Balance (EUR)', 'admin.user_edit.skills': 'Skills', 'admin.user_edit.tab.profile': 'Profile', 'admin.user_edit.tab.account': 'Account', 'admin.user_edit.tab.balance': 'Balance', 'admin.user_edit.tab.settings': 'Settings', 'admin.user_edit.tab.specialist': 'Portfolio', 'admin.user_edit.tab.site': 'Website', 'admin.user_edit.plan_expires': 'Plan expires', 'admin.user_edit.interface_lang': 'Interface language', 'admin.user_edit.comm_languages': 'Communication languages', 'admin.user_edit.personal_site_slug': 'Personal page', 'admin.user_edit.show_contact_info': 'Show contact info', 'admin.user_edit.show_contact_info.hint': 'Visible to customers', 'admin.user_edit.notify_new_tasks': 'Notify about new tasks', 'admin.user_edit.notify_new_tasks.hint': 'Push and email notifications', 'admin.user_edit.notif_messages': 'Message notifications', 'admin.user_edit.notif_messages.hint': 'New messages in chat', 'admin.user_edit.site_settings': 'Personal page settings', 'admin.user_edit.categories': 'Service categories', 'admin.user_edit.locations': 'Service areas', 'admin.user_edit.skill_placeholder': 'New skill...', 'admin.user_edit.add_category': '— Select category —', 'admin.user_edit.add_location': '— Select location —', 'admin.user_edit.specialist_cards': 'Portfolio', 'admin.user_edit.no_cards': 'No portfolio found', 'admin.user_edit.card_title': 'Portfolio title', 'admin.user_edit.card_description': 'Description', 'admin.balance.topup.btn': 'Top up', 'admin.balance.withdraw.btn': 'Withdraw', 'admin.balance.modal_hint': 'Changes take effect immediately and are recorded in history', 'admin.balance.topup.title': 'Top up balance', 'admin.balance.topup.amount': 'Amount', 'admin.balance.topup.description': 'Comment', 'admin.balance.topup.description.placeholder': 'For example: bonus or manual top-up', 'admin.balance.topup.submit': 'Top up balance', 'admin.balance.withdraw.title': 'Withdraw balance', 'admin.balance.withdraw.amount': 'Amount', 'admin.balance.withdraw.description': 'Comment', 'admin.balance.withdraw.description.placeholder': 'For example: refund or manual debit', 'admin.balance.withdraw.submit': 'Withdraw from balance', 'admin.user_edit.role.customer': 'Customer', 'admin.user_edit.role.specialist': 'Specialist', 'admin.user_edit.role.admin': 'Administrator', 'common.refresh': 'Refresh', 'common.back_home': 'Home', 'admin.loc.hint': 'Manage cities and districts', 'admin.loc.add_city': 'New city', 'admin.loc.add_district': 'Add district', 'admin.loc.new': 'New location', 'admin.loc.edit': 'Edit location', 'admin.loc.district': 'district', 'admin.loc.empty': 'No locations', 'admin.loc.delete.confirm': 'Delete location? All districts will also be deleted.', 'admin.cat.add_root': 'New category', 'admin.cat.add_sub': 'Subcategory', 'admin.cat.edit': 'Edit', 'admin.cat.delete': 'Delete', 'admin.cat.delete.confirm': 'Delete category? All subcategories will also be deleted.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Icon', 'admin.cat.name_el': 'Greek', 'admin.cat.name_en': 'English', 'admin.cat.name_ru': 'Russian', 'admin.cat.order': 'Order', 'admin.cat.active': 'Active', 'admin.cat.parent': 'Parent category', 'admin.cat.no_parent': 'Top level', 'admin.cat.save': 'Save', 'admin.cat.cancel': 'Cancel', 'admin.cat.empty': 'No categories', 'admin.cat.hint': 'Manage categories with multi-level hierarchy', 'admin.cat.new': 'New category', 'admin.cat.subcategory': 'subcategory', 'admin.cat.add_child': 'Add subcategory', 'admin.cat.inactive': 'Inactive', 'admin.event.user_login': 'Login', 'admin.event.user_register': 'Registration', 'admin.event.admin_user_deactivate': 'User blocked', 'admin.event.admin_user_activate': 'User activated', 'admin.event.admin_user_role_changed': 'Role changed', 'admin.event.admin_task_cancelled': 'Task cancelled', 'admin.event.admin_task_deleted': 'Task deleted', 'admin.event.admin_report_reviewed': 'Report reviewed', 'admin.event.admin_report_dismissed': 'Report dismissed', 'admin.event.task_created': 'Task created', // User status 'user.online': 'Online', 'user.seen_minutes': 'was here {n} min ago', 'user.seen_hours': 'was here {n} hr ago', 'user.seen_yesterday': 'was here yesterday', 'user.seen_days': 'was here {n} days ago', // Specialists 'specialists.title': 'Specialists', 'specialists.search': 'Search specialist...', 'specialists.search.btn': 'Search', 'specialists.empty': 'No specialists found', 'specialists.no_bio': 'No description', 'specialists.view': 'View profile', 'specialists.reviews': 'reviews', 'specialist.favorite': 'Add to favorites', 'specialist.unfavorite': 'Remove from favorites', 'specialist.site_link': 'Personal site', 'favorites.specialists.title': 'Favourite specialists', 'favorites.specialists.empty': 'No favourite specialists yet', 'nav.favorites': 'Favourites', 'nav.schedule': 'Schedule', 'nav.find_tasks': 'Find Orders', 'schedule.title': 'My Schedule', 'schedule.subtitle': 'Mark the days when you are free or busy — clients will see your availability', 'schedule.available': 'Available', 'schedule.busy': 'Busy', 'schedule.unset': 'Not set', 'schedule.click_hint': '← click to cycle status', 'schedule.range_mode': 'Select range', 'schedule.range_from': 'From {date} — select end date', 'schedule.click_to_set': 'Click to set', 'schedule.free': 'free', 'schedule.busy_count': 'busy', 'schedule.free_days': 'free days', 'schedule.googleCalendar': 'Google Calendar', 'schedule.connectGoogle': 'Connect Google Calendar', 'schedule.disconnectGoogle': 'Disconnect', 'schedule.connectedAs': 'Connected as', 'schedule.importFromGoogle': 'Sync from Google', 'schedule.gcalConnected': '\u2713 Google Calendar connected', 'schedule.gcalError': 'Google Calendar connection error', 'schedule.gcalImportDone': 'Imported {n} days from Google Calendar', 'schedule.gcalAutoSyncNote': 'Availability changes are automatically synced to Google Calendar', 'schedule.gcalConnectDesc': 'Connect Google Calendar to automatically sync your availability', 'schedule.gcalDisconnectConfirm': 'Disconnect Google Calendar?', 'find_tasks.title': 'Find Orders', 'find_tasks.for_me': 'For me', 'find_tasks.all': 'All orders', 'find_tasks.by_category': 'By category', 'find_tasks.list': 'List', 'find_tasks.already_offered': 'Offer sent', 'find_tasks.offer_now': 'Make an offer', 'find_tasks.empty_for_me': 'No tasks found in your categories', 'find_tasks.banner_hint': 'Find tasks matching your portfolio categories', 'find_tasks.no_cards': 'Create a specialist portfolio to see tasks matched to you', 'find_tasks.add_card': 'Create portfolio', 'find_tasks.search': 'Search tasks...', 'find_tasks.tasks_count': 'tasks', 'footer.tagline': 'The task platform for Greece', 'footer.rights': 'All rights reserved.', // App download section 'app.download_title': 'Download the CanHelp mobile app', 'app.download_desc': 'All of CanHelp — always at your fingertips. Available for Android and iOS.', // Nav 'nav.pricing': 'Pricing', // Pricing page 'pricing.title': 'Pricing', 'pricing.subtitle': 'Choose the right plan for you', 'pricing.role.customer': 'Customer', 'pricing.role.specialist': 'Specialist', 'pricing.free': 'Free', 'pricing.per_month': 'mo', 'pricing.duration': 'Duration', 'pricing.days': 'days', 'pricing.current_plan': 'Your plan', 'pricing.popular': 'Popular', 'pricing.choose': 'Choose', 'pricing.your_plan': 'Active plan', 'pricing.free_default': 'Default', 'pricing.compare': 'Compare features', 'pricing.feature': 'Feature', 'pricing.faq_note': 'Payment is deducted from your CanHelp balance. Top up available in Payments.', 'pricing.feat.messages': 'Messages / day', 'pricing.feat.orders': 'Orders / day', 'pricing.feat.contact_all': 'Contact everyone', 'pricing.feat.view_phone': 'View phone number', 'pricing.feat.show_contact': 'Show contact info', 'pricing.feat.favorites': 'Favorites', 'pricing.feat.verified_badge': 'Verified badge', 'pricing.feat.google_calendar': 'Google Calendar', 'pricing.feat.personal_site': 'Personal site', 'pricing.feat.auto_response': 'Auto-response', 'pricing.feat.auto_match': 'Auto-match', 'pricing.feat.highlighted_reviews': 'Highlighted reviews', 'pricing.feat.portfolio': 'Portfolio items', 'pricing.feat.cards': 'Specialist cards', 'pricing.feat.notify_tasks': 'New task notifications', 'pricing.feat.video': 'Video in portfolio', // Upgrade prompt 'upgrade.available_in': 'Available in', 'upgrade.cta': 'Upgrade', // Dashboard plan block 'dashboard.plan.title': 'My Plan', 'dashboard.plan.expires': 'Expires in {n} days', 'dashboard.plan.upgrade': 'Upgrade plan', 'dashboard.plan.no_plan': 'Free plan', 'dashboard.plan.messages': 'Messages today', 'dashboard.plan.orders': 'Orders today', 'dashboard.plan.limits': 'Daily limits', 'dashboard.plan.features': 'Features', 'dashboard.plan.stats': 'Stats', 'dashboard.stats.cards': 'Portfolios', 'dashboard.stats.maxCards': 'Max portfolios', 'dashboard.stats.portfolioItems': 'Portfolio items', 'dashboard.stats.maxPortfolioItems': 'Max items', 'dashboard.stats.activeOffers': 'Active offers', 'dashboard.stats.reviewsReceived': 'Reviews', 'dashboard.stats.activeTasks': 'Active tasks', 'dashboard.stats.completedTasks': 'Completed', 'status.need_help': 'I need help', 'status.active': 'Active', 'status.toggle_on': 'Enable', 'status.toggle_off': 'Disable', // FOMO 'fomo.missed_orders': 'Missed {n} orders', 'fomo.missed_value': 'Worth €{v}', 'fomo.upgrade_hint': 'Upgrade to receive more orders', 'fomo.conversion': 'Task conversion', 'fomo.active': 'Active', 'fomo.with_offers': 'With offers', 'fomo.completed': 'Completed', 'fomo.already_offered': '{n} specialists have already responded', 'fomo.specialist_missed': 'You missed {n} orders', 'fomo.top_categories': 'Categories', 'fomo.offers_received': 'offers received', 'fomo.avg_offers': 'Avg {n}/task', 'fomo.completion_rate': 'completed', // Task auto-match 'task.auto_match': 'Auto-match', 'task.auto_match_results': 'Top specialists', 'task.no_offer_yet': 'You haven\'t sent an offer yet', 'task.make_offer': 'Send offer', 'auto_response.title': 'Auto-Response', 'auto_response.enabled': 'Enable auto-response', 'auto_response.min_budget': 'Min budget', 'auto_response.max_budget': 'Max budget', 'auto_response.default_price': 'Default price', 'auto_response.default_message': 'Default message', 'auto_response.max_per_day': 'Max auto-offers per day', 'auto_response.save': 'Save', 'auto_response.saved': 'Saved', 'auto_response.categories': 'Categories', 'auto_response.locations': 'Locations', // Personal site 'profile.personal_site': 'Personal Site', 'profile.site_slug': 'URL slug', 'profile.site_slug_hint': 'Only latin letters, numbers, - and _', 'profile.site_open': 'Open site', 'profile.site_preview': 'Your site', 'profile.show_contact': 'Show contact info', 'profile.show_contact_hint': 'Customers with Pro/Ultimate plans will see your phone number', // Google Calendar plan gate 'gcal.upgrade_required': 'Google Calendar requires a Pro or Ultimate plan', // Chat limits 'chat.limit_warning': '{n} messages left today', 'chat.limit_reached': 'Message limit reached. Upgrade your plan', 'chat.upgrade': 'Upgrade', // Site page 'site.member_since': 'Member since', 'site.rating': 'Rating', 'site.completed_tasks': 'Completed', 'site.languages': 'Languages', 'site.photos': 'photos', 'site.contact_form': 'Get in touch', 'site.contact_sent': 'Message sent!', 'site.contact_sent_desc': 'The specialist will contact you soon', 'site.contact_name': 'Name', 'site.contact_name_ph': 'Your name', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Message', 'site.contact_message_ph': 'Describe your task...', 'site.contact_send': 'Send', 'site.share': 'Share', 'site.speaks_languages': 'Speaks', 'site.message_sent': 'Message sent!', 'site.message_sent_desc': 'The specialist will receive it in the chat', 'site.message_placeholder': 'Write your message...', 'site.write_to_chat': 'Write to chat', 'site.auth_required_title': 'Sign in required', 'site.auth_required_desc': 'To write in the chat, you need to sign in to your CanHelp account.', 'site.auth_login_btn': 'Sign in', 'site.auth_contact_form_btn': 'Contact via feedback form', 'specialist.services': 'Services', 'portfolio.title': 'Portfolio', 'status.can_help_now': 'Available now', 'common.not_found': 'Page not found', 'common.anonymous': 'Anonymous' }, ru: { 'footer.slogan': 'Ваша задача — наша забота! Решаем любые вопросы быстро и удобно.', 'footer.links': 'Ссылки', 'footer.socials': 'Мы в соцсетях', 'nav.home': 'Главная', 'nav.tasks': 'Задачи', 'nav.post': '+ Опубликовать', 'nav.dashboard': 'Панель управления', 'nav.chat': 'Сообщения', 'nav.notifications': 'Уведомления', 'nav.profile': 'Профиль', 'nav.admin': 'Админка', 'nav.specialists': 'Специалисты', 'nav.new_task': 'Новая задача', 'nav.login': 'Войти', 'nav.register': 'Регистрация', 'nav.logout': 'Выйти', 'hero.title': 'Найди специалиста для любой работы', 'hero.subtitle': 'Опубликуй задачу, получи предложения и выбери лучшего профессионала', 'hero.cta.post': 'Опубликовать задачу', 'hero.cta.browse': 'Найти работу', 'hero.search.placeholder': 'Что нужно? напр. электрик, уборка...', 'stats.specialists': 'специалистов', 'stats.tasks': 'задач', 'stats.categories': 'категорий', 'stats.free': 'бесплатная регистрация', 'section.categories': 'Создай задачу в любой категории', 'section.how': 'Как это работает', 'section.recent': 'Последние задачи', 'section.all': 'Смотреть все →', 'section.more': 'ещё', 'section.cities': 'Города и районы', 'section.community': 'Общественный проект для всех', 'community.subtitle': 'CanHelp — не просто маркетплейс, это сообщество взаимопомощи. Любой, у кого есть знания или навык, может найти клиента. Любой, у кого есть задача, может найти специалиста.', 'community.point1.title': 'Умеете что-то делать?', 'community.point1.desc': 'Ремонт, репетиторство, дизайн, переводы, уход — каждый навык имеет ценность. Создайте профиль и находите клиентов рядом с вами.', 'community.point2.title': 'Нужна помощь?', 'community.point2.desc': 'Опубликуйте задачу за минуту и получайте предложения от проверенных специалистов в вашем городе.', 'community.point3.title': 'Помогите проекту расти', 'community.point3.desc': 'CanHelp развивается благодаря сообществам. Поделитесь ссылкой с друзьями и знакомыми — вместе мы строим что-то полезное для всех.', 'community.share': 'Поделиться с друзьями', 'community.share.copied': 'Ссылка скопирована!', // Referral section on home page 'section.referral': 'Реферальная программа', 'referral.home.subtitle': 'Поделитесь ссылкой — каждый новый пользователь, зарегистрировавшийся по ней, принесёт вам награду.', 'referral.home.step1.title': 'Зарегистрируйтесь и получите ссылку', 'referral.home.step1.desc': 'Создайте аккаунт и найдите свою уникальную реферальную ссылку в профиле.', 'referral.home.step2.title': 'Поделитесь с друзьями', 'referral.home.step2.desc': 'Отправьте ссылку друзьям, знакомым или опубликуйте в социальных сетях.', 'referral.home.step3.title': 'Получайте награды', 'referral.home.step3.desc': 'Как только друг подтвердит email, вы автоматически получите свою награду.', 'referral.home.cta': 'Получить ссылку', 'referral.home.badge': 'Реферальная программа', // FAQ section 'section.faq': 'Частые вопросы', 'faq.q1': 'Как работает CanHelp?', 'faq.a1': 'Опубликуйте задачу, получите предложения от специалистов, выберите лучшего и начните сотрудничество. Это быстро, просто и бесплатно для клиентов.', 'faq.q2': 'Сколько стоит использование платформы?', 'faq.a2': 'Регистрация и публикация задач полностью бесплатны для клиентов. Специалисты имеют доступ к бесплатному плану, а также к премиум-опциям.', 'faq.q3': 'Как стать специалистом?', 'faq.a3': 'Зарегистрируйтесь, перейдите в «Стать специалистом», заполните профиль навыками и категориями и начните получать задачи.', 'faq.q4': 'Как выбрать подходящего специалиста?', 'faq.a4': 'Оцените отзывы, опыт, навыки и портфолио каждого специалиста. Общайтесь через чат платформы и уточняйте детали до принятия решения.', 'faq.q5': 'Что если я не доволен результатом?', 'faq.a5': 'Вы можете оставить отзыв о специалисте и поставить оценку от 1 до 5 звёзд. Отзывы помогают другим пользователям выбирать проверенных профессионалов.', 'faq.q6': 'Можно ли связаться со специалистом до принятия предложения?', 'faq.a6': 'Да. Как только вы получили предложение, можно открыть чат со специалистом, задать вопросы и уточнить все детали до принятия решения.', 'faq.q7': 'Сколько времени ждать предложений?', 'faq.a7': 'Как правило, в течение нескольких часов. Специалисты получают уведомление о новых задачах и могут быстро ответить.', 'faq.q8': 'Можно ли разместить задачу в любом городе Греции?', 'faq.a8': 'Да! CanHelp охватывает всю Грецию — Афины, Фессалоники, Патры и другие города.', 'faq.q9': 'Какие виды задач есть на CanHelp?', 'faq.a9': 'Ремонт, уборка, электрики, репетиторство, дизайн, IT, переезды, красота и многое другое. Категории постоянно расширяются.', 'faq.q10': 'Есть ли мобильное приложение?', 'faq.a10': 'Да! CanHelp доступно для Android и iOS. Скачайте приложение и управляйте всем со своего телефона.', 'how.step1.title': 'Опубликуй задачу', 'how.step1.desc': 'Опиши что нужно и установи бюджет', 'how.step2.title': 'Получи предложения', 'how.step2.desc': 'Специалисты пришлют предложения с ценой и сроками', 'how.step3.title': 'Выбери и начни', 'how.step3.desc': 'Выбери лучшего профессионала и начни сотрудничество', 'tasks.title': 'задач', 'tasks.filters': 'Фильтры', 'tasks.search': 'Поиск', 'tasks.search.placeholder': 'Название или ключевое слово...', 'tasks.search.btn': 'Поиск', 'tasks.publish': 'Опубликовать', 'tasks.category.all': 'Все', 'tasks.category.all_in': 'Все в', 'tasks.category.label': 'Категория', 'tasks.location.label': 'Город', 'tasks.location.placeholder': 'напр. Афины', 'tasks.empty': 'Задачи не найдены', 'tasks.empty.cta': 'Опубликуй первую', 'task.status.open': 'Открыта', 'task.status.in_progress': 'В работе', 'task.status.completed': 'Завершена', 'task.status.cancelled': 'Отменена', 'task.status.draft': 'Черновик', 'task.budget': 'Бюджет', 'task.location': 'Местоположение', 'task.deadline': 'Дата начала', 'task.created_at': 'Создано', 'task.customer': 'Заказчик', 'task.offer.btn': 'Отправить предложение', 'task.invite.banner_title': 'Вас пригласили на это задание', 'task.invite.banner_hint': 'Заказчик лично пригласил вас', 'task.invite.accept': 'Отправить предложение', 'task.invite.decline': 'Отказаться', 'offer.accept': 'Принять', 'offer.decline': 'Отклонить', 'task.complete': 'Завершить задачу', 'task.complete.confirm': 'Отметить задачу как выполненную?', 'task.edit': 'Редактировать', 'task.status_label': 'Статус', 'task.yours': 'Ваша задача', 'task.offer.yours': 'Ваше предложение', 'review.leave': 'Оставить отзыв', 'review.rating': 'Оценка', 'review.comment': 'Комментарий', 'review.comment.placeholder': 'Расскажите о своём опыте...', 'review.submit': 'Отправить отзыв', 'review.submitting': 'Отправка...', 'review.done': 'Отзыв отправлен!', 'profile.reviews': 'Отзывы', 'profile.no_reviews': 'Отзывов пока нет', 'profile.rating': 'Рейтинг', 'profile.skills.label': 'Навыки', 'profile.member_since': 'Участник с', 'task.offers': 'Предложения', 'task.offers.none': 'Предложений пока нет', 'create.title': 'Опубликовать задачу', 'create.field.title': 'Название', 'create.field.description': 'Описание', 'create.field.category': 'Категория', 'create.field.category.select': 'Выберите...', 'create.field.location': 'Местоположение', 'create.field.location.any': 'Где угодно', 'create.field.location.all': 'Весь город', 'create.field.budget': 'Бюджет (€)', 'create.field.deadline': 'Дата начала', 'create.field.budget_negotiable': 'Цена обсуждается', 'create.field.time_slot': 'Время выполнения', 'create.field.time_slot.any': 'В любое время', 'create.field.time_slot.morning': 'Утром (08:00–13:00)', 'create.field.time_slot.afternoon': 'Днём (13:00–18:00)', 'create.field.time_slot.evening': 'Вечером (18:00–22:00)', 'create.field.time_slot.weekend': 'Выходной', 'create.field.address': 'Адрес (необязательно)', 'create.field.address.district': 'Квартал', 'create.field.address.street': 'Улица', 'create.field.address.house': 'Дом', 'create.field.confidential': 'Конфиденциальная заметка', 'create.field.confidential.placeholder': 'Детали, видные только назначенному специалисту...', 'create.field.confidential.hint': 'Не отображается публично', 'create.field.photos': 'Фотографии', 'create.field.photos.add': 'Добавить фото', 'create.field.photos.uploading': 'Загрузка...', 'task.budget_negotiable': 'Цена обсуждается', 'task.time_slot': 'Время', 'task.confidential': 'Конфид. заметка', 'create.field.title.placeholder': 'напр. Уборка квартиры 80кв', 'create.field.description.placeholder': 'Подробно опишите что нужно...', 'create.field.location.placeholder': 'напр. Афины, Колонаки', 'create.field.budget.placeholder': 'напр. 100', 'create.submit': 'Опубликовать задачу', 'create.submitting': 'Публикация...', 'login.title': 'Добро пожаловать', 'login.subtitle': 'Вход в CanHelp', 'login.email': 'Email', 'login.password': 'Пароль', 'login.submit': 'Войти', 'login.submitting': 'Вход...', 'login.error': 'Неверный email или пароль', 'login.unverified.title': 'Подтвердите ваш email', 'login.unverified.desc': 'Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.', 'login.unverified.resend': 'Отправить письмо повторно', 'login.unverified.sending': 'Отправка...', 'login.unverified.sent': '✓ Отправлено — проверьте входящие', 'profile.email.verified': 'Email подтверждён', 'profile.email.not_verified': 'Email не подтверждён', 'login.no_account': 'Нет аккаунта?', 'login.register_link': 'Зарегистрироваться', 'login.forgot_password': 'Забыл пароль?', 'login.or_continue_with': 'или продолжите через', 'login.continue_google': 'Войти через Google', 'forgot.title': 'Забыл пароль', 'forgot.subtitle': 'Введите email для получения ссылки восстановления', 'forgot.email': 'Email', 'forgot.submit': 'Отправить ссылку', 'forgot.submitting': 'Отправка...', 'forgot.sent.title': 'Проверьте входящие', 'forgot.sent.desc': 'Если аккаунт с таким email существует, мы отправим ссылку для сброса пароля.', 'forgot.back_to_login': 'Вернуться ко входу', 'forgot.error': 'Не удалось отправить ссылку. Проверьте адрес и попробуйте снова.', 'forgot.error.not_found': 'Аккаунт с таким email не найден.', 'forgot.error.send_failed': 'Ошибка отправки письма. Попробуйте позже.', 'reset.title': 'Новый пароль', 'reset.subtitle': 'Введите новый пароль', 'reset.password': 'Новый пароль', 'reset.confirm': 'Подтвердите пароль', 'reset.submit': 'Изменить пароль', 'reset.submitting': 'Сохранение...', 'reset.success': 'Пароль успешно изменён. Перенаправление ко входу...', 'reset.back_to_login': 'Вернуться ко входу', 'reset.error.mismatch': 'Пароли не совпадают', 'reset.error.invalid': 'Недействительная или устаревшая ссылка. Запросите новую.', 'register.title': 'Регистрация', 'register.subtitle': 'Создать аккаунт в CanHelp', 'register.first_name': 'Имя', 'register.last_name': 'Фамилия', 'register.email': 'Email', 'register.password': 'Пароль (мин. 8 символов)', 'register.role': 'Роль', 'register.role.customer': 'Пользователь', 'register.role.customer.desc': 'Публикую задачи', 'register.role.specialist': 'Специалист', 'register.role.specialist.desc': 'Беру задачи', 'register.submit': 'Создать аккаунт', 'register.submitting': 'Регистрация...', 'register.has_account': 'Уже есть аккаунт?', 'register.login_link': 'Войти', 'register.continue_google': 'Зарегистрироваться через Google', 'register.check_email.title': 'Проверьте почту', 'register.check_email.desc': 'Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.', 'register.check_email.login': 'Вернуться к входу', 'dashboard.title': 'Панель управления', 'dashboard.new_task': '+ Новая задача', 'dashboard.my_tasks': 'Мои задачи', 'dashboard.my_offers': 'Мои предложения', 'dashboard.invitations': 'Приглашения на задания', 'dashboard.offers_count': 'предл.', 'dashboard.declined_count': 'откл.', 'dashboard.completed_tasks': 'Завершённые задачи', 'dashboard.completed_offers': 'Завершённые предложения', 'dashboard.review_pending': 'Оценка ещё не оставлена', 'tasks.new.top_specialists': 'Топ специалисты', 'tasks.new.select_category': 'Выберите категорию, чтобы увидеть специалистов', 'tasks.new.invite': 'Предложить работу', 'tasks.new.invited': 'Выбран ✓', 'reviews.count': 'отзывов', 'filter.location': 'Локация', 'filter.language': 'Языки', 'filter.language.any': 'Любой язык', 'filter.category.all': 'Все категории', 'user.categories': 'Категории', 'user.work_area': 'Район работы', 'dashboard.tasks.empty': 'Вы не публиковали задачи', 'dashboard.tasks.empty.cta': 'Опубликуйте первую', 'dashboard.tasks.add_new': 'Добавить новую задачу', 'dashboard.offers.empty': 'Вы не отправляли предложений', 'dashboard.offers.empty.cta': 'Найти задачи', 'dashboard.customer.specialists_title': 'Ищете исполнителя?', 'dashboard.customer.specialists_hint': 'Просматривайте профили специалистов, читайте отзывы и приглашайте их на свои задачи', 'dashboard.customer.specialists_cta': 'Найти исполнителя', 'dashboard.customer.how_title': 'Как это работает', 'dashboard.customer.step1': 'Создайте задачу с описанием и бюджетом', 'dashboard.customer.step2': 'Специалисты пришлют предложения с ценой и сроками', 'dashboard.customer.step3': 'Выберите подходящего и начните работу', 'notif.title': 'Уведомления', 'notif.mark_all': 'Отметить все как прочитанные', 'notif.empty': 'Нет уведомлений', 'notif.type.new_offer': 'Новое предложение', 'notif.type.offer_accepted': 'Ваше предложение принято', 'notif.type.offer_declined': 'Ваше предложение отклонено', 'notif.type.task_completed': 'Задание выполнено', 'notif.type.task_cancelled': 'Задание отменено', 'notif.type.new_message': 'Новое сообщение', 'notif.type.new_review': 'Новый отзыв', 'notif.type.task_invite': 'Приглашение на задание', 'notif.body.new_offer': 'Новое предложение на «{title}»', 'notif.body.offer_accepted': 'Ваше предложение на «{title}» принято', 'notif.body.offer_declined': 'Ваше предложение на «{title}» отклонено', 'notif.body.task_invite': 'Вас приглашают на «{title}»', 'notif.body.new_review': 'Вы получили оценку {rating}★', 'offer.status.pending': 'Ожидает', 'offer.status.accepted': 'Принято', 'offer.status.declined': 'Отклонено', 'offer.status.withdrawn': 'Отозвано', 'offer.status.other_accepted': 'Выбран другой исполнитель', 'common.loading': 'Загрузка...', 'common.error': 'Ошибка', 'common.save': 'Сохранить', 'common.saving': 'Сохранение...', 'common.cancel': 'Отмена', 'common.add': 'Добавить', 'common.close': 'Закрыть', 'common.edit': 'Редактировать', 'common.delete': 'Удалить', 'common.from': 'от', 'common.currency': '€', 'common.greece': 'Греция', // Chat 'chat.connected': 'Подключено', 'chat.disconnected': 'Отключено', 'chat.no_rooms': 'Переписок пока нет', 'chat.task_fallback': 'Задача', 'chat.select': 'Выберите переписку', 'chat.no_messages': 'Сообщений пока нет', 'chat.placeholder': 'Напишите сообщение... (Enter для отправки)', 'chat.conversation_fallback': 'Переписка', 'chat.direct_chat': 'Личный чат', 'chat.linked_task': 'Прикреплённый заказ', 'chat.write_btn': 'Написать', 'chat.just_now': 'только что', 'chat.min_ago': 'м', 'chat.write_specialist': 'Написать специалисту', 'chat.write_customer': 'Написать заказчику', 'chat.notif_settings': 'Настройки уведомлений', 'chat.notif_messages': 'Уведомления о новых сообщениях', 'chat.toast_title': 'Новое сообщение', 'chat.toast_open': 'Открыть чат', // Offer form 'offer.price': 'Цена', 'offer.price.placeholder': 'напр. 80', 'offer.customer_budget': 'Бюджет заказчика', 'offer.message': 'Сообщение', 'offer.optional': 'необязательно', 'offer.message.placeholder': 'Представьтесь, расскажите об опыте и почему вы лучший выбор...', 'offer.submitting': 'Отправка...', // Profile 'profile.photo': 'Фото профиля', 'profile.photo.change': 'Изменить фото', 'profile.photo.hint': 'JPEG, PNG, WebP · до 5MB', 'profile.basic_info': 'Основная информация', 'profile.phone': 'Телефон', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Краткое описание', 'profile.bio.placeholder': 'Расскажите немного о себе...', 'profile.language': 'Язык', 'profile.language.hint': 'Язык интерфейса и email-уведомлений', 'profile.languages': 'Языки общения', 'profile.languages.hint': 'Выберите все языки, на которых вы общаетесь', 'profile.skills': 'Навыки', 'profile.skills.subtitle': 'Добавьте услуги, которые вы предлагаете', 'profile.skills.placeholder': 'напр. Уборка, IT, Репетиторство...', 'profile.role': 'Роль аккаунта', 'profile.role.specialist': '🔧 Специалист', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 Пользователь', 'profile.role.change': 'Для смены роли обратитесь в службу поддержки.', 'profile.become_specialist': 'Стать специалистом', 'profile.become_specialist.desc': 'Перейдите в роль специалиста, чтобы брать задачи и наполнить профиль.', 'become_specialist.hero.title': 'Зарабатывай, делая то, что умеешь', 'become_specialist.hero.subtitle': 'Создай профиль специалиста и получай заказы от клиентов по всей Греции', 'become_specialist.how.title': 'Как это работает', 'become_specialist.step1.title': 'Создай портфолио специалиста', 'become_specialist.step1.desc': 'Укажи категории, навыки и зону покрытия — система автоматически подберёт подходящие заказы', 'become_specialist.step2.title': 'Ищи заказы', 'become_specialist.step2.desc': 'Просматривай задачи по своим категориям в разделе «Поиск заказов»', 'become_specialist.step3.title': 'Откликайся и зарабатывай', 'become_specialist.step3.desc': 'Отправляй предложения с ценой и сроками, общайся с клиентами и выполняй заказы', 'become_specialist.benefits.title': 'Преимущества профиля специалиста', 'become_specialist.benefit1': 'Поиск заказов по вашим категориям и локации', 'become_specialist.benefit2': 'Публичный профиль с отзывами клиентов', 'become_specialist.benefit3': 'Расписание доступности, видимое клиентам', 'become_specialist.benefit4': 'Добавление в избранное клиентами', 'become_specialist.cta': 'Стать специалистом — это бесплатно', 'become_specialist.free_badge': 'Бесплатная регистрация', 'profile.tab.notifications': 'Уведомления', 'profile.tab.reviews': 'Отзывы', 'profile.tab.referral': 'Рефералы', 'profile.tab.auto_response': 'Авто-ответ', 'profile.tab.site': 'Сайт', 'profile.site.title': 'Персональная страница', 'profile.site.url_label': 'Личный сайт', 'profile.site.copy': 'Копировать', 'profile.site.copied': 'Скопировано', 'profile.site.visible_title': 'Что отображается на вашей странице', 'profile.site.visible.name': 'Имя и фото', 'profile.site.visible.bio': 'Биография', 'profile.site.visible.rating': 'Рейтинг и отзывы', 'profile.site.visible.portfolio': 'Портфолио / Карточки', 'profile.site.visible.contacts': 'Контактные данные', 'profile.site.visible.full_last_name': 'Фамилия полностью', 'profile.site.visible.services': 'Карточки услуг', 'profile.site.visible.reviews': 'Раздел с отзывами', 'profile.site.visible.status': 'Статус «Готов помочь»', 'profile.site.theme': 'Тема оформления', 'profile.site.theme.dark': 'Тёмная', 'profile.site.theme.light': 'Светлая', 'profile.site.slug_taken': 'Этот адрес уже занят', 'profile.site.stats.title': 'Аналитика сайта', 'profile.site.stats.days': 'последние 30 дней', 'profile.site.stats.views': 'Просмотры', 'profile.site.stats.unique': 'Уникальные посетители', 'profile.site.stats.messages': 'Сообщения', 'profile.site.stats.total_views': 'Просмотры', 'profile.site.stats.total_unique': 'Уник. посетители', 'profile.site.stats.total_messages': 'Сообщения', 'profile.site.stats.empty': 'Данных пока нет', 'profile.site.stats.loading': 'Загрузка аналитики...', 'profile.site.stats.no_slug': 'Укажите адрес сайта, чтобы видеть статистику', 'profile.site.edit_bio_hint': 'Биография и фото настраиваются во вкладке «Основное».', 'status.title': 'Статус', 'status.can_help_now_hint': 'Ваша карточка показывается выше в поиске', 'status.need_help_hint': 'Специалисты могут предложить вам помощь', 'profile.referral.title': 'Партнёрская программа', 'profile.referral.desc': 'Поделитесь ссылкой и получайте награду за каждого привлечённого пользователя.', 'profile.referral.link_label': 'Ваша реферальная ссылка', 'profile.referral.copy': 'Копировать', 'profile.referral.copied': 'Скопировано!', 'profile.referral.invited_count': 'успешных приглашений', 'profile.referral.no_code': 'Реферальный код недоступен.', 'notifications.title': 'Настройки уведомлений', 'notifications.email.new_tasks': 'Email о новых заказах', 'notifications.email.new_tasks.desc': 'Получать email, когда в ваших категориях публикуется новый заказ', 'notifications.messages.desc': 'Получать уведомление при новом входящем сообщении', 'notifications.saved': 'Настройки сохранены', 'notifications.plan_required': 'Недоступно в вашем тарифе', 'profile.tab.info': 'Основное', 'profile.tab.finance': 'Финансы', 'profile.tab.skills': 'Навыки', 'profile.tab.categories': 'Категории', 'profile.tab.geography': 'География', 'profile.specialist.categories': 'Категории работ', 'profile.specialist.categories.desc': 'Выберите категории, в которых вы работаете', 'profile.specialist.geography': 'Города покрытия', 'profile.specialist.geography.desc': 'Выберите города / районы, где вы работаете', 'profile.saving': 'Сохранение...', 'profile.upload.error': 'Ошибка загрузки фото', 'profile.saved': 'Сохранено', 'profile.tab.cards': 'Портфолио', 'profile.cards.count': 'Портфолио', 'profile.cards.add': 'Добавить портфолио', 'profile.cards.new_title': 'Название нового портфолио', 'profile.cards.placeholder': 'Например: Сантехника', 'profile.cards.create': 'Создать', 'profile.cards.cancel': 'Отмена', 'profile.cards.empty': 'У вас нет портфолио', 'profile.cards.create_first': 'Создать первое портфолио', 'profile.cards.delete_confirm': 'Удалить портфолио?', 'profile.card.tab.main': 'Основное', 'profile.card.tab.skills': 'Навыки', 'profile.card.tab.categories': 'Категории', 'profile.card.tab.geography': 'География', 'profile.card.tab.portfolio': 'Галерея', 'profile.card.active': 'Активна', 'profile.card.save': 'Сохранить', 'profile.card.saved': 'Сохранено', 'profile.card.delete': 'Удалить', 'profile.card.skill.add': 'Добавить навык', 'profile.card.photo.add': 'Добавить фото', 'profile.card.photo.uploading': 'Загрузка...', 'profile.card.photo.empty': 'Нет фотографий', 'profile.card.item.title': 'Заголовок', 'profile.card.item.desc': 'Описание', 'profile.card.item.save': 'Сохранить', 'profile.card.item.cancel': 'Отмена', 'profile.card.item.edit': 'Описание работы', 'profile.upgrade.cards_limit': 'Лимит портфолио исчерпан', 'profile.upgrade.plan': 'Текущий тариф:', 'profile.upgrade.contact': 'Обратитесь к администратору для смены тарифа', 'profile.upgrade.ok': 'Понятно', 'profile.plan.title': 'Тарифный план', 'profile.balance': 'Баланс', 'profile.balance.topup': 'Пополнить баланс', 'profile.balance.topup.title': 'Пополнить баланс', 'profile.balance.topup.amount': 'Сумма (в EUR)', 'profile.balance.topup.hint': 'Выберите сумму или введите вручную', 'profile.balance.topup.submit': 'Перейти к оплате', 'profile.balance.topup.loading': 'Перенаправление...', 'profile.balance.topup.error': 'Ошибка инициализации платежа. Попробуйте снова.', 'payment.success.title': 'Оплата прошла успешно!', 'payment.success.desc': 'Ваш баланс обновлён.', 'payment.cancelled.title': 'Оплата отменена', 'payment.cancelled.desc': 'Оплата была отменена. Средства не списаны.', 'payment.pending.title': 'Обрабатывается...', 'payment.pending.desc': 'Ваш платёж в обработке.', 'payment.back_to_profile': 'Вернуться в профиль', 'profile.plan.basic': 'Базовый (бесплатный)', 'profile.plan.contact_upgrade': 'Обратитесь к администратору для подключения тарифа', 'profile.plan.cards_up_to': 'Портфолио: до', 'profile.plan.cards_unlimited': 'Портфолио: безлимитно', 'profile.plan.tasks_up_to': 'Задач: до', 'profile.plan.offers_up_to': 'Откликов: до', 'profile.plan.valid_until': 'Действителен до', 'profile.plan.no_expiry': 'Бессрочно', // Create task 'create.error': 'Ошибка при публикации', // Tasks list extras 'tasks.category.general': 'Общее', 'tasks.budget.range': 'Диапазон:', 'tasks.budget.from': 'от', 'tasks.budget.to': 'до', 'tasks.filter.reset': 'Сбросить фильтры', 'tasks.load_more': 'Загрузить ещё', 'tasks.showing': 'Результатов:', 'tasks.field.budget': 'Бюджет, €', // Admin 'admin.title': 'Панель администратора', 'admin.tab.stats': 'Статистика', 'admin.tab.users': 'Пользователи', 'admin.tab.tasks': 'Задачи', 'admin.tab.reports': 'Жалобы', 'admin.stats.users': 'Пользователи', 'admin.stats.tasks': 'Задачи', 'admin.stats.offers': 'Предложения', 'admin.stats.reviews': 'Отзывы', 'admin.tasks.by_status': 'Задачи по статусу', 'admin.col.user': 'Пользователь', 'admin.col.email': 'Email', 'admin.col.role': 'Роль', 'admin.col.registered': 'Регистрация', 'admin.col.status': 'Статус', 'admin.col.title': 'Название', 'admin.col.budget': 'Бюджет', 'admin.col.created': 'Создано', 'admin.users.active': 'Активен', 'admin.users.inactive': 'Неактивен', 'admin.users.deactivate': 'Деактивировать', 'admin.users.activate': 'Активировать', 'admin.tasks.cancel': 'Отменить', 'admin.reports.none': 'Жалоб нет', 'admin.reports.reviewed': 'Рассмотрено', 'admin.reports.dismiss': 'Отклонить', 'admin.pagination.total': 'Всего', 'admin.users.role.change': 'Изменить роль', 'admin.users.search.placeholder': 'Поиск по имени или email...', 'admin.tasks.delete': 'Удалить', 'admin.tasks.delete.confirm': 'Удалить эту задачу навсегда?', 'admin.tasks.search.placeholder': 'Поиск по названию...', 'admin.col.customer': 'Заказчик', 'admin.col.reporter': 'Жалобщик', 'admin.col.target': 'Цель', 'admin.filter.all_roles': 'Все роли', 'admin.filter.all_statuses': 'Все статусы', 'admin.reports.target.task': 'Задача', 'admin.reports.target.user': 'Пользователь', 'admin.tab.categories': 'Категории', 'admin.tab.locations': 'Города и районы', 'admin.tab.logs': 'Логи', 'admin.tab.plans': 'Тарифы', 'admin.tab.settings': 'Настройки', 'admin.logs.subtab.ai': 'AI логи', 'admin.logs.subtab.activity': 'Активность', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Уведомления', 'admin.notif_logs.type': 'Тип', 'admin.notif_logs.title': 'Заголовок', 'admin.notif_logs.read': 'Прочитано', 'admin.notif_logs.empty': 'Логи уведомлений пусты', 'admin.stats.notif_chart_title': 'Уведомления по дням', 'admin.stats.notif_label': 'Уведомления', 'admin.stats.mail_chart_title': 'Email по дням', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'Все', 'admin.stats.specialists': 'Исполнители', 'admin.col.plan': 'Тариф', 'admin.back_home': 'На главную', 'admin.plans.title': 'Тарифные пакеты', 'admin.plans.add': '+ Добавить тариф', 'admin.plans.empty': 'Тарифы не созданы', 'admin.plans.form.new': 'Новый тариф', 'admin.plans.form.edit': 'Редактировать тариф', 'admin.plans.form.name': 'Название', 'admin.plans.form.price': 'Цена (EUR)', 'admin.plans.form.old_price': 'Старая цена (EUR, необязательно)', 'admin.plans.form.max_offers': 'Макс. откликов (пусто = без лимита)', 'admin.plans.form.max_cards': 'Макс. портфолио (пусто = без лимита)', 'admin.plans.form.duration_days': 'Срок (дней, пусто = без истечения)', 'admin.plans.form.description': 'Описание', 'admin.plans.form.features': 'Возможности (по одной на строку)', 'admin.plans.form.notify': 'Уведомления о новых заказах', 'admin.plans.form.default': 'По умолчанию', 'admin.plans.form.active': 'Активен', 'admin.plans.form.order': 'Порядок', 'admin.plans.form.role': 'Роль', 'admin.plans.form.tier': 'Уровень', 'admin.plans.form.role.customer': 'Заказчик', 'admin.plans.form.role.specialist': 'Специалист', 'admin.plans.form.tier.free': 'Бесплатный', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Лимиты (пусто = без ограничений)', 'admin.plans.form.max_messages_day': 'Макс. сообщений/день', 'admin.plans.form.max_orders_day': 'Макс. заказов/день', 'admin.plans.form.max_skills': 'Макс. навыков', 'admin.plans.form.max_profiles': 'Макс. профилей', 'admin.plans.form.max_portfolio': 'Макс. элементов портфолио', 'admin.plans.form.section.boost': 'Множители & Буст', 'admin.plans.form.search_boost': 'Буст в поиске', 'admin.plans.form.offers_multiplier': 'Множитель откликов', 'admin.plans.form.section.contact': 'Права контактов', 'admin.plans.form.can_contact_free': 'Контакт с бесплатными пользователями', 'admin.plans.form.can_contact_pro': 'Контакт с Pro пользователями', 'admin.plans.form.can_contact_all': 'Контакт со всеми', 'admin.plans.form.can_show_contact': 'Показывать контакты', 'admin.plans.form.can_view_phone': 'Просмотр телефона', 'admin.plans.form.section.features': 'Возможности', 'admin.plans.form.upload_video': 'Загрузка видео', 'admin.plans.form.favorites': 'Избранное', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Знак верификации', 'admin.plans.form.highlighted_reviews': 'Выделенные отзывы', 'admin.plans.form.personal_site': 'Личный сайт', 'admin.plans.form.can_help_now': 'Статус «Могу помочь»', 'admin.plans.form.need_help': 'Статус «Нужна помощь»', 'admin.plans.form.auto_response': 'Автоответ', 'admin.plans.form.auto_match': 'Автоподбор', 'admin.plans.form.instant_dispatch_free': 'Мгновенная рассылка (бесплатно)', 'admin.plans.form.instant_dispatch_pro': 'Мгновенная рассылка (Pro)', 'admin.plans.badge.default': 'По умолчанию', 'admin.plans.badge.inactive': 'Неактивен', 'admin.plans.make_default': 'Сделать по умолчанию', 'admin.plans.tasks': 'Задач', 'admin.plans.offers': 'Откликов', 'admin.plans.cards': 'Портфолио', 'admin.plans.notify_tasks': 'Уведомления о заказах', 'admin.plans.delete.confirm': 'Удалить тариф', 'admin.activity.title': 'Журнал активности', 'admin.activity.event': 'Событие', 'admin.activity.all_events': 'Все события', 'admin.activity.from': 'От', 'admin.activity.to': 'До', 'admin.activity.reset': 'Сбросить', 'admin.activity.total': 'Всего', 'admin.activity.empty': 'Нет записей', 'admin.mail.event': 'Email событие', 'admin.mail.all_events': 'Все email события', 'admin.mail.from': 'От', 'admin.mail.to': 'До', 'admin.mail.reset': 'Сбросить', 'admin.mail.total': 'Всего', 'admin.mail.empty': 'Нет email логов', 'admin.mail.recipient': 'Получатель', 'admin.mail.provider': 'Провайдер', 'admin.mail.details': 'Детали', 'admin.mail.status': 'Статус', 'admin.mail.success': 'Успешно', 'admin.mail.failed': 'Ошибка', 'admin.event.email_sent': 'Email отправлен', 'admin.event.email_failed': 'Email не отправлен', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Тестовый email отправлен', 'admin.event.admin_email_test_failed': 'Тестовый email не отправлен', 'admin.logs.empty': 'Нет записей', 'admin.logs.date': 'Дата', 'admin.logs.provider': 'Провайдер', 'admin.logs.model': 'Модель', 'admin.logs.action': 'Действие', 'admin.logs.langs': 'Языки', 'admin.logs.in': 'Вход', 'admin.logs.out': 'Выход', 'admin.logs.total': 'Итого', 'admin.logs.ms': 'мс', 'admin.logs.status': 'Статус', 'admin.stats.activity_30d': 'Активность за 30 дней', 'admin.stats.tasks_label': 'Заявки', 'admin.stats.users_label': 'Пользователи', 'admin.stats.specialists_label': 'Исполнители', 'admin.stats.tokens_title': 'Расход токенов (по месяцам)', 'admin.stats.tokens_out': 'Исходящие', 'admin.stats.tokens_in': 'Входящие', 'admin.stats.tokens_out_label': 'Исходящие токены', 'admin.stats.tokens_in_label': 'Входящие токены', 'admin.stats.cost_label': 'Стоимость (USD)', 'admin.stats.tasks_by_status': 'Заявки по статусам', 'admin.task_status.open': 'Открытые', 'admin.task_status.in_progress': 'В работе', 'admin.task_status.completed': 'Завершённые', 'admin.task_status.cancelled': 'Отменённые', 'admin.task_status.draft': 'Черновики', 'admin.settings.tab.general': 'Общие', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Уведомления', 'admin.settings.tab.payment': 'Оплата', 'admin.settings.tab.referral': 'Реферальная', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO и обслуживание', 'admin.settings.seo.maintenance_label': 'Режим обслуживания', 'admin.settings.seo.maintenance_hint': 'Показывать страницу обслуживания всем посетителям', 'admin.settings.seo.indexing_label': 'Индексация поисковыми системами', 'admin.settings.seo.indexing_hint': 'Разрешить поисковым системам индексировать сайт', 'admin.settings.seo.head_scripts_label': 'Скрипты в (JS)', 'admin.settings.seo.head_scripts_hint': 'Выполняется на каждой странице (Google Tag Manager, аналитика и т.д.)', 'admin.settings.seo.site_title_label': 'Заголовок сайта', 'admin.settings.seo.site_description_label': 'Описание сайта (meta description)', 'admin.settings.referral.title': 'Партнёрская программа', 'admin.settings.referral.hint': 'Награждайте пользователей, приводящих новых участников.', 'admin.settings.referral.enabled_label': 'Включено', 'admin.settings.referral.enabled_hint': 'Включить / отключить выдачу наград', 'admin.settings.referral.customer_section': 'Для клиентов', 'admin.settings.referral.specialist_section': 'Для специалистов', 'admin.settings.referral.plan_label': 'Тарифный план за реферала', 'admin.settings.referral.no_plan': '— без плана —', 'admin.settings.referral.plan_hint': 'Этот план будет назначен пригласившему. Если его текущий план выше — добавятся только дни.', 'admin.settings.referral.days_label': 'Дней награды', 'admin.settings.referral.days_hint': 'Количество дней, добавляемых к сроку действия плана.', 'admin.settings.general.title': 'Общие настройки', 'admin.settings.general.site_name': 'Название сайта', 'admin.settings.general.site_url': 'URL сайта', 'admin.settings.general.contact_email': 'Email для связи', 'admin.settings.general.support_phone': 'Телефон поддержки', 'admin.settings.smtp.title': 'Настройки SMTP сервера', 'admin.settings.smtp.hint': 'Используется для отправки email-уведомлений.', 'admin.settings.smtp.host': 'SMTP Хост', 'admin.settings.smtp.port': 'Порт', 'admin.settings.smtp.encryption': 'Шифрование', 'admin.settings.smtp.enc.none': 'Нет', 'admin.settings.smtp.enc.tls': 'STARTTLS (порт 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (порт 465)', 'admin.settings.smtp.username': 'Имя пользователя', 'admin.settings.smtp.password': 'Пароль / App Password', 'admin.settings.smtp.from_name': 'Имя отправителя', 'admin.settings.smtp.from_email': 'Email отправителя', 'admin.settings.smtp.test': 'Отправить тестовый email', 'admin.settings.smtp.sending': 'Отправка...', 'admin.settings.payment.hint': 'Данные для подключения к ePay Piraeus Bank.', 'admin.settings.env.test': 'Тест (sandbox)', 'admin.settings.env.prod': 'Боевой режим', 'admin.settings.env.label': 'Среда', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Активен', 'admin.settings.saving': 'Сохранение...', 'admin.settings.saved': 'Сохранено', 'admin.notif.vars_hint': 'Доступные переменные в шаблонах', 'admin.notif.tmpl.not_set': 'Шаблон не настроен', 'admin.notif.tmpl.subject_label': 'Тема письма', 'admin.notif.tmpl.body_label': 'Текст письма (HTML)', 'admin.notif.tmpl.save': 'Сохранить', 'admin.notif.tmpl.close': 'Закрыть', 'admin.notif.tmpl.translate': 'Авто-перевод на другие языки', 'admin.notif.tmpl.translating': 'Перевод...', 'admin.notif.tmpl.saving': 'Сохранение...', 'admin.notif.email_verification': 'Подтверждение email адреса', 'admin.notif.registration_success': 'Успешная регистрация', 'admin.notif.password_reset': 'Восстановление пароля', 'admin.notif.new_offer': 'Новое предложение', 'admin.notif.new_task': 'Новая задача', 'admin.notif.offer_accepted': 'Предложение принято', 'admin.notif.new_message': 'Новое сообщение', 'admin.notif.offer_declined': 'Отклонение предложения', 'admin.notif.offer_other_accepted': 'Выбран другой исполнитель', 'admin.notif.task_updated': 'Изменение задания', 'admin.notif.deadline_reminder': 'Напоминание о дедлайне', 'admin.notif.task_archived': 'Автоснятие задания', 'admin.notif.referral_reward': 'Реферальная награда', // Шаблоны email для тарифов 'admin.email_template.plan_activated': 'Тарифы — активация тарифа', 'admin.email_template.plan_upgraded': 'Тарифы — повышение тарифа', 'admin.email_template.plan_downgrade_scheduled': 'Тарифы — запланированное понижение', 'admin.email_template.plan_downgrade_applied': 'Тарифы — применение понижения', 'admin.email_template.plan_renewal_reminder': 'Тарифы — напоминание о продлении', 'admin.email_template.plan_insufficient_funds': 'Тарифы — нехватка средств', // Модальное окно подтверждения тарифа 'pricing.confirm.title': 'Подтвердите выбор тарифа', 'pricing.confirm.plan': 'Тариф', 'pricing.confirm.prorated': 'Зачёт остатка', 'pricing.confirm.effective_price': 'К оплате', 'pricing.confirm.your_balance': 'Ваш баланс', 'pricing.confirm.downgrade_info': 'Переход на новый тариф произойдёт автоматически после окончания текущего периода.', 'pricing.confirm.insufficient': 'Недостаточно средств на балансе.', 'pricing.confirm.top_up': 'Пополнить', 'pricing.confirm.schedule_downgrade': 'Запланировать переход', 'pricing.confirm.pay': 'Оплатить', 'admin.user_edit.title': 'Редактирование пользователя', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Регистрация', 'admin.user_edit.last_seen': 'Последний визит', 'admin.user_edit.lang': 'Язык', 'admin.user_edit.first_name': 'Имя', 'admin.user_edit.last_name': 'Фамилия', 'admin.user_edit.phone': 'Телефон', 'admin.user_edit.bio': 'О себе', 'admin.user_edit.role': 'Роль', 'admin.user_edit.plan': 'Тариф', 'admin.user_edit.no_plan': '— Без тарифа —', 'admin.user_edit.active': 'Активный аккаунт', 'admin.user_edit.balance': 'Баланс (EUR)', 'admin.user_edit.skills': 'Навыки', 'admin.user_edit.tab.profile': 'Профиль', 'admin.user_edit.tab.account': 'Аккаунт', 'admin.user_edit.tab.balance': 'Баланс', 'admin.user_edit.tab.settings': 'Настройки', 'admin.user_edit.tab.specialist': 'Портфолио', 'admin.user_edit.tab.site': 'Сайт', 'admin.user_edit.plan_expires': 'Тариф истекает', 'admin.user_edit.interface_lang': 'Язык интерфейса', 'admin.user_edit.comm_languages': 'Языки общения', 'admin.user_edit.personal_site_slug': 'Персональная страница', 'admin.user_edit.show_contact_info': 'Показывать контакты', 'admin.user_edit.show_contact_info.hint': 'Видно заказчикам', 'admin.user_edit.notify_new_tasks': 'Уведомлять о новых задачах', 'admin.user_edit.notify_new_tasks.hint': 'Push и email уведомления', 'admin.user_edit.notif_messages': 'Уведомления о сообщениях', 'admin.user_edit.notif_messages.hint': 'Новые сообщения в чате', 'admin.user_edit.site_settings': 'Настройки персональной страницы', 'admin.user_edit.categories': 'Категории услуг', 'admin.user_edit.locations': 'Районы обслуживания', 'admin.user_edit.skill_placeholder': 'Новый навык...', 'admin.user_edit.add_category': '— Выберите категорию —', 'admin.user_edit.add_location': '— Выберите район —', 'admin.user_edit.specialist_cards': 'Портфолио специалиста', 'admin.user_edit.no_cards': 'Портфолио не найдено', 'admin.user_edit.card_title': 'Заголовок портфолио', 'admin.user_edit.card_description': 'Описание', 'admin.balance.topup.btn': 'Пополнить', 'admin.balance.withdraw.btn': 'Списать', 'admin.balance.modal_hint': 'Изменения применяются сразу и фиксируются в истории', 'admin.balance.topup.title': 'Пополнение баланса', 'admin.balance.topup.amount': 'Сумма', 'admin.balance.topup.description': 'Комментарий', 'admin.balance.topup.description.placeholder': 'Например: бонус или ручное пополнение', 'admin.balance.topup.submit': 'Пополнить баланс', 'admin.balance.withdraw.title': 'Снятие баланса', 'admin.balance.withdraw.amount': 'Сумма', 'admin.balance.withdraw.description': 'Комментарий', 'admin.balance.withdraw.description.placeholder': 'Например: возврат или ручное списание', 'admin.balance.withdraw.submit': 'Списать баланс', 'admin.user_edit.role.customer': 'Заказчик', 'admin.user_edit.role.specialist': 'Исполнитель', 'admin.user_edit.role.admin': 'Администратор', 'common.refresh': 'Обновить', 'common.back_home': 'На главную', 'admin.loc.hint': 'Управление городами и районами', 'admin.loc.add_city': 'Новый город', 'admin.loc.add_district': 'Добавить район', 'admin.loc.new': 'Новая локация', 'admin.loc.edit': 'Редактировать локацию', 'admin.loc.district': 'район', 'admin.loc.empty': 'Нет локаций', 'admin.loc.delete.confirm': 'Удалить локацию? Все районы также будут удалены.', 'admin.cat.add_root': 'Новая категория', 'admin.cat.add_sub': 'Подкатегория', 'admin.cat.edit': 'Редактировать', 'admin.cat.delete': 'Удалить', 'admin.cat.delete.confirm': 'Удалить категорию? Все подкатегории также будут удалены.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Иконка', 'admin.cat.name_el': 'Греческий', 'admin.cat.name_en': 'Английский', 'admin.cat.name_ru': 'Русский', 'admin.cat.order': 'Порядок', 'admin.cat.active': 'Активна', 'admin.cat.parent': 'Родительская категория', 'admin.cat.no_parent': 'Верхний уровень', 'admin.cat.save': 'Сохранить', 'admin.cat.cancel': 'Отмена', 'admin.cat.empty': 'Нет категорий', 'admin.cat.hint': 'Управление категориями с многоуровневой иерархией', 'admin.cat.new': 'Новая категория', 'admin.cat.subcategory': 'подкатегория', 'admin.cat.add_child': 'Добавить подкатегорию', 'admin.cat.inactive': 'Неактивна', 'admin.event.user_login': 'Вход', 'admin.event.user_register': 'Регистрация', 'admin.event.admin_user_deactivate': 'Блокировка юзера', 'admin.event.admin_user_activate': 'Разблокировка юзера', 'admin.event.admin_user_role_changed': 'Смена роли', 'admin.event.admin_task_cancelled': 'Отмена задачи', 'admin.event.admin_task_deleted': 'Удаление задачи', 'admin.event.admin_report_reviewed': 'Жалоба рассмотрена', 'admin.event.admin_report_dismissed': 'Жалоба отклонена', 'admin.event.task_created': 'Создана задача', // User status 'user.online': 'Онлайн', 'user.seen_minutes': 'был здесь {n} мин назад', 'user.seen_hours': 'был здесь {n} ч назад', 'user.seen_yesterday': 'был здесь вчера', 'user.seen_days': 'был здесь {n} дн назад', // Specialists 'specialists.title': 'Специалисты', 'specialists.search': 'Поиск специалиста...', 'specialists.search.btn': 'Поиск', 'specialists.empty': 'Специалисты не найдены', 'specialists.no_bio': 'Без описания', 'specialists.view': 'Смотреть профиль', 'specialists.reviews': 'отзывов', 'specialist.favorite': 'Добавить в избранное', 'specialist.unfavorite': 'Убрать из избранного', 'specialist.site_link': 'Личный сайт', 'favorites.specialists.title': 'Избранные специалисты', 'favorites.specialists.empty': 'Вы ещё не добавили специалистов в избранное', 'nav.favorites': 'Избранное', 'nav.schedule': 'Расписание', 'nav.find_tasks': 'Поиск заказов', 'schedule.title': 'Моё расписание', 'schedule.subtitle': 'Отмечайте дни когда вы свободны или заняты — заказчики увидят вашу доступность', 'schedule.available': 'Свободен', 'schedule.busy': 'Занят', 'schedule.unset': 'Не указано', 'schedule.click_hint': '← клик меняет статус по кругу', 'schedule.range_mode': 'Выделить диапазон', 'schedule.range_from': 'С {date} — выберите конечную дату', 'schedule.click_to_set': 'Нажмите чтобы отметить', 'schedule.free': 'свободно', 'schedule.busy_count': 'занято', 'schedule.free_days': 'свободных дней', 'schedule.googleCalendar': 'Google Календарь', 'schedule.connectGoogle': 'Подключить Google Календарь', 'schedule.disconnectGoogle': 'Отключить', 'schedule.connectedAs': 'Подключено как', 'schedule.importFromGoogle': 'Синхр. из Google', 'schedule.gcalConnected': '\u2713 Google Календарь подключён', 'schedule.gcalError': 'Ошибка подключения Google Календарь', 'schedule.gcalImportDone': 'Импортировано {n} дней из Google Календарь', 'schedule.gcalAutoSyncNote': 'Изменения доступности автоматически отправляются в Google Календарь', 'schedule.gcalConnectDesc': 'Подключите Google Календарь для автоматической синхронизации расписания', 'schedule.gcalDisconnectConfirm': 'Отключить Google Календарь?', 'find_tasks.title': 'Поиск заказов', 'find_tasks.for_me': 'Для меня', 'find_tasks.all': 'Все заказы', 'find_tasks.by_category': 'По категориям', 'find_tasks.list': 'Списком', 'find_tasks.already_offered': 'Предложение отправлено', 'find_tasks.offer_now': 'Откликнуться', 'find_tasks.empty_for_me': 'Нет заказов в ваших категориях', 'find_tasks.banner_hint': 'Найдите заказы по категориям вашего портфолио', 'find_tasks.no_cards': 'Создайте портфолио специалиста, чтобы видеть подходящие заказы', 'find_tasks.add_card': 'Создать портфолио', 'find_tasks.search': 'Поиск заказов...', 'find_tasks.tasks_count': 'заданий', 'footer.tagline': 'Платформа задач для Греции', 'footer.rights': 'Все права защищены.', // App download section 'app.download_title': 'Скачайте мобильное приложение CanHelp', 'app.download_desc': 'Всё CanHelp — всегда под рукой. Доступно для Android и iOS.', // Nav 'nav.pricing': 'Тарифы', // Pricing page 'pricing.title': 'Тарифы', 'pricing.subtitle': 'Выберите подходящий план', 'pricing.role.customer': 'Заказчик', 'pricing.role.specialist': 'Специалист', 'pricing.free': 'Бесплатно', 'pricing.per_month': 'мес', 'pricing.duration': 'Срок', 'pricing.days': 'дн.', 'pricing.current_plan': 'Ваш план', 'pricing.popular': 'Популярный', 'pricing.choose': 'Выбрать', 'pricing.your_plan': 'Активный план', 'pricing.free_default': 'По умолчанию', 'pricing.compare': 'Сравнение функций', 'pricing.feature': 'Функция', 'pricing.faq_note': 'Оплата списывается с баланса CanHelp. Пополнение доступно в разделе Оплата.', 'pricing.feat.messages': 'Сообщений / день', 'pricing.feat.orders': 'Заказов / день', 'pricing.feat.contact_all': 'Связь со всеми', 'pricing.feat.view_phone': 'Просмотр телефона', 'pricing.feat.show_contact': 'Показывать контакты', 'pricing.feat.favorites': 'Избранное', 'pricing.feat.verified_badge': 'Верифицированный бейдж', 'pricing.feat.google_calendar': 'Google Календарь', 'pricing.feat.personal_site': 'Персональный сайт', 'pricing.feat.auto_response': 'Авто-ответ', 'pricing.feat.auto_match': 'Авто-подбор', 'pricing.feat.highlighted_reviews': 'Выделенные отзывы', 'pricing.feat.portfolio': 'Элементов портфолио', 'pricing.feat.cards': 'Карточки специалиста', 'pricing.feat.notify_tasks': 'Уведомления о новых задачах', 'pricing.feat.video': 'Видео в портфолио', // Upgrade prompt 'upgrade.available_in': 'Доступно в', 'upgrade.cta': 'Улучшить', // Dashboard plan block 'dashboard.plan.title': 'Мой план', 'dashboard.plan.expires': 'Истекает через {n} дней', 'dashboard.plan.upgrade': 'Улучшить план', 'dashboard.plan.no_plan': 'Бесплатный план', 'dashboard.plan.messages': 'Сообщений сегодня', 'dashboard.plan.orders': 'Заказов сегодня', 'dashboard.plan.limits': 'Дневные лимиты', 'dashboard.plan.features': 'Функции', 'dashboard.plan.stats': 'Статистика', 'dashboard.stats.cards': 'Портфолио', 'dashboard.stats.maxCards': 'Макс. портфолио', 'dashboard.stats.portfolioItems': 'Элементы портфолио', 'dashboard.stats.maxPortfolioItems': 'Макс. элементы', 'dashboard.stats.activeOffers': 'Активные отклики', 'dashboard.stats.reviewsReceived': 'Отзывы', 'dashboard.stats.activeTasks': 'Активные задачи', 'dashboard.stats.completedTasks': 'Завершённые', 'status.need_help': 'Нужна помощь', 'status.active': 'Активен', 'status.toggle_on': 'Включить', 'status.toggle_off': 'Выключить', // FOMO 'fomo.missed_orders': 'Пропущено {n} заказов', 'fomo.missed_value': 'На сумму €{v}', 'fomo.upgrade_hint': 'Улучшите план — получайте больше заказов', 'fomo.conversion': 'Конверсия задач', 'fomo.active': 'Активные', 'fomo.with_offers': 'С офертами', 'fomo.completed': 'Завершённые', 'fomo.already_offered': '{n} специалистов уже откликнулись', 'fomo.specialist_missed': 'Вы пропустили {n} заказов', 'fomo.top_categories': 'Категории', 'fomo.offers_received': 'предложений получено', 'fomo.avg_offers': 'В среднем {n}/задача', 'fomo.completion_rate': 'завершено', // Task auto-match 'task.auto_match': 'Авто-матч', 'task.auto_match_results': 'Топ специалисты', 'task.no_offer_yet': 'Вы ещё не отправили предложение', 'task.make_offer': 'Отправить предложение', 'auto_response.title': 'Авто-ответ', 'auto_response.enabled': 'Включить авто-ответ', 'auto_response.min_budget': 'Мин. бюджет', 'auto_response.max_budget': 'Макс. бюджет', 'auto_response.default_price': 'Цена по умолчанию', 'auto_response.default_message': 'Сообщение по умолчанию', 'auto_response.max_per_day': 'Макс. авто-офертов в день', 'auto_response.save': 'Сохранить', 'auto_response.saved': 'Сохранено', 'auto_response.categories': 'Категории', 'auto_response.locations': 'Локации', // Personal site 'profile.personal_site': 'Персональный сайт', 'profile.site_slug': 'URL slug', 'profile.site_slug_hint': 'Только латинские буквы, цифры, - и _', 'profile.site_open': 'Открыть сайт', 'profile.site_preview': 'Ваш сайт', 'profile.show_contact': 'Показывать контакты', 'profile.show_contact_hint': 'Заказчики с Pro/Ultimate-планом увидят ваш телефон', // Google Calendar plan gate 'gcal.upgrade_required': 'Google Календарь требует план Pro или Ultimate', // Chat limits 'chat.limit_warning': 'Осталось {n} сообщений сегодня', 'chat.limit_reached': 'Лимит сообщений исчерпан. Улучшите план', 'chat.upgrade': 'Улучшить', // Site page 'site.member_since': 'С нами с', 'site.rating': 'Рейтинг', 'site.completed_tasks': 'Выполнено', 'site.languages': 'Языков', 'site.photos': 'фото', 'site.contact_form': 'Связаться', 'site.contact_sent': 'Сообщение отправлено!', 'site.contact_sent_desc': 'Специалист свяжется с вами в ближайшее время', 'site.contact_name': 'Имя', 'site.contact_name_ph': 'Ваше имя', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Сообщение', 'site.contact_message_ph': 'Опишите вашу задачу...', 'site.contact_send': 'Отправить', 'site.share': 'Поделиться', 'site.speaks_languages': 'Говорит на языках', 'site.message_sent': 'Сообщение отправлено!', 'site.message_sent_desc': 'Специалист получит его в чате', 'site.message_placeholder': 'Напишите сообщение...', 'site.write_to_chat': 'Написать в чат', 'site.auth_required_title': 'Нужна авторизация', 'site.auth_required_desc': 'Чтобы написать в чат, необходимо войти в аккаунт CanHelp.', 'site.auth_login_btn': 'Войти в аккаунт', 'site.auth_contact_form_btn': 'Написать через форму обратной связи', 'specialist.services': 'Услуги', 'portfolio.title': 'Портфолио', 'status.can_help_now': 'Готов помочь', 'common.not_found': 'Страница не найдена', 'common.anonymous': 'Анонимно' } }; export function getTranslations(locale) { const t = translations[locale] ?? translations.el; return (key, fallback)=>t[key] ?? translations.el[key] ?? fallback ?? key; } /06undefined268274undefined176723176729undefined /***/ }) '</***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $: () => (/* binding */ getTranslations), /* harmony export */ YZ: () => (/* binding */ LOCALES) /* harmony export */ }); /* unused harmony export translations */ const LOCALES = [ { code: 'el', label: 'Ελληνικά', flag: '🇬🇷' }, { code: 'en', label: 'English', flag: '🇬🇧' }, { code: 'ru', label: 'Русский', flag: '🇷🇺' } ]; const translations = { el: { 'footer.slogan': 'Η εργασία σου — η φροντίδα μας! Λύνουμε κάθε ζήτημα γρήγορα και εύκολα.', 'footer.links': 'Σύνδεσμοι', 'footer.socials': 'Στα κοινωνικά δίκτυα', // Nav 'nav.home': 'Αρχική', 'nav.tasks': 'Εργασίες', 'nav.post': '+ Δημοσίευση', 'nav.dashboard': 'Πίνακας', 'nav.chat': 'Μηνύματα', 'nav.notifications': 'Ειδοποιήσεις', 'nav.profile': 'Προφίλ', 'nav.admin': 'Διαχείριση', 'nav.specialists': 'Ειδικοί', 'nav.new_task': 'Νέα εργασία', 'nav.login': 'Σύνδεση', 'nav.register': 'Εγγραφή', 'nav.logout': 'Έξοδος', // Hero 'hero.title': 'Βρες ειδικό για κάθε δουλειά', 'hero.subtitle': 'Δημοσίευσε εργασία, λάβε προσφορές και επίλεξε τον καλύτερο επαγγελματία', 'hero.cta.post': 'Δημοσίευσε εργασία', 'hero.cta.browse': 'Βρες εργασία', 'hero.search.placeholder': 'Τι χρειάζεσαι; π.χ. ηλεκτρολόγος, καθαρισμός...', 'stats.specialists': 'ειδικοί', 'stats.tasks': 'εργασίες', 'stats.categories': 'κατηγορίες', 'stats.free': 'δωρεάν εγγραφή', // Sections 'section.categories': 'Δημιούργησε εργασία σε οποιαδήποτε κατηγορία', 'section.how': 'Πώς λειτουργεί', 'section.recent': 'Πρόσφατες εργασίες', 'section.all': 'Δες όλες →', 'section.more': 'ακόμα', 'section.cities': 'Πόλεις & Περιοχές', 'section.community': 'Ένα κοινοτικό έργο για όλους', 'community.subtitle': 'Το CanHelp δεν είναι απλώς μια αγορά — είναι μια κοινότητα αμοιβαίας βοήθειας. Οποιοσδήποτε έχει γνώση ή δεξιότητα μπορεί να βρει έναν πελάτη. Οποιοσδήποτε έχει ένα πρόβλημα μπορεί να βρει έναν ειδικό.', 'community.point1.title': 'Είσαι ειδικός σε κάτι;', 'community.point1.desc': 'Επισκευές, μαθήματα, σχεδιασμός, μεταφράσεις, φροντίδα — κάθε δεξιότητα αξίζει. Δημιούργησε προφίλ και βρες πελάτες κοντά σου.', 'community.point2.title': 'Χρειάζεσαι βοήθεια;', 'community.point2.desc': 'Δημοσίευσε εργασία σε λιγότερο από ένα λεπτό και λάβε προσφορές από επαληθευμένους ειδικούς στην πόλη σου.', 'community.point3.title': 'Βοήθησε το έργο να αναπτυχθεί', 'community.point3.desc': 'Το CanHelp αναπτύσσεται χάρη στις κοινότητες. Μοιράσου το σύνδεσμο με φίλους και γνωστούς — μαζί χτίζουμε κάτι χρήσιμο για όλους.', 'community.share': 'Μοιράσου με φίλους', 'community.share.copied': 'Σύνδεσμος αντιγράφηκε!', // Referral section on home page 'section.referral': 'Πρόγραμμα παραπομπών', 'referral.home.subtitle': 'Μοιράσου τον σύνδεσμό σου — κάθε νέος χρήστης που εγγράφεται μέσα από αυτόν σου αποφέρει ανταμοιβή.', 'referral.home.step1.title': 'Εγγραφείσε και λάβε σύνδεσμο', 'referral.home.step1.desc': 'Δημιούργησε λογαριασμό και βρες τον μοναδικό σου σύνδεσμο παραπομπής στο προφίλ σου.', 'referral.home.step2.title': 'Μοιράσου με φίλους', 'referral.home.step2.desc': 'Στείλε τον σύνδεσμο σε φίλους, γνωστούς ή δημοσίευσέ τον στα social media.', 'referral.home.step3.title': 'Κέρδισε ανταμοιβές', 'referral.home.step3.desc': 'Μόλις ο φίλος σου επαληθεύσει το email του, λαμβάνεις αυτόματα την ανταμοιβή σου.', 'referral.home.cta': 'Πάρε τον σύνδεσμό σου', 'referral.home.badge': 'Πρόγραμμα παραπομπών', // FAQ section 'section.faq': 'Συχνές Ερωτήσεις', 'faq.q1': 'Πώς λειτουργεί το CanHelp;', 'faq.a1': 'Δημοσίευσε μια εργασία, λάβε προσφορές από ειδικούς, επέλεξε τον καλύτερο και ξεκίνα τη συνεργασία. Είναι γρήγορο, απλό και δωρεάν για πελάτες.', 'faq.q2': 'Πόσο κοστίζει η χρήση της πλατφόρμας;', 'faq.a2': 'Η εγγραφή και η δημοσίευση εργασιών είναι εντελώς δωρεάν για πελάτες. Οι ειδικοί έχουν στη διάθεσή τους δωρεάν πλάνο καθώς και premium επιλογές.', 'faq.q3': 'Πώς μπορώ να γίνω ειδικός;', 'faq.a3': 'Κάνε εγγραφή, πήγαινε στο «Γίνε Ειδικός», συμπλήρωσε το προφίλ σου με δεξιότητες και κατηγορίες και αρχίνισε να λαμβάνεις εργασίες.', 'faq.q4': 'Πώς επιλέγω τον κατάλληλο ειδικό;', 'faq.a4': 'Δες τις αξιολογήσεις, την εμπειρία, τις δεξιότητες και το χαρτοφυλάκιο κάθε ειδικού. Επικοινώνησε μαζί του μέσω chat και συζήτα τις λεπτομέρειες πριν αποφασίσεις.', 'faq.q5': 'Τι γίνεται αν δεν είμαι ικανοποιημένος;', 'faq.a5': 'Μπορείς να αφήσεις αξιολόγηση για τον ειδικό και να τον βαθμολογήσεις από 1 έως 5 αστέρια. Οι αξιολογήσεις βοηθούν άλλους χρήστες να επιλέξουν έμπιστους επαγγελματίες.', 'faq.q6': 'Μπορώ να επικοινωνήσω με τον ειδικό πριν την αποδοχή;', 'faq.a6': 'Ναι. Μόλις λάβεις μια προσφορά, μπορείς να ανοίξεις chat με τον ειδικό, να κάνεις ερωτήσεις και να συντονίσεις τις λεπτομέρειες πριν αποφασίσεις.', 'faq.q7': 'Πόσος χρόνος χρειάζεται για να λάβω προσφορές;', 'faq.a7': 'Συνήθως μέσα σε λίγες ώρες. Οι ειδικοί λαμβάνουν ειδοποίηση για νέες εργασίες και μπορούν να απαντήσουν γρήγορα.', 'faq.q8': 'Μπορώ να δημοσιεύσω εργασία σε οποιαδήποτε πόλη της Ελλάδας;', 'faq.a8': 'Ναι! Το CanHelp καλύπτει όλη την Ελλάδα. Μπορείς να βρεις ειδικούς στην Αθήνα, στη Θεσσαλονίκη, στην Πάτρα και αλλού.', 'faq.q9': 'Τι είδη εργασιών μπορώ να βρω στο CanHelp;', 'faq.a9': 'Επισκευές, καθαρισμό, ηλεκτρολόγους, μαθήματα, σχεδιασμό, IT, μετακομίσεις, ομορφιά και πολλά άλλα. Οι κατηγορίες αυξάνονται συνεχώς.', 'faq.q10': 'Υπάρχει εφαρμογή για κινητό;', 'faq.a10': 'Ναι! Το CanHelp διατίθεται για Android και iOS. Κατέβασε την εφαρμογή και διαχειρίσου τα πάντα από το τηλέφωνό σου.', // How it works 'how.step1.title': 'Δημοσίευσε εργασία', 'how.step1.desc': 'Περίγραψε τι χρειάζεσαι και ορίζε τον προϋπολογισμό σου', 'how.step2.title': 'Λάβε προσφορές', 'how.step2.desc': 'Ειδικοί θα σου στείλουν προσφορές με τιμή και χρόνο', 'how.step3.title': 'Επίλεξε & ξεκίνα', 'how.step3.desc': 'Επέλεξε τον καλύτερο επαγγελματία και ξεκίνα τη συνεργασία', // Tasks page 'tasks.title': 'εργασίες', 'tasks.filters': 'Φίλτρα', 'tasks.search': 'Αναζήτηση', 'tasks.search.placeholder': 'Τίτλος ή λέξη κλειδί...', 'tasks.search.btn': 'Αναζήτηση', 'tasks.publish': 'Δημοσίευση', 'tasks.category.all': 'Όλες', 'tasks.category.all_in': 'Όλα στην', 'tasks.category.label': 'Κατηγορία', 'tasks.location.label': 'Πόλη', 'tasks.location.placeholder': 'π.χ. Αθήνα', 'tasks.empty': 'Δεν βρέθηκαν εργασίες', 'tasks.empty.cta': 'Δημοσίευσε την πρώτη', // Task detail 'task.status.open': 'Ανοιχτή', 'task.status.in_progress': 'Σε εξέλιξη', 'task.status.completed': 'Ολοκληρωμένη', 'task.status.cancelled': 'Ακυρωμένη', 'task.status.draft': 'Πρόχειρο', 'task.budget': 'Προϋπολογισμός', 'task.location': 'Τοποθεσία', 'task.deadline': 'Ημερομηνία έναρξης', 'task.created_at': 'Δημιουργήθηκε', 'task.customer': 'Πελάτης', 'task.offer.btn': 'Υποβολή προσφοράς', 'task.invite.banner_title': 'Σας προσκαλούν σε αυτήν την εργασία', 'task.invite.banner_hint': 'Ο πελάτης σας πρόσκαλεσε προσωπικά', 'task.invite.accept': 'Αποστολή προσφοράς', 'task.invite.decline': 'Άρνηση', 'offer.accept': 'Αποδοχή', 'offer.decline': 'Απόρριψη', 'task.complete': 'Ολοκλήρωση εργασίας', 'task.complete.confirm': 'Να ολοκληρωθεί η εργασία;', 'task.edit': 'Επεξεργασία', 'task.status_label': 'Κατάσταση', 'task.yours': 'Η εργασία σου', 'task.offer.yours': 'Η προσφορά σου', 'review.leave': 'Άφησε αξιολόγηση', 'review.rating': 'Βαθμολογία', 'review.comment': 'Σχόλιο', 'review.comment.placeholder': 'Πες μας για την εμπειρία σου...', 'review.submit': 'Υποβολή αξιολόγησης', 'review.submitting': 'Αποστολή...', 'review.done': 'Η αξιολόγηση καταχωρήθηκε!', 'profile.reviews': 'Αξιολογήσεις', 'profile.no_reviews': 'Δεν υπάρχουν αξιολογήσεις ακόμα', 'profile.rating': 'Βαθμολογία', 'profile.skills.label': 'Δεξιότητες', 'profile.member_since': 'Μέλος από', 'task.offers': 'Προσφορές', 'task.offers.none': 'Δεν υπάρχουν ακόμα προσφορές', // Create task 'create.title': 'Δημοσίευση εργασίας', 'create.field.title': 'Τίτλος', 'create.field.description': 'Περιγραφή', 'create.field.category': 'Κατηγορία', 'create.field.category.select': 'Επιλέξτε...', 'create.field.location': 'Τοποθεσία', 'create.field.location.any': 'Οπουδήποτε', 'create.field.location.all': 'Ολόκληρη η πόλη', 'create.field.budget': 'Προϋπολογισμός (€)', 'create.field.deadline': 'Ημερομηνία έναρξης', 'create.field.budget_negotiable': 'Η τιμή είναι διαπραγματεύσιμη', 'create.field.time_slot': 'Χρόνος εκτέλεσης', 'create.field.time_slot.any': 'Οποιαδήποτε', 'create.field.time_slot.morning': 'Πρωινό (08:00–13:00)', 'create.field.time_slot.afternoon': 'Μεσημέρι (13:00–18:00)', 'create.field.time_slot.evening': 'Βράδυ (18:00–22:00)', 'create.field.time_slot.weekend': 'Σαββατοκύριακο', 'create.field.address': 'Διεύθυνση (προαιρετικά)', 'create.field.address.district': 'Συνοικία', 'create.field.address.street': 'Οδός', 'create.field.address.house': 'Αριθμός', 'create.field.confidential': 'Εμπιστευτική σημείωση', 'create.field.confidential.placeholder': 'Λεπτομέρειες που θα δει μόνο ο αναδοχόμενος...', 'create.field.confidential.hint': 'Δεν εμφανίζεται δημόσια', 'create.field.photos': 'Φωτογραφίες', 'create.field.photos.add': 'Προσθήκη φωτογραφίας', 'create.field.photos.uploading': 'Ανέβασμα...', 'task.budget_negotiable': 'Τιμή διαπραγματεύσιμη', 'task.time_slot': 'Χρόνος', 'task.confidential': 'Εμπιστευτική σημείωση', 'create.field.title.placeholder': 'π.χ. Καθαρισμός διαμερίσματος 80τμ', 'create.field.description.placeholder': 'Περίγραψε λεπτομερώς τι χρειάζεσαι...', 'create.field.location.placeholder': 'π.χ. Αθήνα, Κολωνάκι', 'create.field.budget.placeholder': 'π.χ. 100', 'create.submit': 'Δημοσίευση εργασίας', 'create.submitting': 'Δημοσίευση...', // Auth 'login.title': 'Καλωσόρισες', 'login.subtitle': 'Σύνδεση στο CanHelp', 'login.email': 'Email', 'login.password': 'Κωδικός', 'login.submit': 'Σύνδεση', 'login.submitting': 'Σύνδεση...', 'login.error': 'Λάθος email ή κωδικός', 'login.unverified.title': 'Επιβεβαιώστε το email σας', 'login.unverified.desc': 'Στείλαμε σύνδεσμο επαλήθευσης στο email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε το σύνδεσμο.', 'login.unverified.resend': 'Αποστολή νέου email επαλήθευσης', 'login.unverified.sending': 'Αποστολή...', 'login.unverified.sent': '✓ Εστάλη — ελέγξτε τα εισερχόμενα', 'profile.email.verified': 'Email επαληθεύτηκε', 'profile.email.not_verified': 'Email δεν επαληθεύτηκε', 'login.no_account': 'Δεν έχεις λογαριασμό;', 'login.register_link': 'Εγγραφή', 'login.forgot_password': 'Ξέχασα τον κωδικό', 'login.or_continue_with': 'ή συνεχίστε με', 'login.continue_google': 'Σύνδεση με Google', 'forgot.title': 'Ξέχασα τον κωδικό', 'forgot.subtitle': 'Εισάγετε το email σας για να λάβετε σύνδεσμο ανάκτησης', 'forgot.email': 'Email', 'forgot.submit': 'Αποστολή', 'forgot.submitting': 'Αποστολή...', 'forgot.sent.title': 'Ελέγξτε τα εισερχόμενά σας', 'forgot.sent.desc': 'Αν υπάρχει λογαριασμός με αυτό το email, θα σας στείλουμε σύνδεσμο ανάκτησης κωδικού.', 'forgot.back_to_login': 'Επιστροφή στη σύνδεση', 'forgot.error': 'Αποτυχία αποστολής. Ελέγξτε το email σας ή δοκιμάστε ξανά.', 'forgot.error.not_found': 'Δεν βρέθηκε λογαριασμός με αυτό το email.', 'forgot.error.send_failed': 'Αποτυχία αποστολής email. Δοκιμάστε ξανά αργότερα', 'reset.title': 'Νέος κωδικός', 'reset.subtitle': 'Εισάγετε τον νέο σας κωδικό', 'reset.password': 'Νέος κωδικός', 'reset.confirm': 'Επιβεβαίωση κωδικού', 'reset.submit': 'Αλλαγή κωδικού', 'reset.submitting': 'Αποθήκευση...', 'reset.success': 'Ο κωδικός άλλαξε επιτυχώς. Ανακατεύθυνση στη σύνδεση...', 'reset.back_to_login': 'Επιστροφή στη σύνδεση', 'reset.error.mismatch': 'Οι κωδικοί δεν ταιριάζουν', 'reset.error.invalid': 'Μη έγκυρος σύνδεσμος. Παρακαλώ ζητήστε νέο.', 'register.title': 'Εγγραφή', 'register.subtitle': 'Δημιουργία λογαριασμού στο CanHelp', 'register.first_name': 'Όνομα', 'register.last_name': 'Επώνυμο', 'register.email': 'Email', 'register.password': 'Κωδικός (min 8 χαρακτήρες)', 'register.role': 'Ρόλος', 'register.role.customer': 'Χρήστης', 'register.role.customer.desc': 'Δημοσιεύω εργασίες', 'register.role.specialist': 'Ειδικός', 'register.role.specialist.desc': 'Αναλαμβάνω εργασίες', 'register.submit': 'Δημιουργία λογαριασμού', 'register.submitting': 'Εγγραφή...', 'register.has_account': 'Έχεις ήδη λογαριασμό;', 'register.login_link': 'Σύνδεση', 'register.continue_google': 'Εγγραφή με Google', 'register.check_email.title': 'Ελέγξτε το email σας', 'register.check_email.desc': 'Στείλαμε σύνδεσμο επαλήθευσης στη διεύθυνση email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε τον σύνδεσμο.', 'register.check_email.login': 'Επιστροφή στη σύνδεση', // Dashboard 'dashboard.title': 'Πίνακας ελέγχου', 'dashboard.new_task': '+ Νέα εργασία', 'dashboard.my_tasks': 'Οι εργασίες μου', 'dashboard.my_offers': 'Οι προσφορές μου', 'dashboard.invitations': 'Προσκλήσεις για εργασία', 'dashboard.offers_count': 'προσφορές', 'dashboard.declined_count': 'απορρίφθηκαν', 'dashboard.completed_tasks': 'Ολοκληρωμένες εργασίες', 'dashboard.completed_offers': 'Ολοκληρωμένες προσφορές', 'dashboard.review_pending': 'Η αξιολόγηση δεν έχει υποβληθεί ακόμα', 'tasks.new.top_specialists': 'Κορυφαίοι ειδικοί', 'tasks.new.select_category': 'Επιλέξτε κατηγορία για να δείτε ειδικούς', 'tasks.new.invite': 'Πρόσκληση', 'tasks.new.invited': 'Επιλέχθηκε ✓', 'reviews.count': 'αξιολογήσεις', 'filter.location': 'Τοποθεσία', 'filter.language': 'Γλώσσες', 'filter.language.any': 'Οποιαδήποτε γλώσσα', 'filter.category.all': 'Όλες οι κατηγορίες', 'user.categories': 'Κατηγορίες', 'user.work_area': 'Περιοχή εργασίας', 'dashboard.tasks.empty': 'Δεν έχεις δημοσιεύσει εργασίες', 'dashboard.tasks.empty.cta': 'Δημοσίευσε την πρώτη σου', 'dashboard.tasks.add_new': 'Πρόσθεσε νέα εργασία', 'dashboard.offers.empty': 'Δεν έχεις υποβάλλει προσφορές', 'dashboard.offers.empty.cta': 'Βρες εργασίες', 'dashboard.customer.specialists_title': 'Ψάχνεις εκτελεστή;', 'dashboard.customer.specialists_hint': 'Δες προφίλ ειδικών, διάβασε αξιολογήσεις και κάλεσέ τους στις εργασίες σου', 'dashboard.customer.specialists_cta': 'Βρες ειδικό', 'dashboard.customer.how_title': 'Πώς λειτουργεί', 'dashboard.customer.step1': 'Δημιούργησε εργασία με περιγραφή και προϋπολογισμό', 'dashboard.customer.step2': 'Οι ειδικοί θα στείλουν προσφορές με τιμή και χρόνο', 'dashboard.customer.step3': 'Επίλεξε τον κατάλληλο και ξεκίνα τη συνεργασία', // Notifications 'notif.title': 'Ειδοποιήσεις', 'notif.mark_all': 'Σήμανση όλων ως αναγνωσμένα', 'notif.empty': 'Δεν υπάρχουν ειδοποιήσεις', 'notif.type.new_offer': 'Νέα προσφορά', 'notif.type.offer_accepted': 'Η προσφορά σας έγινε δεκτή', 'notif.type.offer_declined': 'Η προσφορά σας απορρίφθηκε', 'notif.type.task_completed': 'Η εργασία ολοκληρώθηκε', 'notif.type.task_cancelled': 'Η εργασία ακυρώθηκε', 'notif.type.new_message': 'Νέο μήνυμα', 'notif.type.new_review': 'Νέα αξιολόγηση', 'notif.type.task_invite': 'Πρόσκληση σε εργασία', 'notif.body.new_offer': 'Νέα προσφορά για «{title}»', 'notif.body.offer_accepted': 'Η προσφορά σας για «{title}» έγινε δεκτή', 'notif.body.offer_declined': 'Η προσφορά σας για «{title}» απορρίφθηκε', 'notif.body.task_invite': 'Σας προσκαλούν για «{title}»', 'notif.body.new_review': 'Λάβατε αξιολόγηση {rating}★', // Offer status 'offer.status.pending': 'Εκκρεμεί', 'offer.status.accepted': 'Αποδεκτή', 'offer.status.declined': 'Απορρίφθηκε', 'offer.status.withdrawn': 'Αποσύρθηκε', 'offer.status.other_accepted': 'Επιλέχθηκε άλλος ειδικός', // Common 'common.loading': 'Φόρτωση...', 'common.error': 'Σφάλμα', 'common.save': 'Αποθήκευση', 'common.saving': 'Αποθήκευση...', 'common.cancel': 'Ακύρωση', 'common.add': 'Προσθήκη', 'common.close': 'Κλείσιμο', 'common.edit': 'Επεξεργασία', 'common.delete': 'Διαγραφή', 'common.from': 'από', 'common.currency': '€', 'common.greece': 'Ελλάδα', // Chat 'chat.connected': 'Συνδεδεμένος', 'chat.disconnected': 'Αποσυνδεδεμένος', 'chat.no_rooms': 'Δεν υπάρχουν συνομιλίες ακόμα', 'chat.task_fallback': 'Εργασία', 'chat.select': 'Επίλεξε συνομιλία', 'chat.no_messages': 'Δεν υπάρχουν μηνύματα', 'chat.placeholder': 'Γράψε μήνυμα... (Enter για αποστολή)', 'chat.conversation_fallback': 'Συνομιλία', 'chat.direct_chat': 'Απευθείας συνομιλία', 'chat.linked_task': 'Συνδεδεμένη εργασία', 'chat.write_btn': 'Μήνυμα', 'chat.just_now': 'μόλις τώρα', 'chat.min_ago': 'λ', 'chat.write_specialist': 'Γράψε στον ειδικό', 'chat.write_customer': 'Γράψε στον πελάτη', 'chat.notif_settings': 'Ρυθμίσεις ειδοποιήσεων', 'chat.notif_messages': 'Ειδοποιήσεις για νέα μηνύματα', 'chat.toast_title': 'Νέο μήνυμα', 'chat.toast_open': 'Άνοιγμα συνομιλίας', // Offer form 'offer.price': 'Τιμή', 'offer.price.placeholder': 'π.χ. 80', 'offer.customer_budget': 'Προϋπολογισμός πελάτη', 'offer.message': 'Μήνυμα', 'offer.optional': 'προαιρετικό', 'offer.message.placeholder': 'Παρουσίασε τον εαυτό σου, την εμπειρία σου και γιατί είσαι η καλύτερη επιλογή...', 'offer.submitting': 'Αποστολή...', // Profile 'profile.photo': 'Φωτογραφία προφίλ', 'profile.photo.change': 'Αλλαγή φωτογραφίας', 'profile.photo.hint': 'JPEG, PNG, WebP · έως 5MB', 'profile.basic_info': 'Βασικά στοιχεία', 'profile.phone': 'Τηλέφωνο', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Σύντομη περιγραφή', 'profile.bio.placeholder': 'Πες μας λίγα λόγια για εσένα...', 'profile.language': 'Γλώσσα', 'profile.language.hint': 'Γλώσσα διεπαφής και email ειδοποιήσεων', 'profile.languages': 'Γλώσσες επικοινωνίας', 'profile.languages.hint': 'Επιλέξτε όλες τις γλώσσες που μιλάτε', 'profile.skills': 'Δεξιότητες', 'profile.skills.subtitle': 'Προσθέσε τις υπηρεσίες που προσφέρεις', 'profile.skills.placeholder': 'π.χ. Καθαρισμός, IT, Μαθήματα...', 'profile.role': 'Ρόλος λογαριασμού', 'profile.role.specialist': '🔧 Ειδικός', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 Χρήστης', 'profile.role.change': 'Για αλλαγή ρόλου επικοινωνήστε με την υποστήριξη.', 'profile.become_specialist': 'Γίνε Ειδικός', 'profile.become_specialist.desc': 'Αναβαθμίσου σε Ειδικό για να δέχεσαι εργασίες και να δημιουργήσεις το προφίλ σου.', 'become_specialist.hero.title': 'Κέρδισε χρήματα κάνοντας αυτό που ξέρεις', 'become_specialist.hero.subtitle': 'Δημιούργησε προφίλ ειδικού και λάβε παραγγελίες από πελάτες σε όλη την Ελλάδα', 'become_specialist.how.title': 'Πώς λειτουργεί', 'become_specialist.step1.title': 'Δημιούργησε κάρτα ειδικού', 'become_specialist.step1.desc': 'Δήλωσε κατηγορίες, δεξιότητες και περιοχές κάλυψης — το σύστημα θα βρει τις κατάλληλες εργασίες για σένα αυτόματα', 'become_specialist.step2.title': 'Βρες εργασίες', 'become_specialist.step2.desc': 'Ανακάλυψε εργασίες στις κατηγορίες σου στην ενότητα «Αναζήτηση εργασιών»', 'become_specialist.step3.title': 'Στείλε προσφορά & κέρδισε', 'become_specialist.step3.desc': 'Υποβάλε προσφορές με τιμή και χρόνο, επικοινωνήσε με πελάτες και ολοκλήρωσε εργασίες', 'become_specialist.benefits.title': 'Πλεονεκτήματα προφίλ ειδικού', 'become_specialist.benefit1': 'Αναζήτηση εργασιών ανά κατηγορία και τοποθεσία', 'become_specialist.benefit2': 'Δημόσιο προφίλ με αξιολογήσεις πελατών', 'become_specialist.benefit3': 'Πρόγραμμα διαθεσιμότητας ορατό στους πελάτες', 'become_specialist.benefit4': 'Προσθήκη σε αγαπημένα από πελάτες', 'become_specialist.cta': 'Γίνε Ειδικός — είναι δωρεάν', 'become_specialist.free_badge': 'Δωρεάν εγγραφή', 'profile.tab.notifications': 'Ειδοποιήσεις', 'profile.tab.reviews': 'Αξιολογήσεις', 'profile.tab.referral': 'Παραπομπές', 'profile.tab.auto_response': 'Αυτόματη απάντηση', 'profile.tab.site': 'Site', 'profile.site.title': 'Προσωπική σελίδα', 'profile.site.url_label': 'Προσωπικό site', 'profile.site.copy': 'Αντιγραφή', 'profile.site.copied': 'Αντιγράφηκε', 'profile.site.visible_title': 'Τι εμφανίζεται στη σελίδα σας', 'profile.site.visible.name': 'Όνομα και φωτογραφία', 'profile.site.visible.bio': 'Βιογραφικό', 'profile.site.visible.rating': 'Αξιολόγηση και κριτικές', 'profile.site.visible.portfolio': 'Χαρτοφυλάκιο / Κάρτες', 'profile.site.visible.contacts': 'Στοιχεία επικοινωνίας', 'profile.site.visible.full_last_name': 'Πλήρες επώνυμο', 'profile.site.visible.services': 'Κάρτες υπηρεσιών', 'profile.site.visible.reviews': 'Ενότητα κριτικών', 'profile.site.visible.status': 'Κατάσταση «Έτοιμος να βοηθήσω»', 'profile.site.theme': 'Θέμα εμφάνισης', 'profile.site.theme.dark': 'Σκοτεινό', 'profile.site.theme.light': 'Φωτεινό', 'profile.site.slug_taken': 'Αυτή η διεύθυνση είναι ήδη κατειλημμένη', 'profile.site.stats.title': 'Στατιστικά επισκεψιμότητας', 'profile.site.stats.days': 'τελευταίες 30 ημέρες', 'profile.site.stats.views': 'Προβολές', 'profile.site.stats.unique': 'Μοναδικοί επισκέπτες', 'profile.site.stats.messages': 'Μηνύματα', 'profile.site.stats.total_views': 'Συνολικές προβολές', 'profile.site.stats.total_unique': 'Μοναδικοί επισκέπτες', 'profile.site.stats.total_messages': 'Μηνύματα', 'profile.site.stats.empty': 'Δεν υπάρχουν δεδομένα ακόμη', 'profile.site.stats.loading': 'Φόρτωση στατιστικών...', 'profile.site.stats.no_slug': 'Ορίστε τη διεύθυνση του site για να δείτε στατιστικά', 'profile.site.edit_bio_hint': 'Το βιογραφικό και η φωτογραφία ρυθμίζονται στην καρτέλα «Βασικά».', 'status.can_help_now_hint': 'Η κάρτα σου εμφανίζεται ψηλότερα', 'status.need_help_hint': 'Οι ειδικοί μπορούν να σε βοηθήσουν', 'profile.referral.title': 'Πρόγραμμα παραπομπών', 'profile.referral.desc': 'Μοιράσου τον σύνδεσμο σου και κέρδισε ανταμοιβές για κάθε νέο χρήστη.', 'profile.referral.link_label': 'Ο σύνδεσμος παραπομπής σου', 'profile.referral.copy': 'Αντιγραφή', 'profile.referral.copied': 'Αντιγράφηκε!', 'profile.referral.invited_count': 'επιτυχείς παραπομπές', 'profile.referral.no_code': 'Ο κωδικός παραπομπής δεν είναι διαθέσιμος.', 'notifications.title': 'Ρυθμίσεις ειδοποιήσεων', 'notifications.email.new_tasks': 'Email για νέες εργασίες', 'notifications.email.new_tasks.desc': 'Λάβε email όταν δημοσιευτεί νέα εργασία στις κατηγορίες σου', 'notifications.messages.desc': 'Λαμβάνεις ειδοποίηση όταν έρθει νέο μήνυμα', 'notifications.saved': 'Ρυθμίσεις αποθηκεύτηκαν', 'notifications.plan_required': 'Συνδρομή απαιτείται για αυτή τη λειτουργία', 'profile.tab.info': 'Βασικά στοιχεία', 'profile.tab.finance': 'Οικονομικά', 'profile.tab.skills': 'Δεξιότητες', 'profile.tab.categories': 'Κατηγορίες', 'profile.tab.geography': 'Γεωγραφία', 'profile.specialist.categories': 'Κατηγορίες εργασιών', 'profile.specialist.categories.desc': 'Επίλεξε τις κατηγορίες στις οποίες εργάζεσαι', 'profile.specialist.geography': 'Περιοχές κάλυψης', 'profile.specialist.geography.desc': 'Επίλεξε τις πόλεις / περιοχές όπου δραστηριοποιείσαι', 'profile.saving': 'Αποθήκευση...', 'profile.upload.error': 'Σφάλμα κατά την αναφόρτωση', 'profile.saved': 'Αποθηκεύτηκε', 'profile.tab.cards': 'Χαρτοφυλάκιο', 'profile.cards.count': 'Χαρτοφυλάκια', 'profile.cards.add': 'Νέο χαρτοφυλάκιο', 'profile.cards.new_title': 'Τίτλος νέου χαρτοφυλακίου', 'profile.cards.placeholder': 'π.χ. Υδραυλικά', 'profile.cards.create': 'Δημιουργία', 'profile.cards.cancel': 'Ακύρωση', 'profile.cards.empty': 'Δεν έχετε χαρτοφυλάκιο', 'profile.cards.create_first': 'Δημιουργήστε το πρώτο σας χαρτοφυλάκιο', 'profile.cards.delete_confirm': 'Διαγραφή χαρτοφυλακίου;', 'profile.card.tab.main': 'Γενικά', 'profile.card.tab.skills': 'Δεξιότητες', 'profile.card.tab.categories': 'Κατηγορίες', 'profile.card.tab.geography': 'Γεωγραφία', 'profile.card.tab.portfolio': 'Γκαλερί', 'profile.card.active': 'Ενεργή', 'profile.card.save': 'Αποθήκευση', 'profile.card.saved': 'Αποθηκεύτηκε', 'profile.card.delete': 'Διαγραφή', 'profile.card.skill.add': 'Προσθήκη δεξιότητας', 'profile.card.photo.add': 'Προσθήκη φωτογραφίας', 'profile.card.photo.uploading': 'Μεταφόρτωση...', 'profile.card.photo.empty': 'Δεν υπάρχουν φωτογραφίες', 'profile.card.item.title': 'Τίτλος', 'profile.card.item.desc': 'Περιγραφή', 'profile.card.item.save': 'Αποθήκευση', 'profile.card.item.cancel': 'Ακύρωση', 'profile.card.item.edit': 'Επεξεργασία', 'profile.upgrade.cards_limit': 'Όριο χαρτοφυλακίων εξαντλήθηκε', 'profile.upgrade.plan': 'Τρέχον πλάνο:', 'profile.upgrade.contact': 'Επικοινωνήστε με τον διαχειριστή για αλλαγή πλάνου', 'profile.upgrade.ok': 'Εντάξει', 'profile.plan.title': 'Πλάνο συνδρομής', 'profile.balance': 'Υπόλοιπο', 'profile.balance.topup': 'Αναπλήρωση υπολοίπου', 'profile.balance.topup.title': 'Αναπλήρωση υπολοίπου', 'profile.balance.topup.amount': 'Ποσό (σε EUR)', 'profile.balance.topup.hint': 'Επιλέξτε ποσό ή εισαγάγετε μανούαλα', 'profile.balance.topup.submit': 'Πληρωμή', 'profile.balance.topup.loading': 'Ρεδιρεκτάρισμα...', 'profile.balance.topup.error': 'Σφάλμα μετάβασης στην πληρωμή. Προσπαθήστε ξανά.', 'payment.success.title': 'Πληρωμή επιτυχής!', 'payment.success.desc': 'Το υπόλοιπό σας ενημερώθηκε.', 'payment.cancelled.title': 'Ακύρωση πληρωμής', 'payment.cancelled.desc': 'Η πληρωμή ακυρώθηκε. Κανένα χρήμα δεν χρεώθηκε.', 'payment.pending.title': 'Σε εξέλιξη...', 'payment.pending.desc': 'Επεξεργαζόμαστε την πληρωμή σας.', 'payment.back_to_profile': 'Επιστροφή στο προφίλ', 'profile.plan.basic': 'Βασικό (δωρεάν)', 'profile.plan.contact_upgrade': 'Επικοινωνήστε με τον διαχειριστή για αναβάθμιση', 'profile.plan.cards_up_to': 'Χαρτοφυλάκια: έως', 'profile.plan.cards_unlimited': 'Χαρτοφυλάκια: απεριόριστα', 'profile.plan.tasks_up_to': 'Εργασίες: έως', 'profile.plan.offers_up_to': 'Προσφορές: έως', 'profile.plan.valid_until': 'Ισχύει έως', 'profile.plan.no_expiry': 'Δεν λήγει', // Create task 'create.error': 'Σφάλμα κατά τη δημοσίευση', // Tasks list extras 'tasks.category.general': 'Γενικά', 'tasks.budget.range': 'Εύρος:', 'tasks.budget.from': 'από', 'tasks.budget.to': 'έως', 'tasks.filter.reset': 'Εκκαθάριση φίλτρων', 'tasks.load_more': 'Φόρτωση ακόμα', 'tasks.showing': 'Αποτελέσματα:', 'tasks.field.budget': 'Προϋπολογισμός, €', // Admin 'admin.title': 'Πίνακας Διαχείρισης', 'admin.tab.stats': 'Στατιστικά', 'admin.tab.users': 'Χρήστες', 'admin.tab.tasks': 'Εργασίες', 'admin.tab.reports': 'Αναφορές', 'admin.stats.users': 'Χρήστες', 'admin.stats.tasks': 'Εργασίες', 'admin.stats.offers': 'Προσφορές', 'admin.stats.reviews': 'Αξιολογήσεις', 'admin.tasks.by_status': 'Εργασίες ανά κατάσταση', 'admin.col.user': 'Χρήστης', 'admin.col.email': 'Email', 'admin.col.role': 'Ρόλος', 'admin.col.registered': 'Εγγραφή', 'admin.col.status': 'Κατάσταση', 'admin.col.title': 'Τίτλος', 'admin.col.budget': 'Προϋπολογισμός', 'admin.col.created': 'Δημιουργία', 'admin.users.active': 'Ενεργός', 'admin.users.inactive': 'Ανενεργός', 'admin.users.deactivate': 'Απενεργοποίηση', 'admin.users.activate': 'Ενεργοποίηση', 'admin.tasks.cancel': 'Ακύρωση', 'admin.reports.none': 'Δεν υπάρχουν αναφορές', 'admin.reports.reviewed': 'Αναθεωρήθηκε', 'admin.reports.dismiss': 'Απόρριψη', 'admin.pagination.total': 'Σύνολο', 'admin.users.role.change': 'Αλλαγή ρόλου', 'admin.users.search.placeholder': 'Αναζήτηση ονόματος ή email...', 'admin.tasks.delete': 'Διαγραφή', 'admin.tasks.delete.confirm': 'Διαγραφή αυτής της εργασίας μόνιμα;', 'admin.tasks.search.placeholder': 'Αναζήτηση τίτλου...', 'admin.col.customer': 'Πελάτης', 'admin.col.reporter': 'Καταγγέλλων', 'admin.col.target': 'Στόχος', 'admin.filter.all_roles': 'Όλοι οι ρόλοι', 'admin.filter.all_statuses': 'Όλες οι καταστάσεις', 'admin.reports.target.task': 'Εργασία', 'admin.reports.target.user': 'Χρήστης', 'admin.tab.categories': 'Κατηγορίες', 'admin.tab.locations': 'Πόλεις & Περιοχές', 'admin.tab.logs': 'Αρχεία', 'admin.tab.plans': 'Πακέτα', 'admin.tab.settings': 'Ρυθμίσεις', 'admin.logs.subtab.ai': 'AI Logs', 'admin.logs.subtab.activity': 'Δραστηριότητα', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Ειδοποιήσεις', 'admin.notif_logs.type': 'Τύπος', 'admin.notif_logs.title': 'Τίτλος', 'admin.notif_logs.read': 'Διαβασμένο', 'admin.notif_logs.empty': 'Δεν υπάρχουν αρχεία ειδοποιήσεων', 'admin.stats.notif_chart_title': 'Ειδοποιήσεις ανά ημέρα', 'admin.stats.notif_label': 'Ειδοποιήσεις', 'admin.stats.mail_chart_title': 'Emails ανά ημέρα', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'Όλα', 'admin.stats.specialists': 'Ειδικοί', 'admin.col.plan': 'Πακέτο', 'admin.back_home': 'Αρχική', 'admin.plans.title': 'Πακέτα συνδρομής', 'admin.plans.add': '+ Νέο πακέτο', 'admin.plans.empty': 'Δεν υπάρχουν πακέτα', 'admin.plans.form.new': 'Νέο πακέτο', 'admin.plans.form.edit': 'Επεξεργασία πακέτου', 'admin.plans.form.name': 'Όνομα', 'admin.plans.form.price': 'Τιμή (EUR)', 'admin.plans.form.old_price': 'Παλιά τιμή (EUR, προαιρετικό)', 'admin.plans.form.max_offers': 'Μέγ. προσφορές (κενό = χωρίς όριο)', 'admin.plans.form.max_cards': 'Μέγ. χαρτοφυλάκιο (κενό = χωρίς όριο)', 'admin.plans.form.duration_days': 'Διάρκεια (ημέρες, κενό = χωρίς λήξη)', 'admin.plans.form.description': 'Περιγραφή', 'admin.plans.form.features': 'Δυνατότητες (μία ανά γραμμή)', 'admin.plans.form.notify': 'Ειδοποιήσεις νέων εργασιών', 'admin.plans.form.default': 'Προεπιλογή', 'admin.plans.form.active': 'Ενεργό', 'admin.plans.form.order': 'Σειρά', 'admin.plans.form.role': 'Ρόλος', 'admin.plans.form.tier': 'Επίπεδο', 'admin.plans.form.role.customer': 'Πελάτης', 'admin.plans.form.role.specialist': 'Ειδικός', 'admin.plans.form.tier.free': 'Δωρεάν', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Όρια (κενό = χωρίς όριο)', 'admin.plans.form.max_messages_day': 'Μέγ. μηνύματα/ημέρα', 'admin.plans.form.max_orders_day': 'Μέγ. παραγγελίες/ημέρα', 'admin.plans.form.max_skills': 'Μέγ. δεξιότητες', 'admin.plans.form.max_profiles': 'Μέγ. προφίλ', 'admin.plans.form.max_portfolio': 'Μέγ. στοιχεία χαρτοφυλακίου', 'admin.plans.form.section.boost': 'Πολλαπλασιαστές & Ενίσχυση', 'admin.plans.form.search_boost': 'Ενίσχυση αναζήτησης', 'admin.plans.form.offers_multiplier': 'Πολλαπλασιαστής προσφορών', 'admin.plans.form.section.contact': 'Δικαιώματα επικοινωνίας', 'admin.plans.form.can_contact_free': 'Επικοινωνία με δωρεάν χρήστες', 'admin.plans.form.can_contact_pro': 'Επικοινωνία με Pro χρήστες', 'admin.plans.form.can_contact_all': 'Επικοινωνία με όλους', 'admin.plans.form.can_show_contact': 'Εμφάνιση στοιχείων επικοινωνίας', 'admin.plans.form.can_view_phone': 'Προβολή τηλεφώνου', 'admin.plans.form.section.features': 'Λειτουργίες', 'admin.plans.form.upload_video': 'Μεταφόρτωση βίντεο', 'admin.plans.form.favorites': 'Αγαπημένα', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Σήμα επαλήθευσης', 'admin.plans.form.highlighted_reviews': 'Προβεβλημένες κριτικές', 'admin.plans.form.personal_site': 'Προσωπική σελίδα', 'admin.plans.form.can_help_now': 'Κατάσταση «Μπορώ να βοηθήσω»', 'admin.plans.form.need_help': 'Κατάσταση «Χρειάζομαι βοήθεια»', 'admin.plans.form.auto_response': 'Αυτόματη απάντηση', 'admin.plans.form.auto_match': 'Αυτόματη αντιστοίχιση', 'admin.plans.form.instant_dispatch_free': 'Άμεση αποστολή (δωρεάν)', 'admin.plans.form.instant_dispatch_pro': 'Άμεση αποστολή (Pro)', 'admin.plans.badge.default': 'Προεπιλογή', 'admin.plans.badge.inactive': 'Ανενεργό', 'admin.plans.make_default': 'Ορισμός ως προεπιλογή', 'admin.plans.tasks': 'Εργασίες', 'admin.plans.offers': 'Προσφορές', 'admin.plans.cards': 'Χαρτοφυλάκιο', 'admin.plans.notify_tasks': 'Ειδοποιήσεις εργασιών', 'admin.plans.delete.confirm': 'Διαγραφή πακέτου', 'admin.activity.title': 'Αρχείο δραστηριότητας', 'admin.activity.event': 'Γεγονός', 'admin.activity.all_events': 'Όλα τα γεγονότα', 'admin.activity.from': 'Από', 'admin.activity.to': 'Έως', 'admin.activity.reset': 'Επαναφορά', 'admin.activity.total': 'Σύνολο', 'admin.activity.empty': 'Δεν υπάρχουν εγγραφές', 'admin.mail.event': 'Συμβάν email', 'admin.mail.all_events': 'Όλα τα email συμβάντα', 'admin.mail.from': 'Από', 'admin.mail.to': 'Έως', 'admin.mail.reset': 'Επαναφορά', 'admin.mail.total': 'Σύνολο', 'admin.mail.empty': 'Δεν υπάρχουν email logs', 'admin.mail.recipient': 'Παραλήπτης', 'admin.mail.provider': 'Πάροχος', 'admin.mail.details': 'Λεπτομέρειες', 'admin.mail.status': 'Κατάσταση', 'admin.mail.success': 'Επιτυχία', 'admin.mail.failed': 'Σφάλμα', 'admin.event.email_sent': 'Email sent', 'admin.event.email_failed': 'Email failed', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Admin test email sent', 'admin.event.admin_email_test_failed': 'Admin test email failed', 'admin.logs.empty': 'Δεν υπάρχουν εγγραφές', 'admin.logs.date': 'Ημερομηνία', 'admin.logs.provider': 'Πάροχος', 'admin.logs.model': 'Μοντέλο', 'admin.logs.action': 'Ενέργεια', 'admin.logs.langs': 'Γλώσσες', 'admin.logs.in': 'Είσοδος', 'admin.logs.out': 'Έξοδος', 'admin.logs.total': 'Σύνολο', 'admin.logs.ms': 'ms', 'admin.logs.status': 'Κατάσταση', 'admin.stats.activity_30d': 'Δραστηριότητα 30 ημερών', 'admin.stats.tasks_label': 'Εργασίες', 'admin.stats.users_label': 'Χρήστες', 'admin.stats.specialists_label': 'Ειδικοί', 'admin.stats.tokens_title': 'Χρήση tokens (ανά μήνα)', 'admin.stats.tokens_out': 'Εξερχόμενα', 'admin.stats.tokens_in': 'Εισερχόμενα', 'admin.stats.tokens_out_label': 'Εξερχόμενα tokens', 'admin.stats.tokens_in_label': 'Εισερχόμενα tokens', 'admin.stats.cost_label': 'Κόστος (USD)', 'admin.stats.tasks_by_status': 'Εργασίες ανά κατάσταση', 'admin.task_status.open': 'Ανοιχτές', 'admin.task_status.in_progress': 'Σε εξέλιξη', 'admin.task_status.completed': 'Ολοκληρωμένες', 'admin.task_status.cancelled': 'Ακυρωμένες', 'admin.task_status.draft': 'Προσχέδια', 'admin.settings.tab.general': 'Γενικά', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Ειδοποιήσεις', 'admin.settings.tab.payment': 'Πληρωμή', 'admin.settings.tab.referral': 'Παραπομπές', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO & Συντήρηση', 'admin.settings.seo.maintenance_label': 'Λειτουργία συντήρησης', 'admin.settings.seo.maintenance_hint': 'Εμφάνιση σελίδας συντήρησης σε όλους τους επισκέπτες', 'admin.settings.seo.indexing_label': 'Ευρετηρίαση από μηχανές αναζήτησης', 'admin.settings.seo.indexing_hint': 'Επιτρέπει στις μηχανές αναζήτησης να ευρετηριάσουν τον ιστότοπο', 'admin.settings.seo.head_scripts_label': 'Scripts στο (JS)', 'admin.settings.seo.head_scripts_hint': 'Εκτελείται σε κάθε σελίδα (Google Tag Manager, analytics κ.λπ.)', 'admin.settings.seo.site_title_label': 'Τίτλος ιστότοπου', 'admin.settings.seo.site_description_label': 'Περιγραφή ιστότοπου (meta description)', 'admin.settings.referral.title': 'Πρόγραμμα παραπομπών', 'admin.settings.referral.hint': 'Επιβράβευσε χρήστες που φέρνουν νέους εγγεγραμμένους.', 'admin.settings.referral.enabled_label': 'Ενεργό', 'admin.settings.referral.enabled_hint': 'Ενεργοποίηση / απενεργοποίηση εφαρμογής ανταμοιβών', 'admin.settings.referral.customer_section': 'Για πελάτες', 'admin.settings.referral.specialist_section': 'Για ειδικούς', 'admin.settings.referral.plan_label': 'Πλάνο ανταμοιβής', 'admin.settings.referral.no_plan': '— χωρίς πλάνο —', 'admin.settings.referral.plan_hint': 'Αυτό το πλάνο θα ανατεθεί στον χρήστη που έφερε νέους. Εάν το τρέχον πλάνο του είναι υψηλότερο, θα προστεθούν μόνο οι μέρες.', 'admin.settings.referral.days_label': 'Ημέρες ανταμοιβής', 'admin.settings.referral.days_hint': 'Αριθμός ημερών που θα προστεθούν στη λήξη του πλάνου.', 'admin.settings.general.title': 'Γενικές ρυθμίσεις', 'admin.settings.general.site_name': 'Όνομα ιστότοπου', 'admin.settings.general.site_url': 'URL ιστότοπου', 'admin.settings.general.contact_email': 'Email επικοινωνίας', 'admin.settings.general.support_phone': 'Τηλέφωνο υποστήριξης', 'admin.settings.smtp.title': 'Ρυθμίσεις SMTP', 'admin.settings.smtp.hint': 'Χρησιμοποιείται για αποστολή ειδοποιήσεων email.', 'admin.settings.smtp.host': 'SMTP Host', 'admin.settings.smtp.port': 'Θύρα', 'admin.settings.smtp.encryption': 'Κρυπτογράφηση', 'admin.settings.smtp.enc.none': 'Χωρίς', 'admin.settings.smtp.enc.tls': 'STARTTLS (θύρα 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (θύρα 465)', 'admin.settings.smtp.username': 'Όνομα χρήστη', 'admin.settings.smtp.password': 'Κωδικός / App Password', 'admin.settings.smtp.from_name': 'Όνομα αποστολέα', 'admin.settings.smtp.from_email': 'Email αποστολέα', 'admin.settings.smtp.test': 'Αποστολή δοκιμαστικού email', 'admin.settings.smtp.sending': 'Αποστολή...', 'admin.settings.payment.hint': 'Τα στοιχεία για ePay Piraeus Bank.', 'admin.settings.env.test': 'Δοκιμαστικό (sandbox)', 'admin.settings.env.prod': 'Παραγωγή', 'admin.settings.env.label': 'Περιβάλλον', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Ενεργό', 'admin.settings.saving': 'Αποθήκευση...', 'admin.settings.saved': '✓ Αποθηκεύτηκε', 'admin.notif.vars_hint': 'Διαθέσιμες μεταβλητές στα πρότυπα', 'admin.notif.tmpl.not_set': 'Πρότυπο δεν έχει οριστεί', 'admin.notif.tmpl.subject_label': 'Θέμα email', 'admin.notif.tmpl.body_label': 'Κείμενο email (HTML)', 'admin.notif.tmpl.save': 'Αποθήκευση', 'admin.notif.tmpl.close': 'Κλείσιμο', 'admin.notif.tmpl.translate': 'Αυτόματη μετάφραση', 'admin.notif.tmpl.translating': 'Μετάφραση...', 'admin.notif.tmpl.saving': 'Αποθήκευση...', 'admin.notif.email_verification': 'Επαλήθευση email', 'admin.notif.registration_success': 'Επιτυχής εγγραφή', 'admin.notif.password_reset': 'Επαναφορά κωδικού', 'admin.notif.new_offer': 'Νέα προσφορά', 'admin.notif.new_task': 'Νέα εργασία', 'admin.notif.offer_accepted': 'Προσφορά αποδεκτή', 'admin.notif.new_message': 'Νέο μήνυμα', 'admin.notif.offer_declined': 'Απόρριψη προσφοράς', 'admin.notif.offer_other_accepted': 'Επιλέχθηκε άλλος ειδικός', 'admin.notif.task_updated': 'Ενημέρωση εργασίας', 'admin.notif.deadline_reminder': 'Υπενθύμιση προθεσμίας', 'admin.notif.task_archived': 'Αυτόματη απόσυρση εργασίας', 'admin.notif.referral_reward': 'Ανταμοιβή παραπομπής', // Plan lifecycle email templates 'admin.email_template.plan_activated': 'Τιμολόγιο — ενεργοποίηση πλάνου', 'admin.email_template.plan_upgraded': 'Τιμολόγιο — αναβάθμιση πλάνου', 'admin.email_template.plan_downgrade_scheduled': 'Τιμολόγιο — προγραμματισμένη υποβάθμιση', 'admin.email_template.plan_downgrade_applied': 'Τιμολόγιο — εφαρμογή υποβάθμισης', 'admin.email_template.plan_renewal_reminder': 'Τιμολόγιο — υπενθύμιση ανανέωσης', 'admin.email_template.plan_insufficient_funds': 'Τιμολόγιο — ανεπαρκές υπόλοιπο', // Pricing confirm modal 'pricing.confirm.title': 'Επιβεβαίωση επιλογής πλάνου', 'pricing.confirm.plan': 'Πλάνο', 'pricing.confirm.prorated': 'Αναλογική έκπτωση', 'pricing.confirm.effective_price': 'Προς πληρωμή', 'pricing.confirm.your_balance': 'Το υπόλοιπό σας', 'pricing.confirm.downgrade_info': 'Η μετάβαση στο νέο πλάνο θα γίνει αυτόματα μετά τη λήξη της τρέχουσας περιόδου.', 'pricing.confirm.insufficient': 'Ανεπαρκές υπόλοιπο.', 'pricing.confirm.top_up': 'Ανανέωση', 'pricing.confirm.schedule_downgrade': 'Προγραμματισμός μετάβασης', 'pricing.confirm.pay': 'Πληρωμή', 'admin.user_edit.title': 'Επεξεργασία χρήστη', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Εγγραφή', 'admin.user_edit.last_seen': 'Τελευταία σύνδεση', 'admin.user_edit.lang': 'Γλώσσα', 'admin.user_edit.first_name': 'Όνομα', 'admin.user_edit.last_name': 'Επώνυμο', 'admin.user_edit.phone': 'Τηλέφωνο', 'admin.user_edit.bio': 'Βιογραφικό', 'admin.user_edit.role': 'Ρόλος', 'admin.user_edit.plan': 'Πακέτο', 'admin.user_edit.no_plan': '— Χωρίς πακέτο —', 'admin.user_edit.active': 'Ενεργός λογαριασμός', 'admin.user_edit.balance': 'Υπόλοιπο (EUR)', 'admin.user_edit.skills': 'Δεξιότητες', 'admin.user_edit.tab.profile': 'Προφίλ', 'admin.user_edit.tab.account': 'Λογαριασμός', 'admin.user_edit.tab.balance': 'Υπόλοιπο', 'admin.user_edit.tab.settings': 'Ρυθμίσεις', 'admin.user_edit.tab.specialist': 'Χαρτοφυλάκιο', 'admin.user_edit.tab.site': 'Ιστοσελίδα', 'admin.user_edit.plan_expires': 'Λήξη πλάνου', 'admin.user_edit.interface_lang': 'Γλώσσα διεπαφής', 'admin.user_edit.comm_languages': 'Γλώσσες επικοινωνίας', 'admin.user_edit.personal_site_slug': 'Προσωπική σελίδα', 'admin.user_edit.show_contact_info': 'Εμφάνιση στοιχείων επικοινωνίας', 'admin.user_edit.show_contact_info.hint': 'Ορατό στους πελάτες', 'admin.user_edit.notify_new_tasks': 'Ειδοποίηση για νέες εργασίες', 'admin.user_edit.notify_new_tasks.hint': 'Push και email ειδοποιήσεις', 'admin.user_edit.notif_messages': 'Ειδοποιήσεις μηνυμάτων', 'admin.user_edit.notif_messages.hint': 'Νέα μηνύματα στη συνομιλία', 'admin.user_edit.site_settings': 'Ρυθμίσεις προσωπικής σελίδας', 'admin.user_edit.categories': 'Κατηγορίες υπηρεσιών', 'admin.user_edit.locations': 'Περιοχές εξυπηρέτησης', 'admin.user_edit.skill_placeholder': 'Νέα δεξιότητα...', 'admin.user_edit.add_category': '— Επιλέξτε κατηγορία —', 'admin.user_edit.add_location': '— Επιλέξτε περιοχή —', 'admin.user_edit.specialist_cards': 'Χαρτοφυλάκιο ειδικού', 'admin.user_edit.no_cards': 'Δεν βρέθηκαν στοιχεία χαρτοφυλακίου', 'admin.user_edit.card_title': 'Τίτλος χαρτοφυλακίου', 'admin.user_edit.card_description': 'Περιγραφή', 'admin.balance.topup.btn': 'Αναπλήρωση', 'admin.balance.withdraw.btn': 'Αφαίρεση', 'admin.balance.modal_hint': 'Οι αλλαγές ισχύουν άμεσα και καταγράφονται στο ιστορικό', 'admin.balance.topup.title': 'Αναπλήρωση υπολοίπου', 'admin.balance.topup.amount': 'Ποσό', 'admin.balance.topup.description': 'Σχόλιο', 'admin.balance.topup.description.placeholder': 'Για παράδειγμα: bonus ή χειροκίνητη αναπλήρωση', 'admin.balance.topup.submit': 'Αναπλήρωση υπολοίπου', 'admin.balance.withdraw.title': 'Αφαίρεση υπολοίπου', 'admin.balance.withdraw.amount': 'Ποσό', 'admin.balance.withdraw.description': 'Σχόλιο', 'admin.balance.withdraw.description.placeholder': 'Για παράδειγμα: επιστροφή ή χειροκίνητη χρέωση', 'admin.balance.withdraw.submit': 'Αφαίρεση από το υπόλοιπο', 'admin.user_edit.role.customer': 'Πελάτης', 'admin.user_edit.role.specialist': 'Ειδικός', 'admin.user_edit.role.admin': 'Διαχειριστής', 'common.refresh': 'Ανανέωση', 'common.back_home': 'Αρχική', 'admin.loc.hint': 'Διαχείριση πόλεων και συνοικιών', 'admin.loc.add_city': 'Νέα πόλη', 'admin.loc.add_district': 'Προσθήκη συνοικίας', 'admin.loc.new': 'Νέα τοποθεσία', 'admin.loc.edit': 'Επεξεργασία τοποθεσίας', 'admin.loc.district': 'συνοικία', 'admin.loc.empty': 'Δεν υπάρχουν τοποθεσίες', 'admin.loc.delete.confirm': 'Διαγραφή τοποθεσίας; Όλες οι συνοικίες θα διαγραφούν επίσης.', 'admin.cat.add_root': 'Νέα κατηγορία', 'admin.cat.add_sub': 'Υποκατηγορία', 'admin.cat.edit': 'Επεξεργασία', 'admin.cat.delete': 'Διαγραφή', 'admin.cat.delete.confirm': 'Διαγραφή κατηγορίας; Όλες οι υποκατηγορίες θα διαγραφούν επίσης.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Εικονίδιο', 'admin.cat.name_el': 'Ελληνικά', 'admin.cat.name_en': 'Αγγλικά', 'admin.cat.name_ru': 'Ρωσικά', 'admin.cat.order': 'Σειρά', 'admin.cat.active': 'Ενεργή', 'admin.cat.parent': 'Γονική κατηγορία', 'admin.cat.no_parent': 'Κορυφαίο επίπεδο', 'admin.cat.save': 'Αποθήκευση', 'admin.cat.cancel': 'Ακύρωση', 'admin.cat.empty': 'Δεν υπάρχουν κατηγορίες', 'admin.cat.hint': 'Διαχείριση κατηγοριών με πολυεπίπεδη ιεραρχία', 'admin.cat.new': 'Νέα κατηγορία', 'admin.cat.subcategory': 'υποκατηγορία', 'admin.cat.add_child': 'Προσθήκη υποκατηγορίας', 'admin.cat.inactive': 'Ανενεργή', 'admin.event.user_login': 'Σύνδεση', 'admin.event.user_register': 'Εγγραφή', 'admin.event.admin_user_deactivate': 'Αποκλεισμός χρήστη', 'admin.event.admin_user_activate': 'Ενεργοποίηση χρήστη', 'admin.event.admin_user_role_changed': 'Αλλαγή ρόλου', 'admin.event.admin_task_cancelled': 'Ακύρωση εργασίας', 'admin.event.admin_task_deleted': 'Διαγραφή εργασίας', 'admin.event.admin_report_reviewed': 'Αναφορά εξετάστηκε', 'admin.event.admin_report_dismissed': 'Αναφορά απορρίφθηκε', 'admin.event.task_created': 'Δημιουργία εργασίας', 'user.online': 'Σε σύνδεση', 'user.seen_minutes': 'ήταν εδώ πριν {n} λεπτά', 'user.seen_hours': 'ήταν εδώ πριν {n} ώρες', 'user.seen_yesterday': 'ήταν εδώ χθες', 'user.seen_days': 'ήταν εδώ πριν {n} μέρες', // Specialists 'specialists.title': 'Ειδικοί', 'specialists.search': 'Αναζήτηση ειδικού...', 'specialists.search.btn': 'Αναζήτηση', 'specialists.empty': 'Δεν βρέθηκαν ειδικοί', 'specialists.no_bio': 'Χωρίς περιγραφή', 'specialists.view': 'Προβολή προφίλ', 'specialists.reviews': 'αξιολογήσεις', 'specialist.favorite': 'Προσθήκη στα αγαπημένα', 'specialist.unfavorite': 'Αφαίρεση από αγαπημένα', 'specialist.site_link': 'Προσωπικό site', 'favorites.specialists.title': 'Αγαπημένοι ειδικοί', 'favorites.specialists.empty': 'Δεν έχετε αγαπημένους ειδικούς', 'nav.favorites': 'Αγαπημένα', 'nav.schedule': 'Πρόγραμμα', 'nav.find_tasks': 'Αναζήτηση εργασιών', 'schedule.title': 'Το πρόγραμμά μου', 'schedule.subtitle': 'Σημειώστε τις ημέρες που είστε ελεύθεροι ή απασχολημένοι — οι πελάτες θα δουν τη διαθεσιμότητά σας', 'schedule.available': 'Ελεύθερος', 'schedule.busy': 'Απασχολημένος', 'schedule.unset': 'Μη ορισμένο', 'schedule.click_hint': '← κλικ για εναλλαγή κατάστασης', 'schedule.range_mode': 'Επιλογή εύρους', 'schedule.range_from': 'Από {date} — επιλέξτε τελική ημερομηνία', 'schedule.click_to_set': 'Κλικ για ορισμό', 'schedule.free': 'ελεύθερα', 'schedule.busy_count': 'απασχολημένα', 'schedule.free_days': 'ελεύθερες ημέρες', 'schedule.googleCalendar': 'Google Calendar', 'schedule.connectGoogle': 'Σύνδεση με Google Calendar', 'schedule.disconnectGoogle': 'Αποσύνδεση', 'schedule.connectedAs': 'Συνδεδεμένο ως', 'schedule.importFromGoogle': 'Συγχρονισμός από Google', 'schedule.gcalConnected': '✓ Google Calendar συνδέθηκε', 'schedule.gcalError': 'Σφάλμα σύνδεσης Google Calendar', 'schedule.gcalImportDone': 'Εισήχθησαν {n} ημερ. από Google Calendar', 'schedule.gcalAutoSyncNote': 'Οι αλλαγές αποστέλλονται αυτόματα στο Google Calendar', 'schedule.gcalConnectDesc': 'Συνδέστε το Google Calendar για αυτόματο συγχρονισμό', 'schedule.gcalDisconnectConfirm': 'Αποσύνδεση Google Calendar;', 'find_tasks.title': 'Αναζήτηση εργασιών', 'find_tasks.for_me': 'Για μένα', 'find_tasks.all': 'Όλες οι εργασίες', 'find_tasks.by_category': 'Ανά κατηγορία', 'find_tasks.list': 'Λίστα', 'find_tasks.already_offered': 'Προσφορά υποβλήθηκε', 'find_tasks.offer_now': 'Υποβολή προσφοράς', 'find_tasks.empty_for_me': 'Δεν βρέθηκαν εργασίες στις κατηγορίες σας', 'find_tasks.banner_hint': 'Βρείτε εργασίες που ταιριάζουν με το χαρτοφυλάκιό σας', 'find_tasks.no_cards': 'Δημιουργήστε ένα χαρτοφυλάκιο ειδικού για να δείτε εργασίες για εσάς', 'find_tasks.add_card': 'Δημιουργία χαρτοφυλακίου', 'find_tasks.search': 'Αναζήτηση εργασιών...', 'find_tasks.tasks_count': 'εργασίες', // Footer 'footer.tagline': 'Η πλατφόρμα εργασιών για την Ελλάδα', 'footer.rights': 'Όλα τα δικαιώματα διατηρούνται.', // App download section 'app.download_title': 'Κατεβάστε την εφαρμογή CanHelp', 'app.download_desc': 'Όλο το CanHelp — πάντα μαζί σας. Διαθέσιμο για Android και iOS.', // Nav 'nav.pricing': 'Τιμές', // Pricing page 'pricing.title': 'Τιμολόγηση', 'pricing.subtitle': 'Επιλέξτε το κατάλληλο πρόγραμμα', 'pricing.role.customer': 'Πελάτης', 'pricing.role.specialist': 'Ειδικός', 'pricing.free': 'Δωρεάν', 'pricing.per_month': 'μήνα', 'pricing.duration': 'Διάρκεια', 'pricing.days': 'ημ.', 'pricing.current_plan': 'Το πρόγραμμά σας', 'pricing.popular': 'Δημοφιλές', 'pricing.choose': 'Επιλογή', 'pricing.your_plan': 'Ενεργό πρόγραμμα', 'pricing.free_default': 'Προεπιλογή', 'pricing.compare': 'Σύγκριση λειτουργιών', 'pricing.feature': 'Λειτουργία', 'pricing.faq_note': 'Η πληρωμή γίνεται από το υπόλοιπο CanHelp. Ανατροφοδότηση διαθέσιμη στην Πληρωμή.', 'pricing.feat.messages': 'Μηνύματα / ημέρα', 'pricing.feat.orders': 'Παραγγελίες / ημέρα', 'pricing.feat.contact_all': 'Επικοινωνία με όλους', 'pricing.feat.view_phone': 'Εμφάνιση τηλεφώνου', 'pricing.feat.show_contact': 'Εμφάνιση στοιχείων επαφής', 'pricing.feat.favorites': 'Αγαπημένα', 'pricing.feat.verified_badge': 'Επαληθευμένο badge', 'pricing.feat.google_calendar': 'Google Calendar', 'pricing.feat.personal_site': 'Προσωπικό site', 'pricing.feat.auto_response': 'Αυτόματη απάντηση', 'pricing.feat.auto_match': 'Αυτόματη αντιστοίχιση', 'pricing.feat.highlighted_reviews': 'Επισημασμένες αξιολογήσεις', 'pricing.feat.portfolio': 'Στοιχεία χαρτοφυλακίου', 'pricing.feat.cards': 'Κάρτες ειδικού', 'pricing.feat.notify_tasks': 'Ειδοποιήσεις νέων εργασιών', 'pricing.feat.video': 'Βίντεο στο χαρτοφυλάκιο', // Upgrade prompt 'upgrade.available_in': 'Διαθέσιμο στο', 'upgrade.cta': 'Αναβάθμιση', // Dashboard plan block 'dashboard.plan.title': 'Το πρόγραμμά μου', 'dashboard.plan.expires': 'Λήγει σε {n} ημέρες', 'dashboard.plan.upgrade': 'Αναβάθμιση προγράμματος', 'dashboard.plan.no_plan': 'Δωρεάν πρόγραμμα', 'dashboard.plan.messages': 'Μηνύματα σήμερα', 'dashboard.plan.orders': 'Παραγγελίες σήμερα', 'dashboard.plan.limits': 'Ημερήσια όρια', 'dashboard.plan.features': 'Λειτουργίες', 'dashboard.plan.stats': 'Στατιστικά', 'dashboard.stats.cards': 'Χαρτοφυλάκια', 'dashboard.stats.maxCards': 'Μέγ. χαρτοφυλάκια', 'dashboard.stats.portfolioItems': 'Στοιχεία portfolio', 'dashboard.stats.maxPortfolioItems': 'Μέγ. στοιχεία', 'dashboard.stats.activeOffers': 'Ενεργές προσφορές', 'dashboard.stats.reviewsReceived': 'Αξιολογήσεις', 'dashboard.stats.activeTasks': 'Ενεργές εργασίες', 'dashboard.stats.completedTasks': 'Ολοκληρωμένες', 'status.can_help_now': 'Είμαι διαθέσιμος τώρα', 'status.need_help': 'Χρειάζομαι βοήθεια', 'status.active': 'Ενεργό', 'status.toggle_on': 'Ενεργοποίηση', 'status.toggle_off': 'Απενεργοποίηση', // FOMO 'fomo.missed_orders': 'Χάσατε {n} παραγγελίες', 'fomo.missed_value': 'Αξία €{v}', 'fomo.upgrade_hint': 'Αναβαθμίστε για να λαμβάνετε περισσότερες παραγγελίες', 'fomo.conversion': 'Μετατροπές εργασιών', 'fomo.active': 'Ενεργές', 'fomo.with_offers': 'Με προσφορές', 'fomo.completed': 'Ολοκληρωμένες', 'fomo.already_offered': '{n} ειδικοί έχουν ήδη απαντήσει', 'fomo.specialist_missed': 'Χάσατε {n} παραγγελίες', 'fomo.top_categories': 'Κατηγορίες', 'fomo.offers_received': 'προσφορές ελήφθησαν', 'fomo.avg_offers': 'Μέσο {n}/εργασία', 'fomo.completion_rate': 'ολοκληρωμένες', // Task auto-match 'task.auto_match': 'Αυτόματη αντιστοίχιση', 'task.auto_match_results': 'Κορυφαίοι ειδικοί', 'task.no_offer_yet': 'Δεν έχετε στείλει προσφορά ακόμα', 'task.make_offer': 'Αποστολή προσφοράς', 'auto_response.title': 'Αυτόματη Απάντηση', 'auto_response.enabled': 'Ενεργοποίηση αυτόματης απάντησης', 'auto_response.min_budget': 'Ελάχ. προϋπολογισμός', 'auto_response.max_budget': 'Μέγ. προϋπολογισμός', 'auto_response.default_price': 'Προεπιλεγμένη τιμή', 'auto_response.default_message': 'Προεπιλεγμένο μήνυμα', 'auto_response.max_per_day': 'Μέγ. αυτόματες προσφορές/ημέρα', 'auto_response.save': 'Αποθήκευση', 'auto_response.saved': 'Αποθηκεύτηκε', 'auto_response.categories': 'Κατηγορίες', 'auto_response.locations': 'Τοποθεσίες', // Personal site 'profile.personal_site': 'Προσωπικό Site', 'profile.site_slug': 'Slug URL', 'profile.site_slug_hint': 'Μόνο λατινικοί χαρακτήρες, αριθμοί, - και _', 'profile.site_open': 'Άνοιγμα site', 'profile.site_preview': 'Το site σας', 'profile.show_contact': 'Εμφάνιση στοιχείων επαφής', 'profile.show_contact_hint': 'Πελάτες με Pro/Ultimate πρόγραμμα θα βλέπουν το τηλέφωνό σας', // Google Calendar plan gate 'gcal.upgrade_required': 'Το Google Calendar απαιτεί Pro ή Ultimate πρόγραμμα', // Chat limits 'chat.limit_warning': 'Απομένουν {n} μηνύματα σήμερα', 'chat.limit_reached': 'Εξαντλήθηκαν τα μηνύματα. Αναβαθμίστε το πρόγραμμά σας', 'chat.upgrade': 'Αναβάθμιση', // Site page 'site.member_since': 'Μαζί μας από', 'site.rating': 'Βαθμολογία', 'site.completed_tasks': 'Ολοκληρώθηκαν', 'site.languages': 'Γλώσσες', 'site.photos': 'φωτ.', 'site.contact_form': 'Επικοινωνία', 'site.contact_sent': 'Το μήνυμα στάλθηκε!', 'site.contact_sent_desc': 'Ο ειδικός θα επικοινωνήσει μαζί σας σύντομα', 'site.contact_name': 'Όνομα', 'site.contact_name_ph': 'Το όνομά σας', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Μήνυμα', 'site.contact_message_ph': 'Περιγράψτε την εργασία σας...', 'site.contact_send': 'Αποστολή', 'site.share': 'Κοινοποίηση', 'site.speaks_languages': 'Μιλάει', 'site.message_sent': 'Το μήνυμα εστάλη!', 'site.message_sent_desc': 'Ο ειδικός θα το λάβει στη συνομιλία', 'site.message_placeholder': 'Γράψτε το μήνυμά σας...', 'site.write_to_chat': 'Γράψτε στο chat', 'site.auth_required_title': 'Απαιτείται σύνδεση', 'site.auth_required_desc': 'Για να γράψετε στο chat, χρειάζεται να συνδεθείτε στο λογαριασμό σας.', 'site.auth_login_btn': 'Σύνδεση', 'site.auth_contact_form_btn': 'Επικοινωνία μέσω φόρμας', 'specialist.services': 'Υπηρεσίες', 'portfolio.title': 'Χαρτοφυλάκιο', 'common.not_found': 'Η σελίδα δεν βρέθηκε', 'common.anonymous': 'Ανώνυμα' }, en: { 'footer.slogan': 'Your task — our care! We solve any issue quickly and easily.', 'footer.links': 'Links', 'footer.socials': 'Socials', 'nav.home': 'Home', 'nav.tasks': 'Tasks', 'nav.post': '+ Post task', 'nav.dashboard': 'Dashboard', 'nav.chat': 'Messages', 'nav.notifications': 'Notifications', 'nav.profile': 'Profile', 'nav.admin': 'Admin Panel', 'nav.specialists': 'Specialists', 'nav.new_task': 'New task', 'nav.login': 'Login', 'nav.register': 'Register', 'nav.logout': 'Logout', 'hero.title': 'Find a specialist for any job', 'hero.subtitle': 'Post a task, receive offers and choose the best professional', 'hero.cta.post': 'Post a task', 'hero.cta.browse': 'Find work', 'hero.search.placeholder': 'What do you need? e.g. electrician, cleaning...', 'stats.specialists': 'specialists', 'stats.tasks': 'tasks', 'stats.categories': 'categories', 'stats.free': 'free sign-up', 'section.categories': 'Create a task in any category', 'section.how': 'How it works', 'section.recent': 'Recent tasks', 'section.all': 'See all →', 'section.more': 'more', 'section.cities': 'Cities & Districts', 'section.community': 'A community project for everyone', 'community.subtitle': 'CanHelp is not just a marketplace — it\'s a community of mutual help. Anyone with knowledge or a skill can find a client. Anyone with a problem can find a specialist.', 'community.point1.title': 'Are you good at something?', 'community.point1.desc': 'Repairs, tutoring, design, translation, care — every skill has value. Create a profile and find clients near you.', 'community.point2.title': 'Need help with something?', 'community.point2.desc': 'Post a task in under a minute and receive offers from verified specialists in your city.', 'community.point3.title': 'Help the project grow', 'community.point3.desc': 'CanHelp grows through communities. Share the link with friends and acquaintances — together we build something useful for everyone.', 'community.share': 'Share with friends', 'community.share.copied': 'Link copied!', // Referral section on home page 'section.referral': 'Referral Program', 'referral.home.subtitle': 'Share your link — every new user who signs up through it earns you a reward.', 'referral.home.step1.title': 'Sign up and get your link', 'referral.home.step1.desc': 'Create an account and find your unique referral link in your profile.', 'referral.home.step2.title': 'Share with friends', 'referral.home.step2.desc': 'Send the link to friends, acquaintances, or post it on social media.', 'referral.home.step3.title': 'Earn rewards', 'referral.home.step3.desc': 'Once your friend verifies their email, you automatically receive your reward.', 'referral.home.cta': 'Get your link', 'referral.home.badge': 'Referral Program', // FAQ section 'section.faq': 'Frequently Asked Questions', 'faq.q1': 'How does CanHelp work?', 'faq.a1': 'Post a task, receive offers from specialists, choose the best one and start working together. It\'s fast, simple and free for customers.', 'faq.q2': 'How much does it cost to use the platform?', 'faq.a2': 'Registration and task posting is completely free for customers. Specialists have access to a free plan as well as premium options.', 'faq.q3': 'How can I become a specialist?', 'faq.a3': 'Register, go to «Become a Specialist», fill in your profile with skills and categories, and start receiving tasks.', 'faq.q4': 'How do I choose the right specialist?', 'faq.a4': 'Check their reviews, experience, skills and portfolio. Chat with them through the platform and discuss the details before deciding.', 'faq.q5': 'What if I am not satisfied?', 'faq.a5': 'You can leave a review about the specialist and rate them from 1 to 5 stars. Reviews help other users find trusted professionals.', 'faq.q6': 'Can I contact a specialist before accepting their offer?', 'faq.a6': 'Yes. Once you receive an offer, you can open a chat with the specialist, ask questions and discuss all the details before making a decision.', 'faq.q7': 'How long does it take to receive offers?', 'faq.a7': 'Usually within a few hours. Specialists get notified about new tasks and can respond quickly.', 'faq.q8': 'Can I post a task in any city in Greece?', 'faq.a8': 'Yes! CanHelp covers all of Greece — Athens, Thessaloniki, Patras and more.', 'faq.q9': 'What types of tasks can I find on CanHelp?', 'faq.a9': 'Repairs, cleaning, electricians, tutoring, design, IT, moving, beauty and much more. Categories are constantly expanding.', 'faq.q10': 'Is there a mobile app?', 'faq.a10': 'Yes! CanHelp is available for Android and iOS. Download the app and manage everything from your phone.', 'how.step1.title': 'Post a task', 'how.step1.desc': 'Describe what you need and set your budget', 'how.step2.title': 'Receive offers', 'how.step2.desc': 'Specialists will send you offers with price and timeline', 'how.step3.title': 'Choose & start', 'how.step3.desc': 'Pick the best professional and start the collaboration', 'tasks.title': 'tasks', 'tasks.filters': 'Filters', 'tasks.search': 'Search', 'tasks.search.placeholder': 'Title or keyword...', 'tasks.search.btn': 'Search', 'tasks.publish': 'Post', 'tasks.category.all': 'All', 'tasks.category.all_in': 'All in', 'tasks.category.label': 'Category', 'tasks.location.label': 'City', 'tasks.location.placeholder': 'e.g. Athens', 'tasks.empty': 'No tasks found', 'tasks.empty.cta': 'Post the first one', 'task.status.open': 'Open', 'task.status.in_progress': 'In progress', 'task.status.completed': 'Completed', 'task.status.cancelled': 'Cancelled', 'task.status.draft': 'Draft', 'task.budget': 'Budget', 'task.location': 'Location', 'task.deadline': 'Start date', 'task.created_at': 'Created', 'task.customer': 'Customer', 'task.offer.btn': 'Submit offer', 'task.invite.banner_title': "You've been invited to this task", 'task.invite.banner_hint': 'The customer personally invited you', 'task.invite.accept': 'Send offer', 'task.invite.decline': 'Decline', 'offer.accept': 'Accept', 'offer.decline': 'Decline', 'task.complete': 'Complete task', 'task.complete.confirm': 'Mark this task as complete?', 'task.edit': 'Edit', 'task.status_label': 'Status', 'task.yours': 'Your task', 'task.offer.yours': 'Your offer', 'review.leave': 'Leave a review', 'review.rating': 'Rating', 'review.comment': 'Comment', 'review.comment.placeholder': 'Tell us about your experience...', 'review.submit': 'Submit review', 'review.submitting': 'Submitting...', 'review.done': 'Review submitted!', 'profile.reviews': 'Reviews', 'profile.no_reviews': 'No reviews yet', 'profile.rating': 'Rating', 'profile.skills.label': 'Skills', 'profile.member_since': 'Member since', 'task.offers': 'Offers', 'task.offers.none': 'No offers yet', 'create.title': 'Post a task', 'create.field.title': 'Title', 'create.field.description': 'Description', 'create.field.category': 'Category', 'create.field.category.select': 'Select...', 'create.field.location': 'Location', 'create.field.location.any': 'Anywhere', 'create.field.location.all': 'Entire city', 'create.field.budget': 'Budget (€)', 'create.field.deadline': 'Start date', 'create.field.budget_negotiable': 'Price is negotiable', 'create.field.time_slot': 'Time slot', 'create.field.time_slot.any': 'Anytime', 'create.field.time_slot.morning': 'Morning (08:00–13:00)', 'create.field.time_slot.afternoon': 'Afternoon (13:00–18:00)', 'create.field.time_slot.evening': 'Evening (18:00–22:00)', 'create.field.time_slot.weekend': 'Weekend', 'create.field.address': 'Address (optional)', 'create.field.address.district': 'District', 'create.field.address.street': 'Street', 'create.field.address.house': 'Number', 'create.field.confidential': 'Confidential note', 'create.field.confidential.placeholder': 'Details visible only to the assigned specialist...', 'create.field.confidential.hint': 'Not shown publicly', 'create.field.photos': 'Photos', 'create.field.photos.add': 'Add photo', 'create.field.photos.uploading': 'Uploading...', 'task.budget_negotiable': 'Price negotiable', 'task.time_slot': 'Time slot', 'task.confidential': 'Confidential note', 'create.field.title.placeholder': 'e.g. Clean 80sqm apartment', 'create.field.description.placeholder': 'Describe in detail what you need...', 'create.field.location.placeholder': 'e.g. Athens, Kolonaki', 'create.field.budget.placeholder': 'e.g. 100', 'create.submit': 'Post task', 'create.submitting': 'Posting...', 'login.title': 'Welcome back', 'login.subtitle': 'Sign in to CanHelp', 'login.email': 'Email', 'login.password': 'Password', 'login.submit': 'Sign in', 'login.submitting': 'Signing in...', 'login.error': 'Invalid email or password', 'login.unverified.title': 'Verify your email address', 'login.unverified.desc': 'We sent a verification link to your email. Check your inbox (or spam) and click the link.', 'login.unverified.resend': 'Resend verification email', 'login.unverified.sending': 'Sending...', 'login.unverified.sent': '✓ Sent — check your inbox', 'profile.email.verified': 'Email verified', 'profile.email.not_verified': 'Email not verified', 'login.no_account': "Don't have an account?", 'login.register_link': 'Register', 'login.forgot_password': 'Forgot password?', 'login.or_continue_with': 'or continue with', 'login.continue_google': 'Continue with Google', 'forgot.title': 'Forgot password', 'forgot.subtitle': 'Enter your email to receive a reset link', 'forgot.email': 'Email', 'forgot.submit': 'Send reset link', 'forgot.submitting': 'Sending...', 'forgot.sent.title': 'Check your inbox', 'forgot.sent.desc': 'If an account exists with that email, we\'ll send you a password reset link.', 'forgot.back_to_login': 'Back to sign in', 'forgot.error': 'Could not send reset link. Check the email address and try again.', 'forgot.error.not_found': 'No account found with this email address.', 'forgot.error.send_failed': 'Failed to send email. Please try again later.', 'reset.title': 'New password', 'reset.subtitle': 'Enter your new password', 'reset.password': 'New password', 'reset.confirm': 'Confirm password', 'reset.submit': 'Change password', 'reset.submitting': 'Saving...', 'reset.success': 'Password changed successfully. Redirecting to sign in...', 'reset.back_to_login': 'Back to sign in', 'reset.error.mismatch': 'Passwords do not match', 'reset.error.invalid': 'Invalid or expired link. Please request a new one.', 'register.title': 'Register', 'register.subtitle': 'Create a CanHelp account', 'register.first_name': 'First name', 'register.last_name': 'Last name', 'register.email': 'Email', 'register.password': 'Password (min 8 characters)', 'register.role': 'Role', 'register.role.customer': 'User', 'register.role.customer.desc': 'I post tasks', 'register.role.specialist': 'Specialist', 'register.role.specialist.desc': 'I take on tasks', 'register.submit': 'Create account', 'register.submitting': 'Registering...', 'register.has_account': 'Already have an account?', 'register.login_link': 'Sign in', 'register.continue_google': 'Continue with Google', 'register.check_email.title': 'Check your email', 'register.check_email.desc': 'We sent a verification link to your email address. Check your inbox (or spam) and click the link.', 'register.check_email.login': 'Back to sign in', 'dashboard.title': 'Dashboard', 'dashboard.new_task': '+ New task', 'dashboard.my_tasks': 'My tasks', 'dashboard.my_offers': 'My offers', 'dashboard.invitations': 'Job invitations', 'dashboard.offers_count': 'offers', 'dashboard.declined_count': 'declined', 'dashboard.completed_tasks': 'Completed tasks', 'dashboard.completed_offers': 'Completed offers', 'dashboard.review_pending': 'Review not yet submitted', 'tasks.new.top_specialists': 'Top specialists', 'tasks.new.select_category': 'Select a category to see matching specialists', 'tasks.new.invite': 'Offer work', 'tasks.new.invited': 'Selected ✓', 'reviews.count': 'reviews', 'filter.location': 'Location', 'filter.language': 'Languages', 'filter.language.any': 'Any language', 'filter.category.all': 'All categories', 'user.categories': 'Categories', 'user.work_area': 'Work area', 'dashboard.tasks.empty': "You haven't posted any tasks", 'dashboard.tasks.empty.cta': 'Post your first one', 'dashboard.tasks.add_new': 'Add a new task', 'dashboard.offers.empty': "You haven't submitted any offers", 'dashboard.offers.empty.cta': 'Find tasks', 'dashboard.customer.specialists_title': 'Looking for a specialist?', 'dashboard.customer.specialists_hint': 'Browse specialist profiles, read reviews and invite them to your tasks', 'dashboard.customer.specialists_cta': 'Find a specialist', 'dashboard.customer.how_title': 'How it works', 'dashboard.customer.step1': 'Create a task with a description and budget', 'dashboard.customer.step2': 'Specialists will send offers with price and timeline', 'dashboard.customer.step3': 'Choose the right one and start working', 'notif.title': 'Notifications', 'notif.mark_all': 'Mark all as read', 'notif.empty': 'No notifications', 'notif.type.new_offer': 'New offer', 'notif.type.offer_accepted': 'Your offer was accepted', 'notif.type.offer_declined': 'Your offer was declined', 'notif.type.task_completed': 'Task completed', 'notif.type.task_cancelled': 'Task cancelled', 'notif.type.new_message': 'New message', 'notif.type.new_review': 'New review', 'notif.type.task_invite': 'Job invitation', 'notif.body.new_offer': 'New offer for «{title}»', 'notif.body.offer_accepted': 'Your offer for «{title}» was accepted', 'notif.body.offer_declined': 'Your offer for «{title}» was declined', 'notif.body.task_invite': 'You\'ve been invited for «{title}»', 'notif.body.new_review': 'You received a {rating}★ review', 'offer.status.pending': 'Pending', 'offer.status.accepted': 'Accepted', 'offer.status.declined': 'Declined', 'offer.status.withdrawn': 'Withdrawn', 'offer.status.other_accepted': 'Another specialist was chosen', 'common.loading': 'Loading...', 'common.error': 'Error', 'common.save': 'Save', 'common.saving': 'Saving...', 'common.cancel': 'Cancel', 'common.add': 'Add', 'common.close': 'Close', 'common.edit': 'Edit', 'common.delete': 'Delete', 'common.from': 'by', 'common.currency': '€', 'common.greece': 'Greece', // Chat 'chat.connected': 'Connected', 'chat.disconnected': 'Disconnected', 'chat.no_rooms': 'No conversations yet', 'chat.task_fallback': 'Task', 'chat.select': 'Select a conversation', 'chat.no_messages': 'No messages yet', 'chat.placeholder': 'Write a message... (Enter to send)', 'chat.conversation_fallback': 'Conversation', 'chat.direct_chat': 'Direct chat', 'chat.linked_task': 'Linked task', 'chat.write_btn': 'Message', 'chat.just_now': 'just now', 'chat.min_ago': 'm', 'chat.write_specialist': 'Write to specialist', 'chat.write_customer': 'Write to customer', 'chat.notif_settings': 'Notification settings', 'chat.notif_messages': 'Notifications for new messages', 'chat.toast_title': 'New message', 'chat.toast_open': 'Open chat', // Offer form 'offer.price': 'Price', 'offer.price.placeholder': 'e.g. 80', 'offer.customer_budget': 'Client budget', 'offer.message': 'Message', 'offer.optional': 'optional', 'offer.message.placeholder': 'Introduce yourself, your experience and why you are the best choice...', 'offer.submitting': 'Sending...', // Profile 'profile.photo': 'Profile photo', 'profile.photo.change': 'Change photo', 'profile.photo.hint': 'JPEG, PNG, WebP · up to 5MB', 'profile.basic_info': 'Basic info', 'profile.phone': 'Phone', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Short bio', 'profile.bio.placeholder': 'Tell us a bit about yourself...', 'profile.language': 'Language', 'profile.language.hint': 'App interface and email notification language', 'profile.languages': 'Languages spoken', 'profile.languages.hint': 'Select all languages you speak', 'profile.skills': 'Skills', 'profile.skills.subtitle': 'Add the services you offer', 'profile.skills.placeholder': 'e.g. Cleaning, IT, Tutoring...', 'profile.role': 'Account role', 'profile.role.specialist': '🔧 Specialist', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 User', 'profile.role.change': 'To change your role please contact support.', 'profile.become_specialist': 'Become a Specialist', 'profile.become_specialist.desc': 'Upgrade to Specialist to take on tasks and build your profile.', 'become_specialist.hero.title': 'Earn money doing what you do best', 'become_specialist.hero.subtitle': 'Create a specialist profile and receive orders from clients across Greece', 'become_specialist.how.title': 'How it works', 'become_specialist.step1.title': 'Create a specialist portfolio', 'become_specialist.step1.desc': 'Set your categories, skills and coverage areas — the system will automatically match you with relevant tasks', 'become_specialist.step2.title': 'Find tasks', 'become_specialist.step2.desc': 'Discover tasks in your categories in the "Find Orders" section', 'become_specialist.step3.title': 'Send an offer & earn', 'become_specialist.step3.desc': 'Submit offers with price and timeline, chat with clients and complete tasks', 'become_specialist.benefits.title': 'Specialist profile advantages', 'become_specialist.benefit1': 'Task search filtered by your categories and location', 'become_specialist.benefit2': 'Public profile with client reviews', 'become_specialist.benefit3': 'Availability schedule visible to clients', 'become_specialist.benefit4': 'Saved to favourites by clients', 'become_specialist.cta': 'Become a Specialist — it\'s free', 'become_specialist.free_badge': 'Free registration', 'profile.tab.notifications': 'Notifications', 'profile.tab.reviews': 'Reviews', 'profile.tab.referral': 'Referrals', 'profile.tab.auto_response': 'Auto-response', 'profile.tab.site': 'Site', 'profile.site.title': 'Personal page', 'profile.site.url_label': 'Personal site', 'profile.site.copy': 'Copy', 'profile.site.copied': 'Copied', 'profile.site.visible_title': "What's on your page", 'profile.site.visible.name': 'Name and photo', 'profile.site.visible.bio': 'Bio', 'profile.site.visible.rating': 'Rating and reviews', 'profile.site.visible.portfolio': 'Portfolio / Cards', 'profile.site.visible.contacts': 'Contact info', 'profile.site.visible.full_last_name': 'Full last name', 'profile.site.visible.services': 'Service cards', 'profile.site.visible.reviews': 'Reviews section', 'profile.site.visible.status': '"Ready to help" status', 'profile.site.theme': 'Appearance theme', 'profile.site.theme.dark': 'Dark', 'profile.site.theme.light': 'Light', 'profile.site.slug_taken': 'This address is already taken', 'profile.site.stats.title': 'Site analytics', 'profile.site.stats.days': 'last 30 days', 'profile.site.stats.views': 'Views', 'profile.site.stats.unique': 'Unique visitors', 'profile.site.stats.messages': 'Messages', 'profile.site.stats.total_views': 'Total views', 'profile.site.stats.total_unique': 'Unique visitors', 'profile.site.stats.total_messages': 'Messages', 'profile.site.stats.empty': 'No data yet', 'profile.site.stats.loading': 'Loading analytics...', 'profile.site.stats.no_slug': 'Set your site URL to see analytics', 'profile.site.edit_bio_hint': 'Bio and photo are edited in the "Basic info" tab.', 'status.title': 'Status', 'status.can_help_now_hint': 'Your card is shown higher in search', 'status.need_help_hint': 'Specialists can offer you help', 'profile.referral.title': 'Referral program', 'profile.referral.desc': 'Share your link and earn rewards for every new user you invite.', 'profile.referral.link_label': 'Your referral link', 'profile.referral.copy': 'Copy', 'profile.referral.copied': 'Copied!', 'profile.referral.invited_count': 'successful referrals', 'profile.referral.no_code': 'Referral code is not available.', 'notifications.title': 'Notification settings', 'notifications.email.new_tasks': 'Email for new tasks', 'notifications.email.new_tasks.desc': 'Receive an email when a new task is posted in your categories', 'notifications.messages.desc': 'Receive a notification when a new message arrives', 'notifications.saved': 'Settings saved', 'notifications.plan_required': 'Not available in your plan', 'profile.tab.info': 'Basic info', 'profile.tab.finance': 'Finance', 'profile.tab.skills': 'Skills', 'profile.tab.categories': 'Categories', 'profile.tab.geography': 'Geography', 'profile.specialist.categories': 'Work categories', 'profile.specialist.categories.desc': 'Select the categories you work in', 'profile.specialist.geography': 'Coverage areas', 'profile.specialist.geography.desc': 'Select the cities / districts where you are active', 'profile.saving': 'Saving...', 'profile.upload.error': 'Error uploading photo', 'profile.saved': 'Saved', 'profile.tab.cards': 'Portfolio', 'profile.cards.count': 'Portfolio', 'profile.cards.add': 'Add portfolio', 'profile.cards.new_title': 'New portfolio title', 'profile.cards.placeholder': 'e.g. Plumbing', 'profile.cards.create': 'Create', 'profile.cards.cancel': 'Cancel', 'profile.cards.empty': 'No portfolio yet', 'profile.cards.create_first': 'Create your first portfolio', 'profile.cards.delete_confirm': 'Delete portfolio?', 'profile.card.tab.main': 'General', 'profile.card.tab.skills': 'Skills', 'profile.card.tab.categories': 'Categories', 'profile.card.tab.geography': 'Geography', 'profile.card.tab.portfolio': 'Portfolio', 'profile.card.active': 'Active', 'profile.card.save': 'Save', 'profile.card.saved': 'Saved', 'profile.card.delete': 'Delete', 'profile.card.skill.add': 'Add skill', 'profile.card.photo.add': 'Add photo', 'profile.card.photo.uploading': 'Uploading...', 'profile.card.photo.empty': 'No photos yet', 'profile.card.item.title': 'Title', 'profile.card.item.desc': 'Description', 'profile.card.item.save': 'Save', 'profile.card.item.cancel': 'Cancel', 'profile.card.item.edit': 'Edit', 'profile.upgrade.cards_limit': 'Portfolio limit reached', 'profile.upgrade.plan': 'Current plan:', 'profile.upgrade.contact': 'Contact the administrator to change your plan', 'profile.upgrade.ok': 'Got it', 'profile.plan.title': 'Subscription plan', 'profile.balance': 'Balance', 'profile.balance.topup': 'Top Up Balance', 'profile.balance.topup.title': 'Top Up Balance', 'profile.balance.topup.amount': 'Amount (EUR)', 'profile.balance.topup.hint': 'Choose a preset or enter a custom amount', 'profile.balance.topup.submit': 'Proceed to Payment', 'profile.balance.topup.loading': 'Redirecting...', 'profile.balance.topup.error': 'Payment initiation failed. Please try again.', 'payment.success.title': 'Payment Successful!', 'payment.success.desc': 'Your balance has been updated.', 'payment.cancelled.title': 'Payment Cancelled', 'payment.cancelled.desc': 'Payment was cancelled. No charges were made.', 'payment.pending.title': 'Processing...', 'payment.pending.desc': 'Your payment is being processed.', 'payment.back_to_profile': 'Back to Profile', 'profile.plan.basic': 'Basic (free)', 'profile.plan.contact_upgrade': 'Contact admin to upgrade your plan', 'profile.plan.cards_up_to': 'Portfolio: up to', 'profile.plan.cards_unlimited': 'Portfolio: unlimited', 'profile.plan.tasks_up_to': 'Tasks: up to', 'profile.plan.offers_up_to': 'Offers: up to', 'profile.plan.valid_until': 'Valid until', 'profile.plan.no_expiry': 'No expiry', // Create task 'create.error': 'Error posting task', // Tasks list extras 'tasks.category.general': 'General', 'tasks.budget.range': 'Range:', 'tasks.budget.from': 'from', 'tasks.budget.to': 'to', 'tasks.filter.reset': 'Reset filters', 'tasks.load_more': 'Load more', 'tasks.showing': 'Results:', 'tasks.field.budget': 'Budget, €', // Admin 'admin.title': 'Admin Panel', 'admin.tab.stats': 'Statistics', 'admin.tab.users': 'Users', 'admin.tab.tasks': 'Tasks', 'admin.tab.reports': 'Reports', 'admin.stats.users': 'Users', 'admin.stats.tasks': 'Tasks', 'admin.stats.offers': 'Offers', 'admin.stats.reviews': 'Reviews', 'admin.tasks.by_status': 'Tasks by status', 'admin.col.user': 'User', 'admin.col.email': 'Email', 'admin.col.role': 'Role', 'admin.col.registered': 'Registered', 'admin.col.status': 'Status', 'admin.col.title': 'Title', 'admin.col.budget': 'Budget', 'admin.col.created': 'Created', 'admin.users.active': 'Active', 'admin.users.inactive': 'Inactive', 'admin.users.deactivate': 'Deactivate', 'admin.users.activate': 'Activate', 'admin.tasks.cancel': 'Cancel', 'admin.reports.none': 'No reports', 'admin.reports.reviewed': 'Reviewed', 'admin.reports.dismiss': 'Dismiss', 'admin.pagination.total': 'Total', 'admin.users.role.change': 'Change role', 'admin.users.search.placeholder': 'Search name or email...', 'admin.tasks.delete': 'Delete', 'admin.tasks.delete.confirm': 'Permanently delete this task?', 'admin.tasks.search.placeholder': 'Search title...', 'admin.col.customer': 'Customer', 'admin.col.reporter': 'Reporter', 'admin.col.target': 'Target', 'admin.filter.all_roles': 'All roles', 'admin.filter.all_statuses': 'All statuses', 'admin.reports.target.task': 'Task', 'admin.reports.target.user': 'User', 'admin.tab.categories': 'Categories', 'admin.tab.locations': 'Cities & Districts', 'admin.tab.logs': 'Logs', 'admin.tab.plans': 'Plans', 'admin.tab.settings': 'Settings', 'admin.logs.subtab.ai': 'AI Logs', 'admin.logs.subtab.activity': 'Activity', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Notifications', 'admin.notif_logs.type': 'Type', 'admin.notif_logs.title': 'Title', 'admin.notif_logs.read': 'Read', 'admin.notif_logs.empty': 'No notification logs', 'admin.stats.notif_chart_title': 'Notifications per day', 'admin.stats.notif_label': 'Notifications', 'admin.stats.mail_chart_title': 'Emails per day', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'All', 'admin.stats.specialists': 'Specialists', 'admin.col.plan': 'Plan', 'admin.back_home': 'Home', 'admin.plans.title': 'Subscription plans', 'admin.plans.add': '+ New plan', 'admin.plans.empty': 'No plans created', 'admin.plans.form.new': 'New plan', 'admin.plans.form.edit': 'Edit plan', 'admin.plans.form.name': 'Name', 'admin.plans.form.price': 'Price (EUR)', 'admin.plans.form.old_price': 'Old price (EUR, optional)', 'admin.plans.form.max_offers': 'Max offers (empty = no limit)', 'admin.plans.form.max_cards': 'Max portfolio (empty = no limit)', 'admin.plans.form.duration_days': 'Duration (days, empty = no expiry)', 'admin.plans.form.description': 'Description', 'admin.plans.form.features': 'Features (one per line)', 'admin.plans.form.notify': 'Notify about new tasks', 'admin.plans.form.default': 'Default', 'admin.plans.form.active': 'Active', 'admin.plans.form.order': 'Order', 'admin.plans.form.role': 'Role', 'admin.plans.form.tier': 'Tier', 'admin.plans.form.role.customer': 'Customer', 'admin.plans.form.role.specialist': 'Specialist', 'admin.plans.form.tier.free': 'Free', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Limits (empty = unlimited)', 'admin.plans.form.max_messages_day': 'Max Messages/Day', 'admin.plans.form.max_orders_day': 'Max Orders/Day', 'admin.plans.form.max_skills': 'Max Skills', 'admin.plans.form.max_profiles': 'Max Profiles', 'admin.plans.form.max_portfolio': 'Max Portfolio Items', 'admin.plans.form.section.boost': 'Multipliers & Boost', 'admin.plans.form.search_boost': 'Search Boost', 'admin.plans.form.offers_multiplier': 'Offers Multiplier', 'admin.plans.form.section.contact': 'Contact Permissions', 'admin.plans.form.can_contact_free': 'Contact Free Plan users', 'admin.plans.form.can_contact_pro': 'Contact Pro Plan users', 'admin.plans.form.can_contact_all': 'Contact All users', 'admin.plans.form.can_show_contact': 'Show Contact Info', 'admin.plans.form.can_view_phone': 'View Phone', 'admin.plans.form.section.features': 'Feature Flags', 'admin.plans.form.upload_video': 'Upload Video', 'admin.plans.form.favorites': 'Favorites', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Verified Badge', 'admin.plans.form.highlighted_reviews': 'Highlighted Reviews', 'admin.plans.form.personal_site': 'Personal Site', 'admin.plans.form.can_help_now': 'Can Help Now Status', 'admin.plans.form.need_help': 'Need Help Status', 'admin.plans.form.auto_response': 'Auto Response', 'admin.plans.form.auto_match': 'Auto Match', 'admin.plans.form.instant_dispatch_free': 'Instant Dispatch (Free)', 'admin.plans.form.instant_dispatch_pro': 'Instant Dispatch (Pro)', 'admin.plans.badge.default': 'Default', 'admin.plans.badge.inactive': 'Inactive', 'admin.plans.make_default': 'Set as default', 'admin.plans.tasks': 'Tasks', 'admin.plans.offers': 'Offers', 'admin.plans.cards': 'Portfolio', 'admin.plans.notify_tasks': 'Task notifications', 'admin.plans.delete.confirm': 'Delete plan', 'admin.activity.title': 'Activity log', 'admin.activity.event': 'Event', 'admin.activity.all_events': 'All events', 'admin.activity.from': 'From', 'admin.activity.to': 'To', 'admin.activity.reset': 'Reset', 'admin.activity.total': 'Total', 'admin.activity.empty': 'No records', 'admin.mail.event': 'Email event', 'admin.mail.all_events': 'All email events', 'admin.mail.from': 'From', 'admin.mail.to': 'To', 'admin.mail.reset': 'Reset', 'admin.mail.total': 'Total', 'admin.mail.empty': 'No email logs', 'admin.mail.recipient': 'Recipient', 'admin.mail.provider': 'Provider', 'admin.mail.details': 'Details', 'admin.mail.status': 'Status', 'admin.mail.success': 'Success', 'admin.mail.failed': 'Failed', 'admin.event.email_sent': 'Email sent', 'admin.event.email_failed': 'Email failed', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Admin test email sent', 'admin.event.admin_email_test_failed': 'Admin test email failed', 'admin.logs.empty': 'No records', 'admin.logs.date': 'Date', 'admin.logs.provider': 'Provider', 'admin.logs.model': 'Model', 'admin.logs.action': 'Action', 'admin.logs.langs': 'Languages', 'admin.logs.in': 'In', 'admin.logs.out': 'Out', 'admin.logs.total': 'Total', 'admin.logs.ms': 'ms', 'admin.logs.status': 'Status', 'admin.stats.activity_30d': 'Activity over 30 days', 'admin.stats.tasks_label': 'Tasks', 'admin.stats.users_label': 'Users', 'admin.stats.specialists_label': 'Specialists', 'admin.stats.tokens_title': 'Token usage (by month)', 'admin.stats.tokens_out': 'Output', 'admin.stats.tokens_in': 'Input', 'admin.stats.tokens_out_label': 'Output tokens', 'admin.stats.tokens_in_label': 'Input tokens', 'admin.stats.cost_label': 'Cost (USD)', 'admin.stats.tasks_by_status': 'Tasks by status', 'admin.task_status.open': 'Open', 'admin.task_status.in_progress': 'In progress', 'admin.task_status.completed': 'Completed', 'admin.task_status.cancelled': 'Cancelled', 'admin.task_status.draft': 'Drafts', 'admin.settings.tab.general': 'General', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Notifications', 'admin.settings.tab.payment': 'Payment', 'admin.settings.tab.referral': 'Referrals', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO & Maintenance', 'admin.settings.seo.maintenance_label': 'Maintenance Mode', 'admin.settings.seo.maintenance_hint': 'Show a maintenance page to all visitors', 'admin.settings.seo.indexing_label': 'Search Engine Indexing', 'admin.settings.seo.indexing_hint': 'Allow search engines to index the site', 'admin.settings.seo.head_scripts_label': ' Scripts (JS)', 'admin.settings.seo.head_scripts_hint': 'Runs on every page (Google Tag Manager, analytics, etc.)', 'admin.settings.seo.site_title_label': 'Site Title', 'admin.settings.seo.site_description_label': 'Site Description (meta description)', 'admin.settings.referral.title': 'Referral program', 'admin.settings.referral.hint': 'Reward users who bring new registrations.', 'admin.settings.referral.enabled_label': 'Enabled', 'admin.settings.referral.enabled_hint': 'Enable / disable reward application', 'admin.settings.referral.customer_section': 'For customers', 'admin.settings.referral.specialist_section': 'For specialists', 'admin.settings.referral.plan_label': 'Reward plan', 'admin.settings.referral.no_plan': '— no plan —', 'admin.settings.referral.plan_hint': 'This plan will be assigned to the referrer. If their current plan is higher, only days will be added.', 'admin.settings.referral.days_label': 'Reward days', 'admin.settings.referral.days_hint': 'Number of days added to the plan expiry.', 'admin.settings.general.title': 'General settings', 'admin.settings.general.site_name': 'Site name', 'admin.settings.general.site_url': 'Site URL', 'admin.settings.general.contact_email': 'Contact email', 'admin.settings.general.support_phone': 'Support phone', 'admin.settings.smtp.title': 'SMTP settings', 'admin.settings.smtp.hint': 'Used to send email notifications.', 'admin.settings.smtp.host': 'SMTP Host', 'admin.settings.smtp.port': 'Port', 'admin.settings.smtp.encryption': 'Encryption', 'admin.settings.smtp.enc.none': 'None', 'admin.settings.smtp.enc.tls': 'STARTTLS (port 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (port 465)', 'admin.settings.smtp.username': 'Username', 'admin.settings.smtp.password': 'Password / App Password', 'admin.settings.smtp.from_name': 'Sender name', 'admin.settings.smtp.from_email': 'Sender email', 'admin.settings.smtp.test': 'Send test email', 'admin.settings.smtp.sending': 'Sending...', 'admin.settings.payment.hint': 'ePay Piraeus Bank credentials.', 'admin.settings.env.test': 'Test (sandbox)', 'admin.settings.env.prod': 'Production', 'admin.settings.env.label': 'Environment', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Active', 'admin.settings.saving': 'Saving...', 'admin.settings.saved': 'Saved', 'admin.notif.vars_hint': 'Available variables in templates', 'admin.notif.tmpl.not_set': 'Template not configured', 'admin.notif.tmpl.subject_label': 'Email subject', 'admin.notif.tmpl.body_label': 'Email body (HTML)', 'admin.notif.tmpl.save': 'Save', 'admin.notif.tmpl.close': 'Close', 'admin.notif.tmpl.translate': 'Auto-translate to other languages', 'admin.notif.tmpl.translating': 'Translating...', 'admin.notif.tmpl.saving': 'Saving...', 'admin.notif.email_verification': 'Email verification', 'admin.notif.registration_success': 'Successful registration', 'admin.notif.password_reset': 'Password reset', 'admin.notif.new_offer': 'New offer', 'admin.notif.new_task': 'New task', 'admin.notif.offer_accepted': 'Offer accepted', 'admin.notif.new_message': 'New message', 'admin.notif.offer_declined': 'Offer declined', 'admin.notif.offer_other_accepted': 'Another specialist chosen', 'admin.notif.task_updated': 'Task updated', 'admin.notif.deadline_reminder': 'Deadline reminder', 'admin.notif.task_archived': 'Task unpublished automatically', 'admin.notif.referral_reward': 'Referral reward', // Plan lifecycle email templates 'admin.email_template.plan_activated': 'Plan activated', 'admin.email_template.plan_upgraded': 'Plan upgraded', 'admin.email_template.plan_downgrade_scheduled': 'Downgrade scheduled', 'admin.email_template.plan_downgrade_applied': 'Downgrade applied', 'admin.email_template.plan_renewal_reminder': 'Renewal reminder', 'admin.email_template.plan_insufficient_funds': 'Insufficient funds warning', // Pricing confirm modal 'pricing.confirm.title': 'Confirm plan selection', 'pricing.confirm.plan': 'Plan', 'pricing.confirm.prorated': 'Prorated credit', 'pricing.confirm.effective_price': 'Amount due', 'pricing.confirm.your_balance': 'Your balance', 'pricing.confirm.downgrade_info': 'The switch to the new plan will happen automatically after the current period ends.', 'pricing.confirm.insufficient': 'Insufficient balance.', 'pricing.confirm.top_up': 'Top up', 'pricing.confirm.schedule_downgrade': 'Schedule downgrade', 'pricing.confirm.pay': 'Pay', 'admin.user_edit.title': 'Edit user', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Registered', 'admin.user_edit.last_seen': 'Last seen', 'admin.user_edit.lang': 'Language', 'admin.user_edit.first_name': 'First name', 'admin.user_edit.last_name': 'Last name', 'admin.user_edit.phone': 'Phone', 'admin.user_edit.bio': 'Bio', 'admin.user_edit.role': 'Role', 'admin.user_edit.plan': 'Plan', 'admin.user_edit.no_plan': '— No plan —', 'admin.user_edit.active': 'Active account', 'admin.user_edit.balance': 'Balance (EUR)', 'admin.user_edit.skills': 'Skills', 'admin.user_edit.tab.profile': 'Profile', 'admin.user_edit.tab.account': 'Account', 'admin.user_edit.tab.balance': 'Balance', 'admin.user_edit.tab.settings': 'Settings', 'admin.user_edit.tab.specialist': 'Portfolio', 'admin.user_edit.tab.site': 'Website', 'admin.user_edit.plan_expires': 'Plan expires', 'admin.user_edit.interface_lang': 'Interface language', 'admin.user_edit.comm_languages': 'Communication languages', 'admin.user_edit.personal_site_slug': 'Personal page', 'admin.user_edit.show_contact_info': 'Show contact info', 'admin.user_edit.show_contact_info.hint': 'Visible to customers', 'admin.user_edit.notify_new_tasks': 'Notify about new tasks', 'admin.user_edit.notify_new_tasks.hint': 'Push and email notifications', 'admin.user_edit.notif_messages': 'Message notifications', 'admin.user_edit.notif_messages.hint': 'New messages in chat', 'admin.user_edit.site_settings': 'Personal page settings', 'admin.user_edit.categories': 'Service categories', 'admin.user_edit.locations': 'Service areas', 'admin.user_edit.skill_placeholder': 'New skill...', 'admin.user_edit.add_category': '— Select category —', 'admin.user_edit.add_location': '— Select location —', 'admin.user_edit.specialist_cards': 'Portfolio', 'admin.user_edit.no_cards': 'No portfolio found', 'admin.user_edit.card_title': 'Portfolio title', 'admin.user_edit.card_description': 'Description', 'admin.balance.topup.btn': 'Top up', 'admin.balance.withdraw.btn': 'Withdraw', 'admin.balance.modal_hint': 'Changes take effect immediately and are recorded in history', 'admin.balance.topup.title': 'Top up balance', 'admin.balance.topup.amount': 'Amount', 'admin.balance.topup.description': 'Comment', 'admin.balance.topup.description.placeholder': 'For example: bonus or manual top-up', 'admin.balance.topup.submit': 'Top up balance', 'admin.balance.withdraw.title': 'Withdraw balance', 'admin.balance.withdraw.amount': 'Amount', 'admin.balance.withdraw.description': 'Comment', 'admin.balance.withdraw.description.placeholder': 'For example: refund or manual debit', 'admin.balance.withdraw.submit': 'Withdraw from balance', 'admin.user_edit.role.customer': 'Customer', 'admin.user_edit.role.specialist': 'Specialist', 'admin.user_edit.role.admin': 'Administrator', 'common.refresh': 'Refresh', 'common.back_home': 'Home', 'admin.loc.hint': 'Manage cities and districts', 'admin.loc.add_city': 'New city', 'admin.loc.add_district': 'Add district', 'admin.loc.new': 'New location', 'admin.loc.edit': 'Edit location', 'admin.loc.district': 'district', 'admin.loc.empty': 'No locations', 'admin.loc.delete.confirm': 'Delete location? All districts will also be deleted.', 'admin.cat.add_root': 'New category', 'admin.cat.add_sub': 'Subcategory', 'admin.cat.edit': 'Edit', 'admin.cat.delete': 'Delete', 'admin.cat.delete.confirm': 'Delete category? All subcategories will also be deleted.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Icon', 'admin.cat.name_el': 'Greek', 'admin.cat.name_en': 'English', 'admin.cat.name_ru': 'Russian', 'admin.cat.order': 'Order', 'admin.cat.active': 'Active', 'admin.cat.parent': 'Parent category', 'admin.cat.no_parent': 'Top level', 'admin.cat.save': 'Save', 'admin.cat.cancel': 'Cancel', 'admin.cat.empty': 'No categories', 'admin.cat.hint': 'Manage categories with multi-level hierarchy', 'admin.cat.new': 'New category', 'admin.cat.subcategory': 'subcategory', 'admin.cat.add_child': 'Add subcategory', 'admin.cat.inactive': 'Inactive', 'admin.event.user_login': 'Login', 'admin.event.user_register': 'Registration', 'admin.event.admin_user_deactivate': 'User blocked', 'admin.event.admin_user_activate': 'User activated', 'admin.event.admin_user_role_changed': 'Role changed', 'admin.event.admin_task_cancelled': 'Task cancelled', 'admin.event.admin_task_deleted': 'Task deleted', 'admin.event.admin_report_reviewed': 'Report reviewed', 'admin.event.admin_report_dismissed': 'Report dismissed', 'admin.event.task_created': 'Task created', // User status 'user.online': 'Online', 'user.seen_minutes': 'was here {n} min ago', 'user.seen_hours': 'was here {n} hr ago', 'user.seen_yesterday': 'was here yesterday', 'user.seen_days': 'was here {n} days ago', // Specialists 'specialists.title': 'Specialists', 'specialists.search': 'Search specialist...', 'specialists.search.btn': 'Search', 'specialists.empty': 'No specialists found', 'specialists.no_bio': 'No description', 'specialists.view': 'View profile', 'specialists.reviews': 'reviews', 'specialist.favorite': 'Add to favorites', 'specialist.unfavorite': 'Remove from favorites', 'specialist.site_link': 'Personal site', 'favorites.specialists.title': 'Favourite specialists', 'favorites.specialists.empty': 'No favourite specialists yet', 'nav.favorites': 'Favourites', 'nav.schedule': 'Schedule', 'nav.find_tasks': 'Find Orders', 'schedule.title': 'My Schedule', 'schedule.subtitle': 'Mark the days when you are free or busy — clients will see your availability', 'schedule.available': 'Available', 'schedule.busy': 'Busy', 'schedule.unset': 'Not set', 'schedule.click_hint': '← click to cycle status', 'schedule.range_mode': 'Select range', 'schedule.range_from': 'From {date} — select end date', 'schedule.click_to_set': 'Click to set', 'schedule.free': 'free', 'schedule.busy_count': 'busy', 'schedule.free_days': 'free days', 'schedule.googleCalendar': 'Google Calendar', 'schedule.connectGoogle': 'Connect Google Calendar', 'schedule.disconnectGoogle': 'Disconnect', 'schedule.connectedAs': 'Connected as', 'schedule.importFromGoogle': 'Sync from Google', 'schedule.gcalConnected': '\u2713 Google Calendar connected', 'schedule.gcalError': 'Google Calendar connection error', 'schedule.gcalImportDone': 'Imported {n} days from Google Calendar', 'schedule.gcalAutoSyncNote': 'Availability changes are automatically synced to Google Calendar', 'schedule.gcalConnectDesc': 'Connect Google Calendar to automatically sync your availability', 'schedule.gcalDisconnectConfirm': 'Disconnect Google Calendar?', 'find_tasks.title': 'Find Orders', 'find_tasks.for_me': 'For me', 'find_tasks.all': 'All orders', 'find_tasks.by_category': 'By category', 'find_tasks.list': 'List', 'find_tasks.already_offered': 'Offer sent', 'find_tasks.offer_now': 'Make an offer', 'find_tasks.empty_for_me': 'No tasks found in your categories', 'find_tasks.banner_hint': 'Find tasks matching your portfolio categories', 'find_tasks.no_cards': 'Create a specialist portfolio to see tasks matched to you', 'find_tasks.add_card': 'Create portfolio', 'find_tasks.search': 'Search tasks...', 'find_tasks.tasks_count': 'tasks', 'footer.tagline': 'The task platform for Greece', 'footer.rights': 'All rights reserved.', // App download section 'app.download_title': 'Download the CanHelp mobile app', 'app.download_desc': 'All of CanHelp — always at your fingertips. Available for Android and iOS.', // Nav 'nav.pricing': 'Pricing', // Pricing page 'pricing.title': 'Pricing', 'pricing.subtitle': 'Choose the right plan for you', 'pricing.role.customer': 'Customer', 'pricing.role.specialist': 'Specialist', 'pricing.free': 'Free', 'pricing.per_month': 'mo', 'pricing.duration': 'Duration', 'pricing.days': 'days', 'pricing.current_plan': 'Your plan', 'pricing.popular': 'Popular', 'pricing.choose': 'Choose', 'pricing.your_plan': 'Active plan', 'pricing.free_default': 'Default', 'pricing.compare': 'Compare features', 'pricing.feature': 'Feature', 'pricing.faq_note': 'Payment is deducted from your CanHelp balance. Top up available in Payments.', 'pricing.feat.messages': 'Messages / day', 'pricing.feat.orders': 'Orders / day', 'pricing.feat.contact_all': 'Contact everyone', 'pricing.feat.view_phone': 'View phone number', 'pricing.feat.show_contact': 'Show contact info', 'pricing.feat.favorites': 'Favorites', 'pricing.feat.verified_badge': 'Verified badge', 'pricing.feat.google_calendar': 'Google Calendar', 'pricing.feat.personal_site': 'Personal site', 'pricing.feat.auto_response': 'Auto-response', 'pricing.feat.auto_match': 'Auto-match', 'pricing.feat.highlighted_reviews': 'Highlighted reviews', 'pricing.feat.portfolio': 'Portfolio items', 'pricing.feat.cards': 'Specialist cards', 'pricing.feat.notify_tasks': 'New task notifications', 'pricing.feat.video': 'Video in portfolio', // Upgrade prompt 'upgrade.available_in': 'Available in', 'upgrade.cta': 'Upgrade', // Dashboard plan block 'dashboard.plan.title': 'My Plan', 'dashboard.plan.expires': 'Expires in {n} days', 'dashboard.plan.upgrade': 'Upgrade plan', 'dashboard.plan.no_plan': 'Free plan', 'dashboard.plan.messages': 'Messages today', 'dashboard.plan.orders': 'Orders today', 'dashboard.plan.limits': 'Daily limits', 'dashboard.plan.features': 'Features', 'dashboard.plan.stats': 'Stats', 'dashboard.stats.cards': 'Portfolios', 'dashboard.stats.maxCards': 'Max portfolios', 'dashboard.stats.portfolioItems': 'Portfolio items', 'dashboard.stats.maxPortfolioItems': 'Max items', 'dashboard.stats.activeOffers': 'Active offers', 'dashboard.stats.reviewsReceived': 'Reviews', 'dashboard.stats.activeTasks': 'Active tasks', 'dashboard.stats.completedTasks': 'Completed', 'status.need_help': 'I need help', 'status.active': 'Active', 'status.toggle_on': 'Enable', 'status.toggle_off': 'Disable', // FOMO 'fomo.missed_orders': 'Missed {n} orders', 'fomo.missed_value': 'Worth €{v}', 'fomo.upgrade_hint': 'Upgrade to receive more orders', 'fomo.conversion': 'Task conversion', 'fomo.active': 'Active', 'fomo.with_offers': 'With offers', 'fomo.completed': 'Completed', 'fomo.already_offered': '{n} specialists have already responded', 'fomo.specialist_missed': 'You missed {n} orders', 'fomo.top_categories': 'Categories', 'fomo.offers_received': 'offers received', 'fomo.avg_offers': 'Avg {n}/task', 'fomo.completion_rate': 'completed', // Task auto-match 'task.auto_match': 'Auto-match', 'task.auto_match_results': 'Top specialists', 'task.no_offer_yet': 'You haven\'t sent an offer yet', 'task.make_offer': 'Send offer', 'auto_response.title': 'Auto-Response', 'auto_response.enabled': 'Enable auto-response', 'auto_response.min_budget': 'Min budget', 'auto_response.max_budget': 'Max budget', 'auto_response.default_price': 'Default price', 'auto_response.default_message': 'Default message', 'auto_response.max_per_day': 'Max auto-offers per day', 'auto_response.save': 'Save', 'auto_response.saved': 'Saved', 'auto_response.categories': 'Categories', 'auto_response.locations': 'Locations', // Personal site 'profile.personal_site': 'Personal Site', 'profile.site_slug': 'URL slug', 'profile.site_slug_hint': 'Only latin letters, numbers, - and _', 'profile.site_open': 'Open site', 'profile.site_preview': 'Your site', 'profile.show_contact': 'Show contact info', 'profile.show_contact_hint': 'Customers with Pro/Ultimate plans will see your phone number', // Google Calendar plan gate 'gcal.upgrade_required': 'Google Calendar requires a Pro or Ultimate plan', // Chat limits 'chat.limit_warning': '{n} messages left today', 'chat.limit_reached': 'Message limit reached. Upgrade your plan', 'chat.upgrade': 'Upgrade', // Site page 'site.member_since': 'Member since', 'site.rating': 'Rating', 'site.completed_tasks': 'Completed', 'site.languages': 'Languages', 'site.photos': 'photos', 'site.contact_form': 'Get in touch', 'site.contact_sent': 'Message sent!', 'site.contact_sent_desc': 'The specialist will contact you soon', 'site.contact_name': 'Name', 'site.contact_name_ph': 'Your name', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Message', 'site.contact_message_ph': 'Describe your task...', 'site.contact_send': 'Send', 'site.share': 'Share', 'site.speaks_languages': 'Speaks', 'site.message_sent': 'Message sent!', 'site.message_sent_desc': 'The specialist will receive it in the chat', 'site.message_placeholder': 'Write your message...', 'site.write_to_chat': 'Write to chat', 'site.auth_required_title': 'Sign in required', 'site.auth_required_desc': 'To write in the chat, you need to sign in to your CanHelp account.', 'site.auth_login_btn': 'Sign in', 'site.auth_contact_form_btn': 'Contact via feedback form', 'specialist.services': 'Services', 'portfolio.title': 'Portfolio', 'status.can_help_now': 'Available now', 'common.not_found': 'Page not found', 'common.anonymous': 'Anonymous' }, ru: { 'footer.slogan': 'Ваша задача — наша забота! Решаем любые вопросы быстро и удобно.', 'footer.links': 'Ссылки', 'footer.socials': 'Мы в соцсетях', 'nav.home': 'Главная', 'nav.tasks': 'Задачи', 'nav.post': '+ Опубликовать', 'nav.dashboard': 'Панель управления', 'nav.chat': 'Сообщения', 'nav.notifications': 'Уведомления', 'nav.profile': 'Профиль', 'nav.admin': 'Админка', 'nav.specialists': 'Специалисты', 'nav.new_task': 'Новая задача', 'nav.login': 'Войти', 'nav.register': 'Регистрация', 'nav.logout': 'Выйти', 'hero.title': 'Найди специалиста для любой работы', 'hero.subtitle': 'Опубликуй задачу, получи предложения и выбери лучшего профессионала', 'hero.cta.post': 'Опубликовать задачу', 'hero.cta.browse': 'Найти работу', 'hero.search.placeholder': 'Что нужно? напр. электрик, уборка...', 'stats.specialists': 'специалистов', 'stats.tasks': 'задач', 'stats.categories': 'категорий', 'stats.free': 'бесплатная регистрация', 'section.categories': 'Создай задачу в любой категории', 'section.how': 'Как это работает', 'section.recent': 'Последние задачи', 'section.all': 'Смотреть все →', 'section.more': 'ещё', 'section.cities': 'Города и районы', 'section.community': 'Общественный проект для всех', 'community.subtitle': 'CanHelp — не просто маркетплейс, это сообщество взаимопомощи. Любой, у кого есть знания или навык, может найти клиента. Любой, у кого есть задача, может найти специалиста.', 'community.point1.title': 'Умеете что-то делать?', 'community.point1.desc': 'Ремонт, репетиторство, дизайн, переводы, уход — каждый навык имеет ценность. Создайте профиль и находите клиентов рядом с вами.', 'community.point2.title': 'Нужна помощь?', 'community.point2.desc': 'Опубликуйте задачу за минуту и получайте предложения от проверенных специалистов в вашем городе.', 'community.point3.title': 'Помогите проекту расти', 'community.point3.desc': 'CanHelp развивается благодаря сообществам. Поделитесь ссылкой с друзьями и знакомыми — вместе мы строим что-то полезное для всех.', 'community.share': 'Поделиться с друзьями', 'community.share.copied': 'Ссылка скопирована!', // Referral section on home page 'section.referral': 'Реферальная программа', 'referral.home.subtitle': 'Поделитесь ссылкой — каждый новый пользователь, зарегистрировавшийся по ней, принесёт вам награду.', 'referral.home.step1.title': 'Зарегистрируйтесь и получите ссылку', 'referral.home.step1.desc': 'Создайте аккаунт и найдите свою уникальную реферальную ссылку в профиле.', 'referral.home.step2.title': 'Поделитесь с друзьями', 'referral.home.step2.desc': 'Отправьте ссылку друзьям, знакомым или опубликуйте в социальных сетях.', 'referral.home.step3.title': 'Получайте награды', 'referral.home.step3.desc': 'Как только друг подтвердит email, вы автоматически получите свою награду.', 'referral.home.cta': 'Получить ссылку', 'referral.home.badge': 'Реферальная программа', // FAQ section 'section.faq': 'Частые вопросы', 'faq.q1': 'Как работает CanHelp?', 'faq.a1': 'Опубликуйте задачу, получите предложения от специалистов, выберите лучшего и начните сотрудничество. Это быстро, просто и бесплатно для клиентов.', 'faq.q2': 'Сколько стоит использование платформы?', 'faq.a2': 'Регистрация и публикация задач полностью бесплатны для клиентов. Специалисты имеют доступ к бесплатному плану, а также к премиум-опциям.', 'faq.q3': 'Как стать специалистом?', 'faq.a3': 'Зарегистрируйтесь, перейдите в «Стать специалистом», заполните профиль навыками и категориями и начните получать задачи.', 'faq.q4': 'Как выбрать подходящего специалиста?', 'faq.a4': 'Оцените отзывы, опыт, навыки и портфолио каждого специалиста. Общайтесь через чат платформы и уточняйте детали до принятия решения.', 'faq.q5': 'Что если я не доволен результатом?', 'faq.a5': 'Вы можете оставить отзыв о специалисте и поставить оценку от 1 до 5 звёзд. Отзывы помогают другим пользователям выбирать проверенных профессионалов.', 'faq.q6': 'Можно ли связаться со специалистом до принятия предложения?', 'faq.a6': 'Да. Как только вы получили предложение, можно открыть чат со специалистом, задать вопросы и уточнить все детали до принятия решения.', 'faq.q7': 'Сколько времени ждать предложений?', 'faq.a7': 'Как правило, в течение нескольких часов. Специалисты получают уведомление о новых задачах и могут быстро ответить.', 'faq.q8': 'Можно ли разместить задачу в любом городе Греции?', 'faq.a8': 'Да! CanHelp охватывает всю Грецию — Афины, Фессалоники, Патры и другие города.', 'faq.q9': 'Какие виды задач есть на CanHelp?', 'faq.a9': 'Ремонт, уборка, электрики, репетиторство, дизайн, IT, переезды, красота и многое другое. Категории постоянно расширяются.', 'faq.q10': 'Есть ли мобильное приложение?', 'faq.a10': 'Да! CanHelp доступно для Android и iOS. Скачайте приложение и управляйте всем со своего телефона.', 'how.step1.title': 'Опубликуй задачу', 'how.step1.desc': 'Опиши что нужно и установи бюджет', 'how.step2.title': 'Получи предложения', 'how.step2.desc': 'Специалисты пришлют предложения с ценой и сроками', 'how.step3.title': 'Выбери и начни', 'how.step3.desc': 'Выбери лучшего профессионала и начни сотрудничество', 'tasks.title': 'задач', 'tasks.filters': 'Фильтры', 'tasks.search': 'Поиск', 'tasks.search.placeholder': 'Название или ключевое слово...', 'tasks.search.btn': 'Поиск', 'tasks.publish': 'Опубликовать', 'tasks.category.all': 'Все', 'tasks.category.all_in': 'Все в', 'tasks.category.label': 'Категория', 'tasks.location.label': 'Город', 'tasks.location.placeholder': 'напр. Афины', 'tasks.empty': 'Задачи не найдены', 'tasks.empty.cta': 'Опубликуй первую', 'task.status.open': 'Открыта', 'task.status.in_progress': 'В работе', 'task.status.completed': 'Завершена', 'task.status.cancelled': 'Отменена', 'task.status.draft': 'Черновик', 'task.budget': 'Бюджет', 'task.location': 'Местоположение', 'task.deadline': 'Дата начала', 'task.created_at': 'Создано', 'task.customer': 'Заказчик', 'task.offer.btn': 'Отправить предложение', 'task.invite.banner_title': 'Вас пригласили на это задание', 'task.invite.banner_hint': 'Заказчик лично пригласил вас', 'task.invite.accept': 'Отправить предложение', 'task.invite.decline': 'Отказаться', 'offer.accept': 'Принять', 'offer.decline': 'Отклонить', 'task.complete': 'Завершить задачу', 'task.complete.confirm': 'Отметить задачу как выполненную?', 'task.edit': 'Редактировать', 'task.status_label': 'Статус', 'task.yours': 'Ваша задача', 'task.offer.yours': 'Ваше предложение', 'review.leave': 'Оставить отзыв', 'review.rating': 'Оценка', 'review.comment': 'Комментарий', 'review.comment.placeholder': 'Расскажите о своём опыте...', 'review.submit': 'Отправить отзыв', 'review.submitting': 'Отправка...', 'review.done': 'Отзыв отправлен!', 'profile.reviews': 'Отзывы', 'profile.no_reviews': 'Отзывов пока нет', 'profile.rating': 'Рейтинг', 'profile.skills.label': 'Навыки', 'profile.member_since': 'Участник с', 'task.offers': 'Предложения', 'task.offers.none': 'Предложений пока нет', 'create.title': 'Опубликовать задачу', 'create.field.title': 'Название', 'create.field.description': 'Описание', 'create.field.category': 'Категория', 'create.field.category.select': 'Выберите...', 'create.field.location': 'Местоположение', 'create.field.location.any': 'Где угодно', 'create.field.location.all': 'Весь город', 'create.field.budget': 'Бюджет (€)', 'create.field.deadline': 'Дата начала', 'create.field.budget_negotiable': 'Цена обсуждается', 'create.field.time_slot': 'Время выполнения', 'create.field.time_slot.any': 'В любое время', 'create.field.time_slot.morning': 'Утром (08:00–13:00)', 'create.field.time_slot.afternoon': 'Днём (13:00–18:00)', 'create.field.time_slot.evening': 'Вечером (18:00–22:00)', 'create.field.time_slot.weekend': 'Выходной', 'create.field.address': 'Адрес (необязательно)', 'create.field.address.district': 'Квартал', 'create.field.address.street': 'Улица', 'create.field.address.house': 'Дом', 'create.field.confidential': 'Конфиденциальная заметка', 'create.field.confidential.placeholder': 'Детали, видные только назначенному специалисту...', 'create.field.confidential.hint': 'Не отображается публично', 'create.field.photos': 'Фотографии', 'create.field.photos.add': 'Добавить фото', 'create.field.photos.uploading': 'Загрузка...', 'task.budget_negotiable': 'Цена обсуждается', 'task.time_slot': 'Время', 'task.confidential': 'Конфид. заметка', 'create.field.title.placeholder': 'напр. Уборка квартиры 80кв', 'create.field.description.placeholder': 'Подробно опишите что нужно...', 'create.field.location.placeholder': 'напр. Афины, Колонаки', 'create.field.budget.placeholder': 'напр. 100', 'create.submit': 'Опубликовать задачу', 'create.submitting': 'Публикация...', 'login.title': 'Добро пожаловать', 'login.subtitle': 'Вход в CanHelp', 'login.email': 'Email', 'login.password': 'Пароль', 'login.submit': 'Войти', 'login.submitting': 'Вход...', 'login.error': 'Неверный email или пароль', 'login.unverified.title': 'Подтвердите ваш email', 'login.unverified.desc': 'Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.', 'login.unverified.resend': 'Отправить письмо повторно', 'login.unverified.sending': 'Отправка...', 'login.unverified.sent': '✓ Отправлено — проверьте входящие', 'profile.email.verified': 'Email подтверждён', 'profile.email.not_verified': 'Email не подтверждён', 'login.no_account': 'Нет аккаунта?', 'login.register_link': 'Зарегистрироваться', 'login.forgot_password': 'Забыл пароль?', 'login.or_continue_with': 'или продолжите через', 'login.continue_google': 'Войти через Google', 'forgot.title': 'Забыл пароль', 'forgot.subtitle': 'Введите email для получения ссылки восстановления', 'forgot.email': 'Email', 'forgot.submit': 'Отправить ссылку', 'forgot.submitting': 'Отправка...', 'forgot.sent.title': 'Проверьте входящие', 'forgot.sent.desc': 'Если аккаунт с таким email существует, мы отправим ссылку для сброса пароля.', 'forgot.back_to_login': 'Вернуться ко входу', 'forgot.error': 'Не удалось отправить ссылку. Проверьте адрес и попробуйте снова.', 'forgot.error.not_found': 'Аккаунт с таким email не найден.', 'forgot.error.send_failed': 'Ошибка отправки письма. Попробуйте позже.', 'reset.title': 'Новый пароль', 'reset.subtitle': 'Введите новый пароль', 'reset.password': 'Новый пароль', 'reset.confirm': 'Подтвердите пароль', 'reset.submit': 'Изменить пароль', 'reset.submitting': 'Сохранение...', 'reset.success': 'Пароль успешно изменён. Перенаправление ко входу...', 'reset.back_to_login': 'Вернуться ко входу', 'reset.error.mismatch': 'Пароли не совпадают', 'reset.error.invalid': 'Недействительная или устаревшая ссылка. Запросите новую.', 'register.title': 'Регистрация', 'register.subtitle': 'Создать аккаунт в CanHelp', 'register.first_name': 'Имя', 'register.last_name': 'Фамилия', 'register.email': 'Email', 'register.password': 'Пароль (мин. 8 символов)', 'register.role': 'Роль', 'register.role.customer': 'Пользователь', 'register.role.customer.desc': 'Публикую задачи', 'register.role.specialist': 'Специалист', 'register.role.specialist.desc': 'Беру задачи', 'register.submit': 'Создать аккаунт', 'register.submitting': 'Регистрация...', 'register.has_account': 'Уже есть аккаунт?', 'register.login_link': 'Войти', 'register.continue_google': 'Зарегистрироваться через Google', 'register.check_email.title': 'Проверьте почту', 'register.check_email.desc': 'Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.', 'register.check_email.login': 'Вернуться к входу', 'dashboard.title': 'Панель управления', 'dashboard.new_task': '+ Новая задача', 'dashboard.my_tasks': 'Мои задачи', 'dashboard.my_offers': 'Мои предложения', 'dashboard.invitations': 'Приглашения на задания', 'dashboard.offers_count': 'предл.', 'dashboard.declined_count': 'откл.', 'dashboard.completed_tasks': 'Завершённые задачи', 'dashboard.completed_offers': 'Завершённые предложения', 'dashboard.review_pending': 'Оценка ещё не оставлена', 'tasks.new.top_specialists': 'Топ специалисты', 'tasks.new.select_category': 'Выберите категорию, чтобы увидеть специалистов', 'tasks.new.invite': 'Предложить работу', 'tasks.new.invited': 'Выбран ✓', 'reviews.count': 'отзывов', 'filter.location': 'Локация', 'filter.language': 'Языки', 'filter.language.any': 'Любой язык', 'filter.category.all': 'Все категории', 'user.categories': 'Категории', 'user.work_area': 'Район работы', 'dashboard.tasks.empty': 'Вы не публиковали задачи', 'dashboard.tasks.empty.cta': 'Опубликуйте первую', 'dashboard.tasks.add_new': 'Добавить новую задачу', 'dashboard.offers.empty': 'Вы не отправляли предложений', 'dashboard.offers.empty.cta': 'Найти задачи', 'dashboard.customer.specialists_title': 'Ищете исполнителя?', 'dashboard.customer.specialists_hint': 'Просматривайте профили специалистов, читайте отзывы и приглашайте их на свои задачи', 'dashboard.customer.specialists_cta': 'Найти исполнителя', 'dashboard.customer.how_title': 'Как это работает', 'dashboard.customer.step1': 'Создайте задачу с описанием и бюджетом', 'dashboard.customer.step2': 'Специалисты пришлют предложения с ценой и сроками', 'dashboard.customer.step3': 'Выберите подходящего и начните работу', 'notif.title': 'Уведомления', 'notif.mark_all': 'Отметить все как прочитанные', 'notif.empty': 'Нет уведомлений', 'notif.type.new_offer': 'Новое предложение', 'notif.type.offer_accepted': 'Ваше предложение принято', 'notif.type.offer_declined': 'Ваше предложение отклонено', 'notif.type.task_completed': 'Задание выполнено', 'notif.type.task_cancelled': 'Задание отменено', 'notif.type.new_message': 'Новое сообщение', 'notif.type.new_review': 'Новый отзыв', 'notif.type.task_invite': 'Приглашение на задание', 'notif.body.new_offer': 'Новое предложение на «{title}»', 'notif.body.offer_accepted': 'Ваше предложение на «{title}» принято', 'notif.body.offer_declined': 'Ваше предложение на «{title}» отклонено', 'notif.body.task_invite': 'Вас приглашают на «{title}»', 'notif.body.new_review': 'Вы получили оценку {rating}★', 'offer.status.pending': 'Ожидает', 'offer.status.accepted': 'Принято', 'offer.status.declined': 'Отклонено', 'offer.status.withdrawn': 'Отозвано', 'offer.status.other_accepted': 'Выбран другой исполнитель', 'common.loading': 'Загрузка...', 'common.error': 'Ошибка', 'common.save': 'Сохранить', 'common.saving': 'Сохранение...', 'common.cancel': 'Отмена', 'common.add': 'Добавить', 'common.close': 'Закрыть', 'common.edit': 'Редактировать', 'common.delete': 'Удалить', 'common.from': 'от', 'common.currency': '€', 'common.greece': 'Греция', // Chat 'chat.connected': 'Подключено', 'chat.disconnected': 'Отключено', 'chat.no_rooms': 'Переписок пока нет', 'chat.task_fallback': 'Задача', 'chat.select': 'Выберите переписку', 'chat.no_messages': 'Сообщений пока нет', 'chat.placeholder': 'Напишите сообщение... (Enter для отправки)', 'chat.conversation_fallback': 'Переписка', 'chat.direct_chat': 'Личный чат', 'chat.linked_task': 'Прикреплённый заказ', 'chat.write_btn': 'Написать', 'chat.just_now': 'только что', 'chat.min_ago': 'м', 'chat.write_specialist': 'Написать специалисту', 'chat.write_customer': 'Написать заказчику', 'chat.notif_settings': 'Настройки уведомлений', 'chat.notif_messages': 'Уведомления о новых сообщениях', 'chat.toast_title': 'Новое сообщение', 'chat.toast_open': 'Открыть чат', // Offer form 'offer.price': 'Цена', 'offer.price.placeholder': 'напр. 80', 'offer.customer_budget': 'Бюджет заказчика', 'offer.message': 'Сообщение', 'offer.optional': 'необязательно', 'offer.message.placeholder': 'Представьтесь, расскажите об опыте и почему вы лучший выбор...', 'offer.submitting': 'Отправка...', // Profile 'profile.photo': 'Фото профиля', 'profile.photo.change': 'Изменить фото', 'profile.photo.hint': 'JPEG, PNG, WebP · до 5MB', 'profile.basic_info': 'Основная информация', 'profile.phone': 'Телефон', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Краткое описание', 'profile.bio.placeholder': 'Расскажите немного о себе...', 'profile.language': 'Язык', 'profile.language.hint': 'Язык интерфейса и email-уведомлений', 'profile.languages': 'Языки общения', 'profile.languages.hint': 'Выберите все языки, на которых вы общаетесь', 'profile.skills': 'Навыки', 'profile.skills.subtitle': 'Добавьте услуги, которые вы предлагаете', 'profile.skills.placeholder': 'напр. Уборка, IT, Репетиторство...', 'profile.role': 'Роль аккаунта', 'profile.role.specialist': '🔧 Специалист', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 Пользователь', 'profile.role.change': 'Для смены роли обратитесь в службу поддержки.', 'profile.become_specialist': 'Стать специалистом', 'profile.become_specialist.desc': 'Перейдите в роль специалиста, чтобы брать задачи и наполнить профиль.', 'become_specialist.hero.title': 'Зарабатывай, делая то, что умеешь', 'become_specialist.hero.subtitle': 'Создай профиль специалиста и получай заказы от клиентов по всей Греции', 'become_specialist.how.title': 'Как это работает', 'become_specialist.step1.title': 'Создай портфолио специалиста', 'become_specialist.step1.desc': 'Укажи категории, навыки и зону покрытия — система автоматически подберёт подходящие заказы', 'become_specialist.step2.title': 'Ищи заказы', 'become_specialist.step2.desc': 'Просматривай задачи по своим категориям в разделе «Поиск заказов»', 'become_specialist.step3.title': 'Откликайся и зарабатывай', 'become_specialist.step3.desc': 'Отправляй предложения с ценой и сроками, общайся с клиентами и выполняй заказы', 'become_specialist.benefits.title': 'Преимущества профиля специалиста', 'become_specialist.benefit1': 'Поиск заказов по вашим категориям и локации', 'become_specialist.benefit2': 'Публичный профиль с отзывами клиентов', 'become_specialist.benefit3': 'Расписание доступности, видимое клиентам', 'become_specialist.benefit4': 'Добавление в избранное клиентами', 'become_specialist.cta': 'Стать специалистом — это бесплатно', 'become_specialist.free_badge': 'Бесплатная регистрация', 'profile.tab.notifications': 'Уведомления', 'profile.tab.reviews': 'Отзывы', 'profile.tab.referral': 'Рефералы', 'profile.tab.auto_response': 'Авто-ответ', 'profile.tab.site': 'Сайт', 'profile.site.title': 'Персональная страница', 'profile.site.url_label': 'Личный сайт', 'profile.site.copy': 'Копировать', 'profile.site.copied': 'Скопировано', 'profile.site.visible_title': 'Что отображается на вашей странице', 'profile.site.visible.name': 'Имя и фото', 'profile.site.visible.bio': 'Биография', 'profile.site.visible.rating': 'Рейтинг и отзывы', 'profile.site.visible.portfolio': 'Портфолио / Карточки', 'profile.site.visible.contacts': 'Контактные данные', 'profile.site.visible.full_last_name': 'Фамилия полностью', 'profile.site.visible.services': 'Карточки услуг', 'profile.site.visible.reviews': 'Раздел с отзывами', 'profile.site.visible.status': 'Статус «Готов помочь»', 'profile.site.theme': 'Тема оформления', 'profile.site.theme.dark': 'Тёмная', 'profile.site.theme.light': 'Светлая', 'profile.site.slug_taken': 'Этот адрес уже занят', 'profile.site.stats.title': 'Аналитика сайта', 'profile.site.stats.days': 'последние 30 дней', 'profile.site.stats.views': 'Просмотры', 'profile.site.stats.unique': 'Уникальные посетители', 'profile.site.stats.messages': 'Сообщения', 'profile.site.stats.total_views': 'Просмотры', 'profile.site.stats.total_unique': 'Уник. посетители', 'profile.site.stats.total_messages': 'Сообщения', 'profile.site.stats.empty': 'Данных пока нет', 'profile.site.stats.loading': 'Загрузка аналитики...', 'profile.site.stats.no_slug': 'Укажите адрес сайта, чтобы видеть статистику', 'profile.site.edit_bio_hint': 'Биография и фото настраиваются во вкладке «Основное».', 'status.title': 'Статус', 'status.can_help_now_hint': 'Ваша карточка показывается выше в поиске', 'status.need_help_hint': 'Специалисты могут предложить вам помощь', 'profile.referral.title': 'Партнёрская программа', 'profile.referral.desc': 'Поделитесь ссылкой и получайте награду за каждого привлечённого пользователя.', 'profile.referral.link_label': 'Ваша реферальная ссылка', 'profile.referral.copy': 'Копировать', 'profile.referral.copied': 'Скопировано!', 'profile.referral.invited_count': 'успешных приглашений', 'profile.referral.no_code': 'Реферальный код недоступен.', 'notifications.title': 'Настройки уведомлений', 'notifications.email.new_tasks': 'Email о новых заказах', 'notifications.email.new_tasks.desc': 'Получать email, когда в ваших категориях публикуется новый заказ', 'notifications.messages.desc': 'Получать уведомление при новом входящем сообщении', 'notifications.saved': 'Настройки сохранены', 'notifications.plan_required': 'Недоступно в вашем тарифе', 'profile.tab.info': 'Основное', 'profile.tab.finance': 'Финансы', 'profile.tab.skills': 'Навыки', 'profile.tab.categories': 'Категории', 'profile.tab.geography': 'География', 'profile.specialist.categories': 'Категории работ', 'profile.specialist.categories.desc': 'Выберите категории, в которых вы работаете', 'profile.specialist.geography': 'Города покрытия', 'profile.specialist.geography.desc': 'Выберите города / районы, где вы работаете', 'profile.saving': 'Сохранение...', 'profile.upload.error': 'Ошибка загрузки фото', 'profile.saved': 'Сохранено', 'profile.tab.cards': 'Портфолио', 'profile.cards.count': 'Портфолио', 'profile.cards.add': 'Добавить портфолио', 'profile.cards.new_title': 'Название нового портфолио', 'profile.cards.placeholder': 'Например: Сантехника', 'profile.cards.create': 'Создать', 'profile.cards.cancel': 'Отмена', 'profile.cards.empty': 'У вас нет портфолио', 'profile.cards.create_first': 'Создать первое портфолио', 'profile.cards.delete_confirm': 'Удалить портфолио?', 'profile.card.tab.main': 'Основное', 'profile.card.tab.skills': 'Навыки', 'profile.card.tab.categories': 'Категории', 'profile.card.tab.geography': 'География', 'profile.card.tab.portfolio': 'Галерея', 'profile.card.active': 'Активна', 'profile.card.save': 'Сохранить', 'profile.card.saved': 'Сохранено', 'profile.card.delete': 'Удалить', 'profile.card.skill.add': 'Добавить навык', 'profile.card.photo.add': 'Добавить фото', 'profile.card.photo.uploading': 'Загрузка...', 'profile.card.photo.empty': 'Нет фотографий', 'profile.card.item.title': 'Заголовок', 'profile.card.item.desc': 'Описание', 'profile.card.item.save': 'Сохранить', 'profile.card.item.cancel': 'Отмена', 'profile.card.item.edit': 'Описание работы', 'profile.upgrade.cards_limit': 'Лимит портфолио исчерпан', 'profile.upgrade.plan': 'Текущий тариф:', 'profile.upgrade.contact': 'Обратитесь к администратору для смены тарифа', 'profile.upgrade.ok': 'Понятно', 'profile.plan.title': 'Тарифный план', 'profile.balance': 'Баланс', 'profile.balance.topup': 'Пополнить баланс', 'profile.balance.topup.title': 'Пополнить баланс', 'profile.balance.topup.amount': 'Сумма (в EUR)', 'profile.balance.topup.hint': 'Выберите сумму или введите вручную', 'profile.balance.topup.submit': 'Перейти к оплате', 'profile.balance.topup.loading': 'Перенаправление...', 'profile.balance.topup.error': 'Ошибка инициализации платежа. Попробуйте снова.', 'payment.success.title': 'Оплата прошла успешно!', 'payment.success.desc': 'Ваш баланс обновлён.', 'payment.cancelled.title': 'Оплата отменена', 'payment.cancelled.desc': 'Оплата была отменена. Средства не списаны.', 'payment.pending.title': 'Обрабатывается...', 'payment.pending.desc': 'Ваш платёж в обработке.', 'payment.back_to_profile': 'Вернуться в профиль', 'profile.plan.basic': 'Базовый (бесплатный)', 'profile.plan.contact_upgrade': 'Обратитесь к администратору для подключения тарифа', 'profile.plan.cards_up_to': 'Портфолио: до', 'profile.plan.cards_unlimited': 'Портфолио: безлимитно', 'profile.plan.tasks_up_to': 'Задач: до', 'profile.plan.offers_up_to': 'Откликов: до', 'profile.plan.valid_until': 'Действителен до', 'profile.plan.no_expiry': 'Бессрочно', // Create task 'create.error': 'Ошибка при публикации', // Tasks list extras 'tasks.category.general': 'Общее', 'tasks.budget.range': 'Диапазон:', 'tasks.budget.from': 'от', 'tasks.budget.to': 'до', 'tasks.filter.reset': 'Сбросить фильтры', 'tasks.load_more': 'Загрузить ещё', 'tasks.showing': 'Результатов:', 'tasks.field.budget': 'Бюджет, €', // Admin 'admin.title': 'Панель администратора', 'admin.tab.stats': 'Статистика', 'admin.tab.users': 'Пользователи', 'admin.tab.tasks': 'Задачи', 'admin.tab.reports': 'Жалобы', 'admin.stats.users': 'Пользователи', 'admin.stats.tasks': 'Задачи', 'admin.stats.offers': 'Предложения', 'admin.stats.reviews': 'Отзывы', 'admin.tasks.by_status': 'Задачи по статусу', 'admin.col.user': 'Пользователь', 'admin.col.email': 'Email', 'admin.col.role': 'Роль', 'admin.col.registered': 'Регистрация', 'admin.col.status': 'Статус', 'admin.col.title': 'Название', 'admin.col.budget': 'Бюджет', 'admin.col.created': 'Создано', 'admin.users.active': 'Активен', 'admin.users.inactive': 'Неактивен', 'admin.users.deactivate': 'Деактивировать', 'admin.users.activate': 'Активировать', 'admin.tasks.cancel': 'Отменить', 'admin.reports.none': 'Жалоб нет', 'admin.reports.reviewed': 'Рассмотрено', 'admin.reports.dismiss': 'Отклонить', 'admin.pagination.total': 'Всего', 'admin.users.role.change': 'Изменить роль', 'admin.users.search.placeholder': 'Поиск по имени или email...', 'admin.tasks.delete': 'Удалить', 'admin.tasks.delete.confirm': 'Удалить эту задачу навсегда?', 'admin.tasks.search.placeholder': 'Поиск по названию...', 'admin.col.customer': 'Заказчик', 'admin.col.reporter': 'Жалобщик', 'admin.col.target': 'Цель', 'admin.filter.all_roles': 'Все роли', 'admin.filter.all_statuses': 'Все статусы', 'admin.reports.target.task': 'Задача', 'admin.reports.target.user': 'Пользователь', 'admin.tab.categories': 'Категории', 'admin.tab.locations': 'Города и районы', 'admin.tab.logs': 'Логи', 'admin.tab.plans': 'Тарифы', 'admin.tab.settings': 'Настройки', 'admin.logs.subtab.ai': 'AI логи', 'admin.logs.subtab.activity': 'Активность', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Уведомления', 'admin.notif_logs.type': 'Тип', 'admin.notif_logs.title': 'Заголовок', 'admin.notif_logs.read': 'Прочитано', 'admin.notif_logs.empty': 'Логи уведомлений пусты', 'admin.stats.notif_chart_title': 'Уведомления по дням', 'admin.stats.notif_label': 'Уведомления', 'admin.stats.mail_chart_title': 'Email по дням', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'Все', 'admin.stats.specialists': 'Исполнители', 'admin.col.plan': 'Тариф', 'admin.back_home': 'На главную', 'admin.plans.title': 'Тарифные пакеты', 'admin.plans.add': '+ Добавить тариф', 'admin.plans.empty': 'Тарифы не созданы', 'admin.plans.form.new': 'Новый тариф', 'admin.plans.form.edit': 'Редактировать тариф', 'admin.plans.form.name': 'Название', 'admin.plans.form.price': 'Цена (EUR)', 'admin.plans.form.old_price': 'Старая цена (EUR, необязательно)', 'admin.plans.form.max_offers': 'Макс. откликов (пусто = без лимита)', 'admin.plans.form.max_cards': 'Макс. портфолио (пусто = без лимита)', 'admin.plans.form.duration_days': 'Срок (дней, пусто = без истечения)', 'admin.plans.form.description': 'Описание', 'admin.plans.form.features': 'Возможности (по одной на строку)', 'admin.plans.form.notify': 'Уведомления о новых заказах', 'admin.plans.form.default': 'По умолчанию', 'admin.plans.form.active': 'Активен', 'admin.plans.form.order': 'Порядок', 'admin.plans.form.role': 'Роль', 'admin.plans.form.tier': 'Уровень', 'admin.plans.form.role.customer': 'Заказчик', 'admin.plans.form.role.specialist': 'Специалист', 'admin.plans.form.tier.free': 'Бесплатный', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Лимиты (пусто = без ограничений)', 'admin.plans.form.max_messages_day': 'Макс. сообщений/день', 'admin.plans.form.max_orders_day': 'Макс. заказов/день', 'admin.plans.form.max_skills': 'Макс. навыков', 'admin.plans.form.max_profiles': 'Макс. профилей', 'admin.plans.form.max_portfolio': 'Макс. элементов портфолио', 'admin.plans.form.section.boost': 'Множители & Буст', 'admin.plans.form.search_boost': 'Буст в поиске', 'admin.plans.form.offers_multiplier': 'Множитель откликов', 'admin.plans.form.section.contact': 'Права контактов', 'admin.plans.form.can_contact_free': 'Контакт с бесплатными пользователями', 'admin.plans.form.can_contact_pro': 'Контакт с Pro пользователями', 'admin.plans.form.can_contact_all': 'Контакт со всеми', 'admin.plans.form.can_show_contact': 'Показывать контакты', 'admin.plans.form.can_view_phone': 'Просмотр телефона', 'admin.plans.form.section.features': 'Возможности', 'admin.plans.form.upload_video': 'Загрузка видео', 'admin.plans.form.favorites': 'Избранное', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Знак верификации', 'admin.plans.form.highlighted_reviews': 'Выделенные отзывы', 'admin.plans.form.personal_site': 'Личный сайт', 'admin.plans.form.can_help_now': 'Статус «Могу помочь»', 'admin.plans.form.need_help': 'Статус «Нужна помощь»', 'admin.plans.form.auto_response': 'Автоответ', 'admin.plans.form.auto_match': 'Автоподбор', 'admin.plans.form.instant_dispatch_free': 'Мгновенная рассылка (бесплатно)', 'admin.plans.form.instant_dispatch_pro': 'Мгновенная рассылка (Pro)', 'admin.plans.badge.default': 'По умолчанию', 'admin.plans.badge.inactive': 'Неактивен', 'admin.plans.make_default': 'Сделать по умолчанию', 'admin.plans.tasks': 'Задач', 'admin.plans.offers': 'Откликов', 'admin.plans.cards': 'Портфолио', 'admin.plans.notify_tasks': 'Уведомления о заказах', 'admin.plans.delete.confirm': 'Удалить тариф', 'admin.activity.title': 'Журнал активности', 'admin.activity.event': 'Событие', 'admin.activity.all_events': 'Все события', 'admin.activity.from': 'От', 'admin.activity.to': 'До', 'admin.activity.reset': 'Сбросить', 'admin.activity.total': 'Всего', 'admin.activity.empty': 'Нет записей', 'admin.mail.event': 'Email событие', 'admin.mail.all_events': 'Все email события', 'admin.mail.from': 'От', 'admin.mail.to': 'До', 'admin.mail.reset': 'Сбросить', 'admin.mail.total': 'Всего', 'admin.mail.empty': 'Нет email логов', 'admin.mail.recipient': 'Получатель', 'admin.mail.provider': 'Провайдер', 'admin.mail.details': 'Детали', 'admin.mail.status': 'Статус', 'admin.mail.success': 'Успешно', 'admin.mail.failed': 'Ошибка', 'admin.event.email_sent': 'Email отправлен', 'admin.event.email_failed': 'Email не отправлен', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Тестовый email отправлен', 'admin.event.admin_email_test_failed': 'Тестовый email не отправлен', 'admin.logs.empty': 'Нет записей', 'admin.logs.date': 'Дата', 'admin.logs.provider': 'Провайдер', 'admin.logs.model': 'Модель', 'admin.logs.action': 'Действие', 'admin.logs.langs': 'Языки', 'admin.logs.in': 'Вход', 'admin.logs.out': 'Выход', 'admin.logs.total': 'Итого', 'admin.logs.ms': 'мс', 'admin.logs.status': 'Статус', 'admin.stats.activity_30d': 'Активность за 30 дней', 'admin.stats.tasks_label': 'Заявки', 'admin.stats.users_label': 'Пользователи', 'admin.stats.specialists_label': 'Исполнители', 'admin.stats.tokens_title': 'Расход токенов (по месяцам)', 'admin.stats.tokens_out': 'Исходящие', 'admin.stats.tokens_in': 'Входящие', 'admin.stats.tokens_out_label': 'Исходящие токены', 'admin.stats.tokens_in_label': 'Входящие токены', 'admin.stats.cost_label': 'Стоимость (USD)', 'admin.stats.tasks_by_status': 'Заявки по статусам', 'admin.task_status.open': 'Открытые', 'admin.task_status.in_progress': 'В работе', 'admin.task_status.completed': 'Завершённые', 'admin.task_status.cancelled': 'Отменённые', 'admin.task_status.draft': 'Черновики', 'admin.settings.tab.general': 'Общие', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Уведомления', 'admin.settings.tab.payment': 'Оплата', 'admin.settings.tab.referral': 'Реферальная', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO и обслуживание', 'admin.settings.seo.maintenance_label': 'Режим обслуживания', 'admin.settings.seo.maintenance_hint': 'Показывать страницу обслуживания всем посетителям', 'admin.settings.seo.indexing_label': 'Индексация поисковыми системами', 'admin.settings.seo.indexing_hint': 'Разрешить поисковым системам индексировать сайт', 'admin.settings.seo.head_scripts_label': 'Скрипты в (JS)', 'admin.settings.seo.head_scripts_hint': 'Выполняется на каждой странице (Google Tag Manager, аналитика и т.д.)', 'admin.settings.seo.site_title_label': 'Заголовок сайта', 'admin.settings.seo.site_description_label': 'Описание сайта (meta description)', 'admin.settings.referral.title': 'Партнёрская программа', 'admin.settings.referral.hint': 'Награждайте пользователей, приводящих новых участников.', 'admin.settings.referral.enabled_label': 'Включено', 'admin.settings.referral.enabled_hint': 'Включить / отключить выдачу наград', 'admin.settings.referral.customer_section': 'Для клиентов', 'admin.settings.referral.specialist_section': 'Для специалистов', 'admin.settings.referral.plan_label': 'Тарифный план за реферала', 'admin.settings.referral.no_plan': '— без плана —', 'admin.settings.referral.plan_hint': 'Этот план будет назначен пригласившему. Если его текущий план выше — добавятся только дни.', 'admin.settings.referral.days_label': 'Дней награды', 'admin.settings.referral.days_hint': 'Количество дней, добавляемых к сроку действия плана.', 'admin.settings.general.title': 'Общие настройки', 'admin.settings.general.site_name': 'Название сайта', 'admin.settings.general.site_url': 'URL сайта', 'admin.settings.general.contact_email': 'Email для связи', 'admin.settings.general.support_phone': 'Телефон поддержки', 'admin.settings.smtp.title': 'Настройки SMTP сервера', 'admin.settings.smtp.hint': 'Используется для отправки email-уведомлений.', 'admin.settings.smtp.host': 'SMTP Хост', 'admin.settings.smtp.port': 'Порт', 'admin.settings.smtp.encryption': 'Шифрование', 'admin.settings.smtp.enc.none': 'Нет', 'admin.settings.smtp.enc.tls': 'STARTTLS (порт 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (порт 465)', 'admin.settings.smtp.username': 'Имя пользователя', 'admin.settings.smtp.password': 'Пароль / App Password', 'admin.settings.smtp.from_name': 'Имя отправителя', 'admin.settings.smtp.from_email': 'Email отправителя', 'admin.settings.smtp.test': 'Отправить тестовый email', 'admin.settings.smtp.sending': 'Отправка...', 'admin.settings.payment.hint': 'Данные для подключения к ePay Piraeus Bank.', 'admin.settings.env.test': 'Тест (sandbox)', 'admin.settings.env.prod': 'Боевой режим', 'admin.settings.env.label': 'Среда', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Активен', 'admin.settings.saving': 'Сохранение...', 'admin.settings.saved': 'Сохранено', 'admin.notif.vars_hint': 'Доступные переменные в шаблонах', 'admin.notif.tmpl.not_set': 'Шаблон не настроен', 'admin.notif.tmpl.subject_label': 'Тема письма', 'admin.notif.tmpl.body_label': 'Текст письма (HTML)', 'admin.notif.tmpl.save': 'Сохранить', 'admin.notif.tmpl.close': 'Закрыть', 'admin.notif.tmpl.translate': 'Авто-перевод на другие языки', 'admin.notif.tmpl.translating': 'Перевод...', 'admin.notif.tmpl.saving': 'Сохранение...', 'admin.notif.email_verification': 'Подтверждение email адреса', 'admin.notif.registration_success': 'Успешная регистрация', 'admin.notif.password_reset': 'Восстановление пароля', 'admin.notif.new_offer': 'Новое предложение', 'admin.notif.new_task': 'Новая задача', 'admin.notif.offer_accepted': 'Предложение принято', 'admin.notif.new_message': 'Новое сообщение', 'admin.notif.offer_declined': 'Отклонение предложения', 'admin.notif.offer_other_accepted': 'Выбран другой исполнитель', 'admin.notif.task_updated': 'Изменение задания', 'admin.notif.deadline_reminder': 'Напоминание о дедлайне', 'admin.notif.task_archived': 'Автоснятие задания', 'admin.notif.referral_reward': 'Реферальная награда', // Шаблоны email для тарифов 'admin.email_template.plan_activated': 'Тарифы — активация тарифа', 'admin.email_template.plan_upgraded': 'Тарифы — повышение тарифа', 'admin.email_template.plan_downgrade_scheduled': 'Тарифы — запланированное понижение', 'admin.email_template.plan_downgrade_applied': 'Тарифы — применение понижения', 'admin.email_template.plan_renewal_reminder': 'Тарифы — напоминание о продлении', 'admin.email_template.plan_insufficient_funds': 'Тарифы — нехватка средств', // Модальное окно подтверждения тарифа 'pricing.confirm.title': 'Подтвердите выбор тарифа', 'pricing.confirm.plan': 'Тариф', 'pricing.confirm.prorated': 'Зачёт остатка', 'pricing.confirm.effective_price': 'К оплате', 'pricing.confirm.your_balance': 'Ваш баланс', 'pricing.confirm.downgrade_info': 'Переход на новый тариф произойдёт автоматически после окончания текущего периода.', 'pricing.confirm.insufficient': 'Недостаточно средств на балансе.', 'pricing.confirm.top_up': 'Пополнить', 'pricing.confirm.schedule_downgrade': 'Запланировать переход', 'pricing.confirm.pay': 'Оплатить', 'admin.user_edit.title': 'Редактирование пользователя', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Регистрация', 'admin.user_edit.last_seen': 'Последний визит', 'admin.user_edit.lang': 'Язык', 'admin.user_edit.first_name': 'Имя', 'admin.user_edit.last_name': 'Фамилия', 'admin.user_edit.phone': 'Телефон', 'admin.user_edit.bio': 'О себе', 'admin.user_edit.role': 'Роль', 'admin.user_edit.plan': 'Тариф', 'admin.user_edit.no_plan': '— Без тарифа —', 'admin.user_edit.active': 'Активный аккаунт', 'admin.user_edit.balance': 'Баланс (EUR)', 'admin.user_edit.skills': 'Навыки', 'admin.user_edit.tab.profile': 'Профиль', 'admin.user_edit.tab.account': 'Аккаунт', 'admin.user_edit.tab.balance': 'Баланс', 'admin.user_edit.tab.settings': 'Настройки', 'admin.user_edit.tab.specialist': 'Портфолио', 'admin.user_edit.tab.site': 'Сайт', 'admin.user_edit.plan_expires': 'Тариф истекает', 'admin.user_edit.interface_lang': 'Язык интерфейса', 'admin.user_edit.comm_languages': 'Языки общения', 'admin.user_edit.personal_site_slug': 'Персональная страница', 'admin.user_edit.show_contact_info': 'Показывать контакты', 'admin.user_edit.show_contact_info.hint': 'Видно заказчикам', 'admin.user_edit.notify_new_tasks': 'Уведомлять о новых задачах', 'admin.user_edit.notify_new_tasks.hint': 'Push и email уведомления', 'admin.user_edit.notif_messages': 'Уведомления о сообщениях', 'admin.user_edit.notif_messages.hint': 'Новые сообщения в чате', 'admin.user_edit.site_settings': 'Настройки персональной страницы', 'admin.user_edit.categories': 'Категории услуг', 'admin.user_edit.locations': 'Районы обслуживания', 'admin.user_edit.skill_placeholder': 'Новый навык...', 'admin.user_edit.add_category': '— Выберите категорию —', 'admin.user_edit.add_location': '— Выберите район —', 'admin.user_edit.specialist_cards': 'Портфолио специалиста', 'admin.user_edit.no_cards': 'Портфолио не найдено', 'admin.user_edit.card_title': 'Заголовок портфолио', 'admin.user_edit.card_description': 'Описание', 'admin.balance.topup.btn': 'Пополнить', 'admin.balance.withdraw.btn': 'Списать', 'admin.balance.modal_hint': 'Изменения применяются сразу и фиксируются в истории', 'admin.balance.topup.title': 'Пополнение баланса', 'admin.balance.topup.amount': 'Сумма', 'admin.balance.topup.description': 'Комментарий', 'admin.balance.topup.description.placeholder': 'Например: бонус или ручное пополнение', 'admin.balance.topup.submit': 'Пополнить баланс', 'admin.balance.withdraw.title': 'Снятие баланса', 'admin.balance.withdraw.amount': 'Сумма', 'admin.balance.withdraw.description': 'Комментарий', 'admin.balance.withdraw.description.placeholder': 'Например: возврат или ручное списание', 'admin.balance.withdraw.submit': 'Списать баланс', 'admin.user_edit.role.customer': 'Заказчик', 'admin.user_edit.role.specialist': 'Исполнитель', 'admin.user_edit.role.admin': 'Администратор', 'common.refresh': 'Обновить', 'common.back_home': 'На главную', 'admin.loc.hint': 'Управление городами и районами', 'admin.loc.add_city': 'Новый город', 'admin.loc.add_district': 'Добавить район', 'admin.loc.new': 'Новая локация', 'admin.loc.edit': 'Редактировать локацию', 'admin.loc.district': 'район', 'admin.loc.empty': 'Нет локаций', 'admin.loc.delete.confirm': 'Удалить локацию? Все районы также будут удалены.', 'admin.cat.add_root': 'Новая категория', 'admin.cat.add_sub': 'Подкатегория', 'admin.cat.edit': 'Редактировать', 'admin.cat.delete': 'Удалить', 'admin.cat.delete.confirm': 'Удалить категорию? Все подкатегории также будут удалены.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Иконка', 'admin.cat.name_el': 'Греческий', 'admin.cat.name_en': 'Английский', 'admin.cat.name_ru': 'Русский', 'admin.cat.order': 'Порядок', 'admin.cat.active': 'Активна', 'admin.cat.parent': 'Родительская категория', 'admin.cat.no_parent': 'Верхний уровень', 'admin.cat.save': 'Сохранить', 'admin.cat.cancel': 'Отмена', 'admin.cat.empty': 'Нет категорий', 'admin.cat.hint': 'Управление категориями с многоуровневой иерархией', 'admin.cat.new': 'Новая категория', 'admin.cat.subcategory': 'подкатегория', 'admin.cat.add_child': 'Добавить подкатегорию', 'admin.cat.inactive': 'Неактивна', 'admin.event.user_login': 'Вход', 'admin.event.user_register': 'Регистрация', 'admin.event.admin_user_deactivate': 'Блокировка юзера', 'admin.event.admin_user_activate': 'Разблокировка юзера', 'admin.event.admin_user_role_changed': 'Смена роли', 'admin.event.admin_task_cancelled': 'Отмена задачи', 'admin.event.admin_task_deleted': 'Удаление задачи', 'admin.event.admin_report_reviewed': 'Жалоба рассмотрена', 'admin.event.admin_report_dismissed': 'Жалоба отклонена', 'admin.event.task_created': 'Создана задача', // User status 'user.online': 'Онлайн', 'user.seen_minutes': 'был здесь {n} мин назад', 'user.seen_hours': 'был здесь {n} ч назад', 'user.seen_yesterday': 'был здесь вчера', 'user.seen_days': 'был здесь {n} дн назад', // Specialists 'specialists.title': 'Специалисты', 'specialists.search': 'Поиск специалиста...', 'specialists.search.btn': 'Поиск', 'specialists.empty': 'Специалисты не найдены', 'specialists.no_bio': 'Без описания', 'specialists.view': 'Смотреть профиль', 'specialists.reviews': 'отзывов', 'specialist.favorite': 'Добавить в избранное', 'specialist.unfavorite': 'Убрать из избранного', 'specialist.site_link': 'Личный сайт', 'favorites.specialists.title': 'Избранные специалисты', 'favorites.specialists.empty': 'Вы ещё не добавили специалистов в избранное', 'nav.favorites': 'Избранное', 'nav.schedule': 'Расписание', 'nav.find_tasks': 'Поиск заказов', 'schedule.title': 'Моё расписание', 'schedule.subtitle': 'Отмечайте дни когда вы свободны или заняты — заказчики увидят вашу доступность', 'schedule.available': 'Свободен', 'schedule.busy': 'Занят', 'schedule.unset': 'Не указано', 'schedule.click_hint': '← клик меняет статус по кругу', 'schedule.range_mode': 'Выделить диапазон', 'schedule.range_from': 'С {date} — выберите конечную дату', 'schedule.click_to_set': 'Нажмите чтобы отметить', 'schedule.free': 'свободно', 'schedule.busy_count': 'занято', 'schedule.free_days': 'свободных дней', 'schedule.googleCalendar': 'Google Календарь', 'schedule.connectGoogle': 'Подключить Google Календарь', 'schedule.disconnectGoogle': 'Отключить', 'schedule.connectedAs': 'Подключено как', 'schedule.importFromGoogle': 'Синхр. из Google', 'schedule.gcalConnected': '\u2713 Google Календарь подключён', 'schedule.gcalError': 'Ошибка подключения Google Календарь', 'schedule.gcalImportDone': 'Импортировано {n} дней из Google Календарь', 'schedule.gcalAutoSyncNote': 'Изменения доступности автоматически отправляются в Google Календарь', 'schedule.gcalConnectDesc': 'Подключите Google Календарь для автоматической синхронизации расписания', 'schedule.gcalDisconnectConfirm': 'Отключить Google Календарь?', 'find_tasks.title': 'Поиск заказов', 'find_tasks.for_me': 'Для меня', 'find_tasks.all': 'Все заказы', 'find_tasks.by_category': 'По категориям', 'find_tasks.list': 'Списком', 'find_tasks.already_offered': 'Предложение отправлено', 'find_tasks.offer_now': 'Откликнуться', 'find_tasks.empty_for_me': 'Нет заказов в ваших категориях', 'find_tasks.banner_hint': 'Найдите заказы по категориям вашего портфолио', 'find_tasks.no_cards': 'Создайте портфолио специалиста, чтобы видеть подходящие заказы', 'find_tasks.add_card': 'Создать портфолио', 'find_tasks.search': 'Поиск заказов...', 'find_tasks.tasks_count': 'заданий', 'footer.tagline': 'Платформа задач для Греции', 'footer.rights': 'Все права защищены.', // App download section 'app.download_title': 'Скачайте мобильное приложение CanHelp', 'app.download_desc': 'Всё CanHelp — всегда под рукой. Доступно для Android и iOS.', // Nav 'nav.pricing': 'Тарифы', // Pricing page 'pricing.title': 'Тарифы', 'pricing.subtitle': 'Выберите подходящий план', 'pricing.role.customer': 'Заказчик', 'pricing.role.specialist': 'Специалист', 'pricing.free': 'Бесплатно', 'pricing.per_month': 'мес', 'pricing.duration': 'Срок', 'pricing.days': 'дн.', 'pricing.current_plan': 'Ваш план', 'pricing.popular': 'Популярный', 'pricing.choose': 'Выбрать', 'pricing.your_plan': 'Активный план', 'pricing.free_default': 'По умолчанию', 'pricing.compare': 'Сравнение функций', 'pricing.feature': 'Функция', 'pricing.faq_note': 'Оплата списывается с баланса CanHelp. Пополнение доступно в разделе Оплата.', 'pricing.feat.messages': 'Сообщений / день', 'pricing.feat.orders': 'Заказов / день', 'pricing.feat.contact_all': 'Связь со всеми', 'pricing.feat.view_phone': 'Просмотр телефона', 'pricing.feat.show_contact': 'Показывать контакты', 'pricing.feat.favorites': 'Избранное', 'pricing.feat.verified_badge': 'Верифицированный бейдж', 'pricing.feat.google_calendar': 'Google Календарь', 'pricing.feat.personal_site': 'Персональный сайт', 'pricing.feat.auto_response': 'Авто-ответ', 'pricing.feat.auto_match': 'Авто-подбор', 'pricing.feat.highlighted_reviews': 'Выделенные отзывы', 'pricing.feat.portfolio': 'Элементов портфолио', 'pricing.feat.cards': 'Карточки специалиста', 'pricing.feat.notify_tasks': 'Уведомления о новых задачах', 'pricing.feat.video': 'Видео в портфолио', // Upgrade prompt 'upgrade.available_in': 'Доступно в', 'upgrade.cta': 'Улучшить', // Dashboard plan block 'dashboard.plan.title': 'Мой план', 'dashboard.plan.expires': 'Истекает через {n} дней', 'dashboard.plan.upgrade': 'Улучшить план', 'dashboard.plan.no_plan': 'Бесплатный план', 'dashboard.plan.messages': 'Сообщений сегодня', 'dashboard.plan.orders': 'Заказов сегодня', 'dashboard.plan.limits': 'Дневные лимиты', 'dashboard.plan.features': 'Функции', 'dashboard.plan.stats': 'Статистика', 'dashboard.stats.cards': 'Портфолио', 'dashboard.stats.maxCards': 'Макс. портфолио', 'dashboard.stats.portfolioItems': 'Элементы портфолио', 'dashboard.stats.maxPortfolioItems': 'Макс. элементы', 'dashboard.stats.activeOffers': 'Активные отклики', 'dashboard.stats.reviewsReceived': 'Отзывы', 'dashboard.stats.activeTasks': 'Активные задачи', 'dashboard.stats.completedTasks': 'Завершённые', 'status.need_help': 'Нужна помощь', 'status.active': 'Активен', 'status.toggle_on': 'Включить', 'status.toggle_off': 'Выключить', // FOMO 'fomo.missed_orders': 'Пропущено {n} заказов', 'fomo.missed_value': 'На сумму €{v}', 'fomo.upgrade_hint': 'Улучшите план — получайте больше заказов', 'fomo.conversion': 'Конверсия задач', 'fomo.active': 'Активные', 'fomo.with_offers': 'С офертами', 'fomo.completed': 'Завершённые', 'fomo.already_offered': '{n} специалистов уже откликнулись', 'fomo.specialist_missed': 'Вы пропустили {n} заказов', 'fomo.top_categories': 'Категории', 'fomo.offers_received': 'предложений получено', 'fomo.avg_offers': 'В среднем {n}/задача', 'fomo.completion_rate': 'завершено', // Task auto-match 'task.auto_match': 'Авто-матч', 'task.auto_match_results': 'Топ специалисты', 'task.no_offer_yet': 'Вы ещё не отправили предложение', 'task.make_offer': 'Отправить предложение', 'auto_response.title': 'Авто-ответ', 'auto_response.enabled': 'Включить авто-ответ', 'auto_response.min_budget': 'Мин. бюджет', 'auto_response.max_budget': 'Макс. бюджет', 'auto_response.default_price': 'Цена по умолчанию', 'auto_response.default_message': 'Сообщение по умолчанию', 'auto_response.max_per_day': 'Макс. авто-офертов в день', 'auto_response.save': 'Сохранить', 'auto_response.saved': 'Сохранено', 'auto_response.categories': 'Категории', 'auto_response.locations': 'Локации', // Personal site 'profile.personal_site': 'Персональный сайт', 'profile.site_slug': 'URL slug', 'profile.site_slug_hint': 'Только латинские буквы, цифры, - и _', 'profile.site_open': 'Открыть сайт', 'profile.site_preview': 'Ваш сайт', 'profile.show_contact': 'Показывать контакты', 'profile.show_contact_hint': 'Заказчики с Pro/Ultimate-планом увидят ваш телефон', // Google Calendar plan gate 'gcal.upgrade_required': 'Google Календарь требует план Pro или Ultimate', // Chat limits 'chat.limit_warning': 'Осталось {n} сообщений сегодня', 'chat.limit_reached': 'Лимит сообщений исчерпан. Улучшите план', 'chat.upgrade': 'Улучшить', // Site page 'site.member_since': 'С нами с', 'site.rating': 'Рейтинг', 'site.completed_tasks': 'Выполнено', 'site.languages': 'Языков', 'site.photos': 'фото', 'site.contact_form': 'Связаться', 'site.contact_sent': 'Сообщение отправлено!', 'site.contact_sent_desc': 'Специалист свяжется с вами в ближайшее время', 'site.contact_name': 'Имя', 'site.contact_name_ph': 'Ваше имя', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Сообщение', 'site.contact_message_ph': 'Опишите вашу задачу...', 'site.contact_send': 'Отправить', 'site.share': 'Поделиться', 'site.speaks_languages': 'Говорит на языках', 'site.message_sent': 'Сообщение отправлено!', 'site.message_sent_desc': 'Специалист получит его в чате', 'site.message_placeholder': 'Напишите сообщение...', 'site.write_to_chat': 'Написать в чат', 'site.auth_required_title': 'Нужна авторизация', 'site.auth_required_desc': 'Чтобы написать в чат, необходимо войти в аккаунт CanHelp.', 'site.auth_login_btn': 'Войти в аккаунт', 'site.auth_contact_form_btn': 'Написать через форму обратной связи', 'specialist.services': 'Услуги', 'portfolio.title': 'Портфолио', 'status.can_help_now': 'Готов помочь', 'common.not_found': 'Страница не найдена', 'common.anonymous': 'Анонимно' } }; function getTranslations(locale) { const t = translations[locale] ?? translations.el; return (key, fallback)=>t[key] ?? translations.el[key] ?? fallback ?? key; } /***/ })   /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $: () => (/* binding */ getTranslations), /* harmony export */ YZ: () => (/* binding */ LOCALES) /* harmony export */ }); /* unused harmony export translations */ :export const LOCALES = [ { code: 'el', label: 'Ελληνικά', flag: '🇬🇷' }, { code: 'en', label: 'English', flag: '🇬🇧' }, { code: 'ru', label: 'Русский', flag: '🇷🇺' } ]; export const translations = { el: { 'footer.slogan': 'Η εργασία σου — η φροντίδα μας! Λύνουμε κάθε ζήτημα γρήγορα και εύκολα.', 'footer.links': 'Σύνδεσμοι', 'footer.socials': 'Στα κοινωνικά δίκτυα', // Nav 'nav.home': 'Αρχική', 'nav.tasks': 'Εργασίες', 'nav.post': '+ Δημοσίευση', 'nav.dashboard': 'Πίνακας', 'nav.chat': 'Μηνύματα', 'nav.notifications': 'Ειδοποιήσεις', 'nav.profile': 'Προφίλ', 'nav.admin': 'Διαχείριση', 'nav.specialists': 'Ειδικοί', 'nav.new_task': 'Νέα εργασία', 'nav.login': 'Σύνδεση', 'nav.register': 'Εγγραφή', 'nav.logout': 'Έξοδος', // Hero 'hero.title': 'Βρες ειδικό για κάθε δουλειά', 'hero.subtitle': 'Δημοσίευσε εργασία, λάβε προσφορές και επίλεξε τον καλύτερο επαγγελματία', 'hero.cta.post': 'Δημοσίευσε εργασία', 'hero.cta.browse': 'Βρες εργασία', 'hero.search.placeholder': 'Τι χρειάζεσαι; π.χ. ηλεκτρολόγος, καθαρισμός...', 'stats.specialists': 'ειδικοί', 'stats.tasks': 'εργασίες', 'stats.categories': 'κατηγορίες', 'stats.free': 'δωρεάν εγγραφή', // Sections 'section.categories': 'Δημιούργησε εργασία σε οποιαδήποτε κατηγορία', 'section.how': 'Πώς λειτουργεί', 'section.recent': 'Πρόσφατες εργασίες', 'section.all': 'Δες όλες →', 'section.more': 'ακόμα', 'section.cities': 'Πόλεις & Περιοχές', 'section.community': 'Ένα κοινοτικό έργο για όλους', 'community.subtitle': 'Το CanHelp δεν είναι απλώς μια αγορά — είναι μια κοινότητα αμοιβαίας βοήθειας. Οποιοσδήποτε έχει γνώση ή δεξιότητα μπορεί να βρει έναν πελάτη. Οποιοσδήποτε έχει ένα πρόβλημα μπορεί να βρει έναν ειδικό.', 'community.point1.title': 'Είσαι ειδικός σε κάτι;', 'community.point1.desc': 'Επισκευές, μαθήματα, σχεδιασμός, μεταφράσεις, φροντίδα — κάθε δεξιότητα αξίζει. Δημιούργησε προφίλ και βρες πελάτες κοντά σου.', 'community.point2.title': 'Χρειάζεσαι βοήθεια;', 'community.point2.desc': 'Δημοσίευσε εργασία σε λιγότερο από ένα λεπτό και λάβε προσφορές από επαληθευμένους ειδικούς στην πόλη σου.', 'community.point3.title': 'Βοήθησε το έργο να αναπτυχθεί', 'community.point3.desc': 'Το CanHelp αναπτύσσεται χάρη στις κοινότητες. Μοιράσου το σύνδεσμο με φίλους και γνωστούς — μαζί χτίζουμε κάτι χρήσιμο για όλους.', 'community.share': 'Μοιράσου με φίλους', 'community.share.copied': 'Σύνδεσμος αντιγράφηκε!', // Referral section on home page 'section.referral': 'Πρόγραμμα παραπομπών', 'referral.home.subtitle': 'Μοιράσου τον σύνδεσμό σου — κάθε νέος χρήστης που εγγράφεται μέσα από αυτόν σου αποφέρει ανταμοιβή.', 'referral.home.step1.title': 'Εγγραφείσε και λάβε σύνδεσμο', 'referral.home.step1.desc': 'Δημιούργησε λογαριασμό και βρες τον μοναδικό σου σύνδεσμο παραπομπής στο προφίλ σου.', 'referral.home.step2.title': 'Μοιράσου με φίλους', 'referral.home.step2.desc': 'Στείλε τον σύνδεσμο σε φίλους, γνωστούς ή δημοσίευσέ τον στα social media.', 'referral.home.step3.title': 'Κέρδισε ανταμοιβές', 'referral.home.step3.desc': 'Μόλις ο φίλος σου επαληθεύσει το email του, λαμβάνεις αυτόματα την ανταμοιβή σου.', 'referral.home.cta': 'Πάρε τον σύνδεσμό σου', 'referral.home.badge': 'Πρόγραμμα παραπομπών', // FAQ section 'section.faq': 'Συχνές Ερωτήσεις', 'faq.q1': 'Πώς λειτουργεί το CanHelp;', 'faq.a1': 'Δημοσίευσε μια εργασία, λάβε προσφορές από ειδικούς, επέλεξε τον καλύτερο και ξεκίνα τη συνεργασία. Είναι γρήγορο, απλό και δωρεάν για πελάτες.', 'faq.q2': 'Πόσο κοστίζει η χρήση της πλατφόρμας;', 'faq.a2': 'Η εγγραφή και η δημοσίευση εργασιών είναι εντελώς δωρεάν για πελάτες. Οι ειδικοί έχουν στη διάθεσή τους δωρεάν πλάνο καθώς και premium επιλογές.', 'faq.q3': 'Πώς μπορώ να γίνω ειδικός;', 'faq.a3': 'Κάνε εγγραφή, πήγαινε στο «Γίνε Ειδικός», συμπλήρωσε το προφίλ σου με δεξιότητες και κατηγορίες και αρχίνισε να λαμβάνεις εργασίες.', 'faq.q4': 'Πώς επιλέγω τον κατάλληλο ειδικό;', 'faq.a4': 'Δες τις αξιολογήσεις, την εμπειρία, τις δεξιότητες και το χαρτοφυλάκιο κάθε ειδικού. Επικοινώνησε μαζί του μέσω chat και συζήτα τις λεπτομέρειες πριν αποφασίσεις.', 'faq.q5': 'Τι γίνεται αν δεν είμαι ικανοποιημένος;', 'faq.a5': 'Μπορείς να αφήσεις αξιολόγηση για τον ειδικό και να τον βαθμολογήσεις από 1 έως 5 αστέρια. Οι αξιολογήσεις βοηθούν άλλους χρήστες να επιλέξουν έμπιστους επαγγελματίες.', 'faq.q6': 'Μπορώ να επικοινωνήσω με τον ειδικό πριν την αποδοχή;', 'faq.a6': 'Ναι. Μόλις λάβεις μια προσφορά, μπορείς να ανοίξεις chat με τον ειδικό, να κάνεις ερωτήσεις και να συντονίσεις τις λεπτομέρειες πριν αποφασίσεις.', 'faq.q7': 'Πόσος χρόνος χρειάζεται για να λάβω προσφορές;', 'faq.a7': 'Συνήθως μέσα σε λίγες ώρες. Οι ειδικοί λαμβάνουν ειδοποίηση για νέες εργασίες και μπορούν να απαντήσουν γρήγορα.', 'faq.q8': 'Μπορώ να δημοσιεύσω εργασία σε οποιαδήποτε πόλη της Ελλάδας;', 'faq.a8': 'Ναι! Το CanHelp καλύπτει όλη την Ελλάδα. Μπορείς να βρεις ειδικούς στην Αθήνα, στη Θεσσαλονίκη, στην Πάτρα και αλλού.', 'faq.q9': 'Τι είδη εργασιών μπορώ να βρω στο CanHelp;', 'faq.a9': 'Επισκευές, καθαρισμό, ηλεκτρολόγους, μαθήματα, σχεδιασμό, IT, μετακομίσεις, ομορφιά και πολλά άλλα. Οι κατηγορίες αυξάνονται συνεχώς.', 'faq.q10': 'Υπάρχει εφαρμογή για κινητό;', 'faq.a10': 'Ναι! Το CanHelp διατίθεται για Android και iOS. Κατέβασε την εφαρμογή και διαχειρίσου τα πάντα από το τηλέφωνό σου.', // How it works 'how.step1.title': 'Δημοσίευσε εργασία', 'how.step1.desc': 'Περίγραψε τι χρειάζεσαι και ορίζε τον προϋπολογισμό σου', 'how.step2.title': 'Λάβε προσφορές', 'how.step2.desc': 'Ειδικοί θα σου στείλουν προσφορές με τιμή και χρόνο', 'how.step3.title': 'Επίλεξε & ξεκίνα', 'how.step3.desc': 'Επέλεξε τον καλύτερο επαγγελματία και ξεκίνα τη συνεργασία', // Tasks page 'tasks.title': 'εργασίες', 'tasks.filters': 'Φίλτρα', 'tasks.search': 'Αναζήτηση', 'tasks.search.placeholder': 'Τίτλος ή λέξη κλειδί...', 'tasks.search.btn': 'Αναζήτηση', 'tasks.publish': 'Δημοσίευση', 'tasks.category.all': 'Όλες', 'tasks.category.all_in': 'Όλα στην', 'tasks.category.label': 'Κατηγορία', 'tasks.location.label': 'Πόλη', 'tasks.location.placeholder': 'π.χ. Αθήνα', 'tasks.empty': 'Δεν βρέθηκαν εργασίες', 'tasks.empty.cta': 'Δημοσίευσε την πρώτη', // Task detail 'task.status.open': 'Ανοιχτή', 'task.status.in_progress': 'Σε εξέλιξη', 'task.status.completed': 'Ολοκληρωμένη', 'task.status.cancelled': 'Ακυρωμένη', 'task.status.draft': 'Πρόχειρο', 'task.budget': 'Προϋπολογισμός', 'task.location': 'Τοποθεσία', 'task.deadline': 'Ημερομηνία έναρξης', 'task.created_at': 'Δημιουργήθηκε', 'task.customer': 'Πελάτης', 'task.offer.btn': 'Υποβολή προσφοράς', 'task.invite.banner_title': 'Σας προσκαλούν σε αυτήν την εργασία', 'task.invite.banner_hint': 'Ο πελάτης σας πρόσκαλεσε προσωπικά', 'task.invite.accept': 'Αποστολή προσφοράς', 'task.invite.decline': 'Άρνηση', 'offer.accept': 'Αποδοχή', 'offer.decline': 'Απόρριψη', 'task.complete': 'Ολοκλήρωση εργασίας', 'task.complete.confirm': 'Να ολοκληρωθεί η εργασία;', 'task.edit': 'Επεξεργασία', 'task.status_label': 'Κατάσταση', 'task.yours': 'Η εργασία σου', 'task.offer.yours': 'Η προσφορά σου', 'review.leave': 'Άφησε αξιολόγηση', 'review.rating': 'Βαθμολογία', 'review.comment': 'Σχόλιο', 'review.comment.placeholder': 'Πες μας για την εμπειρία σου...', 'review.submit': 'Υποβολή αξιολόγησης', 'review.submitting': 'Αποστολή...', 'review.done': 'Η αξιολόγηση καταχωρήθηκε!', 'profile.reviews': 'Αξιολογήσεις', 'profile.no_reviews': 'Δεν υπάρχουν αξιολογήσεις ακόμα', 'profile.rating': 'Βαθμολογία', 'profile.skills.label': 'Δεξιότητες', 'profile.member_since': 'Μέλος από', 'task.offers': 'Προσφορές', 'task.offers.none': 'Δεν υπάρχουν ακόμα προσφορές', // Create task 'create.title': 'Δημοσίευση εργασίας', 'create.field.title': 'Τίτλος', 'create.field.description': 'Περιγραφή', 'create.field.category': 'Κατηγορία', 'create.field.category.select': 'Επιλέξτε...', 'create.field.location': 'Τοποθεσία', 'create.field.location.any': 'Οπουδήποτε', 'create.field.location.all': 'Ολόκληρη η πόλη', 'create.field.budget': 'Προϋπολογισμός (€)', 'create.field.deadline': 'Ημερομηνία έναρξης', 'create.field.budget_negotiable': 'Η τιμή είναι διαπραγματεύσιμη', 'create.field.time_slot': 'Χρόνος εκτέλεσης', 'create.field.time_slot.any': 'Οποιαδήποτε', 'create.field.time_slot.morning': 'Πρωινό (08:00–13:00)', 'create.field.time_slot.afternoon': 'Μεσημέρι (13:00–18:00)', 'create.field.time_slot.evening': 'Βράδυ (18:00–22:00)', 'create.field.time_slot.weekend': 'Σαββατοκύριακο', 'create.field.address': 'Διεύθυνση (προαιρετικά)', 'create.field.address.district': 'Συνοικία', 'create.field.address.street': 'Οδός', 'create.field.address.house': 'Αριθμός', 'create.field.confidential': 'Εμπιστευτική σημείωση', 'create.field.confidential.placeholder': 'Λεπτομέρειες που θα δει μόνο ο αναδοχόμενος...', 'create.field.confidential.hint': 'Δεν εμφανίζεται δημόσια', 'create.field.photos': 'Φωτογραφίες', 'create.field.photos.add': 'Προσθήκη φωτογραφίας', 'create.field.photos.uploading': 'Ανέβασμα...', 'task.budget_negotiable': 'Τιμή διαπραγματεύσιμη', 'task.time_slot': 'Χρόνος', 'task.confidential': 'Εμπιστευτική σημείωση', 'create.field.title.placeholder': 'π.χ. Καθαρισμός διαμερίσματος 80τμ', 'create.field.description.placeholder': 'Περίγραψε λεπτομερώς τι χρειάζεσαι...', 'create.field.location.placeholder': 'π.χ. Αθήνα, Κολωνάκι', 'create.field.budget.placeholder': 'π.χ. 100', 'create.submit': 'Δημοσίευση εργασίας', 'create.submitting': 'Δημοσίευση...', // Auth 'login.title': 'Καλωσόρισες', 'login.subtitle': 'Σύνδεση στο CanHelp', 'login.email': 'Email', 'login.password': 'Κωδικός', 'login.submit': 'Σύνδεση', 'login.submitting': 'Σύνδεση...', 'login.error': 'Λάθος email ή κωδικός', 'login.unverified.title': 'Επιβεβαιώστε το email σας', 'login.unverified.desc': 'Στείλαμε σύνδεσμο επαλήθευσης στο email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε το σύνδεσμο.', 'login.unverified.resend': 'Αποστολή νέου email επαλήθευσης', 'login.unverified.sending': 'Αποστολή...', 'login.unverified.sent': '✓ Εστάλη — ελέγξτε τα εισερχόμενα', 'profile.email.verified': 'Email επαληθεύτηκε', 'profile.email.not_verified': 'Email δεν επαληθεύτηκε', 'login.no_account': 'Δεν έχεις λογαριασμό;', 'login.register_link': 'Εγγραφή', 'login.forgot_password': 'Ξέχασα τον κωδικό', 'login.or_continue_with': 'ή συνεχίστε με', 'login.continue_google': 'Σύνδεση με Google', 'forgot.title': 'Ξέχασα τον κωδικό', 'forgot.subtitle': 'Εισάγετε το email σας για να λάβετε σύνδεσμο ανάκτησης', 'forgot.email': 'Email', 'forgot.submit': 'Αποστολή', 'forgot.submitting': 'Αποστολή...', 'forgot.sent.title': 'Ελέγξτε τα εισερχόμενά σας', 'forgot.sent.desc': 'Αν υπάρχει λογαριασμός με αυτό το email, θα σας στείλουμε σύνδεσμο ανάκτησης κωδικού.', 'forgot.back_to_login': 'Επιστροφή στη σύνδεση', 'forgot.error': 'Αποτυχία αποστολής. Ελέγξτε το email σας ή δοκιμάστε ξανά.', 'forgot.error.not_found': 'Δεν βρέθηκε λογαριασμός με αυτό το email.', 'forgot.error.send_failed': 'Αποτυχία αποστολής email. Δοκιμάστε ξανά αργότερα', 'reset.title': 'Νέος κωδικός', 'reset.subtitle': 'Εισάγετε τον νέο σας κωδικό', 'reset.password': 'Νέος κωδικός', 'reset.confirm': 'Επιβεβαίωση κωδικού', 'reset.submit': 'Αλλαγή κωδικού', 'reset.submitting': 'Αποθήκευση...', 'reset.success': 'Ο κωδικός άλλαξε επιτυχώς. Ανακατεύθυνση στη σύνδεση...', 'reset.back_to_login': 'Επιστροφή στη σύνδεση', 'reset.error.mismatch': 'Οι κωδικοί δεν ταιριάζουν', 'reset.error.invalid': 'Μη έγκυρος σύνδεσμος. Παρακαλώ ζητήστε νέο.', 'register.title': 'Εγγραφή', 'register.subtitle': 'Δημιουργία λογαριασμού στο CanHelp', 'register.first_name': 'Όνομα', 'register.last_name': 'Επώνυμο', 'register.email': 'Email', 'register.password': 'Κωδικός (min 8 χαρακτήρες)', 'register.role': 'Ρόλος', 'register.role.customer': 'Χρήστης', 'register.role.customer.desc': 'Δημοσιεύω εργασίες', 'register.role.specialist': 'Ειδικός', 'register.role.specialist.desc': 'Αναλαμβάνω εργασίες', 'register.submit': 'Δημιουργία λογαριασμού', 'register.submitting': 'Εγγραφή...', 'register.has_account': 'Έχεις ήδη λογαριασμό;', 'register.login_link': 'Σύνδεση', 'register.continue_google': 'Εγγραφή με Google', 'register.check_email.title': 'Ελέγξτε το email σας', 'register.check_email.desc': 'Στείλαμε σύνδεσμο επαλήθευσης στη διεύθυνση email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε τον σύνδεσμο.', 'register.check_email.login': 'Επιστροφή στη σύνδεση', // Dashboard 'dashboard.title': 'Πίνακας ελέγχου', 'dashboard.new_task': '+ Νέα εργασία', 'dashboard.my_tasks': 'Οι εργασίες μου', 'dashboard.my_offers': 'Οι προσφορές μου', 'dashboard.invitations': 'Προσκλήσεις για εργασία', 'dashboard.offers_count': 'προσφορές', 'dashboard.declined_count': 'απορρίφθηκαν', 'dashboard.completed_tasks': 'Ολοκληρωμένες εργασίες', 'dashboard.completed_offers': 'Ολοκληρωμένες προσφορές', 'dashboard.review_pending': 'Η αξιολόγηση δεν έχει υποβληθεί ακόμα', 'tasks.new.top_specialists': 'Κορυφαίοι ειδικοί', 'tasks.new.select_category': 'Επιλέξτε κατηγορία για να δείτε ειδικούς', 'tasks.new.invite': 'Πρόσκληση', 'tasks.new.invited': 'Επιλέχθηκε ✓', 'reviews.count': 'αξιολογήσεις', 'filter.location': 'Τοποθεσία', 'filter.language': 'Γλώσσες', 'filter.language.any': 'Οποιαδήποτε γλώσσα', 'filter.category.all': 'Όλες οι κατηγορίες', 'user.categories': 'Κατηγορίες', 'user.work_area': 'Περιοχή εργασίας', 'dashboard.tasks.empty': 'Δεν έχεις δημοσιεύσει εργασίες', 'dashboard.tasks.empty.cta': 'Δημοσίευσε την πρώτη σου', 'dashboard.tasks.add_new': 'Πρόσθεσε νέα εργασία', 'dashboard.offers.empty': 'Δεν έχεις υποβάλλει προσφορές', 'dashboard.offers.empty.cta': 'Βρες εργασίες', 'dashboard.customer.specialists_title': 'Ψάχνεις εκτελεστή;', 'dashboard.customer.specialists_hint': 'Δες προφίλ ειδικών, διάβασε αξιολογήσεις και κάλεσέ τους στις εργασίες σου', 'dashboard.customer.specialists_cta': 'Βρες ειδικό', 'dashboard.customer.how_title': 'Πώς λειτουργεί', 'dashboard.customer.step1': 'Δημιούργησε εργασία με περιγραφή και προϋπολογισμό', 'dashboard.customer.step2': 'Οι ειδικοί θα στείλουν προσφορές με τιμή και χρόνο', 'dashboard.customer.step3': 'Επίλεξε τον κατάλληλο και ξεκίνα τη συνεργασία', // Notifications 'notif.title': 'Ειδοποιήσεις', 'notif.mark_all': 'Σήμανση όλων ως αναγνωσμένα', 'notif.empty': 'Δεν υπάρχουν ειδοποιήσεις', 'notif.type.new_offer': 'Νέα προσφορά', 'notif.type.offer_accepted': 'Η προσφορά σας έγινε δεκτή', 'notif.type.offer_declined': 'Η προσφορά σας απορρίφθηκε', 'notif.type.task_completed': 'Η εργασία ολοκληρώθηκε', 'notif.type.task_cancelled': 'Η εργασία ακυρώθηκε', 'notif.type.new_message': 'Νέο μήνυμα', 'notif.type.new_review': 'Νέα αξιολόγηση', 'notif.type.task_invite': 'Πρόσκληση σε εργασία', 'notif.body.new_offer': 'Νέα προσφορά για «{title}»', 'notif.body.offer_accepted': 'Η προσφορά σας για «{title}» έγινε δεκτή', 'notif.body.offer_declined': 'Η προσφορά σας για «{title}» απορρίφθηκε', 'notif.body.task_invite': 'Σας προσκαλούν για «{title}»', 'notif.body.new_review': 'Λάβατε αξιολόγηση {rating}★', // Offer status 'offer.status.pending': 'Εκκρεμεί', 'offer.status.accepted': 'Αποδεκτή', 'offer.status.declined': 'Απορρίφθηκε', 'offer.status.withdrawn': 'Αποσύρθηκε', 'offer.status.other_accepted': 'Επιλέχθηκε άλλος ειδικός', // Common 'common.loading': 'Φόρτωση...', 'common.error': 'Σφάλμα', 'common.save': 'Αποθήκευση', 'common.saving': 'Αποθήκευση...', 'common.cancel': 'Ακύρωση', 'common.add': 'Προσθήκη', 'common.close': 'Κλείσιμο', 'common.edit': 'Επεξεργασία', 'common.delete': 'Διαγραφή', 'common.from': 'από', 'common.currency': '€', 'common.greece': 'Ελλάδα', // Chat 'chat.connected': 'Συνδεδεμένος', 'chat.disconnected': 'Αποσυνδεδεμένος', 'chat.no_rooms': 'Δεν υπάρχουν συνομιλίες ακόμα', 'chat.task_fallback': 'Εργασία', 'chat.select': 'Επίλεξε συνομιλία', 'chat.no_messages': 'Δεν υπάρχουν μηνύματα', 'chat.placeholder': 'Γράψε μήνυμα... (Enter για αποστολή)', 'chat.conversation_fallback': 'Συνομιλία', 'chat.direct_chat': 'Απευθείας συνομιλία', 'chat.linked_task': 'Συνδεδεμένη εργασία', 'chat.write_btn': 'Μήνυμα', 'chat.just_now': 'μόλις τώρα', 'chat.min_ago': 'λ', 'chat.write_specialist': 'Γράψε στον ειδικό', 'chat.write_customer': 'Γράψε στον πελάτη', 'chat.notif_settings': 'Ρυθμίσεις ειδοποιήσεων', 'chat.notif_messages': 'Ειδοποιήσεις για νέα μηνύματα', 'chat.toast_title': 'Νέο μήνυμα', 'chat.toast_open': 'Άνοιγμα συνομιλίας', // Offer form 'offer.price': 'Τιμή', 'offer.price.placeholder': 'π.χ. 80', 'offer.customer_budget': 'Προϋπολογισμός πελάτη', 'offer.message': 'Μήνυμα', 'offer.optional': 'προαιρετικό', 'offer.message.placeholder': 'Παρουσίασε τον εαυτό σου, την εμπειρία σου και γιατί είσαι η καλύτερη επιλογή...', 'offer.submitting': 'Αποστολή...', // Profile 'profile.photo': 'Φωτογραφία προφίλ', 'profile.photo.change': 'Αλλαγή φωτογραφίας', 'profile.photo.hint': 'JPEG, PNG, WebP · έως 5MB', 'profile.basic_info': 'Βασικά στοιχεία', 'profile.phone': 'Τηλέφωνο', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Σύντομη περιγραφή', 'profile.bio.placeholder': 'Πες μας λίγα λόγια για εσένα...', 'profile.language': 'Γλώσσα', 'profile.language.hint': 'Γλώσσα διεπαφής και email ειδοποιήσεων', 'profile.languages': 'Γλώσσες επικοινωνίας', 'profile.languages.hint': 'Επιλέξτε όλες τις γλώσσες που μιλάτε', 'profile.skills': 'Δεξιότητες', 'profile.skills.subtitle': 'Προσθέσε τις υπηρεσίες που προσφέρεις', 'profile.skills.placeholder': 'π.χ. Καθαρισμός, IT, Μαθήματα...', 'profile.role': 'Ρόλος λογαριασμού', 'profile.role.specialist': '🔧 Ειδικός', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 Χρήστης', 'profile.role.change': 'Για αλλαγή ρόλου επικοινωνήστε με την υποστήριξη.', 'profile.become_specialist': 'Γίνε Ειδικός', 'profile.become_specialist.desc': 'Αναβαθμίσου σε Ειδικό για να δέχεσαι εργασίες και να δημιουργήσεις το προφίλ σου.', 'become_specialist.hero.title': 'Κέρδισε χρήματα κάνοντας αυτό που ξέρεις', 'become_specialist.hero.subtitle': 'Δημιούργησε προφίλ ειδικού και λάβε παραγγελίες από πελάτες σε όλη την Ελλάδα', 'become_specialist.how.title': 'Πώς λειτουργεί', 'become_specialist.step1.title': 'Δημιούργησε κάρτα ειδικού', 'become_specialist.step1.desc': 'Δήλωσε κατηγορίες, δεξιότητες και περιοχές κάλυψης — το σύστημα θα βρει τις κατάλληλες εργασίες για σένα αυτόματα', 'become_specialist.step2.title': 'Βρες εργασίες', 'become_specialist.step2.desc': 'Ανακάλυψε εργασίες στις κατηγορίες σου στην ενότητα «Αναζήτηση εργασιών»', 'become_specialist.step3.title': 'Στείλε προσφορά & κέρδισε', 'become_specialist.step3.desc': 'Υποβάλε προσφορές με τιμή και χρόνο, επικοινωνήσε με πελάτες και ολοκλήρωσε εργασίες', 'become_specialist.benefits.title': 'Πλεονεκτήματα προφίλ ειδικού', 'become_specialist.benefit1': 'Αναζήτηση εργασιών ανά κατηγορία και τοποθεσία', 'become_specialist.benefit2': 'Δημόσιο προφίλ με αξιολογήσεις πελατών', 'become_specialist.benefit3': 'Πρόγραμμα διαθεσιμότητας ορατό στους πελάτες', 'become_specialist.benefit4': 'Προσθήκη σε αγαπημένα από πελάτες', 'become_specialist.cta': 'Γίνε Ειδικός — είναι δωρεάν', 'become_specialist.free_badge': 'Δωρεάν εγγραφή', 'profile.tab.notifications': 'Ειδοποιήσεις', 'profile.tab.reviews': 'Αξιολογήσεις', 'profile.tab.referral': 'Παραπομπές', 'profile.tab.auto_response': 'Αυτόματη απάντηση', 'profile.tab.site': 'Site', 'profile.site.title': 'Προσωπική σελίδα', 'profile.site.url_label': 'Προσωπικό site', 'profile.site.copy': 'Αντιγραφή', 'profile.site.copied': 'Αντιγράφηκε', 'profile.site.visible_title': 'Τι εμφανίζεται στη σελίδα σας', 'profile.site.visible.name': 'Όνομα και φωτογραφία', 'profile.site.visible.bio': 'Βιογραφικό', 'profile.site.visible.rating': 'Αξιολόγηση και κριτικές', 'profile.site.visible.portfolio': 'Χαρτοφυλάκιο / Κάρτες', 'profile.site.visible.contacts': 'Στοιχεία επικοινωνίας', 'profile.site.visible.full_last_name': 'Πλήρες επώνυμο', 'profile.site.visible.services': 'Κάρτες υπηρεσιών', 'profile.site.visible.reviews': 'Ενότητα κριτικών', 'profile.site.visible.status': 'Κατάσταση «Έτοιμος να βοηθήσω»', 'profile.site.theme': 'Θέμα εμφάνισης', 'profile.site.theme.dark': 'Σκοτεινό', 'profile.site.theme.light': 'Φωτεινό', 'profile.site.slug_taken': 'Αυτή η διεύθυνση είναι ήδη κατειλημμένη', 'profile.site.stats.title': 'Στατιστικά επισκεψιμότητας', 'profile.site.stats.days': 'τελευταίες 30 ημέρες', 'profile.site.stats.views': 'Προβολές', 'profile.site.stats.unique': 'Μοναδικοί επισκέπτες', 'profile.site.stats.messages': 'Μηνύματα', 'profile.site.stats.total_views': 'Συνολικές προβολές', 'profile.site.stats.total_unique': 'Μοναδικοί επισκέπτες', 'profile.site.stats.total_messages': 'Μηνύματα', 'profile.site.stats.empty': 'Δεν υπάρχουν δεδομένα ακόμη', 'profile.site.stats.loading': 'Φόρτωση στατιστικών...', 'profile.site.stats.no_slug': 'Ορίστε τη διεύθυνση του site για να δείτε στατιστικά', 'profile.site.edit_bio_hint': 'Το βιογραφικό και η φωτογραφία ρυθμίζονται στην καρτέλα «Βασικά».', 'status.can_help_now_hint': 'Η κάρτα σου εμφανίζεται ψηλότερα', 'status.need_help_hint': 'Οι ειδικοί μπορούν να σε βοηθήσουν', 'profile.referral.title': 'Πρόγραμμα παραπομπών', 'profile.referral.desc': 'Μοιράσου τον σύνδεσμο σου και κέρδισε ανταμοιβές για κάθε νέο χρήστη.', 'profile.referral.link_label': 'Ο σύνδεσμος παραπομπής σου', 'profile.referral.copy': 'Αντιγραφή', 'profile.referral.copied': 'Αντιγράφηκε!', 'profile.referral.invited_count': 'επιτυχείς παραπομπές', 'profile.referral.no_code': 'Ο κωδικός παραπομπής δεν είναι διαθέσιμος.', 'notifications.title': 'Ρυθμίσεις ειδοποιήσεων', 'notifications.email.new_tasks': 'Email για νέες εργασίες', 'notifications.email.new_tasks.desc': 'Λάβε email όταν δημοσιευτεί νέα εργασία στις κατηγορίες σου', 'notifications.messages.desc': 'Λαμβάνεις ειδοποίηση όταν έρθει νέο μήνυμα', 'notifications.saved': 'Ρυθμίσεις αποθηκεύτηκαν', 'notifications.plan_required': 'Συνδρομή απαιτείται για αυτή τη λειτουργία', 'profile.tab.info': 'Βασικά στοιχεία', 'profile.tab.finance': 'Οικονομικά', 'profile.tab.skills': 'Δεξιότητες', 'profile.tab.categories': 'Κατηγορίες', 'profile.tab.geography': 'Γεωγραφία', 'profile.specialist.categories': 'Κατηγορίες εργασιών', 'profile.specialist.categories.desc': 'Επίλεξε τις κατηγορίες στις οποίες εργάζεσαι', 'profile.specialist.geography': 'Περιοχές κάλυψης', 'profile.specialist.geography.desc': 'Επίλεξε τις πόλεις / περιοχές όπου δραστηριοποιείσαι', 'profile.saving': 'Αποθήκευση...', 'profile.upload.error': 'Σφάλμα κατά την αναφόρτωση', 'profile.saved': 'Αποθηκεύτηκε', 'profile.tab.cards': 'Χαρτοφυλάκιο', 'profile.cards.count': 'Χαρτοφυλάκια', 'profile.cards.add': 'Νέο χαρτοφυλάκιο', 'profile.cards.new_title': 'Τίτλος νέου χαρτοφυλακίου', 'profile.cards.placeholder': 'π.χ. Υδραυλικά', 'profile.cards.create': 'Δημιουργία', 'profile.cards.cancel': 'Ακύρωση', 'profile.cards.empty': 'Δεν έχετε χαρτοφυλάκιο', 'profile.cards.create_first': 'Δημιουργήστε το πρώτο σας χαρτοφυλάκιο', 'profile.cards.delete_confirm': 'Διαγραφή χαρτοφυλακίου;', 'profile.card.tab.main': 'Γενικά', 'profile.card.tab.skills': 'Δεξιότητες', 'profile.card.tab.categories': 'Κατηγορίες', 'profile.card.tab.geography': 'Γεωγραφία', 'profile.card.tab.portfolio': 'Γκαλερί', 'profile.card.active': 'Ενεργή', 'profile.card.save': 'Αποθήκευση', 'profile.card.saved': 'Αποθηκεύτηκε', 'profile.card.delete': 'Διαγραφή', 'profile.card.skill.add': 'Προσθήκη δεξιότητας', 'profile.card.photo.add': 'Προσθήκη φωτογραφίας', 'profile.card.photo.uploading': 'Μεταφόρτωση...', 'profile.card.photo.empty': 'Δεν υπάρχουν φωτογραφίες', 'profile.card.item.title': 'Τίτλος', 'profile.card.item.desc': 'Περιγραφή', 'profile.card.item.save': 'Αποθήκευση', 'profile.card.item.cancel': 'Ακύρωση', 'profile.card.item.edit': 'Επεξεργασία', 'profile.upgrade.cards_limit': 'Όριο χαρτοφυλακίων εξαντλήθηκε', 'profile.upgrade.plan': 'Τρέχον πλάνο:', 'profile.upgrade.contact': 'Επικοινωνήστε με τον διαχειριστή για αλλαγή πλάνου', 'profile.upgrade.ok': 'Εντάξει', 'profile.plan.title': 'Πλάνο συνδρομής', 'profile.balance': 'Υπόλοιπο', 'profile.balance.topup': 'Αναπλήρωση υπολοίπου', 'profile.balance.topup.title': 'Αναπλήρωση υπολοίπου', 'profile.balance.topup.amount': 'Ποσό (σε EUR)', 'profile.balance.topup.hint': 'Επιλέξτε ποσό ή εισαγάγετε μανούαλα', 'profile.balance.topup.submit': 'Πληρωμή', 'profile.balance.topup.loading': 'Ρεδιρεκτάρισμα...', 'profile.balance.topup.error': 'Σφάλμα μετάβασης στην πληρωμή. Προσπαθήστε ξανά.', 'payment.success.title': 'Πληρωμή επιτυχής!', 'payment.success.desc': 'Το υπόλοιπό σας ενημερώθηκε.', 'payment.cancelled.title': 'Ακύρωση πληρωμής', 'payment.cancelled.desc': 'Η πληρωμή ακυρώθηκε. Κανένα χρήμα δεν χρεώθηκε.', 'payment.pending.title': 'Σε εξέλιξη...', 'payment.pending.desc': 'Επεξεργαζόμαστε την πληρωμή σας.', 'payment.back_to_profile': 'Επιστροφή στο προφίλ', 'profile.plan.basic': 'Βασικό (δωρεάν)', 'profile.plan.contact_upgrade': 'Επικοινωνήστε με τον διαχειριστή για αναβάθμιση', 'profile.plan.cards_up_to': 'Χαρτοφυλάκια: έως', 'profile.plan.cards_unlimited': 'Χαρτοφυλάκια: απεριόριστα', 'profile.plan.tasks_up_to': 'Εργασίες: έως', 'profile.plan.offers_up_to': 'Προσφορές: έως', 'profile.plan.valid_until': 'Ισχύει έως', 'profile.plan.no_expiry': 'Δεν λήγει', // Create task 'create.error': 'Σφάλμα κατά τη δημοσίευση', // Tasks list extras 'tasks.category.general': 'Γενικά', 'tasks.budget.range': 'Εύρος:', 'tasks.budget.from': 'από', 'tasks.budget.to': 'έως', 'tasks.filter.reset': 'Εκκαθάριση φίλτρων', 'tasks.load_more': 'Φόρτωση ακόμα', 'tasks.showing': 'Αποτελέσματα:', 'tasks.field.budget': 'Προϋπολογισμός, €', // Admin 'admin.title': 'Πίνακας Διαχείρισης', 'admin.tab.stats': 'Στατιστικά', 'admin.tab.users': 'Χρήστες', 'admin.tab.tasks': 'Εργασίες', 'admin.tab.reports': 'Αναφορές', 'admin.stats.users': 'Χρήστες', 'admin.stats.tasks': 'Εργασίες', 'admin.stats.offers': 'Προσφορές', 'admin.stats.reviews': 'Αξιολογήσεις', 'admin.tasks.by_status': 'Εργασίες ανά κατάσταση', 'admin.col.user': 'Χρήστης', 'admin.col.email': 'Email', 'admin.col.role': 'Ρόλος', 'admin.col.registered': 'Εγγραφή', 'admin.col.status': 'Κατάσταση', 'admin.col.title': 'Τίτλος', 'admin.col.budget': 'Προϋπολογισμός', 'admin.col.created': 'Δημιουργία', 'admin.users.active': 'Ενεργός', 'admin.users.inactive': 'Ανενεργός', 'admin.users.deactivate': 'Απενεργοποίηση', 'admin.users.activate': 'Ενεργοποίηση', 'admin.tasks.cancel': 'Ακύρωση', 'admin.reports.none': 'Δεν υπάρχουν αναφορές', 'admin.reports.reviewed': 'Αναθεωρήθηκε', 'admin.reports.dismiss': 'Απόρριψη', 'admin.pagination.total': 'Σύνολο', 'admin.users.role.change': 'Αλλαγή ρόλου', 'admin.users.search.placeholder': 'Αναζήτηση ονόματος ή email...', 'admin.tasks.delete': 'Διαγραφή', 'admin.tasks.delete.confirm': 'Διαγραφή αυτής της εργασίας μόνιμα;', 'admin.tasks.search.placeholder': 'Αναζήτηση τίτλου...', 'admin.col.customer': 'Πελάτης', 'admin.col.reporter': 'Καταγγέλλων', 'admin.col.target': 'Στόχος', 'admin.filter.all_roles': 'Όλοι οι ρόλοι', 'admin.filter.all_statuses': 'Όλες οι καταστάσεις', 'admin.reports.target.task': 'Εργασία', 'admin.reports.target.user': 'Χρήστης', 'admin.tab.categories': 'Κατηγορίες', 'admin.tab.locations': 'Πόλεις & Περιοχές', 'admin.tab.logs': 'Αρχεία', 'admin.tab.plans': 'Πακέτα', 'admin.tab.settings': 'Ρυθμίσεις', 'admin.logs.subtab.ai': 'AI Logs', 'admin.logs.subtab.activity': 'Δραστηριότητα', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Ειδοποιήσεις', 'admin.notif_logs.type': 'Τύπος', 'admin.notif_logs.title': 'Τίτλος', 'admin.notif_logs.read': 'Διαβασμένο', 'admin.notif_logs.empty': 'Δεν υπάρχουν αρχεία ειδοποιήσεων', 'admin.stats.notif_chart_title': 'Ειδοποιήσεις ανά ημέρα', 'admin.stats.notif_label': 'Ειδοποιήσεις', 'admin.stats.mail_chart_title': 'Emails ανά ημέρα', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'Όλα', 'admin.stats.specialists': 'Ειδικοί', 'admin.col.plan': 'Πακέτο', 'admin.back_home': 'Αρχική', 'admin.plans.title': 'Πακέτα συνδρομής', 'admin.plans.add': '+ Νέο πακέτο', 'admin.plans.empty': 'Δεν υπάρχουν πακέτα', 'admin.plans.form.new': 'Νέο πακέτο', 'admin.plans.form.edit': 'Επεξεργασία πακέτου', 'admin.plans.form.name': 'Όνομα', 'admin.plans.form.price': 'Τιμή (EUR)', 'admin.plans.form.old_price': 'Παλιά τιμή (EUR, προαιρετικό)', 'admin.plans.form.max_offers': 'Μέγ. προσφορές (κενό = χωρίς όριο)', 'admin.plans.form.max_cards': 'Μέγ. χαρτοφυλάκιο (κενό = χωρίς όριο)', 'admin.plans.form.duration_days': 'Διάρκεια (ημέρες, κενό = χωρίς λήξη)', 'admin.plans.form.description': 'Περιγραφή', 'admin.plans.form.features': 'Δυνατότητες (μία ανά γραμμή)', 'admin.plans.form.notify': 'Ειδοποιήσεις νέων εργασιών', 'admin.plans.form.default': 'Προεπιλογή', 'admin.plans.form.active': 'Ενεργό', 'admin.plans.form.order': 'Σειρά', 'admin.plans.form.role': 'Ρόλος', 'admin.plans.form.tier': 'Επίπεδο', 'admin.plans.form.role.customer': 'Πελάτης', 'admin.plans.form.role.specialist': 'Ειδικός', 'admin.plans.form.tier.free': 'Δωρεάν', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Όρια (κενό = χωρίς όριο)', 'admin.plans.form.max_messages_day': 'Μέγ. μηνύματα/ημέρα', 'admin.plans.form.max_orders_day': 'Μέγ. παραγγελίες/ημέρα', 'admin.plans.form.max_skills': 'Μέγ. δεξιότητες', 'admin.plans.form.max_profiles': 'Μέγ. προφίλ', 'admin.plans.form.max_portfolio': 'Μέγ. στοιχεία χαρτοφυλακίου', 'admin.plans.form.section.boost': 'Πολλαπλασιαστές & Ενίσχυση', 'admin.plans.form.search_boost': 'Ενίσχυση αναζήτησης', 'admin.plans.form.offers_multiplier': 'Πολλαπλασιαστής προσφορών', 'admin.plans.form.section.contact': 'Δικαιώματα επικοινωνίας', 'admin.plans.form.can_contact_free': 'Επικοινωνία με δωρεάν χρήστες', 'admin.plans.form.can_contact_pro': 'Επικοινωνία με Pro χρήστες', 'admin.plans.form.can_contact_all': 'Επικοινωνία με όλους', 'admin.plans.form.can_show_contact': 'Εμφάνιση στοιχείων επικοινωνίας', 'admin.plans.form.can_view_phone': 'Προβολή τηλεφώνου', 'admin.plans.form.section.features': 'Λειτουργίες', 'admin.plans.form.upload_video': 'Μεταφόρτωση βίντεο', 'admin.plans.form.favorites': 'Αγαπημένα', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Σήμα επαλήθευσης', 'admin.plans.form.highlighted_reviews': 'Προβεβλημένες κριτικές', 'admin.plans.form.personal_site': 'Προσωπική σελίδα', 'admin.plans.form.can_help_now': 'Κατάσταση «Μπορώ να βοηθήσω»', 'admin.plans.form.need_help': 'Κατάσταση «Χρειάζομαι βοήθεια»', 'admin.plans.form.auto_response': 'Αυτόματη απάντηση', 'admin.plans.form.auto_match': 'Αυτόματη αντιστοίχιση', 'admin.plans.form.instant_dispatch_free': 'Άμεση αποστολή (δωρεάν)', 'admin.plans.form.instant_dispatch_pro': 'Άμεση αποστολή (Pro)', 'admin.plans.badge.default': 'Προεπιλογή', 'admin.plans.badge.inactive': 'Ανενεργό', 'admin.plans.make_default': 'Ορισμός ως προεπιλογή', 'admin.plans.tasks': 'Εργασίες', 'admin.plans.offers': 'Προσφορές', 'admin.plans.cards': 'Χαρτοφυλάκιο', 'admin.plans.notify_tasks': 'Ειδοποιήσεις εργασιών', 'admin.plans.delete.confirm': 'Διαγραφή πακέτου', 'admin.activity.title': 'Αρχείο δραστηριότητας', 'admin.activity.event': 'Γεγονός', 'admin.activity.all_events': 'Όλα τα γεγονότα', 'admin.activity.from': 'Από', 'admin.activity.to': 'Έως', 'admin.activity.reset': 'Επαναφορά', 'admin.activity.total': 'Σύνολο', 'admin.activity.empty': 'Δεν υπάρχουν εγγραφές', 'admin.mail.event': 'Συμβάν email', 'admin.mail.all_events': 'Όλα τα email συμβάντα', 'admin.mail.from': 'Από', 'admin.mail.to': 'Έως', 'admin.mail.reset': 'Επαναφορά', 'admin.mail.total': 'Σύνολο', 'admin.mail.empty': 'Δεν υπάρχουν email logs', 'admin.mail.recipient': 'Παραλήπτης', 'admin.mail.provider': 'Πάροχος', 'admin.mail.details': 'Λεπτομέρειες', 'admin.mail.status': 'Κατάσταση', 'admin.mail.success': 'Επιτυχία', 'admin.mail.failed': 'Σφάλμα', 'admin.event.email_sent': 'Email sent', 'admin.event.email_failed': 'Email failed', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Admin test email sent', 'admin.event.admin_email_test_failed': 'Admin test email failed', 'admin.logs.empty': 'Δεν υπάρχουν εγγραφές', 'admin.logs.date': 'Ημερομηνία', 'admin.logs.provider': 'Πάροχος', 'admin.logs.model': 'Μοντέλο', 'admin.logs.action': 'Ενέργεια', 'admin.logs.langs': 'Γλώσσες', 'admin.logs.in': 'Είσοδος', 'admin.logs.out': 'Έξοδος', 'admin.logs.total': 'Σύνολο', 'admin.logs.ms': 'ms', 'admin.logs.status': 'Κατάσταση', 'admin.stats.activity_30d': 'Δραστηριότητα 30 ημερών', 'admin.stats.tasks_label': 'Εργασίες', 'admin.stats.users_label': 'Χρήστες', 'admin.stats.specialists_label': 'Ειδικοί', 'admin.stats.tokens_title': 'Χρήση tokens (ανά μήνα)', 'admin.stats.tokens_out': 'Εξερχόμενα', 'admin.stats.tokens_in': 'Εισερχόμενα', 'admin.stats.tokens_out_label': 'Εξερχόμενα tokens', 'admin.stats.tokens_in_label': 'Εισερχόμενα tokens', 'admin.stats.cost_label': 'Κόστος (USD)', 'admin.stats.tasks_by_status': 'Εργασίες ανά κατάσταση', 'admin.task_status.open': 'Ανοιχτές', 'admin.task_status.in_progress': 'Σε εξέλιξη', 'admin.task_status.completed': 'Ολοκληρωμένες', 'admin.task_status.cancelled': 'Ακυρωμένες', 'admin.task_status.draft': 'Προσχέδια', 'admin.settings.tab.general': 'Γενικά', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Ειδοποιήσεις', 'admin.settings.tab.payment': 'Πληρωμή', 'admin.settings.tab.referral': 'Παραπομπές', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO & Συντήρηση', 'admin.settings.seo.maintenance_label': 'Λειτουργία συντήρησης', 'admin.settings.seo.maintenance_hint': 'Εμφάνιση σελίδας συντήρησης σε όλους τους επισκέπτες', 'admin.settings.seo.indexing_label': 'Ευρετηρίαση από μηχανές αναζήτησης', 'admin.settings.seo.indexing_hint': 'Επιτρέπει στις μηχανές αναζήτησης να ευρετηριάσουν τον ιστότοπο', 'admin.settings.seo.head_scripts_label': 'Scripts στο (JS)', 'admin.settings.seo.head_scripts_hint': 'Εκτελείται σε κάθε σελίδα (Google Tag Manager, analytics κ.λπ.)', 'admin.settings.seo.site_title_label': 'Τίτλος ιστότοπου', 'admin.settings.seo.site_description_label': 'Περιγραφή ιστότοπου (meta description)', 'admin.settings.referral.title': 'Πρόγραμμα παραπομπών', 'admin.settings.referral.hint': 'Επιβράβευσε χρήστες που φέρνουν νέους εγγεγραμμένους.', 'admin.settings.referral.enabled_label': 'Ενεργό', 'admin.settings.referral.enabled_hint': 'Ενεργοποίηση / απενεργοποίηση εφαρμογής ανταμοιβών', 'admin.settings.referral.customer_section': 'Για πελάτες', 'admin.settings.referral.specialist_section': 'Για ειδικούς', 'admin.settings.referral.plan_label': 'Πλάνο ανταμοιβής', 'admin.settings.referral.no_plan': '— χωρίς πλάνο —', 'admin.settings.referral.plan_hint': 'Αυτό το πλάνο θα ανατεθεί στον χρήστη που έφερε νέους. Εάν το τρέχον πλάνο του είναι υψηλότερο, θα προστεθούν μόνο οι μέρες.', 'admin.settings.referral.days_label': 'Ημέρες ανταμοιβής', 'admin.settings.referral.days_hint': 'Αριθμός ημερών που θα προστεθούν στη λήξη του πλάνου.', 'admin.settings.general.title': 'Γενικές ρυθμίσεις', 'admin.settings.general.site_name': 'Όνομα ιστότοπου', 'admin.settings.general.site_url': 'URL ιστότοπου', 'admin.settings.general.contact_email': 'Email επικοινωνίας', 'admin.settings.general.support_phone': 'Τηλέφωνο υποστήριξης', 'admin.settings.smtp.title': 'Ρυθμίσεις SMTP', 'admin.settings.smtp.hint': 'Χρησιμοποιείται για αποστολή ειδοποιήσεων email.', 'admin.settings.smtp.host': 'SMTP Host', 'admin.settings.smtp.port': 'Θύρα', 'admin.settings.smtp.encryption': 'Κρυπτογράφηση', 'admin.settings.smtp.enc.none': 'Χωρίς', 'admin.settings.smtp.enc.tls': 'STARTTLS (θύρα 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (θύρα 465)', 'admin.settings.smtp.username': 'Όνομα χρήστη', 'admin.settings.smtp.password': 'Κωδικός / App Password', 'admin.settings.smtp.from_name': 'Όνομα αποστολέα', 'admin.settings.smtp.from_email': 'Email αποστολέα', 'admin.settings.smtp.test': 'Αποστολή δοκιμαστικού email', 'admin.settings.smtp.sending': 'Αποστολή...', 'admin.settings.payment.hint': 'Τα στοιχεία για ePay Piraeus Bank.', 'admin.settings.env.test': 'Δοκιμαστικό (sandbox)', 'admin.settings.env.prod': 'Παραγωγή', 'admin.settings.env.label': 'Περιβάλλον', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Ενεργό', 'admin.settings.saving': 'Αποθήκευση...', 'admin.settings.saved': '✓ Αποθηκεύτηκε', 'admin.notif.vars_hint': 'Διαθέσιμες μεταβλητές στα πρότυπα', 'admin.notif.tmpl.not_set': 'Πρότυπο δεν έχει οριστεί', 'admin.notif.tmpl.subject_label': 'Θέμα email', 'admin.notif.tmpl.body_label': 'Κείμενο email (HTML)', 'admin.notif.tmpl.save': 'Αποθήκευση', 'admin.notif.tmpl.close': 'Κλείσιμο', 'admin.notif.tmpl.translate': 'Αυτόματη μετάφραση', 'admin.notif.tmpl.translating': 'Μετάφραση...', 'admin.notif.tmpl.saving': 'Αποθήκευση...', 'admin.notif.email_verification': 'Επαλήθευση email', 'admin.notif.registration_success': 'Επιτυχής εγγραφή', 'admin.notif.password_reset': 'Επαναφορά κωδικού', 'admin.notif.new_offer': 'Νέα προσφορά', 'admin.notif.new_task': 'Νέα εργασία', 'admin.notif.offer_accepted': 'Προσφορά αποδεκτή', 'admin.notif.new_message': 'Νέο μήνυμα', 'admin.notif.offer_declined': 'Απόρριψη προσφοράς', 'admin.notif.offer_other_accepted': 'Επιλέχθηκε άλλος ειδικός', 'admin.notif.task_updated': 'Ενημέρωση εργασίας', 'admin.notif.deadline_reminder': 'Υπενθύμιση προθεσμίας', 'admin.notif.task_archived': 'Αυτόματη απόσυρση εργασίας', 'admin.notif.referral_reward': 'Ανταμοιβή παραπομπής', // Plan lifecycle email templates 'admin.email_template.plan_activated': 'Τιμολόγιο — ενεργοποίηση πλάνου', 'admin.email_template.plan_upgraded': 'Τιμολόγιο — αναβάθμιση πλάνου', 'admin.email_template.plan_downgrade_scheduled': 'Τιμολόγιο — προγραμματισμένη υποβάθμιση', 'admin.email_template.plan_downgrade_applied': 'Τιμολόγιο — εφαρμογή υποβάθμισης', 'admin.email_template.plan_renewal_reminder': 'Τιμολόγιο — υπενθύμιση ανανέωσης', 'admin.email_template.plan_insufficient_funds': 'Τιμολόγιο — ανεπαρκές υπόλοιπο', // Pricing confirm modal 'pricing.confirm.title': 'Επιβεβαίωση επιλογής πλάνου', 'pricing.confirm.plan': 'Πλάνο', 'pricing.confirm.prorated': 'Αναλογική έκπτωση', 'pricing.confirm.effective_price': 'Προς πληρωμή', 'pricing.confirm.your_balance': 'Το υπόλοιπό σας', 'pricing.confirm.downgrade_info': 'Η μετάβαση στο νέο πλάνο θα γίνει αυτόματα μετά τη λήξη της τρέχουσας περιόδου.', 'pricing.confirm.insufficient': 'Ανεπαρκές υπόλοιπο.', 'pricing.confirm.top_up': 'Ανανέωση', 'pricing.confirm.schedule_downgrade': 'Προγραμματισμός μετάβασης', 'pricing.confirm.pay': 'Πληρωμή', 'admin.user_edit.title': 'Επεξεργασία χρήστη', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Εγγραφή', 'admin.user_edit.last_seen': 'Τελευταία σύνδεση', 'admin.user_edit.lang': 'Γλώσσα', 'admin.user_edit.first_name': 'Όνομα', 'admin.user_edit.last_name': 'Επώνυμο', 'admin.user_edit.phone': 'Τηλέφωνο', 'admin.user_edit.bio': 'Βιογραφικό', 'admin.user_edit.role': 'Ρόλος', 'admin.user_edit.plan': 'Πακέτο', 'admin.user_edit.no_plan': '— Χωρίς πακέτο —', 'admin.user_edit.active': 'Ενεργός λογαριασμός', 'admin.user_edit.balance': 'Υπόλοιπο (EUR)', 'admin.user_edit.skills': 'Δεξιότητες', 'admin.user_edit.tab.profile': 'Προφίλ', 'admin.user_edit.tab.account': 'Λογαριασμός', 'admin.user_edit.tab.balance': 'Υπόλοιπο', 'admin.user_edit.tab.settings': 'Ρυθμίσεις', 'admin.user_edit.tab.specialist': 'Χαρτοφυλάκιο', 'admin.user_edit.tab.site': 'Ιστοσελίδα', 'admin.user_edit.plan_expires': 'Λήξη πλάνου', 'admin.user_edit.interface_lang': 'Γλώσσα διεπαφής', 'admin.user_edit.comm_languages': 'Γλώσσες επικοινωνίας', 'admin.user_edit.personal_site_slug': 'Προσωπική σελίδα', 'admin.user_edit.show_contact_info': 'Εμφάνιση στοιχείων επικοινωνίας', 'admin.user_edit.show_contact_info.hint': 'Ορατό στους πελάτες', 'admin.user_edit.notify_new_tasks': 'Ειδοποίηση για νέες εργασίες', 'admin.user_edit.notify_new_tasks.hint': 'Push και email ειδοποιήσεις', 'admin.user_edit.notif_messages': 'Ειδοποιήσεις μηνυμάτων', 'admin.user_edit.notif_messages.hint': 'Νέα μηνύματα στη συνομιλία', 'admin.user_edit.site_settings': 'Ρυθμίσεις προσωπικής σελίδας', 'admin.user_edit.categories': 'Κατηγορίες υπηρεσιών', 'admin.user_edit.locations': 'Περιοχές εξυπηρέτησης', 'admin.user_edit.skill_placeholder': 'Νέα δεξιότητα...', 'admin.user_edit.add_category': '— Επιλέξτε κατηγορία —', 'admin.user_edit.add_location': '— Επιλέξτε περιοχή —', 'admin.user_edit.specialist_cards': 'Χαρτοφυλάκιο ειδικού', 'admin.user_edit.no_cards': 'Δεν βρέθηκαν στοιχεία χαρτοφυλακίου', 'admin.user_edit.card_title': 'Τίτλος χαρτοφυλακίου', 'admin.user_edit.card_description': 'Περιγραφή', 'admin.balance.topup.btn': 'Αναπλήρωση', 'admin.balance.withdraw.btn': 'Αφαίρεση', 'admin.balance.modal_hint': 'Οι αλλαγές ισχύουν άμεσα και καταγράφονται στο ιστορικό', 'admin.balance.topup.title': 'Αναπλήρωση υπολοίπου', 'admin.balance.topup.amount': 'Ποσό', 'admin.balance.topup.description': 'Σχόλιο', 'admin.balance.topup.description.placeholder': 'Για παράδειγμα: bonus ή χειροκίνητη αναπλήρωση', 'admin.balance.topup.submit': 'Αναπλήρωση υπολοίπου', 'admin.balance.withdraw.title': 'Αφαίρεση υπολοίπου', 'admin.balance.withdraw.amount': 'Ποσό', 'admin.balance.withdraw.description': 'Σχόλιο', 'admin.balance.withdraw.description.placeholder': 'Για παράδειγμα: επιστροφή ή χειροκίνητη χρέωση', 'admin.balance.withdraw.submit': 'Αφαίρεση από το υπόλοιπο', 'admin.user_edit.role.customer': 'Πελάτης', 'admin.user_edit.role.specialist': 'Ειδικός', 'admin.user_edit.role.admin': 'Διαχειριστής', 'common.refresh': 'Ανανέωση', 'common.back_home': 'Αρχική', 'admin.loc.hint': 'Διαχείριση πόλεων και συνοικιών', 'admin.loc.add_city': 'Νέα πόλη', 'admin.loc.add_district': 'Προσθήκη συνοικίας', 'admin.loc.new': 'Νέα τοποθεσία', 'admin.loc.edit': 'Επεξεργασία τοποθεσίας', 'admin.loc.district': 'συνοικία', 'admin.loc.empty': 'Δεν υπάρχουν τοποθεσίες', 'admin.loc.delete.confirm': 'Διαγραφή τοποθεσίας; Όλες οι συνοικίες θα διαγραφούν επίσης.', 'admin.cat.add_root': 'Νέα κατηγορία', 'admin.cat.add_sub': 'Υποκατηγορία', 'admin.cat.edit': 'Επεξεργασία', 'admin.cat.delete': 'Διαγραφή', 'admin.cat.delete.confirm': 'Διαγραφή κατηγορίας; Όλες οι υποκατηγορίες θα διαγραφούν επίσης.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Εικονίδιο', 'admin.cat.name_el': 'Ελληνικά', 'admin.cat.name_en': 'Αγγλικά', 'admin.cat.name_ru': 'Ρωσικά', 'admin.cat.order': 'Σειρά', 'admin.cat.active': 'Ενεργή', 'admin.cat.parent': 'Γονική κατηγορία', 'admin.cat.no_parent': 'Κορυφαίο επίπεδο', 'admin.cat.save': 'Αποθήκευση', 'admin.cat.cancel': 'Ακύρωση', 'admin.cat.empty': 'Δεν υπάρχουν κατηγορίες', 'admin.cat.hint': 'Διαχείριση κατηγοριών με πολυεπίπεδη ιεραρχία', 'admin.cat.new': 'Νέα κατηγορία', 'admin.cat.subcategory': 'υποκατηγορία', 'admin.cat.add_child': 'Προσθήκη υποκατηγορίας', 'admin.cat.inactive': 'Ανενεργή', 'admin.event.user_login': 'Σύνδεση', 'admin.event.user_register': 'Εγγραφή', 'admin.event.admin_user_deactivate': 'Αποκλεισμός χρήστη', 'admin.event.admin_user_activate': 'Ενεργοποίηση χρήστη', 'admin.event.admin_user_role_changed': 'Αλλαγή ρόλου', 'admin.event.admin_task_cancelled': 'Ακύρωση εργασίας', 'admin.event.admin_task_deleted': 'Διαγραφή εργασίας', 'admin.event.admin_report_reviewed': 'Αναφορά εξετάστηκε', 'admin.event.admin_report_dismissed': 'Αναφορά απορρίφθηκε', 'admin.event.task_created': 'Δημιουργία εργασίας', 'user.online': 'Σε σύνδεση', 'user.seen_minutes': 'ήταν εδώ πριν {n} λεπτά', 'user.seen_hours': 'ήταν εδώ πριν {n} ώρες', 'user.seen_yesterday': 'ήταν εδώ χθες', 'user.seen_days': 'ήταν εδώ πριν {n} μέρες', // Specialists 'specialists.title': 'Ειδικοί', 'specialists.search': 'Αναζήτηση ειδικού...', 'specialists.search.btn': 'Αναζήτηση', 'specialists.empty': 'Δεν βρέθηκαν ειδικοί', 'specialists.no_bio': 'Χωρίς περιγραφή', 'specialists.view': 'Προβολή προφίλ', 'specialists.reviews': 'αξιολογήσεις', 'specialist.favorite': 'Προσθήκη στα αγαπημένα', 'specialist.unfavorite': 'Αφαίρεση από αγαπημένα', 'specialist.site_link': 'Προσωπικό site', 'favorites.specialists.title': 'Αγαπημένοι ειδικοί', 'favorites.specialists.empty': 'Δεν έχετε αγαπημένους ειδικούς', 'nav.favorites': 'Αγαπημένα', 'nav.schedule': 'Πρόγραμμα', 'nav.find_tasks': 'Αναζήτηση εργασιών', 'schedule.title': 'Το πρόγραμμά μου', 'schedule.subtitle': 'Σημειώστε τις ημέρες που είστε ελεύθεροι ή απασχολημένοι — οι πελάτες θα δουν τη διαθεσιμότητά σας', 'schedule.available': 'Ελεύθερος', 'schedule.busy': 'Απασχολημένος', 'schedule.unset': 'Μη ορισμένο', 'schedule.click_hint': '← κλικ για εναλλαγή κατάστασης', 'schedule.range_mode': 'Επιλογή εύρους', 'schedule.range_from': 'Από {date} — επιλέξτε τελική ημερομηνία', 'schedule.click_to_set': 'Κλικ για ορισμό', 'schedule.free': 'ελεύθερα', 'schedule.busy_count': 'απασχολημένα', 'schedule.free_days': 'ελεύθερες ημέρες', 'schedule.googleCalendar': 'Google Calendar', 'schedule.connectGoogle': 'Σύνδεση με Google Calendar', 'schedule.disconnectGoogle': 'Αποσύνδεση', 'schedule.connectedAs': 'Συνδεδεμένο ως', 'schedule.importFromGoogle': 'Συγχρονισμός από Google', 'schedule.gcalConnected': '✓ Google Calendar συνδέθηκε', 'schedule.gcalError': 'Σφάλμα σύνδεσης Google Calendar', 'schedule.gcalImportDone': 'Εισήχθησαν {n} ημερ. από Google Calendar', 'schedule.gcalAutoSyncNote': 'Οι αλλαγές αποστέλλονται αυτόματα στο Google Calendar', 'schedule.gcalConnectDesc': 'Συνδέστε το Google Calendar για αυτόματο συγχρονισμό', 'schedule.gcalDisconnectConfirm': 'Αποσύνδεση Google Calendar;', 'find_tasks.title': 'Αναζήτηση εργασιών', 'find_tasks.for_me': 'Για μένα', 'find_tasks.all': 'Όλες οι εργασίες', 'find_tasks.by_category': 'Ανά κατηγορία', 'find_tasks.list': 'Λίστα', 'find_tasks.already_offered': 'Προσφορά υποβλήθηκε', 'find_tasks.offer_now': 'Υποβολή προσφοράς', 'find_tasks.empty_for_me': 'Δεν βρέθηκαν εργασίες στις κατηγορίες σας', 'find_tasks.banner_hint': 'Βρείτε εργασίες που ταιριάζουν με το χαρτοφυλάκιό σας', 'find_tasks.no_cards': 'Δημιουργήστε ένα χαρτοφυλάκιο ειδικού για να δείτε εργασίες για εσάς', 'find_tasks.add_card': 'Δημιουργία χαρτοφυλακίου', 'find_tasks.search': 'Αναζήτηση εργασιών...', 'find_tasks.tasks_count': 'εργασίες', // Footer 'footer.tagline': 'Η πλατφόρμα εργασιών για την Ελλάδα', 'footer.rights': 'Όλα τα δικαιώματα διατηρούνται.', // App download section 'app.download_title': 'Κατεβάστε την εφαρμογή CanHelp', 'app.download_desc': 'Όλο το CanHelp — πάντα μαζί σας. Διαθέσιμο για Android και iOS.', // Nav 'nav.pricing': 'Τιμές', // Pricing page 'pricing.title': 'Τιμολόγηση', 'pricing.subtitle': 'Επιλέξτε το κατάλληλο πρόγραμμα', 'pricing.role.customer': 'Πελάτης', 'pricing.role.specialist': 'Ειδικός', 'pricing.free': 'Δωρεάν', 'pricing.per_month': 'μήνα', 'pricing.duration': 'Διάρκεια', 'pricing.days': 'ημ.', 'pricing.current_plan': 'Το πρόγραμμά σας', 'pricing.popular': 'Δημοφιλές', 'pricing.choose': 'Επιλογή', 'pricing.your_plan': 'Ενεργό πρόγραμμα', 'pricing.free_default': 'Προεπιλογή', 'pricing.compare': 'Σύγκριση λειτουργιών', 'pricing.feature': 'Λειτουργία', 'pricing.faq_note': 'Η πληρωμή γίνεται από το υπόλοιπο CanHelp. Ανατροφοδότηση διαθέσιμη στην Πληρωμή.', 'pricing.feat.messages': 'Μηνύματα / ημέρα', 'pricing.feat.orders': 'Παραγγελίες / ημέρα', 'pricing.feat.contact_all': 'Επικοινωνία με όλους', 'pricing.feat.view_phone': 'Εμφάνιση τηλεφώνου', 'pricing.feat.show_contact': 'Εμφάνιση στοιχείων επαφής', 'pricing.feat.favorites': 'Αγαπημένα', 'pricing.feat.verified_badge': 'Επαληθευμένο badge', 'pricing.feat.google_calendar': 'Google Calendar', 'pricing.feat.personal_site': 'Προσωπικό site', 'pricing.feat.auto_response': 'Αυτόματη απάντηση', 'pricing.feat.auto_match': 'Αυτόματη αντιστοίχιση', 'pricing.feat.highlighted_reviews': 'Επισημασμένες αξιολογήσεις', 'pricing.feat.portfolio': 'Στοιχεία χαρτοφυλακίου', 'pricing.feat.cards': 'Κάρτες ειδικού', 'pricing.feat.notify_tasks': 'Ειδοποιήσεις νέων εργασιών', 'pricing.feat.video': 'Βίντεο στο χαρτοφυλάκιο', // Upgrade prompt 'upgrade.available_in': 'Διαθέσιμο στο', 'upgrade.cta': 'Αναβάθμιση', // Dashboard plan block 'dashboard.plan.title': 'Το πρόγραμμά μου', 'dashboard.plan.expires': 'Λήγει σε {n} ημέρες', 'dashboard.plan.upgrade': 'Αναβάθμιση προγράμματος', 'dashboard.plan.no_plan': 'Δωρεάν πρόγραμμα', 'dashboard.plan.messages': 'Μηνύματα σήμερα', 'dashboard.plan.orders': 'Παραγγελίες σήμερα', 'dashboard.plan.limits': 'Ημερήσια όρια', 'dashboard.plan.features': 'Λειτουργίες', 'dashboard.plan.stats': 'Στατιστικά', 'dashboard.stats.cards': 'Χαρτοφυλάκια', 'dashboard.stats.maxCards': 'Μέγ. χαρτοφυλάκια', 'dashboard.stats.portfolioItems': 'Στοιχεία portfolio', 'dashboard.stats.maxPortfolioItems': 'Μέγ. στοιχεία', 'dashboard.stats.activeOffers': 'Ενεργές προσφορές', 'dashboard.stats.reviewsReceived': 'Αξιολογήσεις', 'dashboard.stats.activeTasks': 'Ενεργές εργασίες', 'dashboard.stats.completedTasks': 'Ολοκληρωμένες', 'status.can_help_now': 'Είμαι διαθέσιμος τώρα', 'status.need_help': 'Χρειάζομαι βοήθεια', 'status.active': 'Ενεργό', 'status.toggle_on': 'Ενεργοποίηση', 'status.toggle_off': 'Απενεργοποίηση', // FOMO 'fomo.missed_orders': 'Χάσατε {n} παραγγελίες', 'fomo.missed_value': 'Αξία €{v}', 'fomo.upgrade_hint': 'Αναβαθμίστε για να λαμβάνετε περισσότερες παραγγελίες', 'fomo.conversion': 'Μετατροπές εργασιών', 'fomo.active': 'Ενεργές', 'fomo.with_offers': 'Με προσφορές', 'fomo.completed': 'Ολοκληρωμένες', 'fomo.already_offered': '{n} ειδικοί έχουν ήδη απαντήσει', 'fomo.specialist_missed': 'Χάσατε {n} παραγγελίες', 'fomo.top_categories': 'Κατηγορίες', 'fomo.offers_received': 'προσφορές ελήφθησαν', 'fomo.avg_offers': 'Μέσο {n}/εργασία', 'fomo.completion_rate': 'ολοκληρωμένες', // Task auto-match 'task.auto_match': 'Αυτόματη αντιστοίχιση', 'task.auto_match_results': 'Κορυφαίοι ειδικοί', 'task.no_offer_yet': 'Δεν έχετε στείλει προσφορά ακόμα', 'task.make_offer': 'Αποστολή προσφοράς', 'auto_response.title': 'Αυτόματη Απάντηση', 'auto_response.enabled': 'Ενεργοποίηση αυτόματης απάντησης', 'auto_response.min_budget': 'Ελάχ. προϋπολογισμός', 'auto_response.max_budget': 'Μέγ. προϋπολογισμός', 'auto_response.default_price': 'Προεπιλεγμένη τιμή', 'auto_response.default_message': 'Προεπιλεγμένο μήνυμα', 'auto_response.max_per_day': 'Μέγ. αυτόματες προσφορές/ημέρα', 'auto_response.save': 'Αποθήκευση', 'auto_response.saved': 'Αποθηκεύτηκε', 'auto_response.categories': 'Κατηγορίες', 'auto_response.locations': 'Τοποθεσίες', // Personal site 'profile.personal_site': 'Προσωπικό Site', 'profile.site_slug': 'Slug URL', 'profile.site_slug_hint': 'Μόνο λατινικοί χαρακτήρες, αριθμοί, - και _', 'profile.site_open': 'Άνοιγμα site', 'profile.site_preview': 'Το site σας', 'profile.show_contact': 'Εμφάνιση στοιχείων επαφής', 'profile.show_contact_hint': 'Πελάτες με Pro/Ultimate πρόγραμμα θα βλέπουν το τηλέφωνό σας', // Google Calendar plan gate 'gcal.upgrade_required': 'Το Google Calendar απαιτεί Pro ή Ultimate πρόγραμμα', // Chat limits 'chat.limit_warning': 'Απομένουν {n} μηνύματα σήμερα', 'chat.limit_reached': 'Εξαντλήθηκαν τα μηνύματα. Αναβαθμίστε το πρόγραμμά σας', 'chat.upgrade': 'Αναβάθμιση', // Site page 'site.member_since': 'Μαζί μας από', 'site.rating': 'Βαθμολογία', 'site.completed_tasks': 'Ολοκληρώθηκαν', 'site.languages': 'Γλώσσες', 'site.photos': 'φωτ.', 'site.contact_form': 'Επικοινωνία', 'site.contact_sent': 'Το μήνυμα στάλθηκε!', 'site.contact_sent_desc': 'Ο ειδικός θα επικοινωνήσει μαζί σας σύντομα', 'site.contact_name': 'Όνομα', 'site.contact_name_ph': 'Το όνομά σας', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Μήνυμα', 'site.contact_message_ph': 'Περιγράψτε την εργασία σας...', 'site.contact_send': 'Αποστολή', 'site.share': 'Κοινοποίηση', 'site.speaks_languages': 'Μιλάει', 'site.message_sent': 'Το μήνυμα εστάλη!', 'site.message_sent_desc': 'Ο ειδικός θα το λάβει στη συνομιλία', 'site.message_placeholder': 'Γράψτε το μήνυμά σας...', 'site.write_to_chat': 'Γράψτε στο chat', 'site.auth_required_title': 'Απαιτείται σύνδεση', 'site.auth_required_desc': 'Για να γράψετε στο chat, χρειάζεται να συνδεθείτε στο λογαριασμό σας.', 'site.auth_login_btn': 'Σύνδεση', 'site.auth_contact_form_btn': 'Επικοινωνία μέσω φόρμας', 'specialist.services': 'Υπηρεσίες', 'portfolio.title': 'Χαρτοφυλάκιο', 'common.not_found': 'Η σελίδα δεν βρέθηκε', 'common.anonymous': 'Ανώνυμα' }, en: { 'footer.slogan': 'Your task — our care! We solve any issue quickly and easily.', 'footer.links': 'Links', 'footer.socials': 'Socials', 'nav.home': 'Home', 'nav.tasks': 'Tasks', 'nav.post': '+ Post task', 'nav.dashboard': 'Dashboard', 'nav.chat': 'Messages', 'nav.notifications': 'Notifications', 'nav.profile': 'Profile', 'nav.admin': 'Admin Panel', 'nav.specialists': 'Specialists', 'nav.new_task': 'New task', 'nav.login': 'Login', 'nav.register': 'Register', 'nav.logout': 'Logout', 'hero.title': 'Find a specialist for any job', 'hero.subtitle': 'Post a task, receive offers and choose the best professional', 'hero.cta.post': 'Post a task', 'hero.cta.browse': 'Find work', 'hero.search.placeholder': 'What do you need? e.g. electrician, cleaning...', 'stats.specialists': 'specialists', 'stats.tasks': 'tasks', 'stats.categories': 'categories', 'stats.free': 'free sign-up', 'section.categories': 'Create a task in any category', 'section.how': 'How it works', 'section.recent': 'Recent tasks', 'section.all': 'See all →', 'section.more': 'more', 'section.cities': 'Cities & Districts', 'section.community': 'A community project for everyone', 'community.subtitle': 'CanHelp is not just a marketplace — it\'s a community of mutual help. Anyone with knowledge or a skill can find a client. Anyone with a problem can find a specialist.', 'community.point1.title': 'Are you good at something?', 'community.point1.desc': 'Repairs, tutoring, design, translation, care — every skill has value. Create a profile and find clients near you.', 'community.point2.title': 'Need help with something?', 'community.point2.desc': 'Post a task in under a minute and receive offers from verified specialists in your city.', 'community.point3.title': 'Help the project grow', 'community.point3.desc': 'CanHelp grows through communities. Share the link with friends and acquaintances — together we build something useful for everyone.', 'community.share': 'Share with friends', 'community.share.copied': 'Link copied!', // Referral section on home page 'section.referral': 'Referral Program', 'referral.home.subtitle': 'Share your link — every new user who signs up through it earns you a reward.', 'referral.home.step1.title': 'Sign up and get your link', 'referral.home.step1.desc': 'Create an account and find your unique referral link in your profile.', 'referral.home.step2.title': 'Share with friends', 'referral.home.step2.desc': 'Send the link to friends, acquaintances, or post it on social media.', 'referral.home.step3.title': 'Earn rewards', 'referral.home.step3.desc': 'Once your friend verifies their email, you automatically receive your reward.', 'referral.home.cta': 'Get your link', 'referral.home.badge': 'Referral Program', // FAQ section 'section.faq': 'Frequently Asked Questions', 'faq.q1': 'How does CanHelp work?', 'faq.a1': 'Post a task, receive offers from specialists, choose the best one and start working together. It\'s fast, simple and free for customers.', 'faq.q2': 'How much does it cost to use the platform?', 'faq.a2': 'Registration and task posting is completely free for customers. Specialists have access to a free plan as well as premium options.', 'faq.q3': 'How can I become a specialist?', 'faq.a3': 'Register, go to «Become a Specialist», fill in your profile with skills and categories, and start receiving tasks.', 'faq.q4': 'How do I choose the right specialist?', 'faq.a4': 'Check their reviews, experience, skills and portfolio. Chat with them through the platform and discuss the details before deciding.', 'faq.q5': 'What if I am not satisfied?', 'faq.a5': 'You can leave a review about the specialist and rate them from 1 to 5 stars. Reviews help other users find trusted professionals.', 'faq.q6': 'Can I contact a specialist before accepting their offer?', 'faq.a6': 'Yes. Once you receive an offer, you can open a chat with the specialist, ask questions and discuss all the details before making a decision.', 'faq.q7': 'How long does it take to receive offers?', 'faq.a7': 'Usually within a few hours. Specialists get notified about new tasks and can respond quickly.', 'faq.q8': 'Can I post a task in any city in Greece?', 'faq.a8': 'Yes! CanHelp covers all of Greece — Athens, Thessaloniki, Patras and more.', 'faq.q9': 'What types of tasks can I find on CanHelp?', 'faq.a9': 'Repairs, cleaning, electricians, tutoring, design, IT, moving, beauty and much more. Categories are constantly expanding.', 'faq.q10': 'Is there a mobile app?', 'faq.a10': 'Yes! CanHelp is available for Android and iOS. Download the app and manage everything from your phone.', 'how.step1.title': 'Post a task', 'how.step1.desc': 'Describe what you need and set your budget', 'how.step2.title': 'Receive offers', 'how.step2.desc': 'Specialists will send you offers with price and timeline', 'how.step3.title': 'Choose & start', 'how.step3.desc': 'Pick the best professional and start the collaboration', 'tasks.title': 'tasks', 'tasks.filters': 'Filters', 'tasks.search': 'Search', 'tasks.search.placeholder': 'Title or keyword...', 'tasks.search.btn': 'Search', 'tasks.publish': 'Post', 'tasks.category.all': 'All', 'tasks.category.all_in': 'All in', 'tasks.category.label': 'Category', 'tasks.location.label': 'City', 'tasks.location.placeholder': 'e.g. Athens', 'tasks.empty': 'No tasks found', 'tasks.empty.cta': 'Post the first one', 'task.status.open': 'Open', 'task.status.in_progress': 'In progress', 'task.status.completed': 'Completed', 'task.status.cancelled': 'Cancelled', 'task.status.draft': 'Draft', 'task.budget': 'Budget', 'task.location': 'Location', 'task.deadline': 'Start date', 'task.created_at': 'Created', 'task.customer': 'Customer', 'task.offer.btn': 'Submit offer', 'task.invite.banner_title': "You've been invited to this task", 'task.invite.banner_hint': 'The customer personally invited you', 'task.invite.accept': 'Send offer', 'task.invite.decline': 'Decline', 'offer.accept': 'Accept', 'offer.decline': 'Decline', 'task.complete': 'Complete task', 'task.complete.confirm': 'Mark this task as complete?', 'task.edit': 'Edit', 'task.status_label': 'Status', 'task.yours': 'Your task', 'task.offer.yours': 'Your offer', 'review.leave': 'Leave a review', 'review.rating': 'Rating', 'review.comment': 'Comment', 'review.comment.placeholder': 'Tell us about your experience...', 'review.submit': 'Submit review', 'review.submitting': 'Submitting...', 'review.done': 'Review submitted!', 'profile.reviews': 'Reviews', 'profile.no_reviews': 'No reviews yet', 'profile.rating': 'Rating', 'profile.skills.label': 'Skills', 'profile.member_since': 'Member since', 'task.offers': 'Offers', 'task.offers.none': 'No offers yet', 'create.title': 'Post a task', 'create.field.title': 'Title', 'create.field.description': 'Description', 'create.field.category': 'Category', 'create.field.category.select': 'Select...', 'create.field.location': 'Location', 'create.field.location.any': 'Anywhere', 'create.field.location.all': 'Entire city', 'create.field.budget': 'Budget (€)', 'create.field.deadline': 'Start date', 'create.field.budget_negotiable': 'Price is negotiable', 'create.field.time_slot': 'Time slot', 'create.field.time_slot.any': 'Anytime', 'create.field.time_slot.morning': 'Morning (08:00–13:00)', 'create.field.time_slot.afternoon': 'Afternoon (13:00–18:00)', 'create.field.time_slot.evening': 'Evening (18:00–22:00)', 'create.field.time_slot.weekend': 'Weekend', 'create.field.address': 'Address (optional)', 'create.field.address.district': 'District', 'create.field.address.street': 'Street', 'create.field.address.house': 'Number', 'create.field.confidential': 'Confidential note', 'create.field.confidential.placeholder': 'Details visible only to the assigned specialist...', 'create.field.confidential.hint': 'Not shown publicly', 'create.field.photos': 'Photos', 'create.field.photos.add': 'Add photo', 'create.field.photos.uploading': 'Uploading...', 'task.budget_negotiable': 'Price negotiable', 'task.time_slot': 'Time slot', 'task.confidential': 'Confidential note', 'create.field.title.placeholder': 'e.g. Clean 80sqm apartment', 'create.field.description.placeholder': 'Describe in detail what you need...', 'create.field.location.placeholder': 'e.g. Athens, Kolonaki', 'create.field.budget.placeholder': 'e.g. 100', 'create.submit': 'Post task', 'create.submitting': 'Posting...', 'login.title': 'Welcome back', 'login.subtitle': 'Sign in to CanHelp', 'login.email': 'Email', 'login.password': 'Password', 'login.submit': 'Sign in', 'login.submitting': 'Signing in...', 'login.error': 'Invalid email or password', 'login.unverified.title': 'Verify your email address', 'login.unverified.desc': 'We sent a verification link to your email. Check your inbox (or spam) and click the link.', 'login.unverified.resend': 'Resend verification email', 'login.unverified.sending': 'Sending...', 'login.unverified.sent': '✓ Sent — check your inbox', 'profile.email.verified': 'Email verified', 'profile.email.not_verified': 'Email not verified', 'login.no_account': "Don't have an account?", 'login.register_link': 'Register', 'login.forgot_password': 'Forgot password?', 'login.or_continue_with': 'or continue with', 'login.continue_google': 'Continue with Google', 'forgot.title': 'Forgot password', 'forgot.subtitle': 'Enter your email to receive a reset link', 'forgot.email': 'Email', 'forgot.submit': 'Send reset link', 'forgot.submitting': 'Sending...', 'forgot.sent.title': 'Check your inbox', 'forgot.sent.desc': 'If an account exists with that email, we\'ll send you a password reset link.', 'forgot.back_to_login': 'Back to sign in', 'forgot.error': 'Could not send reset link. Check the email address and try again.', 'forgot.error.not_found': 'No account found with this email address.', 'forgot.error.send_failed': 'Failed to send email. Please try again later.', 'reset.title': 'New password', 'reset.subtitle': 'Enter your new password', 'reset.password': 'New password', 'reset.confirm': 'Confirm password', 'reset.submit': 'Change password', 'reset.submitting': 'Saving...', 'reset.success': 'Password changed successfully. Redirecting to sign in...', 'reset.back_to_login': 'Back to sign in', 'reset.error.mismatch': 'Passwords do not match', 'reset.error.invalid': 'Invalid or expired link. Please request a new one.', 'register.title': 'Register', 'register.subtitle': 'Create a CanHelp account', 'register.first_name': 'First name', 'register.last_name': 'Last name', 'register.email': 'Email', 'register.password': 'Password (min 8 characters)', 'register.role': 'Role', 'register.role.customer': 'User', 'register.role.customer.desc': 'I post tasks', 'register.role.specialist': 'Specialist', 'register.role.specialist.desc': 'I take on tasks', 'register.submit': 'Create account', 'register.submitting': 'Registering...', 'register.has_account': 'Already have an account?', 'register.login_link': 'Sign in', 'register.continue_google': 'Continue with Google', 'register.check_email.title': 'Check your email', 'register.check_email.desc': 'We sent a verification link to your email address. Check your inbox (or spam) and click the link.', 'register.check_email.login': 'Back to sign in', 'dashboard.title': 'Dashboard', 'dashboard.new_task': '+ New task', 'dashboard.my_tasks': 'My tasks', 'dashboard.my_offers': 'My offers', 'dashboard.invitations': 'Job invitations', 'dashboard.offers_count': 'offers', 'dashboard.declined_count': 'declined', 'dashboard.completed_tasks': 'Completed tasks', 'dashboard.completed_offers': 'Completed offers', 'dashboard.review_pending': 'Review not yet submitted', 'tasks.new.top_specialists': 'Top specialists', 'tasks.new.select_category': 'Select a category to see matching specialists', 'tasks.new.invite': 'Offer work', 'tasks.new.invited': 'Selected ✓', 'reviews.count': 'reviews', 'filter.location': 'Location', 'filter.language': 'Languages', 'filter.language.any': 'Any language', 'filter.category.all': 'All categories', 'user.categories': 'Categories', 'user.work_area': 'Work area', 'dashboard.tasks.empty': "You haven't posted any tasks", 'dashboard.tasks.empty.cta': 'Post your first one', 'dashboard.tasks.add_new': 'Add a new task', 'dashboard.offers.empty': "You haven't submitted any offers", 'dashboard.offers.empty.cta': 'Find tasks', 'dashboard.customer.specialists_title': 'Looking for a specialist?', 'dashboard.customer.specialists_hint': 'Browse specialist profiles, read reviews and invite them to your tasks', 'dashboard.customer.specialists_cta': 'Find a specialist', 'dashboard.customer.how_title': 'How it works', 'dashboard.customer.step1': 'Create a task with a description and budget', 'dashboard.customer.step2': 'Specialists will send offers with price and timeline', 'dashboard.customer.step3': 'Choose the right one and start working', 'notif.title': 'Notifications', 'notif.mark_all': 'Mark all as read', 'notif.empty': 'No notifications', 'notif.type.new_offer': 'New offer', 'notif.type.offer_accepted': 'Your offer was accepted', 'notif.type.offer_declined': 'Your offer was declined', 'notif.type.task_completed': 'Task completed', 'notif.type.task_cancelled': 'Task cancelled', 'notif.type.new_message': 'New message', 'notif.type.new_review': 'New review', 'notif.type.task_invite': 'Job invitation', 'notif.body.new_offer': 'New offer for «{title}»', 'notif.body.offer_accepted': 'Your offer for «{title}» was accepted', 'notif.body.offer_declined': 'Your offer for «{title}» was declined', 'notif.body.task_invite': 'You\'ve been invited for «{title}»', 'notif.body.new_review': 'You received a {rating}★ review', 'offer.status.pending': 'Pending', 'offer.status.accepted': 'Accepted', 'offer.status.declined': 'Declined', 'offer.status.withdrawn': 'Withdrawn', 'offer.status.other_accepted': 'Another specialist was chosen', 'common.loading': 'Loading...', 'common.error': 'Error', 'common.save': 'Save', 'common.saving': 'Saving...', 'common.cancel': 'Cancel', 'common.add': 'Add', 'common.close': 'Close', 'common.edit': 'Edit', 'common.delete': 'Delete', 'common.from': 'by', 'common.currency': '€', 'common.greece': 'Greece', // Chat 'chat.connected': 'Connected', 'chat.disconnected': 'Disconnected', 'chat.no_rooms': 'No conversations yet', 'chat.task_fallback': 'Task', 'chat.select': 'Select a conversation', 'chat.no_messages': 'No messages yet', 'chat.placeholder': 'Write a message... (Enter to send)', 'chat.conversation_fallback': 'Conversation', 'chat.direct_chat': 'Direct chat', 'chat.linked_task': 'Linked task', 'chat.write_btn': 'Message', 'chat.just_now': 'just now', 'chat.min_ago': 'm', 'chat.write_specialist': 'Write to specialist', 'chat.write_customer': 'Write to customer', 'chat.notif_settings': 'Notification settings', 'chat.notif_messages': 'Notifications for new messages', 'chat.toast_title': 'New message', 'chat.toast_open': 'Open chat', // Offer form 'offer.price': 'Price', 'offer.price.placeholder': 'e.g. 80', 'offer.customer_budget': 'Client budget', 'offer.message': 'Message', 'offer.optional': 'optional', 'offer.message.placeholder': 'Introduce yourself, your experience and why you are the best choice...', 'offer.submitting': 'Sending...', // Profile 'profile.photo': 'Profile photo', 'profile.photo.change': 'Change photo', 'profile.photo.hint': 'JPEG, PNG, WebP · up to 5MB', 'profile.basic_info': 'Basic info', 'profile.phone': 'Phone', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Short bio', 'profile.bio.placeholder': 'Tell us a bit about yourself...', 'profile.language': 'Language', 'profile.language.hint': 'App interface and email notification language', 'profile.languages': 'Languages spoken', 'profile.languages.hint': 'Select all languages you speak', 'profile.skills': 'Skills', 'profile.skills.subtitle': 'Add the services you offer', 'profile.skills.placeholder': 'e.g. Cleaning, IT, Tutoring...', 'profile.role': 'Account role', 'profile.role.specialist': '🔧 Specialist', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 User', 'profile.role.change': 'To change your role please contact support.', 'profile.become_specialist': 'Become a Specialist', 'profile.become_specialist.desc': 'Upgrade to Specialist to take on tasks and build your profile.', 'become_specialist.hero.title': 'Earn money doing what you do best', 'become_specialist.hero.subtitle': 'Create a specialist profile and receive orders from clients across Greece', 'become_specialist.how.title': 'How it works', 'become_specialist.step1.title': 'Create a specialist portfolio', 'become_specialist.step1.desc': 'Set your categories, skills and coverage areas — the system will automatically match you with relevant tasks', 'become_specialist.step2.title': 'Find tasks', 'become_specialist.step2.desc': 'Discover tasks in your categories in the "Find Orders" section', 'become_specialist.step3.title': 'Send an offer & earn', 'become_specialist.step3.desc': 'Submit offers with price and timeline, chat with clients and complete tasks', 'become_specialist.benefits.title': 'Specialist profile advantages', 'become_specialist.benefit1': 'Task search filtered by your categories and location', 'become_specialist.benefit2': 'Public profile with client reviews', 'become_specialist.benefit3': 'Availability schedule visible to clients', 'become_specialist.benefit4': 'Saved to favourites by clients', 'become_specialist.cta': 'Become a Specialist — it\'s free', 'become_specialist.free_badge': 'Free registration', 'profile.tab.notifications': 'Notifications', 'profile.tab.reviews': 'Reviews', 'profile.tab.referral': 'Referrals', 'profile.tab.auto_response': 'Auto-response', 'profile.tab.site': 'Site', 'profile.site.title': 'Personal page', 'profile.site.url_label': 'Personal site', 'profile.site.copy': 'Copy', 'profile.site.copied': 'Copied', 'profile.site.visible_title': "What's on your page", 'profile.site.visible.name': 'Name and photo', 'profile.site.visible.bio': 'Bio', 'profile.site.visible.rating': 'Rating and reviews', 'profile.site.visible.portfolio': 'Portfolio / Cards', 'profile.site.visible.contacts': 'Contact info', 'profile.site.visible.full_last_name': 'Full last name', 'profile.site.visible.services': 'Service cards', 'profile.site.visible.reviews': 'Reviews section', 'profile.site.visible.status': '"Ready to help" status', 'profile.site.theme': 'Appearance theme', 'profile.site.theme.dark': 'Dark', 'profile.site.theme.light': 'Light', 'profile.site.slug_taken': 'This address is already taken', 'profile.site.stats.title': 'Site analytics', 'profile.site.stats.days': 'last 30 days', 'profile.site.stats.views': 'Views', 'profile.site.stats.unique': 'Unique visitors', 'profile.site.stats.messages': 'Messages', 'profile.site.stats.total_views': 'Total views', 'profile.site.stats.total_unique': 'Unique visitors', 'profile.site.stats.total_messages': 'Messages', 'profile.site.stats.empty': 'No data yet', 'profile.site.stats.loading': 'Loading analytics...', 'profile.site.stats.no_slug': 'Set your site URL to see analytics', 'profile.site.edit_bio_hint': 'Bio and photo are edited in the "Basic info" tab.', 'status.title': 'Status', 'status.can_help_now_hint': 'Your card is shown higher in search', 'status.need_help_hint': 'Specialists can offer you help', 'profile.referral.title': 'Referral program', 'profile.referral.desc': 'Share your link and earn rewards for every new user you invite.', 'profile.referral.link_label': 'Your referral link', 'profile.referral.copy': 'Copy', 'profile.referral.copied': 'Copied!', 'profile.referral.invited_count': 'successful referrals', 'profile.referral.no_code': 'Referral code is not available.', 'notifications.title': 'Notification settings', 'notifications.email.new_tasks': 'Email for new tasks', 'notifications.email.new_tasks.desc': 'Receive an email when a new task is posted in your categories', 'notifications.messages.desc': 'Receive a notification when a new message arrives', 'notifications.saved': 'Settings saved', 'notifications.plan_required': 'Not available in your plan', 'profile.tab.info': 'Basic info', 'profile.tab.finance': 'Finance', 'profile.tab.skills': 'Skills', 'profile.tab.categories': 'Categories', 'profile.tab.geography': 'Geography', 'profile.specialist.categories': 'Work categories', 'profile.specialist.categories.desc': 'Select the categories you work in', 'profile.specialist.geography': 'Coverage areas', 'profile.specialist.geography.desc': 'Select the cities / districts where you are active', 'profile.saving': 'Saving...', 'profile.upload.error': 'Error uploading photo', 'profile.saved': 'Saved', 'profile.tab.cards': 'Portfolio', 'profile.cards.count': 'Portfolio', 'profile.cards.add': 'Add portfolio', 'profile.cards.new_title': 'New portfolio title', 'profile.cards.placeholder': 'e.g. Plumbing', 'profile.cards.create': 'Create', 'profile.cards.cancel': 'Cancel', 'profile.cards.empty': 'No portfolio yet', 'profile.cards.create_first': 'Create your first portfolio', 'profile.cards.delete_confirm': 'Delete portfolio?', 'profile.card.tab.main': 'General', 'profile.card.tab.skills': 'Skills', 'profile.card.tab.categories': 'Categories', 'profile.card.tab.geography': 'Geography', 'profile.card.tab.portfolio': 'Portfolio', 'profile.card.active': 'Active', 'profile.card.save': 'Save', 'profile.card.saved': 'Saved', 'profile.card.delete': 'Delete', 'profile.card.skill.add': 'Add skill', 'profile.card.photo.add': 'Add photo', 'profile.card.photo.uploading': 'Uploading...', 'profile.card.photo.empty': 'No photos yet', 'profile.card.item.title': 'Title', 'profile.card.item.desc': 'Description', 'profile.card.item.save': 'Save', 'profile.card.item.cancel': 'Cancel', 'profile.card.item.edit': 'Edit', 'profile.upgrade.cards_limit': 'Portfolio limit reached', 'profile.upgrade.plan': 'Current plan:', 'profile.upgrade.contact': 'Contact the administrator to change your plan', 'profile.upgrade.ok': 'Got it', 'profile.plan.title': 'Subscription plan', 'profile.balance': 'Balance', 'profile.balance.topup': 'Top Up Balance', 'profile.balance.topup.title': 'Top Up Balance', 'profile.balance.topup.amount': 'Amount (EUR)', 'profile.balance.topup.hint': 'Choose a preset or enter a custom amount', 'profile.balance.topup.submit': 'Proceed to Payment', 'profile.balance.topup.loading': 'Redirecting...', 'profile.balance.topup.error': 'Payment initiation failed. Please try again.', 'payment.success.title': 'Payment Successful!', 'payment.success.desc': 'Your balance has been updated.', 'payment.cancelled.title': 'Payment Cancelled', 'payment.cancelled.desc': 'Payment was cancelled. No charges were made.', 'payment.pending.title': 'Processing...', 'payment.pending.desc': 'Your payment is being processed.', 'payment.back_to_profile': 'Back to Profile', 'profile.plan.basic': 'Basic (free)', 'profile.plan.contact_upgrade': 'Contact admin to upgrade your plan', 'profile.plan.cards_up_to': 'Portfolio: up to', 'profile.plan.cards_unlimited': 'Portfolio: unlimited', 'profile.plan.tasks_up_to': 'Tasks: up to', 'profile.plan.offers_up_to': 'Offers: up to', 'profile.plan.valid_until': 'Valid until', 'profile.plan.no_expiry': 'No expiry', // Create task 'create.error': 'Error posting task', // Tasks list extras 'tasks.category.general': 'General', 'tasks.budget.range': 'Range:', 'tasks.budget.from': 'from', 'tasks.budget.to': 'to', 'tasks.filter.reset': 'Reset filters', 'tasks.load_more': 'Load more', 'tasks.showing': 'Results:', 'tasks.field.budget': 'Budget, €', // Admin 'admin.title': 'Admin Panel', 'admin.tab.stats': 'Statistics', 'admin.tab.users': 'Users', 'admin.tab.tasks': 'Tasks', 'admin.tab.reports': 'Reports', 'admin.stats.users': 'Users', 'admin.stats.tasks': 'Tasks', 'admin.stats.offers': 'Offers', 'admin.stats.reviews': 'Reviews', 'admin.tasks.by_status': 'Tasks by status', 'admin.col.user': 'User', 'admin.col.email': 'Email', 'admin.col.role': 'Role', 'admin.col.registered': 'Registered', 'admin.col.status': 'Status', 'admin.col.title': 'Title', 'admin.col.budget': 'Budget', 'admin.col.created': 'Created', 'admin.users.active': 'Active', 'admin.users.inactive': 'Inactive', 'admin.users.deactivate': 'Deactivate', 'admin.users.activate': 'Activate', 'admin.tasks.cancel': 'Cancel', 'admin.reports.none': 'No reports', 'admin.reports.reviewed': 'Reviewed', 'admin.reports.dismiss': 'Dismiss', 'admin.pagination.total': 'Total', 'admin.users.role.change': 'Change role', 'admin.users.search.placeholder': 'Search name or email...', 'admin.tasks.delete': 'Delete', 'admin.tasks.delete.confirm': 'Permanently delete this task?', 'admin.tasks.search.placeholder': 'Search title...', 'admin.col.customer': 'Customer', 'admin.col.reporter': 'Reporter', 'admin.col.target': 'Target', 'admin.filter.all_roles': 'All roles', 'admin.filter.all_statuses': 'All statuses', 'admin.reports.target.task': 'Task', 'admin.reports.target.user': 'User', 'admin.tab.categories': 'Categories', 'admin.tab.locations': 'Cities & Districts', 'admin.tab.logs': 'Logs', 'admin.tab.plans': 'Plans', 'admin.tab.settings': 'Settings', 'admin.logs.subtab.ai': 'AI Logs', 'admin.logs.subtab.activity': 'Activity', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Notifications', 'admin.notif_logs.type': 'Type', 'admin.notif_logs.title': 'Title', 'admin.notif_logs.read': 'Read', 'admin.notif_logs.empty': 'No notification logs', 'admin.stats.notif_chart_title': 'Notifications per day', 'admin.stats.notif_label': 'Notifications', 'admin.stats.mail_chart_title': 'Emails per day', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'All', 'admin.stats.specialists': 'Specialists', 'admin.col.plan': 'Plan', 'admin.back_home': 'Home', 'admin.plans.title': 'Subscription plans', 'admin.plans.add': '+ New plan', 'admin.plans.empty': 'No plans created', 'admin.plans.form.new': 'New plan', 'admin.plans.form.edit': 'Edit plan', 'admin.plans.form.name': 'Name', 'admin.plans.form.price': 'Price (EUR)', 'admin.plans.form.old_price': 'Old price (EUR, optional)', 'admin.plans.form.max_offers': 'Max offers (empty = no limit)', 'admin.plans.form.max_cards': 'Max portfolio (empty = no limit)', 'admin.plans.form.duration_days': 'Duration (days, empty = no expiry)', 'admin.plans.form.description': 'Description', 'admin.plans.form.features': 'Features (one per line)', 'admin.plans.form.notify': 'Notify about new tasks', 'admin.plans.form.default': 'Default', 'admin.plans.form.active': 'Active', 'admin.plans.form.order': 'Order', 'admin.plans.form.role': 'Role', 'admin.plans.form.tier': 'Tier', 'admin.plans.form.role.customer': 'Customer', 'admin.plans.form.role.specialist': 'Specialist', 'admin.plans.form.tier.free': 'Free', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Limits (empty = unlimited)', 'admin.plans.form.max_messages_day': 'Max Messages/Day', 'admin.plans.form.max_orders_day': 'Max Orders/Day', 'admin.plans.form.max_skills': 'Max Skills', 'admin.plans.form.max_profiles': 'Max Profiles', 'admin.plans.form.max_portfolio': 'Max Portfolio Items', 'admin.plans.form.section.boost': 'Multipliers & Boost', 'admin.plans.form.search_boost': 'Search Boost', 'admin.plans.form.offers_multiplier': 'Offers Multiplier', 'admin.plans.form.section.contact': 'Contact Permissions', 'admin.plans.form.can_contact_free': 'Contact Free Plan users', 'admin.plans.form.can_contact_pro': 'Contact Pro Plan users', 'admin.plans.form.can_contact_all': 'Contact All users', 'admin.plans.form.can_show_contact': 'Show Contact Info', 'admin.plans.form.can_view_phone': 'View Phone', 'admin.plans.form.section.features': 'Feature Flags', 'admin.plans.form.upload_video': 'Upload Video', 'admin.plans.form.favorites': 'Favorites', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Verified Badge', 'admin.plans.form.highlighted_reviews': 'Highlighted Reviews', 'admin.plans.form.personal_site': 'Personal Site', 'admin.plans.form.can_help_now': 'Can Help Now Status', 'admin.plans.form.need_help': 'Need Help Status', 'admin.plans.form.auto_response': 'Auto Response', 'admin.plans.form.auto_match': 'Auto Match', 'admin.plans.form.instant_dispatch_free': 'Instant Dispatch (Free)', 'admin.plans.form.instant_dispatch_pro': 'Instant Dispatch (Pro)', 'admin.plans.badge.default': 'Default', 'admin.plans.badge.inactive': 'Inactive', 'admin.plans.make_default': 'Set as default', 'admin.plans.tasks': 'Tasks', 'admin.plans.offers': 'Offers', 'admin.plans.cards': 'Portfolio', 'admin.plans.notify_tasks': 'Task notifications', 'admin.plans.delete.confirm': 'Delete plan', 'admin.activity.title': 'Activity log', 'admin.activity.event': 'Event', 'admin.activity.all_events': 'All events', 'admin.activity.from': 'From', 'admin.activity.to': 'To', 'admin.activity.reset': 'Reset', 'admin.activity.total': 'Total', 'admin.activity.empty': 'No records', 'admin.mail.event': 'Email event', 'admin.mail.all_events': 'All email events', 'admin.mail.from': 'From', 'admin.mail.to': 'To', 'admin.mail.reset': 'Reset', 'admin.mail.total': 'Total', 'admin.mail.empty': 'No email logs', 'admin.mail.recipient': 'Recipient', 'admin.mail.provider': 'Provider', 'admin.mail.details': 'Details', 'admin.mail.status': 'Status', 'admin.mail.success': 'Success', 'admin.mail.failed': 'Failed', 'admin.event.email_sent': 'Email sent', 'admin.event.email_failed': 'Email failed', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Admin test email sent', 'admin.event.admin_email_test_failed': 'Admin test email failed', 'admin.logs.empty': 'No records', 'admin.logs.date': 'Date', 'admin.logs.provider': 'Provider', 'admin.logs.model': 'Model', 'admin.logs.action': 'Action', 'admin.logs.langs': 'Languages', 'admin.logs.in': 'In', 'admin.logs.out': 'Out', 'admin.logs.total': 'Total', 'admin.logs.ms': 'ms', 'admin.logs.status': 'Status', 'admin.stats.activity_30d': 'Activity over 30 days', 'admin.stats.tasks_label': 'Tasks', 'admin.stats.users_label': 'Users', 'admin.stats.specialists_label': 'Specialists', 'admin.stats.tokens_title': 'Token usage (by month)', 'admin.stats.tokens_out': 'Output', 'admin.stats.tokens_in': 'Input', 'admin.stats.tokens_out_label': 'Output tokens', 'admin.stats.tokens_in_label': 'Input tokens', 'admin.stats.cost_label': 'Cost (USD)', 'admin.stats.tasks_by_status': 'Tasks by status', 'admin.task_status.open': 'Open', 'admin.task_status.in_progress': 'In progress', 'admin.task_status.completed': 'Completed', 'admin.task_status.cancelled': 'Cancelled', 'admin.task_status.draft': 'Drafts', 'admin.settings.tab.general': 'General', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Notifications', 'admin.settings.tab.payment': 'Payment', 'admin.settings.tab.referral': 'Referrals', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO & Maintenance', 'admin.settings.seo.maintenance_label': 'Maintenance Mode', 'admin.settings.seo.maintenance_hint': 'Show a maintenance page to all visitors', 'admin.settings.seo.indexing_label': 'Search Engine Indexing', 'admin.settings.seo.indexing_hint': 'Allow search engines to index the site', 'admin.settings.seo.head_scripts_label': ' Scripts (JS)', 'admin.settings.seo.head_scripts_hint': 'Runs on every page (Google Tag Manager, analytics, etc.)', 'admin.settings.seo.site_title_label': 'Site Title', 'admin.settings.seo.site_description_label': 'Site Description (meta description)', 'admin.settings.referral.title': 'Referral program', 'admin.settings.referral.hint': 'Reward users who bring new registrations.', 'admin.settings.referral.enabled_label': 'Enabled', 'admin.settings.referral.enabled_hint': 'Enable / disable reward application', 'admin.settings.referral.customer_section': 'For customers', 'admin.settings.referral.specialist_section': 'For specialists', 'admin.settings.referral.plan_label': 'Reward plan', 'admin.settings.referral.no_plan': '— no plan —', 'admin.settings.referral.plan_hint': 'This plan will be assigned to the referrer. If their current plan is higher, only days will be added.', 'admin.settings.referral.days_label': 'Reward days', 'admin.settings.referral.days_hint': 'Number of days added to the plan expiry.', 'admin.settings.general.title': 'General settings', 'admin.settings.general.site_name': 'Site name', 'admin.settings.general.site_url': 'Site URL', 'admin.settings.general.contact_email': 'Contact email', 'admin.settings.general.support_phone': 'Support phone', 'admin.settings.smtp.title': 'SMTP settings', 'admin.settings.smtp.hint': 'Used to send email notifications.', 'admin.settings.smtp.host': 'SMTP Host', 'admin.settings.smtp.port': 'Port', 'admin.settings.smtp.encryption': 'Encryption', 'admin.settings.smtp.enc.none': 'None', 'admin.settings.smtp.enc.tls': 'STARTTLS (port 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (port 465)', 'admin.settings.smtp.username': 'Username', 'admin.settings.smtp.password': 'Password / App Password', 'admin.settings.smtp.from_name': 'Sender name', 'admin.settings.smtp.from_email': 'Sender email', 'admin.settings.smtp.test': 'Send test email', 'admin.settings.smtp.sending': 'Sending...', 'admin.settings.payment.hint': 'ePay Piraeus Bank credentials.', 'admin.settings.env.test': 'Test (sandbox)', 'admin.settings.env.prod': 'Production', 'admin.settings.env.label': 'Environment', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Active', 'admin.settings.saving': 'Saving...', 'admin.settings.saved': 'Saved', 'admin.notif.vars_hint': 'Available variables in templates', 'admin.notif.tmpl.not_set': 'Template not configured', 'admin.notif.tmpl.subject_label': 'Email subject', 'admin.notif.tmpl.body_label': 'Email body (HTML)', 'admin.notif.tmpl.save': 'Save', 'admin.notif.tmpl.close': 'Close', 'admin.notif.tmpl.translate': 'Auto-translate to other languages', 'admin.notif.tmpl.translating': 'Translating...', 'admin.notif.tmpl.saving': 'Saving...', 'admin.notif.email_verification': 'Email verification', 'admin.notif.registration_success': 'Successful registration', 'admin.notif.password_reset': 'Password reset', 'admin.notif.new_offer': 'New offer', 'admin.notif.new_task': 'New task', 'admin.notif.offer_accepted': 'Offer accepted', 'admin.notif.new_message': 'New message', 'admin.notif.offer_declined': 'Offer declined', 'admin.notif.offer_other_accepted': 'Another specialist chosen', 'admin.notif.task_updated': 'Task updated', 'admin.notif.deadline_reminder': 'Deadline reminder', 'admin.notif.task_archived': 'Task unpublished automatically', 'admin.notif.referral_reward': 'Referral reward', // Plan lifecycle email templates 'admin.email_template.plan_activated': 'Plan activated', 'admin.email_template.plan_upgraded': 'Plan upgraded', 'admin.email_template.plan_downgrade_scheduled': 'Downgrade scheduled', 'admin.email_template.plan_downgrade_applied': 'Downgrade applied', 'admin.email_template.plan_renewal_reminder': 'Renewal reminder', 'admin.email_template.plan_insufficient_funds': 'Insufficient funds warning', // Pricing confirm modal 'pricing.confirm.title': 'Confirm plan selection', 'pricing.confirm.plan': 'Plan', 'pricing.confirm.prorated': 'Prorated credit', 'pricing.confirm.effective_price': 'Amount due', 'pricing.confirm.your_balance': 'Your balance', 'pricing.confirm.downgrade_info': 'The switch to the new plan will happen automatically after the current period ends.', 'pricing.confirm.insufficient': 'Insufficient balance.', 'pricing.confirm.top_up': 'Top up', 'pricing.confirm.schedule_downgrade': 'Schedule downgrade', 'pricing.confirm.pay': 'Pay', 'admin.user_edit.title': 'Edit user', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Registered', 'admin.user_edit.last_seen': 'Last seen', 'admin.user_edit.lang': 'Language', 'admin.user_edit.first_name': 'First name', 'admin.user_edit.last_name': 'Last name', 'admin.user_edit.phone': 'Phone', 'admin.user_edit.bio': 'Bio', 'admin.user_edit.role': 'Role', 'admin.user_edit.plan': 'Plan', 'admin.user_edit.no_plan': '— No plan —', 'admin.user_edit.active': 'Active account', 'admin.user_edit.balance': 'Balance (EUR)', 'admin.user_edit.skills': 'Skills', 'admin.user_edit.tab.profile': 'Profile', 'admin.user_edit.tab.account': 'Account', 'admin.user_edit.tab.balance': 'Balance', 'admin.user_edit.tab.settings': 'Settings', 'admin.user_edit.tab.specialist': 'Portfolio', 'admin.user_edit.tab.site': 'Website', 'admin.user_edit.plan_expires': 'Plan expires', 'admin.user_edit.interface_lang': 'Interface language', 'admin.user_edit.comm_languages': 'Communication languages', 'admin.user_edit.personal_site_slug': 'Personal page', 'admin.user_edit.show_contact_info': 'Show contact info', 'admin.user_edit.show_contact_info.hint': 'Visible to customers', 'admin.user_edit.notify_new_tasks': 'Notify about new tasks', 'admin.user_edit.notify_new_tasks.hint': 'Push and email notifications', 'admin.user_edit.notif_messages': 'Message notifications', 'admin.user_edit.notif_messages.hint': 'New messages in chat', 'admin.user_edit.site_settings': 'Personal page settings', 'admin.user_edit.categories': 'Service categories', 'admin.user_edit.locations': 'Service areas', 'admin.user_edit.skill_placeholder': 'New skill...', 'admin.user_edit.add_category': '— Select category —', 'admin.user_edit.add_location': '— Select location —', 'admin.user_edit.specialist_cards': 'Portfolio', 'admin.user_edit.no_cards': 'No portfolio found', 'admin.user_edit.card_title': 'Portfolio title', 'admin.user_edit.card_description': 'Description', 'admin.balance.topup.btn': 'Top up', 'admin.balance.withdraw.btn': 'Withdraw', 'admin.balance.modal_hint': 'Changes take effect immediately and are recorded in history', 'admin.balance.topup.title': 'Top up balance', 'admin.balance.topup.amount': 'Amount', 'admin.balance.topup.description': 'Comment', 'admin.balance.topup.description.placeholder': 'For example: bonus or manual top-up', 'admin.balance.topup.submit': 'Top up balance', 'admin.balance.withdraw.title': 'Withdraw balance', 'admin.balance.withdraw.amount': 'Amount', 'admin.balance.withdraw.description': 'Comment', 'admin.balance.withdraw.description.placeholder': 'For example: refund or manual debit', 'admin.balance.withdraw.submit': 'Withdraw from balance', 'admin.user_edit.role.customer': 'Customer', 'admin.user_edit.role.specialist': 'Specialist', 'admin.user_edit.role.admin': 'Administrator', 'common.refresh': 'Refresh', 'common.back_home': 'Home', 'admin.loc.hint': 'Manage cities and districts', 'admin.loc.add_city': 'New city', 'admin.loc.add_district': 'Add district', 'admin.loc.new': 'New location', 'admin.loc.edit': 'Edit location', 'admin.loc.district': 'district', 'admin.loc.empty': 'No locations', 'admin.loc.delete.confirm': 'Delete location? All districts will also be deleted.', 'admin.cat.add_root': 'New category', 'admin.cat.add_sub': 'Subcategory', 'admin.cat.edit': 'Edit', 'admin.cat.delete': 'Delete', 'admin.cat.delete.confirm': 'Delete category? All subcategories will also be deleted.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Icon', 'admin.cat.name_el': 'Greek', 'admin.cat.name_en': 'English', 'admin.cat.name_ru': 'Russian', 'admin.cat.order': 'Order', 'admin.cat.active': 'Active', 'admin.cat.parent': 'Parent category', 'admin.cat.no_parent': 'Top level', 'admin.cat.save': 'Save', 'admin.cat.cancel': 'Cancel', 'admin.cat.empty': 'No categories', 'admin.cat.hint': 'Manage categories with multi-level hierarchy', 'admin.cat.new': 'New category', 'admin.cat.subcategory': 'subcategory', 'admin.cat.add_child': 'Add subcategory', 'admin.cat.inactive': 'Inactive', 'admin.event.user_login': 'Login', 'admin.event.user_register': 'Registration', 'admin.event.admin_user_deactivate': 'User blocked', 'admin.event.admin_user_activate': 'User activated', 'admin.event.admin_user_role_changed': 'Role changed', 'admin.event.admin_task_cancelled': 'Task cancelled', 'admin.event.admin_task_deleted': 'Task deleted', 'admin.event.admin_report_reviewed': 'Report reviewed', 'admin.event.admin_report_dismissed': 'Report dismissed', 'admin.event.task_created': 'Task created', // User status 'user.online': 'Online', 'user.seen_minutes': 'was here {n} min ago', 'user.seen_hours': 'was here {n} hr ago', 'user.seen_yesterday': 'was here yesterday', 'user.seen_days': 'was here {n} days ago', // Specialists 'specialists.title': 'Specialists', 'specialists.search': 'Search specialist...', 'specialists.search.btn': 'Search', 'specialists.empty': 'No specialists found', 'specialists.no_bio': 'No description', 'specialists.view': 'View profile', 'specialists.reviews': 'reviews', 'specialist.favorite': 'Add to favorites', 'specialist.unfavorite': 'Remove from favorites', 'specialist.site_link': 'Personal site', 'favorites.specialists.title': 'Favourite specialists', 'favorites.specialists.empty': 'No favourite specialists yet', 'nav.favorites': 'Favourites', 'nav.schedule': 'Schedule', 'nav.find_tasks': 'Find Orders', 'schedule.title': 'My Schedule', 'schedule.subtitle': 'Mark the days when you are free or busy — clients will see your availability', 'schedule.available': 'Available', 'schedule.busy': 'Busy', 'schedule.unset': 'Not set', 'schedule.click_hint': '← click to cycle status', 'schedule.range_mode': 'Select range', 'schedule.range_from': 'From {date} — select end date', 'schedule.click_to_set': 'Click to set', 'schedule.free': 'free', 'schedule.busy_count': 'busy', 'schedule.free_days': 'free days', 'schedule.googleCalendar': 'Google Calendar', 'schedule.connectGoogle': 'Connect Google Calendar', 'schedule.disconnectGoogle': 'Disconnect', 'schedule.connectedAs': 'Connected as', 'schedule.importFromGoogle': 'Sync from Google', 'schedule.gcalConnected': '\u2713 Google Calendar connected', 'schedule.gcalError': 'Google Calendar connection error', 'schedule.gcalImportDone': 'Imported {n} days from Google Calendar', 'schedule.gcalAutoSyncNote': 'Availability changes are automatically synced to Google Calendar', 'schedule.gcalConnectDesc': 'Connect Google Calendar to automatically sync your availability', 'schedule.gcalDisconnectConfirm': 'Disconnect Google Calendar?', 'find_tasks.title': 'Find Orders', 'find_tasks.for_me': 'For me', 'find_tasks.all': 'All orders', 'find_tasks.by_category': 'By category', 'find_tasks.list': 'List', 'find_tasks.already_offered': 'Offer sent', 'find_tasks.offer_now': 'Make an offer', 'find_tasks.empty_for_me': 'No tasks found in your categories', 'find_tasks.banner_hint': 'Find tasks matching your portfolio categories', 'find_tasks.no_cards': 'Create a specialist portfolio to see tasks matched to you', 'find_tasks.add_card': 'Create portfolio', 'find_tasks.search': 'Search tasks...', 'find_tasks.tasks_count': 'tasks', 'footer.tagline': 'The task platform for Greece', 'footer.rights': 'All rights reserved.', // App download section 'app.download_title': 'Download the CanHelp mobile app', 'app.download_desc': 'All of CanHelp — always at your fingertips. Available for Android and iOS.', // Nav 'nav.pricing': 'Pricing', // Pricing page 'pricing.title': 'Pricing', 'pricing.subtitle': 'Choose the right plan for you', 'pricing.role.customer': 'Customer', 'pricing.role.specialist': 'Specialist', 'pricing.free': 'Free', 'pricing.per_month': 'mo', 'pricing.duration': 'Duration', 'pricing.days': 'days', 'pricing.current_plan': 'Your plan', 'pricing.popular': 'Popular', 'pricing.choose': 'Choose', 'pricing.your_plan': 'Active plan', 'pricing.free_default': 'Default', 'pricing.compare': 'Compare features', 'pricing.feature': 'Feature', 'pricing.faq_note': 'Payment is deducted from your CanHelp balance. Top up available in Payments.', 'pricing.feat.messages': 'Messages / day', 'pricing.feat.orders': 'Orders / day', 'pricing.feat.contact_all': 'Contact everyone', 'pricing.feat.view_phone': 'View phone number', 'pricing.feat.show_contact': 'Show contact info', 'pricing.feat.favorites': 'Favorites', 'pricing.feat.verified_badge': 'Verified badge', 'pricing.feat.google_calendar': 'Google Calendar', 'pricing.feat.personal_site': 'Personal site', 'pricing.feat.auto_response': 'Auto-response', 'pricing.feat.auto_match': 'Auto-match', 'pricing.feat.highlighted_reviews': 'Highlighted reviews', 'pricing.feat.portfolio': 'Portfolio items', 'pricing.feat.cards': 'Specialist cards', 'pricing.feat.notify_tasks': 'New task notifications', 'pricing.feat.video': 'Video in portfolio', // Upgrade prompt 'upgrade.available_in': 'Available in', 'upgrade.cta': 'Upgrade', // Dashboard plan block 'dashboard.plan.title': 'My Plan', 'dashboard.plan.expires': 'Expires in {n} days', 'dashboard.plan.upgrade': 'Upgrade plan', 'dashboard.plan.no_plan': 'Free plan', 'dashboard.plan.messages': 'Messages today', 'dashboard.plan.orders': 'Orders today', 'dashboard.plan.limits': 'Daily limits', 'dashboard.plan.features': 'Features', 'dashboard.plan.stats': 'Stats', 'dashboard.stats.cards': 'Portfolios', 'dashboard.stats.maxCards': 'Max portfolios', 'dashboard.stats.portfolioItems': 'Portfolio items', 'dashboard.stats.maxPortfolioItems': 'Max items', 'dashboard.stats.activeOffers': 'Active offers', 'dashboard.stats.reviewsReceived': 'Reviews', 'dashboard.stats.activeTasks': 'Active tasks', 'dashboard.stats.completedTasks': 'Completed', 'status.need_help': 'I need help', 'status.active': 'Active', 'status.toggle_on': 'Enable', 'status.toggle_off': 'Disable', // FOMO 'fomo.missed_orders': 'Missed {n} orders', 'fomo.missed_value': 'Worth €{v}', 'fomo.upgrade_hint': 'Upgrade to receive more orders', 'fomo.conversion': 'Task conversion', 'fomo.active': 'Active', 'fomo.with_offers': 'With offers', 'fomo.completed': 'Completed', 'fomo.already_offered': '{n} specialists have already responded', 'fomo.specialist_missed': 'You missed {n} orders', 'fomo.top_categories': 'Categories', 'fomo.offers_received': 'offers received', 'fomo.avg_offers': 'Avg {n}/task', 'fomo.completion_rate': 'completed', // Task auto-match 'task.auto_match': 'Auto-match', 'task.auto_match_results': 'Top specialists', 'task.no_offer_yet': 'You haven\'t sent an offer yet', 'task.make_offer': 'Send offer', 'auto_response.title': 'Auto-Response', 'auto_response.enabled': 'Enable auto-response', 'auto_response.min_budget': 'Min budget', 'auto_response.max_budget': 'Max budget', 'auto_response.default_price': 'Default price', 'auto_response.default_message': 'Default message', 'auto_response.max_per_day': 'Max auto-offers per day', 'auto_response.save': 'Save', 'auto_response.saved': 'Saved', 'auto_response.categories': 'Categories', 'auto_response.locations': 'Locations', // Personal site 'profile.personal_site': 'Personal Site', 'profile.site_slug': 'URL slug', 'profile.site_slug_hint': 'Only latin letters, numbers, - and _', 'profile.site_open': 'Open site', 'profile.site_preview': 'Your site', 'profile.show_contact': 'Show contact info', 'profile.show_contact_hint': 'Customers with Pro/Ultimate plans will see your phone number', // Google Calendar plan gate 'gcal.upgrade_required': 'Google Calendar requires a Pro or Ultimate plan', // Chat limits 'chat.limit_warning': '{n} messages left today', 'chat.limit_reached': 'Message limit reached. Upgrade your plan', 'chat.upgrade': 'Upgrade', // Site page 'site.member_since': 'Member since', 'site.rating': 'Rating', 'site.completed_tasks': 'Completed', 'site.languages': 'Languages', 'site.photos': 'photos', 'site.contact_form': 'Get in touch', 'site.contact_sent': 'Message sent!', 'site.contact_sent_desc': 'The specialist will contact you soon', 'site.contact_name': 'Name', 'site.contact_name_ph': 'Your name', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Message', 'site.contact_message_ph': 'Describe your task...', 'site.contact_send': 'Send', 'site.share': 'Share', 'site.speaks_languages': 'Speaks', 'site.message_sent': 'Message sent!', 'site.message_sent_desc': 'The specialist will receive it in the chat', 'site.message_placeholder': 'Write your message...', 'site.write_to_chat': 'Write to chat', 'site.auth_required_title': 'Sign in required', 'site.auth_required_desc': 'To write in the chat, you need to sign in to your CanHelp account.', 'site.auth_login_btn': 'Sign in', 'site.auth_contact_form_btn': 'Contact via feedback form', 'specialist.services': 'Services', 'portfolio.title': 'Portfolio', 'status.can_help_now': 'Available now', 'common.not_found': 'Page not found', 'common.anonymous': 'Anonymous' }, ru: { 'footer.slogan': 'Ваша задача — наша забота! Решаем любые вопросы быстро и удобно.', 'footer.links': 'Ссылки', 'footer.socials': 'Мы в соцсетях', 'nav.home': 'Главная', 'nav.tasks': 'Задачи', 'nav.post': '+ Опубликовать', 'nav.dashboard': 'Панель управления', 'nav.chat': 'Сообщения', 'nav.notifications': 'Уведомления', 'nav.profile': 'Профиль', 'nav.admin': 'Админка', 'nav.specialists': 'Специалисты', 'nav.new_task': 'Новая задача', 'nav.login': 'Войти', 'nav.register': 'Регистрация', 'nav.logout': 'Выйти', 'hero.title': 'Найди специалиста для любой работы', 'hero.subtitle': 'Опубликуй задачу, получи предложения и выбери лучшего профессионала', 'hero.cta.post': 'Опубликовать задачу', 'hero.cta.browse': 'Найти работу', 'hero.search.placeholder': 'Что нужно? напр. электрик, уборка...', 'stats.specialists': 'специалистов', 'stats.tasks': 'задач', 'stats.categories': 'категорий', 'stats.free': 'бесплатная регистрация', 'section.categories': 'Создай задачу в любой категории', 'section.how': 'Как это работает', 'section.recent': 'Последние задачи', 'section.all': 'Смотреть все →', 'section.more': 'ещё', 'section.cities': 'Города и районы', 'section.community': 'Общественный проект для всех', 'community.subtitle': 'CanHelp — не просто маркетплейс, это сообщество взаимопомощи. Любой, у кого есть знания или навык, может найти клиента. Любой, у кого есть задача, может найти специалиста.', 'community.point1.title': 'Умеете что-то делать?', 'community.point1.desc': 'Ремонт, репетиторство, дизайн, переводы, уход — каждый навык имеет ценность. Создайте профиль и находите клиентов рядом с вами.', 'community.point2.title': 'Нужна помощь?', 'community.point2.desc': 'Опубликуйте задачу за минуту и получайте предложения от проверенных специалистов в вашем городе.', 'community.point3.title': 'Помогите проекту расти', 'community.point3.desc': 'CanHelp развивается благодаря сообществам. Поделитесь ссылкой с друзьями и знакомыми — вместе мы строим что-то полезное для всех.', 'community.share': 'Поделиться с друзьями', 'community.share.copied': 'Ссылка скопирована!', // Referral section on home page 'section.referral': 'Реферальная программа', 'referral.home.subtitle': 'Поделитесь ссылкой — каждый новый пользователь, зарегистрировавшийся по ней, принесёт вам награду.', 'referral.home.step1.title': 'Зарегистрируйтесь и получите ссылку', 'referral.home.step1.desc': 'Создайте аккаунт и найдите свою уникальную реферальную ссылку в профиле.', 'referral.home.step2.title': 'Поделитесь с друзьями', 'referral.home.step2.desc': 'Отправьте ссылку друзьям, знакомым или опубликуйте в социальных сетях.', 'referral.home.step3.title': 'Получайте награды', 'referral.home.step3.desc': 'Как только друг подтвердит email, вы автоматически получите свою награду.', 'referral.home.cta': 'Получить ссылку', 'referral.home.badge': 'Реферальная программа', // FAQ section 'section.faq': 'Частые вопросы', 'faq.q1': 'Как работает CanHelp?', 'faq.a1': 'Опубликуйте задачу, получите предложения от специалистов, выберите лучшего и начните сотрудничество. Это быстро, просто и бесплатно для клиентов.', 'faq.q2': 'Сколько стоит использование платформы?', 'faq.a2': 'Регистрация и публикация задач полностью бесплатны для клиентов. Специалисты имеют доступ к бесплатному плану, а также к премиум-опциям.', 'faq.q3': 'Как стать специалистом?', 'faq.a3': 'Зарегистрируйтесь, перейдите в «Стать специалистом», заполните профиль навыками и категориями и начните получать задачи.', 'faq.q4': 'Как выбрать подходящего специалиста?', 'faq.a4': 'Оцените отзывы, опыт, навыки и портфолио каждого специалиста. Общайтесь через чат платформы и уточняйте детали до принятия решения.', 'faq.q5': 'Что если я не доволен результатом?', 'faq.a5': 'Вы можете оставить отзыв о специалисте и поставить оценку от 1 до 5 звёзд. Отзывы помогают другим пользователям выбирать проверенных профессионалов.', 'faq.q6': 'Можно ли связаться со специалистом до принятия предложения?', 'faq.a6': 'Да. Как только вы получили предложение, можно открыть чат со специалистом, задать вопросы и уточнить все детали до принятия решения.', 'faq.q7': 'Сколько времени ждать предложений?', 'faq.a7': 'Как правило, в течение нескольких часов. Специалисты получают уведомление о новых задачах и могут быстро ответить.', 'faq.q8': 'Можно ли разместить задачу в любом городе Греции?', 'faq.a8': 'Да! CanHelp охватывает всю Грецию — Афины, Фессалоники, Патры и другие города.', 'faq.q9': 'Какие виды задач есть на CanHelp?', 'faq.a9': 'Ремонт, уборка, электрики, репетиторство, дизайн, IT, переезды, красота и многое другое. Категории постоянно расширяются.', 'faq.q10': 'Есть ли мобильное приложение?', 'faq.a10': 'Да! CanHelp доступно для Android и iOS. Скачайте приложение и управляйте всем со своего телефона.', 'how.step1.title': 'Опубликуй задачу', 'how.step1.desc': 'Опиши что нужно и установи бюджет', 'how.step2.title': 'Получи предложения', 'how.step2.desc': 'Специалисты пришлют предложения с ценой и сроками', 'how.step3.title': 'Выбери и начни', 'how.step3.desc': 'Выбери лучшего профессионала и начни сотрудничество', 'tasks.title': 'задач', 'tasks.filters': 'Фильтры', 'tasks.search': 'Поиск', 'tasks.search.placeholder': 'Название или ключевое слово...', 'tasks.search.btn': 'Поиск', 'tasks.publish': 'Опубликовать', 'tasks.category.all': 'Все', 'tasks.category.all_in': 'Все в', 'tasks.category.label': 'Категория', 'tasks.location.label': 'Город', 'tasks.location.placeholder': 'напр. Афины', 'tasks.empty': 'Задачи не найдены', 'tasks.empty.cta': 'Опубликуй первую', 'task.status.open': 'Открыта', 'task.status.in_progress': 'В работе', 'task.status.completed': 'Завершена', 'task.status.cancelled': 'Отменена', 'task.status.draft': 'Черновик', 'task.budget': 'Бюджет', 'task.location': 'Местоположение', 'task.deadline': 'Дата начала', 'task.created_at': 'Создано', 'task.customer': 'Заказчик', 'task.offer.btn': 'Отправить предложение', 'task.invite.banner_title': 'Вас пригласили на это задание', 'task.invite.banner_hint': 'Заказчик лично пригласил вас', 'task.invite.accept': 'Отправить предложение', 'task.invite.decline': 'Отказаться', 'offer.accept': 'Принять', 'offer.decline': 'Отклонить', 'task.complete': 'Завершить задачу', 'task.complete.confirm': 'Отметить задачу как выполненную?', 'task.edit': 'Редактировать', 'task.status_label': 'Статус', 'task.yours': 'Ваша задача', 'task.offer.yours': 'Ваше предложение', 'review.leave': 'Оставить отзыв', 'review.rating': 'Оценка', 'review.comment': 'Комментарий', 'review.comment.placeholder': 'Расскажите о своём опыте...', 'review.submit': 'Отправить отзыв', 'review.submitting': 'Отправка...', 'review.done': 'Отзыв отправлен!', 'profile.reviews': 'Отзывы', 'profile.no_reviews': 'Отзывов пока нет', 'profile.rating': 'Рейтинг', 'profile.skills.label': 'Навыки', 'profile.member_since': 'Участник с', 'task.offers': 'Предложения', 'task.offers.none': 'Предложений пока нет', 'create.title': 'Опубликовать задачу', 'create.field.title': 'Название', 'create.field.description': 'Описание', 'create.field.category': 'Категория', 'create.field.category.select': 'Выберите...', 'create.field.location': 'Местоположение', 'create.field.location.any': 'Где угодно', 'create.field.location.all': 'Весь город', 'create.field.budget': 'Бюджет (€)', 'create.field.deadline': 'Дата начала', 'create.field.budget_negotiable': 'Цена обсуждается', 'create.field.time_slot': 'Время выполнения', 'create.field.time_slot.any': 'В любое время', 'create.field.time_slot.morning': 'Утром (08:00–13:00)', 'create.field.time_slot.afternoon': 'Днём (13:00–18:00)', 'create.field.time_slot.evening': 'Вечером (18:00–22:00)', 'create.field.time_slot.weekend': 'Выходной', 'create.field.address': 'Адрес (необязательно)', 'create.field.address.district': 'Квартал', 'create.field.address.street': 'Улица', 'create.field.address.house': 'Дом', 'create.field.confidential': 'Конфиденциальная заметка', 'create.field.confidential.placeholder': 'Детали, видные только назначенному специалисту...', 'create.field.confidential.hint': 'Не отображается публично', 'create.field.photos': 'Фотографии', 'create.field.photos.add': 'Добавить фото', 'create.field.photos.uploading': 'Загрузка...', 'task.budget_negotiable': 'Цена обсуждается', 'task.time_slot': 'Время', 'task.confidential': 'Конфид. заметка', 'create.field.title.placeholder': 'напр. Уборка квартиры 80кв', 'create.field.description.placeholder': 'Подробно опишите что нужно...', 'create.field.location.placeholder': 'напр. Афины, Колонаки', 'create.field.budget.placeholder': 'напр. 100', 'create.submit': 'Опубликовать задачу', 'create.submitting': 'Публикация...', 'login.title': 'Добро пожаловать', 'login.subtitle': 'Вход в CanHelp', 'login.email': 'Email', 'login.password': 'Пароль', 'login.submit': 'Войти', 'login.submitting': 'Вход...', 'login.error': 'Неверный email или пароль', 'login.unverified.title': 'Подтвердите ваш email', 'login.unverified.desc': 'Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.', 'login.unverified.resend': 'Отправить письмо повторно', 'login.unverified.sending': 'Отправка...', 'login.unverified.sent': '✓ Отправлено — проверьте входящие', 'profile.email.verified': 'Email подтверждён', 'profile.email.not_verified': 'Email не подтверждён', 'login.no_account': 'Нет аккаунта?', 'login.register_link': 'Зарегистрироваться', 'login.forgot_password': 'Забыл пароль?', 'login.or_continue_with': 'или продолжите через', 'login.continue_google': 'Войти через Google', 'forgot.title': 'Забыл пароль', 'forgot.subtitle': 'Введите email для получения ссылки восстановления', 'forgot.email': 'Email', 'forgot.submit': 'Отправить ссылку', 'forgot.submitting': 'Отправка...', 'forgot.sent.title': 'Проверьте входящие', 'forgot.sent.desc': 'Если аккаунт с таким email существует, мы отправим ссылку для сброса пароля.', 'forgot.back_to_login': 'Вернуться ко входу', 'forgot.error': 'Не удалось отправить ссылку. Проверьте адрес и попробуйте снова.', 'forgot.error.not_found': 'Аккаунт с таким email не найден.', 'forgot.error.send_failed': 'Ошибка отправки письма. Попробуйте позже.', 'reset.title': 'Новый пароль', 'reset.subtitle': 'Введите новый пароль', 'reset.password': 'Новый пароль', 'reset.confirm': 'Подтвердите пароль', 'reset.submit': 'Изменить пароль', 'reset.submitting': 'Сохранение...', 'reset.success': 'Пароль успешно изменён. Перенаправление ко входу...', 'reset.back_to_login': 'Вернуться ко входу', 'reset.error.mismatch': 'Пароли не совпадают', 'reset.error.invalid': 'Недействительная или устаревшая ссылка. Запросите новую.', 'register.title': 'Регистрация', 'register.subtitle': 'Создать аккаунт в CanHelp', 'register.first_name': 'Имя', 'register.last_name': 'Фамилия', 'register.email': 'Email', 'register.password': 'Пароль (мин. 8 символов)', 'register.role': 'Роль', 'register.role.customer': 'Пользователь', 'register.role.customer.desc': 'Публикую задачи', 'register.role.specialist': 'Специалист', 'register.role.specialist.desc': 'Беру задачи', 'register.submit': 'Создать аккаунт', 'register.submitting': 'Регистрация...', 'register.has_account': 'Уже есть аккаунт?', 'register.login_link': 'Войти', 'register.continue_google': 'Зарегистрироваться через Google', 'register.check_email.title': 'Проверьте почту', 'register.check_email.desc': 'Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.', 'register.check_email.login': 'Вернуться к входу', 'dashboard.title': 'Панель управления', 'dashboard.new_task': '+ Новая задача', 'dashboard.my_tasks': 'Мои задачи', 'dashboard.my_offers': 'Мои предложения', 'dashboard.invitations': 'Приглашения на задания', 'dashboard.offers_count': 'предл.', 'dashboard.declined_count': 'откл.', 'dashboard.completed_tasks': 'Завершённые задачи', 'dashboard.completed_offers': 'Завершённые предложения', 'dashboard.review_pending': 'Оценка ещё не оставлена', 'tasks.new.top_specialists': 'Топ специалисты', 'tasks.new.select_category': 'Выберите категорию, чтобы увидеть специалистов', 'tasks.new.invite': 'Предложить работу', 'tasks.new.invited': 'Выбран ✓', 'reviews.count': 'отзывов', 'filter.location': 'Локация', 'filter.language': 'Языки', 'filter.language.any': 'Любой язык', 'filter.category.all': 'Все категории', 'user.categories': 'Категории', 'user.work_area': 'Район работы', 'dashboard.tasks.empty': 'Вы не публиковали задачи', 'dashboard.tasks.empty.cta': 'Опубликуйте первую', 'dashboard.tasks.add_new': 'Добавить новую задачу', 'dashboard.offers.empty': 'Вы не отправляли предложений', 'dashboard.offers.empty.cta': 'Найти задачи', 'dashboard.customer.specialists_title': 'Ищете исполнителя?', 'dashboard.customer.specialists_hint': 'Просматривайте профили специалистов, читайте отзывы и приглашайте их на свои задачи', 'dashboard.customer.specialists_cta': 'Найти исполнителя', 'dashboard.customer.how_title': 'Как это работает', 'dashboard.customer.step1': 'Создайте задачу с описанием и бюджетом', 'dashboard.customer.step2': 'Специалисты пришлют предложения с ценой и сроками', 'dashboard.customer.step3': 'Выберите подходящего и начните работу', 'notif.title': 'Уведомления', 'notif.mark_all': 'Отметить все как прочитанные', 'notif.empty': 'Нет уведомлений', 'notif.type.new_offer': 'Новое предложение', 'notif.type.offer_accepted': 'Ваше предложение принято', 'notif.type.offer_declined': 'Ваше предложение отклонено', 'notif.type.task_completed': 'Задание выполнено', 'notif.type.task_cancelled': 'Задание отменено', 'notif.type.new_message': 'Новое сообщение', 'notif.type.new_review': 'Новый отзыв', 'notif.type.task_invite': 'Приглашение на задание', 'notif.body.new_offer': 'Новое предложение на «{title}»', 'notif.body.offer_accepted': 'Ваше предложение на «{title}» принято', 'notif.body.offer_declined': 'Ваше предложение на «{title}» отклонено', 'notif.body.task_invite': 'Вас приглашают на «{title}»', 'notif.body.new_review': 'Вы получили оценку {rating}★', 'offer.status.pending': 'Ожидает', 'offer.status.accepted': 'Принято', 'offer.status.declined': 'Отклонено', 'offer.status.withdrawn': 'Отозвано', 'offer.status.other_accepted': 'Выбран другой исполнитель', 'common.loading': 'Загрузка...', 'common.error': 'Ошибка', 'common.save': 'Сохранить', 'common.saving': 'Сохранение...', 'common.cancel': 'Отмена', 'common.add': 'Добавить', 'common.close': 'Закрыть', 'common.edit': 'Редактировать', 'common.delete': 'Удалить', 'common.from': 'от', 'common.currency': '€', 'common.greece': 'Греция', // Chat 'chat.connected': 'Подключено', 'chat.disconnected': 'Отключено', 'chat.no_rooms': 'Переписок пока нет', 'chat.task_fallback': 'Задача', 'chat.select': 'Выберите переписку', 'chat.no_messages': 'Сообщений пока нет', 'chat.placeholder': 'Напишите сообщение... (Enter для отправки)', 'chat.conversation_fallback': 'Переписка', 'chat.direct_chat': 'Личный чат', 'chat.linked_task': 'Прикреплённый заказ', 'chat.write_btn': 'Написать', 'chat.just_now': 'только что', 'chat.min_ago': 'м', 'chat.write_specialist': 'Написать специалисту', 'chat.write_customer': 'Написать заказчику', 'chat.notif_settings': 'Настройки уведомлений', 'chat.notif_messages': 'Уведомления о новых сообщениях', 'chat.toast_title': 'Новое сообщение', 'chat.toast_open': 'Открыть чат', // Offer form 'offer.price': 'Цена', 'offer.price.placeholder': 'напр. 80', 'offer.customer_budget': 'Бюджет заказчика', 'offer.message': 'Сообщение', 'offer.optional': 'необязательно', 'offer.message.placeholder': 'Представьтесь, расскажите об опыте и почему вы лучший выбор...', 'offer.submitting': 'Отправка...', // Profile 'profile.photo': 'Фото профиля', 'profile.photo.change': 'Изменить фото', 'profile.photo.hint': 'JPEG, PNG, WebP · до 5MB', 'profile.basic_info': 'Основная информация', 'profile.phone': 'Телефон', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Краткое описание', 'profile.bio.placeholder': 'Расскажите немного о себе...', 'profile.language': 'Язык', 'profile.language.hint': 'Язык интерфейса и email-уведомлений', 'profile.languages': 'Языки общения', 'profile.languages.hint': 'Выберите все языки, на которых вы общаетесь', 'profile.skills': 'Навыки', 'profile.skills.subtitle': 'Добавьте услуги, которые вы предлагаете', 'profile.skills.placeholder': 'напр. Уборка, IT, Репетиторство...', 'profile.role': 'Роль аккаунта', 'profile.role.specialist': '🔧 Специалист', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 Пользователь', 'profile.role.change': 'Для смены роли обратитесь в службу поддержки.', 'profile.become_specialist': 'Стать специалистом', 'profile.become_specialist.desc': 'Перейдите в роль специалиста, чтобы брать задачи и наполнить профиль.', 'become_specialist.hero.title': 'Зарабатывай, делая то, что умеешь', 'become_specialist.hero.subtitle': 'Создай профиль специалиста и получай заказы от клиентов по всей Греции', 'become_specialist.how.title': 'Как это работает', 'become_specialist.step1.title': 'Создай портфолио специалиста', 'become_specialist.step1.desc': 'Укажи категории, навыки и зону покрытия — система автоматически подберёт подходящие заказы', 'become_specialist.step2.title': 'Ищи заказы', 'become_specialist.step2.desc': 'Просматривай задачи по своим категориям в разделе «Поиск заказов»', 'become_specialist.step3.title': 'Откликайся и зарабатывай', 'become_specialist.step3.desc': 'Отправляй предложения с ценой и сроками, общайся с клиентами и выполняй заказы', 'become_specialist.benefits.title': 'Преимущества профиля специалиста', 'become_specialist.benefit1': 'Поиск заказов по вашим категориям и локации', 'become_specialist.benefit2': 'Публичный профиль с отзывами клиентов', 'become_specialist.benefit3': 'Расписание доступности, видимое клиентам', 'become_specialist.benefit4': 'Добавление в избранное клиентами', 'become_specialist.cta': 'Стать специалистом — это бесплатно', 'become_specialist.free_badge': 'Бесплатная регистрация', 'profile.tab.notifications': 'Уведомления', 'profile.tab.reviews': 'Отзывы', 'profile.tab.referral': 'Рефералы', 'profile.tab.auto_response': 'Авто-ответ', 'profile.tab.site': 'Сайт', 'profile.site.title': 'Персональная страница', 'profile.site.url_label': 'Личный сайт', 'profile.site.copy': 'Копировать', 'profile.site.copied': 'Скопировано', 'profile.site.visible_title': 'Что отображается на вашей странице', 'profile.site.visible.name': 'Имя и фото', 'profile.site.visible.bio': 'Биография', 'profile.site.visible.rating': 'Рейтинг и отзывы', 'profile.site.visible.portfolio': 'Портфолио / Карточки', 'profile.site.visible.contacts': 'Контактные данные', 'profile.site.visible.full_last_name': 'Фамилия полностью', 'profile.site.visible.services': 'Карточки услуг', 'profile.site.visible.reviews': 'Раздел с отзывами', 'profile.site.visible.status': 'Статус «Готов помочь»', 'profile.site.theme': 'Тема оформления', 'profile.site.theme.dark': 'Тёмная', 'profile.site.theme.light': 'Светлая', 'profile.site.slug_taken': 'Этот адрес уже занят', 'profile.site.stats.title': 'Аналитика сайта', 'profile.site.stats.days': 'последние 30 дней', 'profile.site.stats.views': 'Просмотры', 'profile.site.stats.unique': 'Уникальные посетители', 'profile.site.stats.messages': 'Сообщения', 'profile.site.stats.total_views': 'Просмотры', 'profile.site.stats.total_unique': 'Уник. посетители', 'profile.site.stats.total_messages': 'Сообщения', 'profile.site.stats.empty': 'Данных пока нет', 'profile.site.stats.loading': 'Загрузка аналитики...', 'profile.site.stats.no_slug': 'Укажите адрес сайта, чтобы видеть статистику', 'profile.site.edit_bio_hint': 'Биография и фото настраиваются во вкладке «Основное».', 'status.title': 'Статус', 'status.can_help_now_hint': 'Ваша карточка показывается выше в поиске', 'status.need_help_hint': 'Специалисты могут предложить вам помощь', 'profile.referral.title': 'Партнёрская программа', 'profile.referral.desc': 'Поделитесь ссылкой и получайте награду за каждого привлечённого пользователя.', 'profile.referral.link_label': 'Ваша реферальная ссылка', 'profile.referral.copy': 'Копировать', 'profile.referral.copied': 'Скопировано!', 'profile.referral.invited_count': 'успешных приглашений', 'profile.referral.no_code': 'Реферальный код недоступен.', 'notifications.title': 'Настройки уведомлений', 'notifications.email.new_tasks': 'Email о новых заказах', 'notifications.email.new_tasks.desc': 'Получать email, когда в ваших категориях публикуется новый заказ', 'notifications.messages.desc': 'Получать уведомление при новом входящем сообщении', 'notifications.saved': 'Настройки сохранены', 'notifications.plan_required': 'Недоступно в вашем тарифе', 'profile.tab.info': 'Основное', 'profile.tab.finance': 'Финансы', 'profile.tab.skills': 'Навыки', 'profile.tab.categories': 'Категории', 'profile.tab.geography': 'География', 'profile.specialist.categories': 'Категории работ', 'profile.specialist.categories.desc': 'Выберите категории, в которых вы работаете', 'profile.specialist.geography': 'Города покрытия', 'profile.specialist.geography.desc': 'Выберите города / районы, где вы работаете', 'profile.saving': 'Сохранение...', 'profile.upload.error': 'Ошибка загрузки фото', 'profile.saved': 'Сохранено', 'profile.tab.cards': 'Портфолио', 'profile.cards.count': 'Портфолио', 'profile.cards.add': 'Добавить портфолио', 'profile.cards.new_title': 'Название нового портфолио', 'profile.cards.placeholder': 'Например: Сантехника', 'profile.cards.create': 'Создать', 'profile.cards.cancel': 'Отмена', 'profile.cards.empty': 'У вас нет портфолио', 'profile.cards.create_first': 'Создать первое портфолио', 'profile.cards.delete_confirm': 'Удалить портфолио?', 'profile.card.tab.main': 'Основное', 'profile.card.tab.skills': 'Навыки', 'profile.card.tab.categories': 'Категории', 'profile.card.tab.geography': 'География', 'profile.card.tab.portfolio': 'Галерея', 'profile.card.active': 'Активна', 'profile.card.save': 'Сохранить', 'profile.card.saved': 'Сохранено', 'profile.card.delete': 'Удалить', 'profile.card.skill.add': 'Добавить навык', 'profile.card.photo.add': 'Добавить фото', 'profile.card.photo.uploading': 'Загрузка...', 'profile.card.photo.empty': 'Нет фотографий', 'profile.card.item.title': 'Заголовок', 'profile.card.item.desc': 'Описание', 'profile.card.item.save': 'Сохранить', 'profile.card.item.cancel': 'Отмена', 'profile.card.item.edit': 'Описание работы', 'profile.upgrade.cards_limit': 'Лимит портфолио исчерпан', 'profile.upgrade.plan': 'Текущий тариф:', 'profile.upgrade.contact': 'Обратитесь к администратору для смены тарифа', 'profile.upgrade.ok': 'Понятно', 'profile.plan.title': 'Тарифный план', 'profile.balance': 'Баланс', 'profile.balance.topup': 'Пополнить баланс', 'profile.balance.topup.title': 'Пополнить баланс', 'profile.balance.topup.amount': 'Сумма (в EUR)', 'profile.balance.topup.hint': 'Выберите сумму или введите вручную', 'profile.balance.topup.submit': 'Перейти к оплате', 'profile.balance.topup.loading': 'Перенаправление...', 'profile.balance.topup.error': 'Ошибка инициализации платежа. Попробуйте снова.', 'payment.success.title': 'Оплата прошла успешно!', 'payment.success.desc': 'Ваш баланс обновлён.', 'payment.cancelled.title': 'Оплата отменена', 'payment.cancelled.desc': 'Оплата была отменена. Средства не списаны.', 'payment.pending.title': 'Обрабатывается...', 'payment.pending.desc': 'Ваш платёж в обработке.', 'payment.back_to_profile': 'Вернуться в профиль', 'profile.plan.basic': 'Базовый (бесплатный)', 'profile.plan.contact_upgrade': 'Обратитесь к администратору для подключения тарифа', 'profile.plan.cards_up_to': 'Портфолио: до', 'profile.plan.cards_unlimited': 'Портфолио: безлимитно', 'profile.plan.tasks_up_to': 'Задач: до', 'profile.plan.offers_up_to': 'Откликов: до', 'profile.plan.valid_until': 'Действителен до', 'profile.plan.no_expiry': 'Бессрочно', // Create task 'create.error': 'Ошибка при публикации', // Tasks list extras 'tasks.category.general': 'Общее', 'tasks.budget.range': 'Диапазон:', 'tasks.budget.from': 'от', 'tasks.budget.to': 'до', 'tasks.filter.reset': 'Сбросить фильтры', 'tasks.load_more': 'Загрузить ещё', 'tasks.showing': 'Результатов:', 'tasks.field.budget': 'Бюджет, €', // Admin 'admin.title': 'Панель администратора', 'admin.tab.stats': 'Статистика', 'admin.tab.users': 'Пользователи', 'admin.tab.tasks': 'Задачи', 'admin.tab.reports': 'Жалобы', 'admin.stats.users': 'Пользователи', 'admin.stats.tasks': 'Задачи', 'admin.stats.offers': 'Предложения', 'admin.stats.reviews': 'Отзывы', 'admin.tasks.by_status': 'Задачи по статусу', 'admin.col.user': 'Пользователь', 'admin.col.email': 'Email', 'admin.col.role': 'Роль', 'admin.col.registered': 'Регистрация', 'admin.col.status': 'Статус', 'admin.col.title': 'Название', 'admin.col.budget': 'Бюджет', 'admin.col.created': 'Создано', 'admin.users.active': 'Активен', 'admin.users.inactive': 'Неактивен', 'admin.users.deactivate': 'Деактивировать', 'admin.users.activate': 'Активировать', 'admin.tasks.cancel': 'Отменить', 'admin.reports.none': 'Жалоб нет', 'admin.reports.reviewed': 'Рассмотрено', 'admin.reports.dismiss': 'Отклонить', 'admin.pagination.total': 'Всего', 'admin.users.role.change': 'Изменить роль', 'admin.users.search.placeholder': 'Поиск по имени или email...', 'admin.tasks.delete': 'Удалить', 'admin.tasks.delete.confirm': 'Удалить эту задачу навсегда?', 'admin.tasks.search.placeholder': 'Поиск по названию...', 'admin.col.customer': 'Заказчик', 'admin.col.reporter': 'Жалобщик', 'admin.col.target': 'Цель', 'admin.filter.all_roles': 'Все роли', 'admin.filter.all_statuses': 'Все статусы', 'admin.reports.target.task': 'Задача', 'admin.reports.target.user': 'Пользователь', 'admin.tab.categories': 'Категории', 'admin.tab.locations': 'Города и районы', 'admin.tab.logs': 'Логи', 'admin.tab.plans': 'Тарифы', 'admin.tab.settings': 'Настройки', 'admin.logs.subtab.ai': 'AI логи', 'admin.logs.subtab.activity': 'Активность', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Уведомления', 'admin.notif_logs.type': 'Тип', 'admin.notif_logs.title': 'Заголовок', 'admin.notif_logs.read': 'Прочитано', 'admin.notif_logs.empty': 'Логи уведомлений пусты', 'admin.stats.notif_chart_title': 'Уведомления по дням', 'admin.stats.notif_label': 'Уведомления', 'admin.stats.mail_chart_title': 'Email по дням', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'Все', 'admin.stats.specialists': 'Исполнители', 'admin.col.plan': 'Тариф', 'admin.back_home': 'На главную', 'admin.plans.title': 'Тарифные пакеты', 'admin.plans.add': '+ Добавить тариф', 'admin.plans.empty': 'Тарифы не созданы', 'admin.plans.form.new': 'Новый тариф', 'admin.plans.form.edit': 'Редактировать тариф', 'admin.plans.form.name': 'Название', 'admin.plans.form.price': 'Цена (EUR)', 'admin.plans.form.old_price': 'Старая цена (EUR, необязательно)', 'admin.plans.form.max_offers': 'Макс. откликов (пусто = без лимита)', 'admin.plans.form.max_cards': 'Макс. портфолио (пусто = без лимита)', 'admin.plans.form.duration_days': 'Срок (дней, пусто = без истечения)', 'admin.plans.form.description': 'Описание', 'admin.plans.form.features': 'Возможности (по одной на строку)', 'admin.plans.form.notify': 'Уведомления о новых заказах', 'admin.plans.form.default': 'По умолчанию', 'admin.plans.form.active': 'Активен', 'admin.plans.form.order': 'Порядок', 'admin.plans.form.role': 'Роль', 'admin.plans.form.tier': 'Уровень', 'admin.plans.form.role.customer': 'Заказчик', 'admin.plans.form.role.specialist': 'Специалист', 'admin.plans.form.tier.free': 'Бесплатный', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Лимиты (пусто = без ограничений)', 'admin.plans.form.max_messages_day': 'Макс. сообщений/день', 'admin.plans.form.max_orders_day': 'Макс. заказов/день', 'admin.plans.form.max_skills': 'Макс. навыков', 'admin.plans.form.max_profiles': 'Макс. профилей', 'admin.plans.form.max_portfolio': 'Макс. элементов портфолио', 'admin.plans.form.section.boost': 'Множители & Буст', 'admin.plans.form.search_boost': 'Буст в поиске', 'admin.plans.form.offers_multiplier': 'Множитель откликов', 'admin.plans.form.section.contact': 'Права контактов', 'admin.plans.form.can_contact_free': 'Контакт с бесплатными пользователями', 'admin.plans.form.can_contact_pro': 'Контакт с Pro пользователями', 'admin.plans.form.can_contact_all': 'Контакт со всеми', 'admin.plans.form.can_show_contact': 'Показывать контакты', 'admin.plans.form.can_view_phone': 'Просмотр телефона', 'admin.plans.form.section.features': 'Возможности', 'admin.plans.form.upload_video': 'Загрузка видео', 'admin.plans.form.favorites': 'Избранное', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Знак верификации', 'admin.plans.form.highlighted_reviews': 'Выделенные отзывы', 'admin.plans.form.personal_site': 'Личный сайт', 'admin.plans.form.can_help_now': 'Статус «Могу помочь»', 'admin.plans.form.need_help': 'Статус «Нужна помощь»', 'admin.plans.form.auto_response': 'Автоответ', 'admin.plans.form.auto_match': 'Автоподбор', 'admin.plans.form.instant_dispatch_free': 'Мгновенная рассылка (бесплатно)', 'admin.plans.form.instant_dispatch_pro': 'Мгновенная рассылка (Pro)', 'admin.plans.badge.default': 'По умолчанию', 'admin.plans.badge.inactive': 'Неактивен', 'admin.plans.make_default': 'Сделать по умолчанию', 'admin.plans.tasks': 'Задач', 'admin.plans.offers': 'Откликов', 'admin.plans.cards': 'Портфолио', 'admin.plans.notify_tasks': 'Уведомления о заказах', 'admin.plans.delete.confirm': 'Удалить тариф', 'admin.activity.title': 'Журнал активности', 'admin.activity.event': 'Событие', 'admin.activity.all_events': 'Все события', 'admin.activity.from': 'От', 'admin.activity.to': 'До', 'admin.activity.reset': 'Сбросить', 'admin.activity.total': 'Всего', 'admin.activity.empty': 'Нет записей', 'admin.mail.event': 'Email событие', 'admin.mail.all_events': 'Все email события', 'admin.mail.from': 'От', 'admin.mail.to': 'До', 'admin.mail.reset': 'Сбросить', 'admin.mail.total': 'Всего', 'admin.mail.empty': 'Нет email логов', 'admin.mail.recipient': 'Получатель', 'admin.mail.provider': 'Провайдер', 'admin.mail.details': 'Детали', 'admin.mail.status': 'Статус', 'admin.mail.success': 'Успешно', 'admin.mail.failed': 'Ошибка', 'admin.event.email_sent': 'Email отправлен', 'admin.event.email_failed': 'Email не отправлен', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Тестовый email отправлен', 'admin.event.admin_email_test_failed': 'Тестовый email не отправлен', 'admin.logs.empty': 'Нет записей', 'admin.logs.date': 'Дата', 'admin.logs.provider': 'Провайдер', 'admin.logs.model': 'Модель', 'admin.logs.action': 'Действие', 'admin.logs.langs': 'Языки', 'admin.logs.in': 'Вход', 'admin.logs.out': 'Выход', 'admin.logs.total': 'Итого', 'admin.logs.ms': 'мс', 'admin.logs.status': 'Статус', 'admin.stats.activity_30d': 'Активность за 30 дней', 'admin.stats.tasks_label': 'Заявки', 'admin.stats.users_label': 'Пользователи', 'admin.stats.specialists_label': 'Исполнители', 'admin.stats.tokens_title': 'Расход токенов (по месяцам)', 'admin.stats.tokens_out': 'Исходящие', 'admin.stats.tokens_in': 'Входящие', 'admin.stats.tokens_out_label': 'Исходящие токены', 'admin.stats.tokens_in_label': 'Входящие токены', 'admin.stats.cost_label': 'Стоимость (USD)', 'admin.stats.tasks_by_status': 'Заявки по статусам', 'admin.task_status.open': 'Открытые', 'admin.task_status.in_progress': 'В работе', 'admin.task_status.completed': 'Завершённые', 'admin.task_status.cancelled': 'Отменённые', 'admin.task_status.draft': 'Черновики', 'admin.settings.tab.general': 'Общие', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Уведомления', 'admin.settings.tab.payment': 'Оплата', 'admin.settings.tab.referral': 'Реферальная', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO и обслуживание', 'admin.settings.seo.maintenance_label': 'Режим обслуживания', 'admin.settings.seo.maintenance_hint': 'Показывать страницу обслуживания всем посетителям', 'admin.settings.seo.indexing_label': 'Индексация поисковыми системами', 'admin.settings.seo.indexing_hint': 'Разрешить поисковым системам индексировать сайт', 'admin.settings.seo.head_scripts_label': 'Скрипты в (JS)', 'admin.settings.seo.head_scripts_hint': 'Выполняется на каждой странице (Google Tag Manager, аналитика и т.д.)', 'admin.settings.seo.site_title_label': 'Заголовок сайта', 'admin.settings.seo.site_description_label': 'Описание сайта (meta description)', 'admin.settings.referral.title': 'Партнёрская программа', 'admin.settings.referral.hint': 'Награждайте пользователей, приводящих новых участников.', 'admin.settings.referral.enabled_label': 'Включено', 'admin.settings.referral.enabled_hint': 'Включить / отключить выдачу наград', 'admin.settings.referral.customer_section': 'Для клиентов', 'admin.settings.referral.specialist_section': 'Для специалистов', 'admin.settings.referral.plan_label': 'Тарифный план за реферала', 'admin.settings.referral.no_plan': '— без плана —', 'admin.settings.referral.plan_hint': 'Этот план будет назначен пригласившему. Если его текущий план выше — добавятся только дни.', 'admin.settings.referral.days_label': 'Дней награды', 'admin.settings.referral.days_hint': 'Количество дней, добавляемых к сроку действия плана.', 'admin.settings.general.title': 'Общие настройки', 'admin.settings.general.site_name': 'Название сайта', 'admin.settings.general.site_url': 'URL сайта', 'admin.settings.general.contact_email': 'Email для связи', 'admin.settings.general.support_phone': 'Телефон поддержки', 'admin.settings.smtp.title': 'Настройки SMTP сервера', 'admin.settings.smtp.hint': 'Используется для отправки email-уведомлений.', 'admin.settings.smtp.host': 'SMTP Хост', 'admin.settings.smtp.port': 'Порт', 'admin.settings.smtp.encryption': 'Шифрование', 'admin.settings.smtp.enc.none': 'Нет', 'admin.settings.smtp.enc.tls': 'STARTTLS (порт 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (порт 465)', 'admin.settings.smtp.username': 'Имя пользователя', 'admin.settings.smtp.password': 'Пароль / App Password', 'admin.settings.smtp.from_name': 'Имя отправителя', 'admin.settings.smtp.from_email': 'Email отправителя', 'admin.settings.smtp.test': 'Отправить тестовый email', 'admin.settings.smtp.sending': 'Отправка...', 'admin.settings.payment.hint': 'Данные для подключения к ePay Piraeus Bank.', 'admin.settings.env.test': 'Тест (sandbox)', 'admin.settings.env.prod': 'Боевой режим', 'admin.settings.env.label': 'Среда', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Активен', 'admin.settings.saving': 'Сохранение...', 'admin.settings.saved': 'Сохранено', 'admin.notif.vars_hint': 'Доступные переменные в шаблонах', 'admin.notif.tmpl.not_set': 'Шаблон не настроен', 'admin.notif.tmpl.subject_label': 'Тема письма', 'admin.notif.tmpl.body_label': 'Текст письма (HTML)', 'admin.notif.tmpl.save': 'Сохранить', 'admin.notif.tmpl.close': 'Закрыть', 'admin.notif.tmpl.translate': 'Авто-перевод на другие языки', 'admin.notif.tmpl.translating': 'Перевод...', 'admin.notif.tmpl.saving': 'Сохранение...', 'admin.notif.email_verification': 'Подтверждение email адреса', 'admin.notif.registration_success': 'Успешная регистрация', 'admin.notif.password_reset': 'Восстановление пароля', 'admin.notif.new_offer': 'Новое предложение', 'admin.notif.new_task': 'Новая задача', 'admin.notif.offer_accepted': 'Предложение принято', 'admin.notif.new_message': 'Новое сообщение', 'admin.notif.offer_declined': 'Отклонение предложения', 'admin.notif.offer_other_accepted': 'Выбран другой исполнитель', 'admin.notif.task_updated': 'Изменение задания', 'admin.notif.deadline_reminder': 'Напоминание о дедлайне', 'admin.notif.task_archived': 'Автоснятие задания', 'admin.notif.referral_reward': 'Реферальная награда', // Шаблоны email для тарифов 'admin.email_template.plan_activated': 'Тарифы — активация тарифа', 'admin.email_template.plan_upgraded': 'Тарифы — повышение тарифа', 'admin.email_template.plan_downgrade_scheduled': 'Тарифы — запланированное понижение', 'admin.email_template.plan_downgrade_applied': 'Тарифы — применение понижения', 'admin.email_template.plan_renewal_reminder': 'Тарифы — напоминание о продлении', 'admin.email_template.plan_insufficient_funds': 'Тарифы — нехватка средств', // Модальное окно подтверждения тарифа 'pricing.confirm.title': 'Подтвердите выбор тарифа', 'pricing.confirm.plan': 'Тариф', 'pricing.confirm.prorated': 'Зачёт остатка', 'pricing.confirm.effective_price': 'К оплате', 'pricing.confirm.your_balance': 'Ваш баланс', 'pricing.confirm.downgrade_info': 'Переход на новый тариф произойдёт автоматически после окончания текущего периода.', 'pricing.confirm.insufficient': 'Недостаточно средств на балансе.', 'pricing.confirm.top_up': 'Пополнить', 'pricing.confirm.schedule_downgrade': 'Запланировать переход', 'pricing.confirm.pay': 'Оплатить', 'admin.user_edit.title': 'Редактирование пользователя', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Регистрация', 'admin.user_edit.last_seen': 'Последний визит', 'admin.user_edit.lang': 'Язык', 'admin.user_edit.first_name': 'Имя', 'admin.user_edit.last_name': 'Фамилия', 'admin.user_edit.phone': 'Телефон', 'admin.user_edit.bio': 'О себе', 'admin.user_edit.role': 'Роль', 'admin.user_edit.plan': 'Тариф', 'admin.user_edit.no_plan': '— Без тарифа —', 'admin.user_edit.active': 'Активный аккаунт', 'admin.user_edit.balance': 'Баланс (EUR)', 'admin.user_edit.skills': 'Навыки', 'admin.user_edit.tab.profile': 'Профиль', 'admin.user_edit.tab.account': 'Аккаунт', 'admin.user_edit.tab.balance': 'Баланс', 'admin.user_edit.tab.settings': 'Настройки', 'admin.user_edit.tab.specialist': 'Портфолио', 'admin.user_edit.tab.site': 'Сайт', 'admin.user_edit.plan_expires': 'Тариф истекает', 'admin.user_edit.interface_lang': 'Язык интерфейса', 'admin.user_edit.comm_languages': 'Языки общения', 'admin.user_edit.personal_site_slug': 'Персональная страница', 'admin.user_edit.show_contact_info': 'Показывать контакты', 'admin.user_edit.show_contact_info.hint': 'Видно заказчикам', 'admin.user_edit.notify_new_tasks': 'Уведомлять о новых задачах', 'admin.user_edit.notify_new_tasks.hint': 'Push и email уведомления', 'admin.user_edit.notif_messages': 'Уведомления о сообщениях', 'admin.user_edit.notif_messages.hint': 'Новые сообщения в чате', 'admin.user_edit.site_settings': 'Настройки персональной страницы', 'admin.user_edit.categories': 'Категории услуг', 'admin.user_edit.locations': 'Районы обслуживания', 'admin.user_edit.skill_placeholder': 'Новый навык...', 'admin.user_edit.add_category': '— Выберите категорию —', 'admin.user_edit.add_location': '— Выберите район —', 'admin.user_edit.specialist_cards': 'Портфолио специалиста', 'admin.user_edit.no_cards': 'Портфолио не найдено', 'admin.user_edit.card_title': 'Заголовок портфолио', 'admin.user_edit.card_description': 'Описание', 'admin.balance.topup.btn': 'Пополнить', 'admin.balance.withdraw.btn': 'Списать', 'admin.balance.modal_hint': 'Изменения применяются сразу и фиксируются в истории', 'admin.balance.topup.title': 'Пополнение баланса', 'admin.balance.topup.amount': 'Сумма', 'admin.balance.topup.description': 'Комментарий', 'admin.balance.topup.description.placeholder': 'Например: бонус или ручное пополнение', 'admin.balance.topup.submit': 'Пополнить баланс', 'admin.balance.withdraw.title': 'Снятие баланса', 'admin.balance.withdraw.amount': 'Сумма', 'admin.balance.withdraw.description': 'Комментарий', 'admin.balance.withdraw.description.placeholder': 'Например: возврат или ручное списание', 'admin.balance.withdraw.submit': 'Списать баланс', 'admin.user_edit.role.customer': 'Заказчик', 'admin.user_edit.role.specialist': 'Исполнитель', 'admin.user_edit.role.admin': 'Администратор', 'common.refresh': 'Обновить', 'common.back_home': 'На главную', 'admin.loc.hint': 'Управление городами и районами', 'admin.loc.add_city': 'Новый город', 'admin.loc.add_district': 'Добавить район', 'admin.loc.new': 'Новая локация', 'admin.loc.edit': 'Редактировать локацию', 'admin.loc.district': 'район', 'admin.loc.empty': 'Нет локаций', 'admin.loc.delete.confirm': 'Удалить локацию? Все районы также будут удалены.', 'admin.cat.add_root': 'Новая категория', 'admin.cat.add_sub': 'Подкатегория', 'admin.cat.edit': 'Редактировать', 'admin.cat.delete': 'Удалить', 'admin.cat.delete.confirm': 'Удалить категорию? Все подкатегории также будут удалены.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Иконка', 'admin.cat.name_el': 'Греческий', 'admin.cat.name_en': 'Английский', 'admin.cat.name_ru': 'Русский', 'admin.cat.order': 'Порядок', 'admin.cat.active': 'Активна', 'admin.cat.parent': 'Родительская категория', 'admin.cat.no_parent': 'Верхний уровень', 'admin.cat.save': 'Сохранить', 'admin.cat.cancel': 'Отмена', 'admin.cat.empty': 'Нет категорий', 'admin.cat.hint': 'Управление категориями с многоуровневой иерархией', 'admin.cat.new': 'Новая категория', 'admin.cat.subcategory': 'подкатегория', 'admin.cat.add_child': 'Добавить подкатегорию', 'admin.cat.inactive': 'Неактивна', 'admin.event.user_login': 'Вход', 'admin.event.user_register': 'Регистрация', 'admin.event.admin_user_deactivate': 'Блокировка юзера', 'admin.event.admin_user_activate': 'Разблокировка юзера', 'admin.event.admin_user_role_changed': 'Смена роли', 'admin.event.admin_task_cancelled': 'Отмена задачи', 'admin.event.admin_task_deleted': 'Удаление задачи', 'admin.event.admin_report_reviewed': 'Жалоба рассмотрена', 'admin.event.admin_report_dismissed': 'Жалоба отклонена', 'admin.event.task_created': 'Создана задача', // User status 'user.online': 'Онлайн', 'user.seen_minutes': 'был здесь {n} мин назад', 'user.seen_hours': 'был здесь {n} ч назад', 'user.seen_yesterday': 'был здесь вчера', 'user.seen_days': 'был здесь {n} дн назад', // Specialists 'specialists.title': 'Специалисты', 'specialists.search': 'Поиск специалиста...', 'specialists.search.btn': 'Поиск', 'specialists.empty': 'Специалисты не найдены', 'specialists.no_bio': 'Без описания', 'specialists.view': 'Смотреть профиль', 'specialists.reviews': 'отзывов', 'specialist.favorite': 'Добавить в избранное', 'specialist.unfavorite': 'Убрать из избранного', 'specialist.site_link': 'Личный сайт', 'favorites.specialists.title': 'Избранные специалисты', 'favorites.specialists.empty': 'Вы ещё не добавили специалистов в избранное', 'nav.favorites': 'Избранное', 'nav.schedule': 'Расписание', 'nav.find_tasks': 'Поиск заказов', 'schedule.title': 'Моё расписание', 'schedule.subtitle': 'Отмечайте дни когда вы свободны или заняты — заказчики увидят вашу доступность', 'schedule.available': 'Свободен', 'schedule.busy': 'Занят', 'schedule.unset': 'Не указано', 'schedule.click_hint': '← клик меняет статус по кругу', 'schedule.range_mode': 'Выделить диапазон', 'schedule.range_from': 'С {date} — выберите конечную дату', 'schedule.click_to_set': 'Нажмите чтобы отметить', 'schedule.free': 'свободно', 'schedule.busy_count': 'занято', 'schedule.free_days': 'свободных дней', 'schedule.googleCalendar': 'Google Календарь', 'schedule.connectGoogle': 'Подключить Google Календарь', 'schedule.disconnectGoogle': 'Отключить', 'schedule.connectedAs': 'Подключено как', 'schedule.importFromGoogle': 'Синхр. из Google', 'schedule.gcalConnected': '\u2713 Google Календарь подключён', 'schedule.gcalError': 'Ошибка подключения Google Календарь', 'schedule.gcalImportDone': 'Импортировано {n} дней из Google Календарь', 'schedule.gcalAutoSyncNote': 'Изменения доступности автоматически отправляются в Google Календарь', 'schedule.gcalConnectDesc': 'Подключите Google Календарь для автоматической синхронизации расписания', 'schedule.gcalDisconnectConfirm': 'Отключить Google Календарь?', 'find_tasks.title': 'Поиск заказов', 'find_tasks.for_me': 'Для меня', 'find_tasks.all': 'Все заказы', 'find_tasks.by_category': 'По категориям', 'find_tasks.list': 'Списком', 'find_tasks.already_offered': 'Предложение отправлено', 'find_tasks.offer_now': 'Откликнуться', 'find_tasks.empty_for_me': 'Нет заказов в ваших категориях', 'find_tasks.banner_hint': 'Найдите заказы по категориям вашего портфолио', 'find_tasks.no_cards': 'Создайте портфолио специалиста, чтобы видеть подходящие заказы', 'find_tasks.add_card': 'Создать портфолио', 'find_tasks.search': 'Поиск заказов...', 'find_tasks.tasks_count': 'заданий', 'footer.tagline': 'Платформа задач для Греции', 'footer.rights': 'Все права защищены.', // App download section 'app.download_title': 'Скачайте мобильное приложение CanHelp', 'app.download_desc': 'Всё CanHelp — всегда под рукой. Доступно для Android и iOS.', // Nav 'nav.pricing': 'Тарифы', // Pricing page 'pricing.title': 'Тарифы', 'pricing.subtitle': 'Выберите подходящий план', 'pricing.role.customer': 'Заказчик', 'pricing.role.specialist': 'Специалист', 'pricing.free': 'Бесплатно', 'pricing.per_month': 'мес', 'pricing.duration': 'Срок', 'pricing.days': 'дн.', 'pricing.current_plan': 'Ваш план', 'pricing.popular': 'Популярный', 'pricing.choose': 'Выбрать', 'pricing.your_plan': 'Активный план', 'pricing.free_default': 'По умолчанию', 'pricing.compare': 'Сравнение функций', 'pricing.feature': 'Функция', 'pricing.faq_note': 'Оплата списывается с баланса CanHelp. Пополнение доступно в разделе Оплата.', 'pricing.feat.messages': 'Сообщений / день', 'pricing.feat.orders': 'Заказов / день', 'pricing.feat.contact_all': 'Связь со всеми', 'pricing.feat.view_phone': 'Просмотр телефона', 'pricing.feat.show_contact': 'Показывать контакты', 'pricing.feat.favorites': 'Избранное', 'pricing.feat.verified_badge': 'Верифицированный бейдж', 'pricing.feat.google_calendar': 'Google Календарь', 'pricing.feat.personal_site': 'Персональный сайт', 'pricing.feat.auto_response': 'Авто-ответ', 'pricing.feat.auto_match': 'Авто-подбор', 'pricing.feat.highlighted_reviews': 'Выделенные отзывы', 'pricing.feat.portfolio': 'Элементов портфолио', 'pricing.feat.cards': 'Карточки специалиста', 'pricing.feat.notify_tasks': 'Уведомления о новых задачах', 'pricing.feat.video': 'Видео в портфолио', // Upgrade prompt 'upgrade.available_in': 'Доступно в', 'upgrade.cta': 'Улучшить', // Dashboard plan block 'dashboard.plan.title': 'Мой план', 'dashboard.plan.expires': 'Истекает через {n} дней', 'dashboard.plan.upgrade': 'Улучшить план', 'dashboard.plan.no_plan': 'Бесплатный план', 'dashboard.plan.messages': 'Сообщений сегодня', 'dashboard.plan.orders': 'Заказов сегодня', 'dashboard.plan.limits': 'Дневные лимиты', 'dashboard.plan.features': 'Функции', 'dashboard.plan.stats': 'Статистика', 'dashboard.stats.cards': 'Портфолио', 'dashboard.stats.maxCards': 'Макс. портфолио', 'dashboard.stats.portfolioItems': 'Элементы портфолио', 'dashboard.stats.maxPortfolioItems': 'Макс. элементы', 'dashboard.stats.activeOffers': 'Активные отклики', 'dashboard.stats.reviewsReceived': 'Отзывы', 'dashboard.stats.activeTasks': 'Активные задачи', 'dashboard.stats.completedTasks': 'Завершённые', 'status.need_help': 'Нужна помощь', 'status.active': 'Активен', 'status.toggle_on': 'Включить', 'status.toggle_off': 'Выключить', // FOMO 'fomo.missed_orders': 'Пропущено {n} заказов', 'fomo.missed_value': 'На сумму €{v}', 'fomo.upgrade_hint': 'Улучшите план — получайте больше заказов', 'fomo.conversion': 'Конверсия задач', 'fomo.active': 'Активные', 'fomo.with_offers': 'С офертами', 'fomo.completed': 'Завершённые', 'fomo.already_offered': '{n} специалистов уже откликнулись', 'fomo.specialist_missed': 'Вы пропустили {n} заказов', 'fomo.top_categories': 'Категории', 'fomo.offers_received': 'предложений получено', 'fomo.avg_offers': 'В среднем {n}/задача', 'fomo.completion_rate': 'завершено', // Task auto-match 'task.auto_match': 'Авто-матч', 'task.auto_match_results': 'Топ специалисты', 'task.no_offer_yet': 'Вы ещё не отправили предложение', 'task.make_offer': 'Отправить предложение', 'auto_response.title': 'Авто-ответ', 'auto_response.enabled': 'Включить авто-ответ', 'auto_response.min_budget': 'Мин. бюджет', 'auto_response.max_budget': 'Макс. бюджет', 'auto_response.default_price': 'Цена по умолчанию', 'auto_response.default_message': 'Сообщение по умолчанию', 'auto_response.max_per_day': 'Макс. авто-офертов в день', 'auto_response.save': 'Сохранить', 'auto_response.saved': 'Сохранено', 'auto_response.categories': 'Категории', 'auto_response.locations': 'Локации', // Personal site 'profile.personal_site': 'Персональный сайт', 'profile.site_slug': 'URL slug', 'profile.site_slug_hint': 'Только латинские буквы, цифры, - и _', 'profile.site_open': 'Открыть сайт', 'profile.site_preview': 'Ваш сайт', 'profile.show_contact': 'Показывать контакты', 'profile.show_contact_hint': 'Заказчики с Pro/Ultimate-планом увидят ваш телефон', // Google Calendar plan gate 'gcal.upgrade_required': 'Google Календарь требует план Pro или Ultimate', // Chat limits 'chat.limit_warning': 'Осталось {n} сообщений сегодня', 'chat.limit_reached': 'Лимит сообщений исчерпан. Улучшите план', 'chat.upgrade': 'Улучшить', // Site page 'site.member_since': 'С нами с', 'site.rating': 'Рейтинг', 'site.completed_tasks': 'Выполнено', 'site.languages': 'Языков', 'site.photos': 'фото', 'site.contact_form': 'Связаться', 'site.contact_sent': 'Сообщение отправлено!', 'site.contact_sent_desc': 'Специалист свяжется с вами в ближайшее время', 'site.contact_name': 'Имя', 'site.contact_name_ph': 'Ваше имя', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Сообщение', 'site.contact_message_ph': 'Опишите вашу задачу...', 'site.contact_send': 'Отправить', 'site.share': 'Поделиться', 'site.speaks_languages': 'Говорит на языках', 'site.message_sent': 'Сообщение отправлено!', 'site.message_sent_desc': 'Специалист получит его в чате', 'site.message_placeholder': 'Напишите сообщение...', 'site.write_to_chat': 'Написать в чат', 'site.auth_required_title': 'Нужна авторизация', 'site.auth_required_desc': 'Чтобы написать в чат, необходимо войти в аккаунт CanHelp.', 'site.auth_login_btn': 'Войти в аккаунт', 'site.auth_contact_form_btn': 'Написать через форму обратной связи', 'specialist.services': 'Услуги', 'portfolio.title': 'Портфолио', 'status.can_help_now': 'Готов помочь', 'common.not_found': 'Страница не найдена', 'common.anonymous': 'Анонимно' } }; export function getTranslations(locale) { const t = translations[locale] ?? translations.el; return (key, fallback)=>t[key] ?? translations.el[key] ?? fallback ?? key; } /06undefined268274undefined176723176729undefined, /***/ 13260:   webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource xwebpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CI: () => (/* binding */ signOut), /* harmony export */ Hh: () => (/* binding */ signUp), /* harmony export */ Jv: () => (/* binding */ signIn), /* harmony export */ wV: () => (/* binding */ useSession), /* harmony export */ yK: () => (/* binding */ authClient) /* harmony export */ }); /* harmony import */ var better_auth_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(69183); webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource import { createAuthClient } from 'better-auth/react'; const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; export const authClient = createAuthClient({ baseURL: API_URL }); export const { signIn, signOut, signUp, useSession } = authClient; d4FdiE"https://api.canhelp.gr"0(0,better_auth_react__WEBPACK_IMPORTED_MODULE_0__/* .createAuthClient */ .M)buffersourcesizemapshash/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CI: () => (/* binding */ signOut), /* harmony export */ Hh: () => (/* binding */ signUp), /* harmony export */ Jv: () => (/* binding */ signIn), /* harmony export */ wV: () => (/* binding */ useSession), /* harmony export */ yK: () => (/* binding */ authClient) /* harmony export */ }); /* harmony import */ var better_auth_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(69183); const API_URL = "https://api.canhelp.gr" || 0; const authClient = (0,better_auth_react__WEBPACK_IMPORTED_MODULE_0__/* .createAuthClient */ .M)({ baseURL: API_URL }); const { signIn, signOut, signUp, useSession } = authClient; {"finalSource":true}mapbufferedMap ConcatSourceRawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CI: () => (/* binding */ signOut), /* harmony export */ Hh: () => (/* binding */ signUp), /* harmony export */ Jv: () => (/* binding */ signIn), /* harmony export */ wV: () => (/* binding */ useSession), /* harmony export */ yK: () => (/* binding */ authClient) /* harmony export */ }); /* harmony import */ var better_auth_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(69183); ReplaceSourceRawSource import { createAuthClient } from 'better-auth/react'; const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; export const authClient = createAuthClient({ baseURL: API_URL }); export const { signIn, signOut, signUp, useSession } = authClient; 052undefined70100"https://api.canhelp.gr"undefined1051270undefined130136undefined156171(0,better_auth_react__WEBPACK_IMPORTED_MODULE_0__/* .createAuthClient */ .M)undefined200206undefined /***/ }) 6/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CI: () => (/* binding */ signOut), /* harmony export */ Hh: () => (/* binding */ signUp), /* harmony export */ Jv: () => (/* binding */ signIn), /* harmony export */ wV: () => (/* binding */ useSession), /* harmony export */ yK: () => (/* binding */ authClient) /* harmony export */ }); /* harmony import */ var better_auth_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(69183); const API_URL = "https://api.canhelp.gr" || 0; const authClient = (0,better_auth_react__WEBPACK_IMPORTED_MODULE_0__/* .createAuthClient */ .M)({ baseURL: API_URL }); const { signIn, signOut, signUp, useSession } = authClient; /***/ })   /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CI: () => (/* binding */ signOut), /* harmony export */ Hh: () => (/* binding */ signUp), /* harmony export */ Jv: () => (/* binding */ signIn), /* harmony export */ wV: () => (/* binding */ useSession), /* harmony export */ yK: () => (/* binding */ authClient) /* harmony export */ }); /* harmony import */ var better_auth_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(69183);  import { createAuthClient } from 'better-auth/react'; const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; export const authClient = createAuthClient({ baseURL: API_URL }); export const { signIn, signOut, signUp, useSession } = authClient; 052undefined70100"https://api.canhelp.gr"undefined1051270undefined130136undefined156171(0,better_auth_react__WEBPACK_IMPORTED_MODULE_0__/* .createAuthClient */ .M)undefined200206undefined, /***/ 14276:  4webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource/***/ (() => { webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource buffersourcesizemapshash {"finalSource":true}mapbufferedMap ReplaceSourceRawSource /***/ }) /***/ (() => { /***/ })  , /***/ 15043:  vwebpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource 9}webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceA // EXPORTS __webpack_require__.d(__webpack_exports__, { Footer: () => (/* binding */ Footer) }); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js var react_jsx_runtime = __webpack_require__(78157); // EXTERNAL MODULE: ./src/context/locale.tsx var locale = __webpack_require__(96484); // EXTERNAL MODULE: ../../node_modules/next/dist/client/app-dir/link.js var app_dir_link = __webpack_require__(94496); var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); ;// ./src/components/SocialIcons.tsx webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource  webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; export function SocialIcons({ className = '' }) { return /*#__PURE__*/ _jsxs("div", { className: `flex gap-4 ${className}`, children: [ /*#__PURE__*/ _jsx("a", { href: "https://t.me/canhelp", target: "_blank", rel: "noopener", "aria-label": "Telegram", className: "hover:text-blue-500 transition", children: /*#__PURE__*/ _jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ _jsx("path", { d: "M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z" }) }) }), /*#__PURE__*/ _jsx("a", { href: "https://instagram.com/canhelp", target: "_blank", rel: "noopener", "aria-label": "Instagram", className: "hover:text-pink-500 transition", children: /*#__PURE__*/ _jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ _jsx("path", { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm6.406-11.845a1.44 1.44 0 1 0 0 2.881 1.44 1.44 0 0 0 0-2.881z" }) }) }) ] }); }  b>@FM #&__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._buffersourcesizemapshash function SocialIcons({ className = '' }) { return /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("div", { className: `flex gap-4 ${className}`, children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("a", { href: "https://t.me/canhelp", target: "_blank", rel: "noopener", "aria-label": "Telegram", className: "hover:text-blue-500 transition", children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { d: "M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z" }) }) }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("a", { href: "https://instagram.com/canhelp", target: "_blank", rel: "noopener", "aria-label": "Instagram", className: "hover:text-pink-500 transition", children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm6.406-11.845a1.44 1.44 0 1 0 0 2.881 1.44 1.44 0 0 0 0-2.881z" }) }) }) ] }); } {"finalSource":false}mapbufferedMap ReplaceSourceRawSource- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; export function SocialIcons({ className = '' }) { return /*#__PURE__*/ _jsxs("div", { className: `flex gap-4 ${className}`, children: [ /*#__PURE__*/ _jsx("a", { href: "https://t.me/canhelp", target: "_blank", rel: "noopener", "aria-label": "Telegram", className: "hover:text-blue-500 transition", children: /*#__PURE__*/ _jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ _jsx("path", { d: "M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z" }) }) }), /*#__PURE__*/ _jsx("a", { href: "https://instagram.com/canhelp", target: "_blank", rel: "noopener", "aria-label": "Instagram", className: "hover:text-pink-500 transition", children: /*#__PURE__*/ _jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ _jsx("path", { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm6.406-11.845a1.44 1.44 0 1 0 0 2.881 1.44 1.44 0 0 0 0-2.881z" }) }) }) ] }); } 062undefined6470undefined139143__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined246249__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined514517__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined780783__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined15391542__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined18171820__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined20832086__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined`ELBK$7 (0,react_jsx_runtime.jsxs)(0,react_jsx_runtime.jsx)! ;// ./src/components/Footer.tsx  webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource1/* __next_internal_client_entry_do_not_use__ Footer auto */ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useLocale } from '@/context/locale'; import Link from 'next/link'; import { SocialIcons } from './SocialIcons'; export function Footer() { const { t } = useLocale(); const year = new Date().getFullYear(); return /*#__PURE__*/ _jsx("footer", { className: "bg-white border-t border-gray-200 mt-16", children: /*#__PURE__*/ _jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12", children: [ /*#__PURE__*/ _jsxs("div", { className: "flex flex-col md:flex-row justify-between items-start gap-10", children: [ /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-[200px] flex flex-col items-start", children: [ /*#__PURE__*/ _jsx("span", { className: "logo-text text-3xl text-blue-700 font-bold mb-2", children: "CanHelp" }), /*#__PURE__*/ _jsx("p", { className: "text-base text-gray-600 mb-4", children: t('footer.slogan') }) ] }), /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-[180px]", children: [ /*#__PURE__*/ _jsx("h3", { className: "text-lg font-semibold text-blue-900 mb-3", children: t('footer.links') }), /*#__PURE__*/ _jsxs("ul", { className: "space-y-2", children: [ /*#__PURE__*/ _jsx("li", { children: /*#__PURE__*/ _jsx(Link, { href: "/", className: "hover:text-blue-600 transition", children: t('nav.home') }) }), /*#__PURE__*/ _jsx("li", { children: /*#__PURE__*/ _jsx(Link, { href: "/tasks", className: "hover:text-blue-600 transition", children: t('nav.tasks') }) }), /*#__PURE__*/ _jsx("li", { children: /*#__PURE__*/ _jsx(Link, { href: "/become-specialist", className: "hover:text-blue-600 transition", children: t('nav.specialists') }) }) ] }) ] }), /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-[180px]", children: [ /*#__PURE__*/ _jsx("h3", { className: "text-lg font-semibold text-blue-900 mb-3", children: t('footer.socials') }), /*#__PURE__*/ _jsx("p", { className: "text-gray-500 text-sm mb-2", children: "info@canhelp.gr" }), /*#__PURE__*/ _jsx(SocialIcons, { className: "mt-2" }) ] }) ] }), /*#__PURE__*/ _jsxs("div", { className: "mt-10 border-t border-gray-100 pt-6 text-center text-gray-400 text-sm", children: [ "\xa9 ", year, " CanHelp. ", t('footer.rights') ] }) ] }) }); } c (/* binding */ Footer) }); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js var react_jsx_runtime = __webpack_require__(78157); // EXTERNAL MODULE: ./src/context/locale.tsx var locale = __webpack_require__(96484); // EXTERNAL MODULE: ../../node_modules/next/dist/client/app-dir/link.js var app_dir_link = __webpack_require__(94496); var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); ;// ./src/components/SocialIcons.tsx function SocialIcons({ className = '' }) { return /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: `flex gap-4 ${className}`, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("a", { href: "https://t.me/canhelp", target: "_blank", rel: "noopener", "aria-label": "Telegram", className: "hover:text-blue-500 transition", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { d: "M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z" }) }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("a", { href: "https://instagram.com/canhelp", target: "_blank", rel: "noopener", "aria-label": "Instagram", className: "hover:text-pink-500 transition", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm6.406-11.845a1.44 1.44 0 1 0 0 2.881 1.44 1.44 0 0 0 0-2.881z" }) }) }) ] }); } ;// ./src/components/Footer.tsx /* __next_internal_client_entry_do_not_use__ Footer auto */ function Footer() { const { t } = (0,locale/* useLocale */.Y)(); const year = new Date().getFullYear(); return /*#__PURE__*/ (0,react_jsx_runtime.jsx)("footer", { className: "bg-white border-t border-gray-200 mt-16", children: /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex flex-col md:flex-row justify-between items-start gap-10", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-[200px] flex flex-col items-start", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "logo-text text-3xl text-blue-700 font-bold mb-2", children: "CanHelp" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("p", { className: "text-base text-gray-600 mb-4", children: t('footer.slogan') }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-[180px]", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("h3", { className: "text-lg font-semibold text-blue-900 mb-3", children: t('footer.links') }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("ul", { className: "space-y-2", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("li", { children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/", className: "hover:text-blue-600 transition", children: t('nav.home') }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("li", { children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/tasks", className: "hover:text-blue-600 transition", children: t('nav.tasks') }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("li", { children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/become-specialist", className: "hover:text-blue-600 transition", children: t('nav.specialists') }) }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-[180px]", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("h3", { className: "text-lg font-semibold text-blue-900 mb-3", children: t('footer.socials') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("p", { className: "text-gray-500 text-sm mb-2", children: "info@canhelp.gr" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)(SocialIcons, { className: "mt-2" }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "mt-10 border-t border-gray-100 pt-6 text-center text-gray-400 text-sm", children: [ "\xa9 ", year, " CanHelp. ", t('footer.rights') ] }) ] }) }); } {"finalSource":true}mapbufferedMap ` ConcatSourceRawSourceA // EXPORTS __webpack_require__.d(__webpack_exports__, { Footer: () => (/* binding */ Footer) }); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js var react_jsx_runtime = __webpack_require__(78157); // EXTERNAL MODULE: ./src/context/locale.tsx var locale = __webpack_require__(96484); // EXTERNAL MODULE: ../../node_modules/next/dist/client/app-dir/link.js var app_dir_link = __webpack_require__(94496); var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); ;// ./src/components/SocialIcons.tsx  ReplaceSourceReplaceSourceRawSource- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; export function SocialIcons({ className = '' }) { return /*#__PURE__*/ _jsxs("div", { className: `flex gap-4 ${className}`, children: [ /*#__PURE__*/ _jsx("a", { href: "https://t.me/canhelp", target: "_blank", rel: "noopener", "aria-label": "Telegram", className: "hover:text-blue-500 transition", children: /*#__PURE__*/ _jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ _jsx("path", { d: "M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z" }) }) }), /*#__PURE__*/ _jsx("a", { href: "https://instagram.com/canhelp", target: "_blank", rel: "noopener", "aria-label": "Instagram", className: "hover:text-pink-500 transition", children: /*#__PURE__*/ _jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ _jsx("path", { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm6.406-11.845a1.44 1.44 0 1 0 0 2.881 1.44 1.44 0 0 0 0-2.881z" }) }) }) ] }); } 062undefined6470undefined139143__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined246249__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined514517__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined780783__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined15391542__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined18171820__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined20832086__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined'69145(0,react_jsx_runtime.jsxs)undefined248322(0,react_jsx_runtime.jsx)undefined587661(0,react_jsx_runtime.jsx)undefined924998(0,react_jsx_runtime.jsx)undefined17541828(0,react_jsx_runtime.jsx)undefined21032177(0,react_jsx_runtime.jsx)undefined24402514(0,react_jsx_runtime.jsx)undefinedRawSource! ;// ./src/components/Footer.tsx 1/* __next_internal_client_entry_do_not_use__ Footer auto */ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useLocale } from '@/context/locale'; import Link from 'next/link'; import { SocialIcons } from './SocialIcons'; export function Footer() { const { t } = useLocale(); const year = new Date().getFullYear(); return /*#__PURE__*/ _jsx("footer", { className: "bg-white border-t border-gray-200 mt-16", children: /*#__PURE__*/ _jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12", children: [ /*#__PURE__*/ _jsxs("div", { className: "flex flex-col md:flex-row justify-between items-start gap-10", children: [ /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-[200px] flex flex-col items-start", children: [ /*#__PURE__*/ _jsx("span", { className: "logo-text text-3xl text-blue-700 font-bold mb-2", children: "CanHelp" }), /*#__PURE__*/ _jsx("p", { className: "text-base text-gray-600 mb-4", children: t('footer.slogan') }) ] }), /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-[180px]", children: [ /*#__PURE__*/ _jsx("h3", { className: "text-lg font-semibold text-blue-900 mb-3", children: t('footer.links') }), /*#__PURE__*/ _jsxs("ul", { className: "space-y-2", children: [ /*#__PURE__*/ _jsx("li", { children: /*#__PURE__*/ _jsx(Link, { href: "/", className: "hover:text-blue-600 transition", children: t('nav.home') }) }), /*#__PURE__*/ _jsx("li", { children: /*#__PURE__*/ _jsx(Link, { href: "/tasks", className: "hover:text-blue-600 transition", children: t('nav.tasks') }) }), /*#__PURE__*/ _jsx("li", { children: /*#__PURE__*/ _jsx(Link, { href: "/become-specialist", className: "hover:text-blue-600 transition", children: t('nav.specialists') }) }) ] }) ] }), /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-[180px]", children: [ /*#__PURE__*/ _jsx("h3", { className: "text-lg font-semibold text-blue-900 mb-3", children: t('footer.socials') }), /*#__PURE__*/ _jsx("p", { className: "text-gray-500 text-sm mb-2", children: "info@canhelp.gr" }), /*#__PURE__*/ _jsx(SocialIcons, { className: "mt-2" }) ] }) ] }), /*#__PURE__*/ _jsxs("div", { className: "mt-10 border-t border-gray-100 pt-6 text-center text-gray-400 text-sm", children: [ "\xa9 ", year, " CanHelp. ", t('footer.rights') ] }) ] }) }); } h 60122undefined124168undefined170198undefined200243undefined245251undefined290298__WEBPACK_MODULE_REFERENCE__1_5b227573654c6f63616c65225d_call_directImport_asiSafe1__._undefined371374__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined482486__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined622626__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined802806__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined992995__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined12431246__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined15301534__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined16941697__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined19441948__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined21202123__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined22012204__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined22062209__WEBPACK_MODULE_REFERENCE__2_5b2264656661756c74225d_directImport_asiSafe1__._undefined25832586__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined26642667__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined26692672__WEBPACK_MODULE_REFERENCE__2_5b2264656661756c74225d_directImport_asiSafe1__._undefined30523055__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined31333136__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined31383141__WEBPACK_MODULE_REFERENCE__2_5b2264656661756c74225d_directImport_asiSafe1__._undefined36533657__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined38173820__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined40694072__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined43044307__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined43094319__WEBPACK_MODULE_REFERENCE__3_5b22536f6369616c49636f6e73225d_directImport_asiSafe1__._undefined45424546__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined102188(0,locale/* useLocale */.Y)undefined261335(0,react_jsx_runtime.jsx)undefined443519(0,react_jsx_runtime.jsxs)undefined655731(0,react_jsx_runtime.jsxs)undefined907983(0,react_jsx_runtime.jsxs)undefined11691243(0,react_jsx_runtime.jsx)undefined14911565(0,react_jsx_runtime.jsx)undefined18491925(0,react_jsx_runtime.jsxs)undefined20852159(0,react_jsx_runtime.jsx)undefined24062482(0,react_jsx_runtime.jsxs)undefined26542728(0,react_jsx_runtime.jsx)undefined28062880(0,react_jsx_runtime.jsx)undefined28822959(link_default())undefined33333407(0,react_jsx_runtime.jsx)undefined34853559(0,react_jsx_runtime.jsx)undefined35613638(link_default())undefined40184092(0,react_jsx_runtime.jsx)undefined41704244(0,react_jsx_runtime.jsx)undefined42464323(link_default())undefined48354911(0,react_jsx_runtime.jsxs)undefined50715145(0,react_jsx_runtime.jsx)undefined53945468(0,react_jsx_runtime.jsx)undefined57005774(0,react_jsx_runtime.jsx)undefined57765861SocialIconsundefined60846160(0,react_jsx_runtime.jsxs)undefined /***/ }) #/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; // EXPORTS __webpack_require__.d(__webpack_exports__, { Footer: () => (/* binding */ Footer) }); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js var react_jsx_runtime = __webpack_require__(78157); // EXTERNAL MODULE: ./src/context/locale.tsx var locale = __webpack_require__(96484); // EXTERNAL MODULE: ../../node_modules/next/dist/client/app-dir/link.js var app_dir_link = __webpack_require__(94496); var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); ;// ./src/components/SocialIcons.tsx function SocialIcons({ className = '' }) { return /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: `flex gap-4 ${className}`, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("a", { href: "https://t.me/canhelp", target: "_blank", rel: "noopener", "aria-label": "Telegram", className: "hover:text-blue-500 transition", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { d: "M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z" }) }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("a", { href: "https://instagram.com/canhelp", target: "_blank", rel: "noopener", "aria-label": "Instagram", className: "hover:text-pink-500 transition", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm6.406-11.845a1.44 1.44 0 1 0 0 2.881 1.44 1.44 0 0 0 0-2.881z" }) }) }) ] }); } ;// ./src/components/Footer.tsx /* __next_internal_client_entry_do_not_use__ Footer auto */ function Footer() { const { t } = (0,locale/* useLocale */.Y)(); const year = new Date().getFullYear(); return /*#__PURE__*/ (0,react_jsx_runtime.jsx)("footer", { className: "bg-white border-t border-gray-200 mt-16", children: /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex flex-col md:flex-row justify-between items-start gap-10", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-[200px] flex flex-col items-start", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "logo-text text-3xl text-blue-700 font-bold mb-2", children: "CanHelp" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("p", { className: "text-base text-gray-600 mb-4", children: t('footer.slogan') }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-[180px]", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("h3", { className: "text-lg font-semibold text-blue-900 mb-3", children: t('footer.links') }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("ul", { className: "space-y-2", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("li", { children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/", className: "hover:text-blue-600 transition", children: t('nav.home') }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("li", { children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/tasks", className: "hover:text-blue-600 transition", children: t('nav.tasks') }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("li", { children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/become-specialist", className: "hover:text-blue-600 transition", children: t('nav.specialists') }) }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-[180px]", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("h3", { className: "text-lg font-semibold text-blue-900 mb-3", children: t('footer.socials') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("p", { className: "text-gray-500 text-sm mb-2", children: "info@canhelp.gr" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)(SocialIcons, { className: "mt-2" }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "mt-10 border-t border-gray-100 pt-6 text-center text-gray-400 text-sm", children: [ "\xa9 ", year, " CanHelp. ", t('footer.rights') ] }) ] }) }); } /***/ })  `A // EXPORTS __webpack_require__.d(__webpack_exports__, { Footer: () => (/* binding */ Footer) }); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js var react_jsx_runtime = __webpack_require__(78157); // EXTERNAL MODULE: ./src/context/locale.tsx var locale = __webpack_require__(96484); // EXTERNAL MODULE: ../../node_modules/next/dist/client/app-dir/link.js var app_dir_link = __webpack_require__(94496); var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); ;// ./src/components/SocialIcons.tsx  ReplaceSource- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; export function SocialIcons({ className = '' }) { return /*#__PURE__*/ _jsxs("div", { className: `flex gap-4 ${className}`, children: [ /*#__PURE__*/ _jsx("a", { href: "https://t.me/canhelp", target: "_blank", rel: "noopener", "aria-label": "Telegram", className: "hover:text-blue-500 transition", children: /*#__PURE__*/ _jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ _jsx("path", { d: "M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z" }) }) }), /*#__PURE__*/ _jsx("a", { href: "https://instagram.com/canhelp", target: "_blank", rel: "noopener", "aria-label": "Instagram", className: "hover:text-pink-500 transition", children: /*#__PURE__*/ _jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ _jsx("path", { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm6.406-11.845a1.44 1.44 0 1 0 0 2.881 1.44 1.44 0 0 0 0-2.881z" }) }) }) ] }); } 062undefined6470undefined139143__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined246249__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined514517__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined780783__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined15391542__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined18171820__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined20832086__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined'69145(0,react_jsx_runtime.jsxs)undefined248322(0,react_jsx_runtime.jsx)undefined587661(0,react_jsx_runtime.jsx)undefined924998(0,react_jsx_runtime.jsx)undefined17541828(0,react_jsx_runtime.jsx)undefined21032177(0,react_jsx_runtime.jsx)undefined24402514(0,react_jsx_runtime.jsx)undefinedRawSource! ;// ./src/components/Footer.tsx 1/* __next_internal_client_entry_do_not_use__ Footer auto */ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useLocale } from '@/context/locale'; import Link from 'next/link'; import { SocialIcons } from './SocialIcons'; export function Footer() { const { t } = useLocale(); const year = new Date().getFullYear(); return /*#__PURE__*/ _jsx("footer", { className: "bg-white border-t border-gray-200 mt-16", children: /*#__PURE__*/ _jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12", children: [ /*#__PURE__*/ _jsxs("div", { className: "flex flex-col md:flex-row justify-between items-start gap-10", children: [ /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-[200px] flex flex-col items-start", children: [ /*#__PURE__*/ _jsx("span", { className: "logo-text text-3xl text-blue-700 font-bold mb-2", children: "CanHelp" }), /*#__PURE__*/ _jsx("p", { className: "text-base text-gray-600 mb-4", children: t('footer.slogan') }) ] }), /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-[180px]", children: [ /*#__PURE__*/ _jsx("h3", { className: "text-lg font-semibold text-blue-900 mb-3", children: t('footer.links') }), /*#__PURE__*/ _jsxs("ul", { className: "space-y-2", children: [ /*#__PURE__*/ _jsx("li", { children: /*#__PURE__*/ _jsx(Link, { href: "/", className: "hover:text-blue-600 transition", children: t('nav.home') }) }), /*#__PURE__*/ _jsx("li", { children: /*#__PURE__*/ _jsx(Link, { href: "/tasks", className: "hover:text-blue-600 transition", children: t('nav.tasks') }) }), /*#__PURE__*/ _jsx("li", { children: /*#__PURE__*/ _jsx(Link, { href: "/become-specialist", className: "hover:text-blue-600 transition", children: t('nav.specialists') }) }) ] }) ] }), /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-[180px]", children: [ /*#__PURE__*/ _jsx("h3", { className: "text-lg font-semibold text-blue-900 mb-3", children: t('footer.socials') }), /*#__PURE__*/ _jsx("p", { className: "text-gray-500 text-sm mb-2", children: "info@canhelp.gr" }), /*#__PURE__*/ _jsx(SocialIcons, { className: "mt-2" }) ] }) ] }), /*#__PURE__*/ _jsxs("div", { className: "mt-10 border-t border-gray-100 pt-6 text-center text-gray-400 text-sm", children: [ "\xa9 ", year, " CanHelp. ", t('footer.rights') ] }) ] }) }); } h 60122undefined124168undefined170198undefined200243undefined245251undefined290298__WEBPACK_MODULE_REFERENCE__1_5b227573654c6f63616c65225d_call_directImport_asiSafe1__._undefined371374__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined482486__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined622626__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined802806__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined992995__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined12431246__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined15301534__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined16941697__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined19441948__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined21202123__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined22012204__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined22062209__WEBPACK_MODULE_REFERENCE__2_5b2264656661756c74225d_directImport_asiSafe1__._undefined25832586__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined26642667__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined26692672__WEBPACK_MODULE_REFERENCE__2_5b2264656661756c74225d_directImport_asiSafe1__._undefined30523055__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined31333136__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined31383141__WEBPACK_MODULE_REFERENCE__2_5b2264656661756c74225d_directImport_asiSafe1__._undefined36533657__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined38173820__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined40694072__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined43044307__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined43094319__WEBPACK_MODULE_REFERENCE__3_5b22536f6369616c49636f6e73225d_directImport_asiSafe1__._undefined45424546__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined102188(0,locale/* useLocale */.Y)undefined261335(0,react_jsx_runtime.jsx)undefined443519(0,react_jsx_runtime.jsxs)undefined655731(0,react_jsx_runtime.jsxs)undefined907983(0,react_jsx_runtime.jsxs)undefined11691243(0,react_jsx_runtime.jsx)undefined14911565(0,react_jsx_runtime.jsx)undefined18491925(0,react_jsx_runtime.jsxs)undefined20852159(0,react_jsx_runtime.jsx)undefined24062482(0,react_jsx_runtime.jsxs)undefined26542728(0,react_jsx_runtime.jsx)undefined28062880(0,react_jsx_runtime.jsx)undefined28822959(link_default())undefined33333407(0,react_jsx_runtime.jsx)undefined34853559(0,react_jsx_runtime.jsx)undefined35613638(link_default())undefined40184092(0,react_jsx_runtime.jsx)undefined41704244(0,react_jsx_runtime.jsx)undefined42464323(link_default())undefined48354911(0,react_jsx_runtime.jsxs)undefined50715145(0,react_jsx_runtime.jsx)undefined53945468(0,react_jsx_runtime.jsx)undefined57005774(0,react_jsx_runtime.jsx)undefined57765861SocialIconsundefined60846160(0,react_jsx_runtime.jsxs)undefined, /***/ 20138:  ?webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocaleProvider: () => (/* binding */ LocaleProvider) /* harmony export */ }); /* unused harmony export useLocale */ /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const LocaleProvider = registerClientReference( function() { throw new Error("Attempted to call LocaleProvider() from the server but LocaleProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/locale.tsx", "LocaleProvider", );export const useLocale = registerClientReference( function() { throw new Error("Attempted to call useLocale() from the server but useLocale is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/locale.tsx", "useLocale", ); `=H(>(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)buffersourcesizemapshash/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocaleProvider: () => (/* binding */ LocaleProvider) /* harmony export */ }); /* unused harmony export useLocale */ /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const LocaleProvider = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call LocaleProvider() from the server but LocaleProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/locale.tsx", "LocaleProvider", );const useLocale = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call useLocale() from the server but useLocale is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/locale.tsx", "useLocale", ); {"finalSource":true}mapbufferedMap ConcatSourceRawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocaleProvider: () => (/* binding */ LocaleProvider) /* harmony export */ }); /* unused harmony export useLocale */ /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); ReplaceSourceRawSource// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const LocaleProvider = registerClientReference( function() { throw new Error("Attempted to call LocaleProvider() from the server but LocaleProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/locale.tsx", "LocaleProvider", );export const useLocale = registerClientReference( function() { throw new Error("Attempted to call useLocale() from the server but useLocale is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/locale.tsx", "useLocale", );61134undefined136142undefined166188(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined527533undefined552574(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined /***/ }) /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocaleProvider: () => (/* binding */ LocaleProvider) /* harmony export */ }); /* unused harmony export useLocale */ /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const LocaleProvider = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call LocaleProvider() from the server but LocaleProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/locale.tsx", "LocaleProvider", );const useLocale = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call useLocale() from the server but useLocale is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/locale.tsx", "useLocale", ); /***/ })   /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocaleProvider: () => (/* binding */ LocaleProvider) /* harmony export */ }); /* unused harmony export useLocale */ /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const LocaleProvider = registerClientReference( function() { throw new Error("Attempted to call LocaleProvider() from the server but LocaleProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/locale.tsx", "LocaleProvider", );export const useLocale = registerClientReference( function() { throw new Error("Attempted to call useLocale() from the server but useLocale is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/locale.tsx", "useLocale", );61134undefined136142undefined166188(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined527533undefined552574(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined, /***/ 21046:  webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource  webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScrollToTopButton: () => (/* binding */ ScrollToTopButton) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource/* __next_internal_client_entry_do_not_use__ ScrollToTopButton auto */ import { jsx as _jsx } from "react/jsx-runtime"; import { useEffect, useState } from 'react'; export function ScrollToTopButton() { const [visible, setVisible] = useState(false); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const onScroll = ()=>{ setVisible(window.scrollY > 200); }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ _jsx("button", { className: `scroll-to-top-btn${visible ? ' visible' : ''}`, "aria-label": "Наверх", onClick: ()=>window.scrollTo({ top: 0, behavior: 'smooth' }), children: /*#__PURE__*/ _jsx("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ _jsx("path", { d: "M10 16V4M10 4L4 10M10 4L16 10", stroke: "white", strokeWidth: "2.8", strokeLinecap: "round", strokeLinejoin: "round" }) }) }); } bGvxL5=:=AD(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)buffersourcesizemapshash7/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScrollToTopButton: () => (/* binding */ ScrollToTopButton) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* __next_internal_client_entry_do_not_use__ ScrollToTopButton auto */ function ScrollToTopButton() { const [visible, setVisible] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{ const onScroll = ()=>{ setVisible(window.scrollY > 200); }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("button", { className: `scroll-to-top-btn${visible ? ' visible' : ''}`, "aria-label": "Наверх", onClick: ()=>window.scrollTo({ top: 0, behavior: 'smooth' }), children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path", { d: "M10 16V4M10 4L4 10M10 4L16 10", stroke: "white", strokeWidth: "2.8", strokeLinecap: "round", strokeLinejoin: "round" }) }) }); } {"finalSource":true}mapbufferedMap ConcatSourceRawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScrollToTopButton: () => (/* binding */ ScrollToTopButton) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); ReplaceSourceRawSource/* __next_internal_client_entry_do_not_use__ ScrollToTopButton auto */ import { jsx as _jsx } from "react/jsx-runtime"; import { useEffect, useState } from 'react'; export function ScrollToTopButton() { const [visible, setVisible] = useState(false); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const onScroll = ()=>{ setVisible(window.scrollY > 200); }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ _jsx("button", { className: `scroll-to-top-btn${visible ? ' visible' : ''}`, "aria-label": "Наверх", onClick: ()=>window.scrollTo({ top: 0, behavior: 'smooth' }), children: /*#__PURE__*/ _jsx("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ _jsx("path", { d: "M10 16V4M10 4L4 10M10 4L16 10", stroke: "white", strokeWidth: "2.8", strokeLinecap: "round", strokeLinejoin: "round" }) }) }); } z71118undefined120163undefined165171undefined237244(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined309317(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)undefined570573(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined833836(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined10431046(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined /***/ }) /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScrollToTopButton: () => (/* binding */ ScrollToTopButton) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* __next_internal_client_entry_do_not_use__ ScrollToTopButton auto */ function ScrollToTopButton() { const [visible, setVisible] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{ const onScroll = ()=>{ setVisible(window.scrollY > 200); }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("button", { className: `scroll-to-top-btn${visible ? ' visible' : ''}`, "aria-label": "Наверх", onClick: ()=>window.scrollTo({ top: 0, behavior: 'smooth' }), children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path", { d: "M10 16V4M10 4L4 10M10 4L16 10", stroke: "white", strokeWidth: "2.8", strokeLinecap: "round", strokeLinejoin: "round" }) }) }); } /***/ })   /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScrollToTopButton: () => (/* binding */ ScrollToTopButton) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* __next_internal_client_entry_do_not_use__ ScrollToTopButton auto */ import { jsx as _jsx } from "react/jsx-runtime"; import { useEffect, useState } from 'react'; export function ScrollToTopButton() { const [visible, setVisible] = useState(false); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const onScroll = ()=>{ setVisible(window.scrollY > 200); }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ _jsx("button", { className: `scroll-to-top-btn${visible ? ' visible' : ''}`, "aria-label": "Наверх", onClick: ()=>window.scrollTo({ top: 0, behavior: 'smooth' }), children: /*#__PURE__*/ _jsx("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ _jsx("path", { d: "M10 16V4M10 4L4 10M10 4L16 10", stroke: "white", strokeWidth: "2.8", strokeLinecap: "round", strokeLinejoin: "round" }) }) }); } z71118undefined120163undefined165171undefined237244(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined309317(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)undefined570573(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined833836(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined10431046(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined, /***/ 30460:  webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource/***/ (() => { /* (ignored) */  /***/ })   , /***/ 32948:  webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource wwebpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScrollToTopButton: () => (/* binding */ ScrollToTopButton) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource)// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const ScrollToTopButton = registerClientReference( function() { throw new Error("Attempted to call ScrollToTopButton() from the server but ScrollToTopButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/ScrollToTopButton.tsx", "ScrollToTopButton", ); `=D(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)buffersourcesizemapshash/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScrollToTopButton: () => (/* binding */ ScrollToTopButton) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const ScrollToTopButton = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call ScrollToTopButton() from the server but ScrollToTopButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/ScrollToTopButton.tsx", "ScrollToTopButton", ); {"finalSource":true}mapbufferedMap ConcatSourceRawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScrollToTopButton: () => (/* binding */ ScrollToTopButton) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); ReplaceSourceRawSource)// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const ScrollToTopButton = registerClientReference( function() { throw new Error("Attempted to call ScrollToTopButton() from the server but ScrollToTopButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/ScrollToTopButton.tsx", "ScrollToTopButton", );61134undefined136142undefined169191(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined /***/ }) e/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScrollToTopButton: () => (/* binding */ ScrollToTopButton) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const ScrollToTopButton = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call ScrollToTopButton() from the server but ScrollToTopButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/ScrollToTopButton.tsx", "ScrollToTopButton", ); /***/ })   /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScrollToTopButton: () => (/* binding */ ScrollToTopButton) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); )// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const ScrollToTopButton = registerClientReference( function() { throw new Error("Attempted to call ScrollToTopButton() from the server but ScrollToTopButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/ScrollToTopButton.tsx", "ScrollToTopButton", );61134undefined136142undefined169191(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined, /***/ 33506:  zwebpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource__webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ NotFound) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5939); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3498); /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_1__); webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourceimport { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import Link from 'next/link'; export default function NotFound() { return /*#__PURE__*/ _jsx("div", { className: "min-h-screen flex items-center justify-center text-center px-4", children: /*#__PURE__*/ _jsxs("div", { children: [ /*#__PURE__*/ _jsx("h1", { className: "text-8xl font-bold text-blue-600 mb-4", children: "404" }), /*#__PURE__*/ _jsx("p", { className: "text-xl text-gray-700 mb-6", children: "Η σελίδα δεν βρέθηκε" }), /*#__PURE__*/ _jsx(Link, { href: "/", className: "bg-blue-600 text-white px-6 py-3 rounded-xl font-semibold hover:bg-blue-700", children: "Επιστροφή στην Αρχική" }) ] }) }); }  d>@\^lK#dg(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(next_link__WEBPACK_IMPORTED_MODULE_1___default())buffersourcesizemapshashl__webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ NotFound) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5939); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3498); /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_1__); function NotFound() { return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { className: "min-h-screen flex items-center justify-center text-center px-4", children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", { children: [ /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h1", { className: "text-8xl font-bold text-blue-600 mb-4", children: "404" }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", { className: "text-xl text-gray-700 mb-6", children: "Η σελίδα δεν βρέθηκε" }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)((next_link__WEBPACK_IMPORTED_MODULE_1___default()), { href: "/", className: "bg-blue-600 text-white px-6 py-3 rounded-xl font-semibold hover:bg-blue-700", children: "Επιστροφή στην Αρχική" }) ] }) }); } {"finalSource":true}mapbufferedMap ConcatSourceRawSource__webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ NotFound) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5939); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3498); /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_1__); ReplaceSourceRawSourceimport { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import Link from 'next/link'; export default function NotFound() { return /*#__PURE__*/ _jsx("div", { className: "min-h-screen flex items-center justify-center text-center px-4", children: /*#__PURE__*/ _jsxs("div", { children: [ /*#__PURE__*/ _jsx("h1", { className: "text-8xl font-bold text-blue-600 mb-4", children: "404" }), /*#__PURE__*/ _jsx("p", { className: "text-xl text-gray-700 mb-6", children: "Η σελίδα δεν βρέθηκε" }), /*#__PURE__*/ _jsx(Link, { href: "/", className: "bg-blue-600 text-white px-6 py-3 rounded-xl font-semibold hover:bg-blue-700", children: "Επιστροφή στην Αρχική" }) ] }) }); } 062undefined6492undefined94108undefined156159(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined287291(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)undefined356359(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined527530(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined703706(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined708711(next_link__WEBPACK_IMPORTED_MODULE_1___default())undefined /***/ }) /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ NotFound) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5939); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3498); /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_1__); function NotFound() { return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { className: "min-h-screen flex items-center justify-center text-center px-4", children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", { children: [ /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h1", { className: "text-8xl font-bold text-blue-600 mb-4", children: "404" }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", { className: "text-xl text-gray-700 mb-6", children: "Η σελίδα δεν βρέθηκε" }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)((next_link__WEBPACK_IMPORTED_MODULE_1___default()), { href: "/", className: "bg-blue-600 text-white px-6 py-3 rounded-xl font-semibold hover:bg-blue-700", children: "Επιστροφή στην Αρχική" }) ] }) }); } /***/ })   __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ NotFound) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5939); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3498); /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_1__); import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import Link from 'next/link'; export default function NotFound() { return /*#__PURE__*/ _jsx("div", { className: "min-h-screen flex items-center justify-center text-center px-4", children: /*#__PURE__*/ _jsxs("div", { children: [ /*#__PURE__*/ _jsx("h1", { className: "text-8xl font-bold text-blue-600 mb-4", children: "404" }), /*#__PURE__*/ _jsx("p", { className: "text-xl text-gray-700 mb-6", children: "Η σελίδα δεν βρέθηκε" }), /*#__PURE__*/ _jsx(Link, { href: "/", className: "bg-blue-600 text-white px-6 py-3 rounded-xl font-semibold hover:bg-blue-700", children: "Επιστροφή στην Αρχική" }) ] }) }); } 062undefined6492undefined94108undefined156159(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined287291(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)undefined356359(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined527530(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined703706(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined708711(next_link__WEBPACK_IMPORTED_MODULE_1___default())undefined, /***/ 39348:  (webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource *webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Footer: () => (/* binding */ Footer) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const Footer = registerClientReference( function() { throw new Error("Attempted to call Footer() from the server but Footer is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/Footer.tsx", "Footer", ); `=D(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)buffersourcesizemapshash/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Footer: () => (/* binding */ Footer) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const Footer = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call Footer() from the server but Footer is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/Footer.tsx", "Footer", ); {"finalSource":true}mapbufferedMap ConcatSourceRawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Footer: () => (/* binding */ Footer) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); ReplaceSourceRawSource// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const Footer = registerClientReference( function() { throw new Error("Attempted to call Footer() from the server but Footer is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/Footer.tsx", "Footer", );61134undefined136142undefined158180(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined /***/ }) ~/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Footer: () => (/* binding */ Footer) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const Footer = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call Footer() from the server but Footer is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/Footer.tsx", "Footer", ); /***/ })   /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Footer: () => (/* binding */ Footer) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const Footer = registerClientReference( function() { throw new Error("Attempted to call Footer() from the server but Footer is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/Footer.tsx", "Footer", );61134undefined136142undefined158180(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined, /***/ 39805:  |webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceV/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceimport(/* webpackMode: "eager", webpackExports: ["Footer"] */ "/opt/canhelp/apps/web/src/components/Footer.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["Header"] */ "/opt/canhelp/apps/web/src/components/Header.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["ScrollToTopButton"] */ "/opt/canhelp/apps/web/src/components/ScrollToTopButton.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["LocaleProvider"] */ "/opt/canhelp/apps/web/src/context/locale.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["LocationProvider"] */ "/opt/canhelp/apps/web/src/context/location.tsx"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/script.js"); aotHmrchPromise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 15043))Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 58719))Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 21046))Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 96484))Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 56003))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 24653, 23))buffersourcesizemapshash\Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 15043)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 58719)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 21046)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 96484)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 56003)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 24653, 23)); {"finalSource":true}mapbufferedMap ReplaceSourceRawSourceimport(/* webpackMode: "eager", webpackExports: ["Footer"] */ "/opt/canhelp/apps/web/src/components/Footer.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["Header"] */ "/opt/canhelp/apps/web/src/components/Header.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["ScrollToTopButton"] */ "/opt/canhelp/apps/web/src/components/ScrollToTopButton.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["LocaleProvider"] */ "/opt/canhelp/apps/web/src/context/locale.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["LocationProvider"] */ "/opt/canhelp/apps/web/src/context/location.tsx"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/script.js"); 0111Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 15043))undefined116227Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 58719))undefined232365Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 21046))undefined370486Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 96484))undefined491611Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 56003))undefined616704Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 24653, 23))undefined /***/ }) s/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 15043)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 58719)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 21046)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 96484)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 56003)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 24653, 23)); /***/ }) tw xV/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { import(/* webpackMode: "eager", webpackExports: ["Footer"] */ "/opt/canhelp/apps/web/src/components/Footer.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["Header"] */ "/opt/canhelp/apps/web/src/components/Header.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["ScrollToTopButton"] */ "/opt/canhelp/apps/web/src/components/ScrollToTopButton.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["LocaleProvider"] */ "/opt/canhelp/apps/web/src/context/locale.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["LocationProvider"] */ "/opt/canhelp/apps/web/src/context/location.tsx"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/script.js"); 0111Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 15043))undefined116227Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 58719))undefined232365Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 21046))undefined370486Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 96484))undefined491611Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 56003))undefined616704Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 24653, 23))undefinedwy, /***/ 47570:  bGwebpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource__webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ RootLayout), /* harmony export */ generateMetadata: () => (/* binding */ generateMetadata) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5939); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var next_headers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56057); /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(95692); /* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(14276); /* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_globals_css__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _components_Header__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(67674); /* harmony import */ var _components_Footer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(39348); /* harmony import */ var _context_locale__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(20138); /* harmony import */ var _context_location__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(1697); /* harmony import */ var _components_ScrollToTopButton__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(32948); webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourceD import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { cookies, headers } from 'next/headers'; import Script from 'next/script'; import './globals.css'; import { Header } from '@/components/Header'; import { Footer } from '@/components/Footer'; import { LocaleProvider } from '@/context/locale'; import { LocationProvider } from '@/context/location'; import { ScrollToTopButton } from '@/components/ScrollToTopButton'; async function fetchSeoSettings() { try { const apiBase = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; const res = await fetch(`${apiBase}/api/admin/seo-public`, { next: { revalidate: 60 } }); if (!res.ok) return {}; return res.json(); } catch { return {}; } } export async function generateMetadata() { const seo = await fetchSeoSettings(); return { title: seo['seo.siteTitle'] || 'CanHelp — Βρες ειδικό για κάθε δουλειά', description: seo['seo.siteDescription'] || 'Η ελληνική πλατφόρμα για online ανάθεση εργασιών. Βρες επαγγελματίες για καθαρισμό, υδραυλικά, μαθήματα και πολλά άλλα.', keywords: 'εργασίες, ειδικοί, Ελλάδα, freelance, καθαρισμός, υδραυλικά', robots: seo['seo.indexingEnabled'] === 'false' ? 'noindex, nofollow' : undefined }; } export default async function RootLayout({ children }) { const cookieStore = await cookies(); const headerStore = await headers(); const pathname = headerStore.get('x-pathname') ?? ''; const isStandalone = pathname.startsWith('/site/'); const rawLocale = cookieStore.get('canhelp_locale')?.value; const locales = [ 'el', 'en', 'ru' ]; const initialLocale = locales.includes(rawLocale) ? rawLocale : 'el'; const initialLocation = decodeURIComponent(cookieStore.get('canhelp_location')?.value ?? ''); const seo = await fetchSeoSettings(); const headScripts = seo['seo.headScripts'] ?? ''; return /*#__PURE__*/ _jsx("html", { lang: initialLocale, children: /*#__PURE__*/ _jsxs("body", { children: [ headScripts && /*#__PURE__*/ _jsx(Script, { id: "seo-head-scripts", strategy: "beforeInteractive", dangerouslySetInnerHTML: { __html: headScripts } }), /*#__PURE__*/ _jsx(LocaleProvider, { initialLocale: initialLocale, children: /*#__PURE__*/ _jsxs(LocationProvider, { initialSlug: initialLocation, children: [ !isStandalone && /*#__PURE__*/ _jsx(Header, {}), /*#__PURE__*/ _jsx("main", { className: "min-h-screen", children: children }), !isStandalone && /*#__PURE__*/ _jsx(ScrollToTopButton, {}), !isStandalone && /*#__PURE__*/ _jsx(Footer, {}) ] }) }) ] }) }); } e>@oq_8:oq4.4BP6:V    & , / 1 6 "https://api.canhelp.gr"0(0,next_headers__WEBPACK_IMPORTED_MODULE_1__/* .cookies */ .UL)(0,next_headers__WEBPACK_IMPORTED_MODULE_1__/* .headers */ .b3)(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)next_script__WEBPACK_IMPORTED_MODULE_2__["default"]_context_locale__WEBPACK_IMPORTED_MODULE_6__.LocaleProvider_context_location__WEBPACK_IMPORTED_MODULE_7__.LocationProvider_components_Header__WEBPACK_IMPORTED_MODULE_4__.Header_components_ScrollToTopButton__WEBPACK_IMPORTED_MODULE_8__.ScrollToTopButton_components_Footer__WEBPACK_IMPORTED_MODULE_5__.Footerbuffersourcesizemapshash__webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ RootLayout), /* harmony export */ generateMetadata: () => (/* binding */ generateMetadata) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5939); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var next_headers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56057); /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(95692); /* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(14276); /* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_globals_css__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _components_Header__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(67674); /* harmony import */ var _components_Footer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(39348); /* harmony import */ var _context_locale__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(20138); /* harmony import */ var _context_location__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(1697); /* harmony import */ var _components_ScrollToTopButton__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(32948); async function fetchSeoSettings() { try { const apiBase = "https://api.canhelp.gr" || 0; const res = await fetch(`${apiBase}/api/admin/seo-public`, { next: { revalidate: 60 } }); if (!res.ok) return {}; return res.json(); } catch { return {}; } } async function generateMetadata() { const seo = await fetchSeoSettings(); return { title: seo['seo.siteTitle'] || 'CanHelp — Βρες ειδικό για κάθε δουλειά', description: seo['seo.siteDescription'] || 'Η ελληνική πλατφόρμα για online ανάθεση εργασιών. Βρες επαγγελματίες για καθαρισμό, υδραυλικά, μαθήματα και πολλά άλλα.', keywords: 'εργασίες, ειδικοί, Ελλάδα, freelance, καθαρισμός, υδραυλικά', robots: seo['seo.indexingEnabled'] === 'false' ? 'noindex, nofollow' : undefined }; } async function RootLayout({ children }) { const cookieStore = await (0,next_headers__WEBPACK_IMPORTED_MODULE_1__/* .cookies */ .UL)(); const headerStore = await (0,next_headers__WEBPACK_IMPORTED_MODULE_1__/* .headers */ .b3)(); const pathname = headerStore.get('x-pathname') ?? ''; const isStandalone = pathname.startsWith('/site/'); const rawLocale = cookieStore.get('canhelp_locale')?.value; const locales = [ 'el', 'en', 'ru' ]; const initialLocale = locales.includes(rawLocale) ? rawLocale : 'el'; const initialLocation = decodeURIComponent(cookieStore.get('canhelp_location')?.value ?? ''); const seo = await fetchSeoSettings(); const headScripts = seo['seo.headScripts'] ?? ''; return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("html", { lang: initialLocale, children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("body", { children: [ headScripts && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(next_script__WEBPACK_IMPORTED_MODULE_2__["default"], { id: "seo-head-scripts", strategy: "beforeInteractive", dangerouslySetInnerHTML: { __html: headScripts } }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_context_locale__WEBPACK_IMPORTED_MODULE_6__.LocaleProvider, { initialLocale: initialLocale, children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_context_location__WEBPACK_IMPORTED_MODULE_7__.LocationProvider, { initialSlug: initialLocation, children: [ !isStandalone && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_Header__WEBPACK_IMPORTED_MODULE_4__.Header, {}), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("main", { className: "min-h-screen", children: children }), !isStandalone && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ScrollToTopButton__WEBPACK_IMPORTED_MODULE_8__.ScrollToTopButton, {}), !isStandalone && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_Footer__WEBPACK_IMPORTED_MODULE_5__.Footer, {}) ] }) }) ] }) }); } {"finalSource":true}mapbufferedMap ConcatSourceRawSource__webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ RootLayout), /* harmony export */ generateMetadata: () => (/* binding */ generateMetadata) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5939); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var next_headers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56057); /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(95692); /* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(14276); /* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_globals_css__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _components_Header__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(67674); /* harmony import */ var _components_Footer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(39348); /* harmony import */ var _context_locale__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(20138); /* harmony import */ var _context_location__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(1697); /* harmony import */ var _components_ScrollToTopButton__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(32948); ReplaceSourceRawSourceD import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { cookies, headers } from 'next/headers'; import Script from 'next/script'; import './globals.css'; import { Header } from '@/components/Header'; import { Footer } from '@/components/Footer'; import { LocaleProvider } from '@/context/locale'; import { LocationProvider } from '@/context/location'; import { ScrollToTopButton } from '@/components/ScrollToTopButton'; async function fetchSeoSettings() { try { const apiBase = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; const res = await fetch(`${apiBase}/api/admin/seo-public`, { next: { revalidate: 60 } }); if (!res.ok) return {}; return res.json(); } catch { return {}; } } export async function generateMetadata() { const seo = await fetchSeoSettings(); return { title: seo['seo.siteTitle'] || 'CanHelp — Βρες ειδικό για κάθε δουλειά', description: seo['seo.siteDescription'] || 'Η ελληνική πλατφόρμα για online ανάθεση εργασιών. Βρες επαγγελματίες για καθαρισμό, υδραυλικά, μαθήματα και πολλά άλλα.', keywords: 'εργασίες, ειδικοί, Ελλάδα, freelance, καθαρισμός, υδραυλικά', robots: seo['seo.indexingEnabled'] === 'false' ? 'noindex, nofollow' : undefined }; } export default async function RootLayout({ children }) { const cookieStore = await cookies(); const headerStore = await headers(); const pathname = headerStore.get('x-pathname') ?? ''; const isStandalone = pathname.startsWith('/site/'); const rawLocale = cookieStore.get('canhelp_locale')?.value; const locales = [ 'el', 'en', 'ru' ]; const initialLocale = locales.includes(rawLocale) ? rawLocale : 'el'; const initialLocation = decodeURIComponent(cookieStore.get('canhelp_location')?.value ?? ''); const seo = await fetchSeoSettings(); const headScripts = seo['seo.headScripts'] ?? ''; return /*#__PURE__*/ _jsx("html", { lang: initialLocale, children: /*#__PURE__*/ _jsxs("body", { children: [ headScripts && /*#__PURE__*/ _jsx(Script, { id: "seo-head-scripts", strategy: "beforeInteractive", dangerouslySetInnerHTML: { __html: headScripts } }), /*#__PURE__*/ _jsx(LocaleProvider, { initialLocale: initialLocale, children: /*#__PURE__*/ _jsxs(LocationProvider, { initialSlug: initialLocation, children: [ !isStandalone && /*#__PURE__*/ _jsx(Header, {}), /*#__PURE__*/ _jsx("main", { className: "min-h-screen", children: children }), !isStandalone && /*#__PURE__*/ _jsx(ScrollToTopButton, {}), !isStandalone && /*#__PURE__*/ _jsx(Footer, {}) ] }) }) ] }) }); } 062undefined64111undefined113145undefined147169undefined171215undefined217261undefined263312undefined314367undefined369435undefined507537"https://api.canhelp.gr"undefined5425640undefined814820undefined13461360undefined14331439(0,next_headers__WEBPACK_IMPORTED_MODULE_1__/* .cookies */ .UL)undefined14741480(0,next_headers__WEBPACK_IMPORTED_MODULE_1__/* .headers */ .b3)undefined20262029(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined21022106(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)undefined21872190(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined21922197next_script__WEBPACK_IMPORTED_MODULE_2__["default"]undefined24602463(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined24652478_context_locale__WEBPACK_IMPORTED_MODULE_6__.LocaleProviderundefined25772581(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)undefined25832598_context_location__WEBPACK_IMPORTED_MODULE_7__.LocationProviderundefined27522755(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined27572762_components_Header__WEBPACK_IMPORTED_MODULE_4__.Headerundefined28122815(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined30283031(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined30333049_components_ScrollToTopButton__WEBPACK_IMPORTED_MODULE_8__.ScrollToTopButtonundefined31163119(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined31213126_components_Footer__WEBPACK_IMPORTED_MODULE_5__.Footerundefined /***/ }) h/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ RootLayout), /* harmony export */ generateMetadata: () => (/* binding */ generateMetadata) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5939); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var next_headers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56057); /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(95692); /* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(14276); /* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_globals_css__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _components_Header__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(67674); /* harmony import */ var _components_Footer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(39348); /* harmony import */ var _context_locale__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(20138); /* harmony import */ var _context_location__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(1697); /* harmony import */ var _components_ScrollToTopButton__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(32948); async function fetchSeoSettings() { try { const apiBase = "https://api.canhelp.gr" || 0; const res = await fetch(`${apiBase}/api/admin/seo-public`, { next: { revalidate: 60 } }); if (!res.ok) return {}; return res.json(); } catch { return {}; } } async function generateMetadata() { const seo = await fetchSeoSettings(); return { title: seo['seo.siteTitle'] || 'CanHelp — Βρες ειδικό για κάθε δουλειά', description: seo['seo.siteDescription'] || 'Η ελληνική πλατφόρμα για online ανάθεση εργασιών. Βρες επαγγελματίες για καθαρισμό, υδραυλικά, μαθήματα και πολλά άλλα.', keywords: 'εργασίες, ειδικοί, Ελλάδα, freelance, καθαρισμός, υδραυλικά', robots: seo['seo.indexingEnabled'] === 'false' ? 'noindex, nofollow' : undefined }; } async function RootLayout({ children }) { const cookieStore = await (0,next_headers__WEBPACK_IMPORTED_MODULE_1__/* .cookies */ .UL)(); const headerStore = await (0,next_headers__WEBPACK_IMPORTED_MODULE_1__/* .headers */ .b3)(); const pathname = headerStore.get('x-pathname') ?? ''; const isStandalone = pathname.startsWith('/site/'); const rawLocale = cookieStore.get('canhelp_locale')?.value; const locales = [ 'el', 'en', 'ru' ]; const initialLocale = locales.includes(rawLocale) ? rawLocale : 'el'; const initialLocation = decodeURIComponent(cookieStore.get('canhelp_location')?.value ?? ''); const seo = await fetchSeoSettings(); const headScripts = seo['seo.headScripts'] ?? ''; return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("html", { lang: initialLocale, children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("body", { children: [ headScripts && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(next_script__WEBPACK_IMPORTED_MODULE_2__["default"], { id: "seo-head-scripts", strategy: "beforeInteractive", dangerouslySetInnerHTML: { __html: headScripts } }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_context_locale__WEBPACK_IMPORTED_MODULE_6__.LocaleProvider, { initialLocale: initialLocale, children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_context_location__WEBPACK_IMPORTED_MODULE_7__.LocationProvider, { initialSlug: initialLocation, children: [ !isStandalone && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_Header__WEBPACK_IMPORTED_MODULE_4__.Header, {}), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("main", { className: "min-h-screen", children: children }), !isStandalone && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ScrollToTopButton__WEBPACK_IMPORTED_MODULE_8__.ScrollToTopButton, {}), !isStandalone && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_Footer__WEBPACK_IMPORTED_MODULE_5__.Footer, {}) ] }) }) ] }) }); } /***/ }) il  mzm__webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ RootLayout), /* harmony export */ generateMetadata: () => (/* binding */ generateMetadata) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5939); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var next_headers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56057); /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(95692); /* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(14276); /* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_globals_css__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _components_Header__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(67674); /* harmony import */ var _components_Footer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(39348); /* harmony import */ var _context_locale__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(20138); /* harmony import */ var _context_location__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(1697); /* harmony import */ var _components_ScrollToTopButton__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(32948); {D import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { cookies, headers } from 'next/headers'; import Script from 'next/script'; import './globals.css'; import { Header } from '@/components/Header'; import { Footer } from '@/components/Footer'; import { LocaleProvider } from '@/context/locale'; import { LocationProvider } from '@/context/location'; import { ScrollToTopButton } from '@/components/ScrollToTopButton'; async function fetchSeoSettings() { try { const apiBase = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; const res = await fetch(`${apiBase}/api/admin/seo-public`, { next: { revalidate: 60 } }); if (!res.ok) return {}; return res.json(); } catch { return {}; } } export async function generateMetadata() { const seo = await fetchSeoSettings(); return { title: seo['seo.siteTitle'] || 'CanHelp — Βρες ειδικό για κάθε δουλειά', description: seo['seo.siteDescription'] || 'Η ελληνική πλατφόρμα για online ανάθεση εργασιών. Βρες επαγγελματίες για καθαρισμό, υδραυλικά, μαθήματα και πολλά άλλα.', keywords: 'εργασίες, ειδικοί, Ελλάδα, freelance, καθαρισμός, υδραυλικά', robots: seo['seo.indexingEnabled'] === 'false' ? 'noindex, nofollow' : undefined }; } export default async function RootLayout({ children }) { const cookieStore = await cookies(); const headerStore = await headers(); const pathname = headerStore.get('x-pathname') ?? ''; const isStandalone = pathname.startsWith('/site/'); const rawLocale = cookieStore.get('canhelp_locale')?.value; const locales = [ 'el', 'en', 'ru' ]; const initialLocale = locales.includes(rawLocale) ? rawLocale : 'el'; const initialLocation = decodeURIComponent(cookieStore.get('canhelp_location')?.value ?? ''); const seo = await fetchSeoSettings(); const headScripts = seo['seo.headScripts'] ?? ''; return /*#__PURE__*/ _jsx("html", { lang: initialLocale, children: /*#__PURE__*/ _jsxs("body", { children: [ headScripts && /*#__PURE__*/ _jsx(Script, { id: "seo-head-scripts", strategy: "beforeInteractive", dangerouslySetInnerHTML: { __html: headScripts } }), /*#__PURE__*/ _jsx(LocaleProvider, { initialLocale: initialLocale, children: /*#__PURE__*/ _jsxs(LocationProvider, { initialSlug: initialLocation, children: [ !isStandalone && /*#__PURE__*/ _jsx(Header, {}), /*#__PURE__*/ _jsx("main", { className: "min-h-screen", children: children }), !isStandalone && /*#__PURE__*/ _jsx(ScrollToTopButton, {}), !isStandalone && /*#__PURE__*/ _jsx(Footer, {}) ] }) }) ] }) }); } 062undefined64111undefined113145undefined147169undefined171215undefined217261undefined263312undefined314367undefined369435undefined507537"https://api.canhelp.gr"undefined5425640undefined814820undefined13461360undefined14331439(0,next_headers__WEBPACK_IMPORTED_MODULE_1__/* .cookies */ .UL)undefined14741480(0,next_headers__WEBPACK_IMPORTED_MODULE_1__/* .headers */ .b3)undefined20262029(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined21022106(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)undefined21872190(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined21922197next_script__WEBPACK_IMPORTED_MODULE_2__["default"]undefined24602463(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined24652478_context_locale__WEBPACK_IMPORTED_MODULE_6__.LocaleProviderundefined25772581(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)undefined25832598_context_location__WEBPACK_IMPORTED_MODULE_7__.LocationProviderundefined27522755(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined27572762_components_Header__WEBPACK_IMPORTED_MODULE_4__.Headerundefined28122815(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined30283031(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined30333049_components_ScrollToTopButton__WEBPACK_IMPORTED_MODULE_8__.ScrollToTopButtonundefined31163119(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined31213126_components_Footer__WEBPACK_IMPORTED_MODULE_5__.Footerundefinedln, /***/ 48178:  webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ E: () => (/* binding */ shortName), /* harmony export */ H: () => (/* binding */ formatShortName) /* harmony export */ }); webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource$/** * Shortens the last name to first letter + period. * "Иван Петров" → "Иван П." * Works with a pre-composed full name string. */ export function shortName(fullName) { if (!fullName?.trim()) return '—'; const parts = fullName.trim().split(/\s+/); if (parts.length < 2 || !parts[1]) return parts[0]; return `${parts[0]} ${parts[1][0].toUpperCase()}.`; } /** * Formats separate firstName + lastName fields, shortening the last name. * Falls back to parsing fullName if firstName is not available. */ export function formatShortName(firstName, lastName, fallbackName) { if (firstName?.trim()) { const l = lastName?.trim(); return l ? `${firstName.trim()} ${l[0].toUpperCase()}.` : firstName.trim(); } return shortName(fallbackName); } C buffersourcesizemapshash/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ E: () => (/* binding */ shortName), /* harmony export */ H: () => (/* binding */ formatShortName) /* harmony export */ }); /** * Shortens the last name to first letter + period. * "Иван Петров" → "Иван П." * Works with a pre-composed full name string. */ function shortName(fullName) { if (!fullName?.trim()) return '—'; const parts = fullName.trim().split(/\s+/); if (parts.length < 2 || !parts[1]) return parts[0]; return `${parts[0]} ${parts[1][0].toUpperCase()}.`; } /** * Formats separate firstName + lastName fields, shortening the last name. * Falls back to parsing fullName if firstName is not available. */ function formatShortName(firstName, lastName, fallbackName) { if (firstName?.trim()) { const l = lastName?.trim(); return l ? `${firstName.trim()} ${l[0].toUpperCase()}.` : firstName.trim(); } return shortName(fallbackName); } {"finalSource":true}mapbufferedMap ConcatSourceRawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ E: () => (/* binding */ shortName), /* harmony export */ H: () => (/* binding */ formatShortName) /* harmony export */ }); ReplaceSourceRawSource$/** * Shortens the last name to first letter + period. * "Иван Петров" → "Иван П." * Works with a pre-composed full name string. */ export function shortName(fullName) { if (!fullName?.trim()) return '—'; const parts = fullName.trim().split(/\s+/); if (parts.length < 2 || !parts[1]) return parts[0]; return `${parts[0]} ${parts[1][0].toUpperCase()}.`; } /** * Formats separate firstName + lastName fields, shortening the last name. * Falls back to parsing fullName if firstName is not available. */ export function formatShortName(firstName, lastName, fallbackName) { if (firstName?.trim()) { const l = lastName?.trim(); return l ? `${firstName.trim()} ${l[0].toUpperCase()}.` : firstName.trim(); } return shortName(fallbackName); } 136142undefined523529undefined /***/ }) ]U/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ E: () => (/* binding */ shortName), /* harmony export */ H: () => (/* binding */ formatShortName) /* harmony export */ }); /** * Shortens the last name to first letter + period. * "Иван Петров" → "Иван П." * Works with a pre-composed full name string. */ function shortName(fullName) { if (!fullName?.trim()) return '—'; const parts = fullName.trim().split(/\s+/); if (parts.length < 2 || !parts[1]) return parts[0]; return `${parts[0]} ${parts[1][0].toUpperCase()}.`; } /** * Formats separate firstName + lastName fields, shortening the last name. * Falls back to parsing fullName if firstName is not available. */ function formatShortName(firstName, lastName, fallbackName) { if (firstName?.trim()) { const l = lastName?.trim(); return l ? `${firstName.trim()} ${l[0].toUpperCase()}.` : firstName.trim(); } return shortName(fallbackName); } /***/ }) ^a  bob/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ E: () => (/* binding */ shortName), /* harmony export */ H: () => (/* binding */ formatShortName) /* harmony export */ }); p$/** * Shortens the last name to first letter + period. * "Иван Петров" → "Иван П." * Works with a pre-composed full name string. */ export function shortName(fullName) { if (!fullName?.trim()) return '—'; const parts = fullName.trim().split(/\s+/); if (parts.length < 2 || !parts[1]) return parts[0]; return `${parts[0]} ${parts[1][0].toUpperCase()}.`; } /** * Formats separate firstName + lastName fields, shortening the last name. * Falls back to parsing fullName if firstName is not available. */ export function formatShortName(firstName, lastName, fallbackName) { if (firstName?.trim()) { const l = lastName?.trim(); return l ? `${firstName.trim()} ${l[0].toUpperCase()}.` : firstName.trim(); } return shortName(fallbackName); } 136142undefined523529undefinedac, /***/ 49046:  webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceV/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceimport(/* webpackMode: "eager", webpackExports: ["__esModule","default"] */ "/opt/canhelp/node_modules/next/dist/client/app-dir/link.js"); @Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 94496, 23))buffersourcesizemapshashhPromise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 94496, 23)); {"finalSource":true}mapbufferedMap ReplaceSourceRawSourceimport(/* webpackMode: "eager", webpackExports: ["__esModule","default"] */ "/opt/canhelp/node_modules/next/dist/client/app-dir/link.js"); s0136Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 94496, 23))undefined /***/ }) R/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 94496, 23)); /***/ }) SV Wfimport(/* webpackMode: "eager", webpackExports: ["__esModule","default"] */ "/opt/canhelp/node_modules/next/dist/client/app-dir/link.js"); s0136Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 94496, 23))undefinedWY, /***/ 56003:  .webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource9/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocationProvider: () => (/* binding */ LocationProvider), /* harmony export */ z: () => (/* binding */ useLocation) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _lib_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(91864); webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourceB /* __next_internal_client_entry_do_not_use__ LocationProvider,useLocation auto */ import { jsx as _jsx } from "react/jsx-runtime"; import { createContext, useContext, useState, useEffect, useCallback } from 'react'; import { getLocations } from '@/lib/api'; const LocationContext = /*#__PURE__*/ createContext({ locationSlug: '', locationTree: [], locationLoading: true, setLocation: ()=>{}, getLabel: ()=>'' }); function readCookieLocation() { if (typeof document === 'undefined') return ''; const match = document.cookie.match(/(?:^|;\s*)canhelp_location=([^;]+)/); return match?.[1] ? decodeURIComponent(match[1]) : ''; } export function LocationProvider({ children, initialSlug = '' }) { const [locationSlug, setLocationSlug] = useState(initialSlug); const [locationTree, setLocationTree] = useState([]); const [locationLoading, setLocationLoading] = useState(true); // Sync from cookie on client mount process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const cookieSlug = readCookieLocation(); setLocationSlug(cookieSlug); }, []); // Load location tree once process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ getLocations().then((tree)=>setLocationTree(tree)).catch(()=>{}).finally(()=>setLocationLoading(false)); }, []); const setLocation = useCallback((slug)=>{ setLocationSlug(slug); const encoded = encodeURIComponent(slug); document.cookie = `canhelp_location=${encoded}; path=/; max-age=31536000; SameSite=Lax`; }, []); const getLabel = useCallback((locale)=>{ if (!locationSlug) return ''; for (const city of locationTree){ if (city.slug === locationSlug) return city.names[locale] ?? city.names.el; for (const d of city.children ?? []){ if (d.slug === locationSlug) return d.names[locale] ?? d.names.el; } } return locationSlug; }, [ locationSlug, locationTree ]); return /*#__PURE__*/ _jsx(LocationContext.Provider, { value: { locationSlug, locationTree, locationLoading, setLocation, getLabel }, children: children }); } export function useLocation() { return useContext(LocationContext); } aR^(4CJ_iHR# , (0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(0,_lib_api__WEBPACK_IMPORTED_MODULE_2__/* .getLocations */ .Vs)(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)buffersourcesizemapshash /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocationProvider: () => (/* binding */ LocationProvider), /* harmony export */ z: () => (/* binding */ useLocation) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _lib_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(91864); /* __next_internal_client_entry_do_not_use__ LocationProvider,useLocation auto */ const LocationContext = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)({ locationSlug: '', locationTree: [], locationLoading: true, setLocation: ()=>{}, getLabel: ()=>'' }); function readCookieLocation() { if (typeof document === 'undefined') return ''; const match = document.cookie.match(/(?:^|;\s*)canhelp_location=([^;]+)/); return match?.[1] ? decodeURIComponent(match[1]) : ''; } function LocationProvider({ children, initialSlug = '' }) { const [locationSlug, setLocationSlug] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(initialSlug); const [locationTree, setLocationTree] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]); const [locationLoading, setLocationLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true); // Sync from cookie on client mount process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{ const cookieSlug = readCookieLocation(); setLocationSlug(cookieSlug); }, []); // Load location tree once process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{ (0,_lib_api__WEBPACK_IMPORTED_MODULE_2__/* .getLocations */ .Vs)().then((tree)=>setLocationTree(tree)).catch(()=>{}).finally(()=>setLocationLoading(false)); }, []); const setLocation = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((slug)=>{ setLocationSlug(slug); const encoded = encodeURIComponent(slug); document.cookie = `canhelp_location=${encoded}; path=/; max-age=31536000; SameSite=Lax`; }, []); const getLabel = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((locale)=>{ if (!locationSlug) return ''; for (const city of locationTree){ if (city.slug === locationSlug) return city.names[locale] ?? city.names.el; for (const d of city.children ?? []){ if (d.slug === locationSlug) return d.names[locale] ?? d.names.el; } } return locationSlug; }, [ locationSlug, locationTree ]); return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(LocationContext.Provider, { value: { locationSlug, locationTree, locationLoading, setLocation, getLabel }, children: children }); } function useLocation() { return (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(LocationContext); } {"finalSource":true}mapbufferedMap ConcatSourceRawSource9/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocationProvider: () => (/* binding */ LocationProvider), /* harmony export */ z: () => (/* binding */ useLocation) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _lib_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(91864); ReplaceSourceRawSourceB /* __next_internal_client_entry_do_not_use__ LocationProvider,useLocation auto */ import { jsx as _jsx } from "react/jsx-runtime"; import { createContext, useContext, useState, useEffect, useCallback } from 'react'; import { getLocations } from '@/lib/api'; const LocationContext = /*#__PURE__*/ createContext({ locationSlug: '', locationTree: [], locationLoading: true, setLocation: ()=>{}, getLabel: ()=>'' }); function readCookieLocation() { if (typeof document === 'undefined') return ''; const match = document.cookie.match(/(?:^|;\s*)canhelp_location=([^;]+)/); return match?.[1] ? decodeURIComponent(match[1]) : ''; } export function LocationProvider({ children, initialSlug = '' }) { const [locationSlug, setLocationSlug] = useState(initialSlug); const [locationTree, setLocationTree] = useState([]); const [locationLoading, setLocationLoading] = useState(true); // Sync from cookie on client mount process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const cookieSlug = readCookieLocation(); setLocationSlug(cookieSlug); }, []); // Load location tree once process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ getLocations().then((tree)=>setLocationTree(tree)).catch(()=>{}).finally(()=>setLocationLoading(false)); }, []); const setLocation = useCallback((slug)=>{ setLocationSlug(slug); const encoded = encodeURIComponent(slug); document.cookie = `canhelp_location=${encoded}; path=/; max-age=31536000; SameSite=Lax`; }, []); const getLabel = useCallback((locale)=>{ if (!locationSlug) return ''; for (const city of locationTree){ if (city.slug === locationSlug) return city.names[locale] ?? city.names.el; for (const d of city.children ?? []){ if (d.slug === locationSlug) return d.names[locale] ?? d.names.el; } } return locationSlug; }, [ locationSlug, locationTree ]); return /*#__PURE__*/ _jsx(LocationContext.Provider, { value: { locationSlug, locationTree, locationLoading, setLocation, getLabel }, children: children }); } export function useLocation() { return useContext(LocationContext); } +82129undefined131214undefined216256undefined296308(0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)undefined657663undefined768775(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined835842(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined899906(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined10101018(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)undefined12101218(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)undefined12341245(0,_lib_api__WEBPACK_IMPORTED_MODULE_2__/* .getLocations */ .Vs)undefined13751385(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)undefined16081618(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)undefined20712074(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined22962302undefined23392348(0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)undefined /***/ }) H /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocationProvider: () => (/* binding */ LocationProvider), /* harmony export */ z: () => (/* binding */ useLocation) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _lib_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(91864); /* __next_internal_client_entry_do_not_use__ LocationProvider,useLocation auto */ const LocationContext = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)({ locationSlug: '', locationTree: [], locationLoading: true, setLocation: ()=>{}, getLabel: ()=>'' }); function readCookieLocation() { if (typeof document === 'undefined') return ''; const match = document.cookie.match(/(?:^|;\s*)canhelp_location=([^;]+)/); return match?.[1] ? decodeURIComponent(match[1]) : ''; } function LocationProvider({ children, initialSlug = '' }) { const [locationSlug, setLocationSlug] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(initialSlug); const [locationTree, setLocationTree] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]); const [locationLoading, setLocationLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true); // Sync from cookie on client mount process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{ const cookieSlug = readCookieLocation(); setLocationSlug(cookieSlug); }, []); // Load location tree once process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{ (0,_lib_api__WEBPACK_IMPORTED_MODULE_2__/* .getLocations */ .Vs)().then((tree)=>setLocationTree(tree)).catch(()=>{}).finally(()=>setLocationLoading(false)); }, []); const setLocation = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((slug)=>{ setLocationSlug(slug); const encoded = encodeURIComponent(slug); document.cookie = `canhelp_location=${encoded}; path=/; max-age=31536000; SameSite=Lax`; }, []); const getLabel = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((locale)=>{ if (!locationSlug) return ''; for (const city of locationTree){ if (city.slug === locationSlug) return city.names[locale] ?? city.names.el; for (const d of city.children ?? []){ if (d.slug === locationSlug) return d.names[locale] ?? d.names.el; } } return locationSlug; }, [ locationSlug, locationTree ]); return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(LocationContext.Provider, { value: { locationSlug, locationTree, locationLoading, setLocation, getLabel }, children: children }); } function useLocation() { return (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(LocationContext); } /***/ }) IL  MZM9/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocationProvider: () => (/* binding */ LocationProvider), /* harmony export */ z: () => (/* binding */ useLocation) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _lib_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(91864); [B /* __next_internal_client_entry_do_not_use__ LocationProvider,useLocation auto */ import { jsx as _jsx } from "react/jsx-runtime"; import { createContext, useContext, useState, useEffect, useCallback } from 'react'; import { getLocations } from '@/lib/api'; const LocationContext = /*#__PURE__*/ createContext({ locationSlug: '', locationTree: [], locationLoading: true, setLocation: ()=>{}, getLabel: ()=>'' }); function readCookieLocation() { if (typeof document === 'undefined') return ''; const match = document.cookie.match(/(?:^|;\s*)canhelp_location=([^;]+)/); return match?.[1] ? decodeURIComponent(match[1]) : ''; } export function LocationProvider({ children, initialSlug = '' }) { const [locationSlug, setLocationSlug] = useState(initialSlug); const [locationTree, setLocationTree] = useState([]); const [locationLoading, setLocationLoading] = useState(true); // Sync from cookie on client mount process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const cookieSlug = readCookieLocation(); setLocationSlug(cookieSlug); }, []); // Load location tree once process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ getLocations().then((tree)=>setLocationTree(tree)).catch(()=>{}).finally(()=>setLocationLoading(false)); }, []); const setLocation = useCallback((slug)=>{ setLocationSlug(slug); const encoded = encodeURIComponent(slug); document.cookie = `canhelp_location=${encoded}; path=/; max-age=31536000; SameSite=Lax`; }, []); const getLabel = useCallback((locale)=>{ if (!locationSlug) return ''; for (const city of locationTree){ if (city.slug === locationSlug) return city.names[locale] ?? city.names.el; for (const d of city.children ?? []){ if (d.slug === locationSlug) return d.names[locale] ?? d.names.el; } } return locationSlug; }, [ locationSlug, locationTree ]); return /*#__PURE__*/ _jsx(LocationContext.Provider, { value: { locationSlug, locationTree, locationLoading, setLocation, getLabel }, children: children }); } export function useLocation() { return useContext(LocationContext); } +82129undefined131214undefined216256undefined296308(0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)undefined657663undefined768775(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined835842(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined899906(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined10101018(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)undefined12101218(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)undefined12341245(0,_lib_api__WEBPACK_IMPORTED_MODULE_2__/* .getLocations */ .Vs)undefined13751385(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)undefined16081618(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)undefined20712074(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined22962302undefined23392348(0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)undefinedLN, /***/ 58719:  `pwebpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource fwebpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceN // EXPORTS __webpack_require__.d(__webpack_exports__, { Header: () => (/* binding */ Header) }); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js var react_jsx_runtime = __webpack_require__(78157); // EXTERNAL MODULE: ../../node_modules/next/dist/client/app-dir/link.js var app_dir_link = __webpack_require__(94496); var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); // EXTERNAL MODULE: ../../node_modules/next/dist/api/navigation.js var navigation = __webpack_require__(71159); // EXTERNAL MODULE: ./src/lib/auth.ts var auth = __webpack_require__(13260); // EXTERNAL MODULE: ./src/context/locale.tsx var context_locale = __webpack_require__(96484); // EXTERNAL MODULE: ./src/lib/formatName.ts var formatName = __webpack_require__(48178); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react.js var react = __webpack_require__(31768); // EXTERNAL MODULE: ./src/lib/translations.ts var translations = __webpack_require__(12998); ;// ./src/components/LanguageSwitcher.tsx webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource Rwebpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource]/* __next_internal_client_entry_do_not_use__ LanguageSwitcher auto */ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useState, useRef, useEffect } from 'react'; import { useLocale } from '@/context/locale'; import { LOCALES } from '@/lib/translations'; export function LanguageSwitcher() { const { locale, setLocale } = useLocale(); const [open, setOpen] = useState(false); const ref = useRef(null); const current = LOCALES.find((l)=>l.code === locale) ?? LOCALES[0]; // Close on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ function handleClick(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false); } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); return /*#__PURE__*/ _jsxs("div", { ref: ref, className: "relative", children: [ /*#__PURE__*/ _jsxs("button", { onClick: ()=>setOpen(!open), className: "flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg border border-gray-200 hover:border-blue-400 hover:bg-blue-50 transition text-sm font-medium text-gray-700", "aria-label": "Change language", children: [ /*#__PURE__*/ _jsx("span", { children: current.code.toUpperCase() }), /*#__PURE__*/ _jsx("svg", { className: `w-3.5 h-3.5 text-gray-400 transition-transform ${open ? 'rotate-180' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), open && /*#__PURE__*/ _jsx("div", { className: "absolute right-0 mt-1 w-40 bg-white border border-gray-200 rounded-xl shadow-lg z-50 overflow-hidden", children: LOCALES.map((loc)=>/*#__PURE__*/ _jsxs("button", { onClick: ()=>{ setLocale(loc.code); setOpen(false); }, className: `w-full flex items-center gap-2.5 px-3.5 py-2.5 text-sm hover:bg-blue-50 transition ${locale === loc.code ? 'bg-blue-50 text-blue-700 font-medium' : 'text-gray-700'}`, children: [ /*#__PURE__*/ _jsx("span", { children: loc.label }), locale === loc.code && /*#__PURE__*/ _jsx("svg", { className: "w-3.5 h-3.5 ml-auto text-blue-600", fill: "currentColor", viewBox: "0 0 20 20", children: /*#__PURE__*/ _jsx("path", { fillRule: "evenodd", d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", clipRule: "evenodd" }) }) ] }, loc.code)) }) ] }); } aF_^fS[dgEHcJf  / 3 __WEBPACK_MODULE_REFERENCE__4_5b227573654c6f63616c65225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_call_asiSafe1__.___WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_asiSafe1__.___WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._buffersourcesizemapshash>/* __next_internal_client_entry_do_not_use__ LanguageSwitcher auto */ function LanguageSwitcher() { const { locale, setLocale } = __WEBPACK_MODULE_REFERENCE__4_5b227573654c6f63616c65225d_call_directImport_asiSafe1__._(); const [open, setOpen] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._(false); const ref = __WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._(null); const current = __WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_call_asiSafe1__._.find((l)=>l.code === locale) ?? __WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_asiSafe1__._[0]; // Close on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && __WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._(()=>{ function handleClick(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false); } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); return /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("div", { ref: ref, className: "relative", children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("button", { onClick: ()=>setOpen(!open), className: "flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg border border-gray-200 hover:border-blue-400 hover:bg-blue-50 transition text-sm font-medium text-gray-700", "aria-label": "Change language", children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("span", { children: current.code.toUpperCase() }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: `w-3.5 h-3.5 text-gray-400 transition-transform ${open ? 'rotate-180' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), open && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("div", { className: "absolute right-0 mt-1 w-40 bg-white border border-gray-200 rounded-xl shadow-lg z-50 overflow-hidden", children: __WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_call_asiSafe1__._.map((loc)=>/*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("button", { onClick: ()=>{ setLocale(loc.code); setOpen(false); }, className: `w-full flex items-center gap-2.5 px-3.5 py-2.5 text-sm hover:bg-blue-50 transition ${locale === loc.code ? 'bg-blue-50 text-blue-700 font-medium' : 'text-gray-700'}`, children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("span", { children: loc.label }), locale === loc.code && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-3.5 h-3.5 ml-auto text-blue-600", fill: "currentColor", viewBox: "0 0 20 20", children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { fillRule: "evenodd", d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", clipRule: "evenodd" }) }) ] }, loc.code)) }) ] }); } {"finalSource":false}mapbufferedMap ReplaceSourceRawSource]/* __next_internal_client_entry_do_not_use__ LanguageSwitcher auto */ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useState, useRef, useEffect } from 'react'; import { useLocale } from '@/context/locale'; import { LOCALES } from '@/lib/translations'; export function LanguageSwitcher() { const { locale, setLocale } = useLocale(); const [open, setOpen] = useState(false); const ref = useRef(null); const current = LOCALES.find((l)=>l.code === locale) ?? LOCALES[0]; // Close on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ function handleClick(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false); } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); return /*#__PURE__*/ _jsxs("div", { ref: ref, className: "relative", children: [ /*#__PURE__*/ _jsxs("button", { onClick: ()=>setOpen(!open), className: "flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg border border-gray-200 hover:border-blue-400 hover:bg-blue-50 transition text-sm font-medium text-gray-700", "aria-label": "Change language", children: [ /*#__PURE__*/ _jsx("span", { children: current.code.toUpperCase() }), /*#__PURE__*/ _jsx("svg", { className: `w-3.5 h-3.5 text-gray-400 transition-transform ${open ? 'rotate-180' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), open && /*#__PURE__*/ _jsx("div", { className: "absolute right-0 mt-1 w-40 bg-white border border-gray-200 rounded-xl shadow-lg z-50 overflow-hidden", children: LOCALES.map((loc)=>/*#__PURE__*/ _jsxs("button", { onClick: ()=>{ setLocale(loc.code); setOpen(false); }, className: `w-full flex items-center gap-2.5 px-3.5 py-2.5 text-sm hover:bg-blue-50 transition ${locale === loc.code ? 'bg-blue-50 text-blue-700 font-medium' : 'text-gray-700'}`, children: [ /*#__PURE__*/ _jsx("span", { children: loc.label }), locale === loc.code && /*#__PURE__*/ _jsx("svg", { className: "w-3.5 h-3.5 ml-auto text-blue-600", fill: "currentColor", viewBox: "0 0 20 20", children: /*#__PURE__*/ _jsx("path", { fillRule: "evenodd", d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", clipRule: "evenodd" }) }) ] }, loc.code)) }) ] }); } r70132undefined134185undefined187231undefined233277undefined279285undefined350358__WEBPACK_MODULE_REFERENCE__4_5b227573654c6f63616c65225d_call_directImport_asiSafe1__._undefined391398__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined424429__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined458464__WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_call_asiSafe1__._undefined498504__WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_asiSafe1__._undefined595603__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined908912__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined10181022__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined13801383__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined15141517__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined18611864__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined21472150__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined23182324__WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_call_asiSafe1__._undefined23512355__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined28092812__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined29732976__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined32313234__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined`_Uo!C4eg< ? O:A9(0,context_locale/* useLocale */.Y)(0,react.useState)(0,react.useRef)translations/* LOCALES */.YZ(0,react.useEffect)(0,react_jsx_runtime.jsxs)(0,react_jsx_runtime.jsx) // EXTERNAL MODULE: ./src/lib/api.ts var api = __webpack_require__(91864); // EXTERNAL MODULE: ../../node_modules/socket.io-client/build/esm-debug/index.js + 30 modules var esm_debug = __webpack_require__(44826); ;// ./src/components/Header.tsx  8webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource"(/* __next_internal_client_entry_do_not_use__ Header auto */ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; import Link from 'next/link'; import { useRouter, usePathname } from 'next/navigation'; import { useSession, signOut } from '@/lib/auth'; import { useLocale } from '@/context/locale'; import { formatShortName } from '@/lib/formatName'; import { LanguageSwitcher } from './LanguageSwitcher'; import { useState, useRef, useEffect } from 'react'; import { getUnreadCount, getMyDashboard } from '@/lib/api'; import { io } from 'socket.io-client'; const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; export function Header() { const router = useRouter(); const pathname = usePathname(); const { data: session } = useSession(); const { t, locale } = useLocale(); const [menuOpen, setMenuOpen] = useState(false); const [profileOpen, setProfileOpen] = useState(false); const [unreadNotif, setUnreadNotif] = useState(0); const [unreadChat, setUnreadChat] = useState(0); const [msgToast, setMsgToast] = useState(null); const [planTier, setPlanTier] = useState(null); const profileRef = useRef(null); const headerRef = useRef(null); const toastTimer = useRef(null); // Close dropdowns on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ function handleClick(e) { if (profileRef.current && !profileRef.current.contains(e.target)) { setProfileOpen(false); } } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); const isAdmin = session?.user?.role === 'admin'; const isSpecialist = session?.user?.role === 'specialist'; // Reset chat badge when entering chat process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (pathname === '/chat') setUnreadChat(0); }, [ pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) return; const socket = io(API_URL, { withCredentials: true, transports: [ 'websocket', 'polling' ] }); socket.on('new_message', (msg)=>{ if (pathname === '/chat') return; setUnreadChat((c)=>c + 1); if (toastTimer.current) clearTimeout(toastTimer.current); setMsgToast(msg); toastTimer.current = setTimeout(()=>setMsgToast(null), 5000); }); return ()=>{ socket.disconnect(); if (toastTimer.current) clearTimeout(toastTimer.current); }; }, [ session, pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) { setUnreadNotif(0); return; } const fetch = ()=>getUnreadCount().then((r)=>setUnreadNotif(r.count)).catch(()=>{}); fetch(); const timer = setInterval(fetch, 30000); return ()=>clearInterval(timer); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) { setPlanTier(null); return; } getMyDashboard().then((d)=>setPlanTier(d.plan?.tier ?? null)).catch(()=>{}); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const onScroll = ()=>{ if (!headerRef.current) return; if (window.scrollY > 40) { headerRef.current.classList.add('header-shrink'); } else { headerRef.current.classList.remove('header-shrink'); } }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx("header", { ref: headerRef, className: "header-base bg-white border-b border-gray-200 sticky top-0 z-50 transition-all duration-300", children: /*#__PURE__*/ _jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [ /*#__PURE__*/ _jsxs("div", { className: "flex items-center justify-between h-16 header-content transition-all duration-300", children: [ /*#__PURE__*/ _jsx(Link, { href: "/", className: "flex items-center shrink-0", children: /*#__PURE__*/ _jsx("span", { className: "logo-text text-2xl font-bold text-blue-600 transition-all duration-300", children: "CanHelp" }) }), /*#__PURE__*/ _jsxs("nav", { className: "hidden md:flex items-center gap-5 ml-auto", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/tasks", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.find_tasks') }), /*#__PURE__*/ _jsx(Link, { href: "/dashboard", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.dashboard') }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/tasks/new", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('dashboard.new_task') }), /*#__PURE__*/ _jsx(Link, { href: "/specialists", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.specialists') }) ] }), /*#__PURE__*/ _jsx(Link, { href: "/pricing", className: `font-medium text-sm transition ${pathname === '/pricing' ? 'text-blue-600' : 'text-gray-600 hover:text-blue-600'}`, children: t('nav.pricing', 'Pricing') }), session ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ _jsx("svg", { className: `w-5 h-5 ${unreadNotif > 0 ? 'text-orange-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ _jsx("svg", { className: `w-5 h-5 ${unreadChat > 0 ? 'text-green-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }), /*#__PURE__*/ _jsxs("div", { className: "relative", ref: profileRef, children: [ /*#__PURE__*/ _jsxs("button", { onClick: ()=>setProfileOpen(!profileOpen), className: "flex items-center gap-1.5 text-sm font-medium text-gray-600 hover:text-blue-600", children: [ /*#__PURE__*/ _jsx("span", { className: "truncate max-w-[100px]", children: formatShortName(session.user.firstName, session.user.lastName, session.user.name) }), planTier === 'pro' && /*#__PURE__*/ _jsx("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-blue-100 text-blue-700 leading-none", children: "Pro" }), planTier === 'ultimate' && /*#__PURE__*/ _jsx("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-gradient-to-r from-amber-400 via-yellow-400 to-amber-400 text-gray-900 shadow-sm shadow-amber-300/50 leading-none", children: "★" }), /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), profileOpen && /*#__PURE__*/ _jsxs("div", { className: "absolute right-0 mt-2 w-52 bg-white border border-gray-200 rounded-xl shadow-lg py-1 z-50", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 shrink-0 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 shrink-0 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/tasks", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ _jsxs(Link, { href: "/schedule", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/admin", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsxs("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/profile", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/favorites", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), /*#__PURE__*/ _jsx("hr", { className: "my-1 border-gray-100" }), /*#__PURE__*/ _jsxs("button", { className: "w-full flex items-center gap-2.5 px-4 py-2 text-sm text-red-500 hover:bg-red-50", onClick: ()=>{ setProfileOpen(false); signOut().then(()=>{ window.location.href = '/'; }); }, children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/login", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.login') }), /*#__PURE__*/ _jsx(Link, { href: "/register", className: "bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 font-medium text-sm", children: t('nav.register') }) ] }), /*#__PURE__*/ _jsx(LanguageSwitcher, {}) ] }), /*#__PURE__*/ _jsxs("div", { className: "md:hidden flex items-center gap-2", children: [ /*#__PURE__*/ _jsx(LanguageSwitcher, {}), /*#__PURE__*/ _jsx("button", { className: "p-2", onClick: ()=>setMenuOpen(!menuOpen), "aria-label": "Toggle menu", children: /*#__PURE__*/ _jsx("svg", { className: "w-5 h-5 text-gray-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: menuOpen ? /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) : /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4 6h16M4 12h16M4 18h16" }) }) }) ] }) ] }), menuOpen && /*#__PURE__*/ _jsxs("div", { className: "md:hidden py-4 border-t border-gray-100 flex flex-col gap-3", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }), session ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "ml-1 px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full", children: unreadChat }) ] }), isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/favorites", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ _jsxs(Link, { href: "/schedule", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/admin", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsxs("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/profile", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ _jsxs("button", { onClick: ()=>{ setMenuOpen(false); signOut().then(()=>{ window.location.href = '/'; }); }, className: "flex items-center gap-2 text-left text-red-500 py-1 font-medium", children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/login", className: "text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.login') }), /*#__PURE__*/ _jsx(Link, { href: "/register", className: "text-blue-600 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.register') }) ] }) ] }) ] }) }), msgToast && /*#__PURE__*/ _jsx("div", { className: "fixed bottom-5 right-5 z-[200] max-w-sm w-full", children: /*#__PURE__*/ _jsxs("div", { className: "bg-white border border-gray-200 rounded-xl shadow-xl p-4 flex items-start gap-3 animate-fade-in", children: [ /*#__PURE__*/ _jsx("span", { className: "text-2xl shrink-0", children: "\uD83D\uDCAC" }), /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-0", children: [ /*#__PURE__*/ _jsx("p", { className: "font-semibold text-gray-900 text-sm", children: t('chat.toast_title') }), /*#__PURE__*/ _jsx("p", { className: "text-xs text-gray-500 truncate mt-0.5", children: msgToast.body }) ] }), /*#__PURE__*/ _jsxs("div", { className: "flex flex-col items-end gap-2 shrink-0", children: [ /*#__PURE__*/ _jsx("button", { onClick: ()=>setMsgToast(null), className: "text-gray-400 hover:text-gray-600 text-lg leading-none", "aria-label": "close", children: "\xd7" }), /*#__PURE__*/ _jsx(Link, { href: `/chat?room=${msgToast.roomId}`, onClick: ()=>setMsgToast(null), className: "text-xs text-blue-600 hover:underline font-medium", children: t('chat.toast_open') }) ] }) ] }) }) ] }); } @`<_IK}%'L^| ?_Gpw"LS]e%-jk0 8 _ " / MQ.13648"*_-/2mpru %)+. ""M%_P%''''((++z-}-//0022S3a3M4P4 6#6$8'8M:P:<<*>.>0>_8>>>>>AACCGGGGIILIKK;P?PAPIPPPPP1S4SUUY!YZ_Z@^D^F^I^t`w`6c9c*f.fggCkGkIkLk|mmpp}ttttvvxx@|D|F|_I|P~S~!#&*.;?ADJM ru_Z] !$+svxŰ_Ȱ'+z~Ȼ˻ $&)ruPTV_^KNTXZ]cgil^a_&KNKNx{x{jnpsCF_PS{~{~RU"%gj7:A_ELO  9=?Bor14NQSVT*-  F!J!!!""#$$$5&8&:&=&"https://api.canhelp.gr"0__WEBPACK_MODULE_REFERENCE__2_5b22757365526f75746572225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__2_5b22757365506174686e616d65225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__3_5b2275736553657373696f6e225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__4_5b227573654c6f63616c65225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__10_5b22696f225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__9_5b22676574556e72656164436f756e74225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__9_5b226765744d7944617368626f617264225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__5_5b22666f726d617453686f72744e616d65225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__3_5b227369676e4f7574225d_call_directImport_asiSafe1__.___WEBPACK_MODULE_REFERENCE__8_5b224c616e67756167655377697463686572225d_directImport_asiSafe1__._d/* __next_internal_client_entry_do_not_use__ Header auto */ const API_URL = "https://api.canhelp.gr" || 0; function Header() { const router = __WEBPACK_MODULE_REFERENCE__2_5b22757365526f75746572225d_call_directImport_asiSafe1__._(); const pathname = __WEBPACK_MODULE_REFERENCE__2_5b22757365506174686e616d65225d_call_directImport_asiSafe1__._(); const { data: session } = __WEBPACK_MODULE_REFERENCE__3_5b2275736553657373696f6e225d_call_directImport_asiSafe1__._(); const { t, locale } = __WEBPACK_MODULE_REFERENCE__4_5b227573654c6f63616c65225d_call_directImport_asiSafe1__._(); const [menuOpen, setMenuOpen] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._(false); const [profileOpen, setProfileOpen] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._(false); const [unreadNotif, setUnreadNotif] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._(0); const [unreadChat, setUnreadChat] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._(0); const [msgToast, setMsgToast] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._(null); const [planTier, setPlanTier] = __WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._(null); const profileRef = __WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._(null); const headerRef = __WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._(null); const toastTimer = __WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._(null); // Close dropdowns on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && __WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._(()=>{ function handleClick(e) { if (profileRef.current && !profileRef.current.contains(e.target)) { setProfileOpen(false); } } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); const isAdmin = session?.user?.role === 'admin'; const isSpecialist = session?.user?.role === 'specialist'; // Reset chat badge when entering chat process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && __WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._(()=>{ if (pathname === '/chat') setUnreadChat(0); }, [ pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && __WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._(()=>{ if (!session) return; const socket = __WEBPACK_MODULE_REFERENCE__10_5b22696f225d_call_directImport_asiSafe1__._(API_URL, { withCredentials: true, transports: [ 'websocket', 'polling' ] }); socket.on('new_message', (msg)=>{ if (pathname === '/chat') return; setUnreadChat((c)=>c + 1); if (toastTimer.current) clearTimeout(toastTimer.current); setMsgToast(msg); toastTimer.current = setTimeout(()=>setMsgToast(null), 5000); }); return ()=>{ socket.disconnect(); if (toastTimer.current) clearTimeout(toastTimer.current); }; }, [ session, pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && __WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._(()=>{ if (!session) { setUnreadNotif(0); return; } const fetch = ()=>__WEBPACK_MODULE_REFERENCE__9_5b22676574556e72656164436f756e74225d_call_directImport_asiSafe1__._().then((r)=>setUnreadNotif(r.count)).catch(()=>{}); fetch(); const timer = setInterval(fetch, 30000); return ()=>clearInterval(timer); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && __WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._(()=>{ if (!session) { setPlanTier(null); return; } __WEBPACK_MODULE_REFERENCE__9_5b226765744d7944617368626f617264225d_call_directImport_asiSafe1__._().then((d)=>setPlanTier(d.plan?.tier ?? null)).catch(()=>{}); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && __WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._(()=>{ const onScroll = ()=>{ if (!headerRef.current) return; if (window.scrollY > 40) { headerRef.current.classList.add('header-shrink'); } else { headerRef.current.classList.remove('header-shrink'); } }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._, { children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("header", { ref: headerRef, className: "header-base bg-white border-b border-gray-200 sticky top-0 z-50 transition-all duration-300", children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("div", { className: "flex items-center justify-between h-16 header-content transition-all duration-300", children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/", className: "flex items-center shrink-0", children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("span", { className: "logo-text text-2xl font-bold text-blue-600 transition-all duration-300", children: "CanHelp" }) }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("nav", { className: "hidden md:flex items-center gap-5 ml-auto", children: [ isSpecialist ? /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._, { children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/tasks", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.find_tasks') }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/dashboard", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.dashboard') }) ] }) : /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._, { children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/tasks/new", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('dashboard.new_task') }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/specialists", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.specialists') }) ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/pricing", className: `font-medium text-sm transition ${pathname === '/pricing' ? 'text-blue-600' : 'text-gray-600 hover:text-blue-600'}`, children: t('nav.pricing', 'Pricing') }), session ? /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._, { children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/notifications", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: `w-5 h-5 ${unreadNotif > 0 ? 'text-orange-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), unreadNotif > 0 && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/chat", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: `w-5 h-5 ${unreadChat > 0 ? 'text-green-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), unreadChat > 0 && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("div", { className: "relative", ref: profileRef, children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("button", { onClick: ()=>setProfileOpen(!profileOpen), className: "flex items-center gap-1.5 text-sm font-medium text-gray-600 hover:text-blue-600", children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("span", { className: "truncate max-w-[100px]", children: __WEBPACK_MODULE_REFERENCE__5_5b22666f726d617453686f72744e616d65225d_call_directImport_asiSafe1__._(session.user.firstName, session.user.lastName, session.user.name) }), planTier === 'pro' && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-blue-100 text-blue-700 leading-none", children: "Pro" }), planTier === 'ultimate' && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-gradient-to-r from-amber-400 via-yellow-400 to-amber-400 text-gray-900 shadow-sm shadow-amber-300/50 leading-none", children: "★" }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), profileOpen && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("div", { className: "absolute right-0 mt-2 w-52 bg-white border border-gray-200 rounded-xl shadow-lg py-1 z-50", children: [ isSpecialist ? /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._, { children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/tasks/new", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/specialists", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._, { children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/notifications", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: `w-4 h-4 shrink-0 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/chat", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: `w-4 h-4 shrink-0 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("span", { className: "flex items-center gap-1.5", children: [ t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("span", { className: "px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }) ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/dashboard", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), isAdmin && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/tasks", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/schedule", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/admin", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/profile", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/favorites", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("hr", { className: "my-1 border-gray-100" }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("button", { className: "w-full flex items-center gap-2.5 px-4 py-2 text-sm text-red-500 hover:bg-red-50", onClick: ()=>{ setProfileOpen(false); __WEBPACK_MODULE_REFERENCE__3_5b227369676e4f7574225d_call_directImport_asiSafe1__._().then(()=>{ window.location.href = '/'; }); }, children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) ] }) ] }) : /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._, { children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/login", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.login') }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/register", className: "bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 font-medium text-sm", children: t('nav.register') }) ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__8_5b224c616e67756167655377697463686572225d_directImport_asiSafe1__._, {}) ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("div", { className: "md:hidden flex items-center gap-2", children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__8_5b224c616e67756167655377697463686572225d_directImport_asiSafe1__._, {}), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("button", { className: "p-2", onClick: ()=>setMenuOpen(!menuOpen), "aria-label": "Toggle menu", children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-5 h-5 text-gray-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: menuOpen ? /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) : /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4 6h16M4 12h16M4 18h16" }) }) }) ] }) ] }), menuOpen && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("div", { className: "md:hidden py-4 border-t border-gray-100 flex flex-col gap-3", children: [ isSpecialist ? /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._, { children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/tasks", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }) : /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._, { children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }), session ? /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._, { children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/chat", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: `w-4 h-4 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("span", { className: "ml-1 px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full", children: unreadChat }) ] }), isSpecialist ? /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._, { children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._, { children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/notifications", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: `w-4 h-4 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/favorites", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/schedule", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/admin", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/profile", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("button", { onClick: ()=>{ setMenuOpen(false); __WEBPACK_MODULE_REFERENCE__3_5b227369676e4f7574225d_call_directImport_asiSafe1__._().then(()=>{ window.location.href = '/'; }); }, className: "flex items-center gap-2 text-left text-red-500 py-1 font-medium", children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) : /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._, { children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/login", className: "text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.login') }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: "/register", className: "text-blue-600 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.register') }) ] }) ] }) ] }) }), msgToast && /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("div", { className: "fixed bottom-5 right-5 z-[200] max-w-sm w-full", children: /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("div", { className: "bg-white border border-gray-200 rounded-xl shadow-xl p-4 flex items-start gap-3 animate-fade-in", children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("span", { className: "text-2xl shrink-0", children: "\uD83D\uDCAC" }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("div", { className: "flex-1 min-w-0", children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("p", { className: "font-semibold text-gray-900 text-sm", children: t('chat.toast_title') }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("p", { className: "text-xs text-gray-500 truncate mt-0.5", children: msgToast.body }) ] }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._("div", { className: "flex flex-col items-end gap-2 shrink-0", children: [ /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._("button", { onClick: ()=>setMsgToast(null), className: "text-gray-400 hover:text-gray-600 text-lg leading-none", "aria-label": "close", children: "\xd7" }), /*#__PURE__*/ __WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._(__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._, { href: `/chat?room=${msgToast.roomId}`, onClick: ()=>setMsgToast(null), className: "text-xs text-blue-600 hover:underline font-medium", children: t('chat.toast_open') }) ] }) ] }) }) ] }); }  "(/* __next_internal_client_entry_do_not_use__ Header auto */ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; import Link from 'next/link'; import { useRouter, usePathname } from 'next/navigation'; import { useSession, signOut } from '@/lib/auth'; import { useLocale } from '@/context/locale'; import { formatShortName } from '@/lib/formatName'; import { LanguageSwitcher } from './LanguageSwitcher'; import { useState, useRef, useEffect } from 'react'; import { getUnreadCount, getMyDashboard } from '@/lib/api'; import { io } from 'socket.io-client'; const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; export function Header() { const router = useRouter(); const pathname = usePathname(); const { data: session } = useSession(); const { t, locale } = useLocale(); const [menuOpen, setMenuOpen] = useState(false); const [profileOpen, setProfileOpen] = useState(false); const [unreadNotif, setUnreadNotif] = useState(0); const [unreadChat, setUnreadChat] = useState(0); const [msgToast, setMsgToast] = useState(null); const [planTier, setPlanTier] = useState(null); const profileRef = useRef(null); const headerRef = useRef(null); const toastTimer = useRef(null); // Close dropdowns on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ function handleClick(e) { if (profileRef.current && !profileRef.current.contains(e.target)) { setProfileOpen(false); } } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); const isAdmin = session?.user?.role === 'admin'; const isSpecialist = session?.user?.role === 'specialist'; // Reset chat badge when entering chat process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (pathname === '/chat') setUnreadChat(0); }, [ pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) return; const socket = io(API_URL, { withCredentials: true, transports: [ 'websocket', 'polling' ] }); socket.on('new_message', (msg)=>{ if (pathname === '/chat') return; setUnreadChat((c)=>c + 1); if (toastTimer.current) clearTimeout(toastTimer.current); setMsgToast(msg); toastTimer.current = setTimeout(()=>setMsgToast(null), 5000); }); return ()=>{ socket.disconnect(); if (toastTimer.current) clearTimeout(toastTimer.current); }; }, [ session, pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) { setUnreadNotif(0); return; } const fetch = ()=>getUnreadCount().then((r)=>setUnreadNotif(r.count)).catch(()=>{}); fetch(); const timer = setInterval(fetch, 30000); return ()=>clearInterval(timer); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) { setPlanTier(null); return; } getMyDashboard().then((d)=>setPlanTier(d.plan?.tier ?? null)).catch(()=>{}); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const onScroll = ()=>{ if (!headerRef.current) return; if (window.scrollY > 40) { headerRef.current.classList.add('header-shrink'); } else { headerRef.current.classList.remove('header-shrink'); } }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx("header", { ref: headerRef, className: "header-base bg-white border-b border-gray-200 sticky top-0 z-50 transition-all duration-300", children: /*#__PURE__*/ _jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [ /*#__PURE__*/ _jsxs("div", { className: "flex items-center justify-between h-16 header-content transition-all duration-300", children: [ /*#__PURE__*/ _jsx(Link, { href: "/", className: "flex items-center shrink-0", children: /*#__PURE__*/ _jsx("span", { className: "logo-text text-2xl font-bold text-blue-600 transition-all duration-300", children: "CanHelp" }) }), /*#__PURE__*/ _jsxs("nav", { className: "hidden md:flex items-center gap-5 ml-auto", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/tasks", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.find_tasks') }), /*#__PURE__*/ _jsx(Link, { href: "/dashboard", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.dashboard') }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/tasks/new", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('dashboard.new_task') }), /*#__PURE__*/ _jsx(Link, { href: "/specialists", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.specialists') }) ] }), /*#__PURE__*/ _jsx(Link, { href: "/pricing", className: `font-medium text-sm transition ${pathname === '/pricing' ? 'text-blue-600' : 'text-gray-600 hover:text-blue-600'}`, children: t('nav.pricing', 'Pricing') }), session ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ _jsx("svg", { className: `w-5 h-5 ${unreadNotif > 0 ? 'text-orange-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ _jsx("svg", { className: `w-5 h-5 ${unreadChat > 0 ? 'text-green-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }), /*#__PURE__*/ _jsxs("div", { className: "relative", ref: profileRef, children: [ /*#__PURE__*/ _jsxs("button", { onClick: ()=>setProfileOpen(!profileOpen), className: "flex items-center gap-1.5 text-sm font-medium text-gray-600 hover:text-blue-600", children: [ /*#__PURE__*/ _jsx("span", { className: "truncate max-w-[100px]", children: formatShortName(session.user.firstName, session.user.lastName, session.user.name) }), planTier === 'pro' && /*#__PURE__*/ _jsx("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-blue-100 text-blue-700 leading-none", children: "Pro" }), planTier === 'ultimate' && /*#__PURE__*/ _jsx("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-gradient-to-r from-amber-400 via-yellow-400 to-amber-400 text-gray-900 shadow-sm shadow-amber-300/50 leading-none", children: "★" }), /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), profileOpen && /*#__PURE__*/ _jsxs("div", { className: "absolute right-0 mt-2 w-52 bg-white border border-gray-200 rounded-xl shadow-lg py-1 z-50", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 shrink-0 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 shrink-0 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/tasks", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ _jsxs(Link, { href: "/schedule", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/admin", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsxs("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/profile", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/favorites", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), /*#__PURE__*/ _jsx("hr", { className: "my-1 border-gray-100" }), /*#__PURE__*/ _jsxs("button", { className: "w-full flex items-center gap-2.5 px-4 py-2 text-sm text-red-500 hover:bg-red-50", onClick: ()=>{ setProfileOpen(false); signOut().then(()=>{ window.location.href = '/'; }); }, children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/login", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.login') }), /*#__PURE__*/ _jsx(Link, { href: "/register", className: "bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 font-medium text-sm", children: t('nav.register') }) ] }), /*#__PURE__*/ _jsx(LanguageSwitcher, {}) ] }), /*#__PURE__*/ _jsxs("div", { className: "md:hidden flex items-center gap-2", children: [ /*#__PURE__*/ _jsx(LanguageSwitcher, {}), /*#__PURE__*/ _jsx("button", { className: "p-2", onClick: ()=>setMenuOpen(!menuOpen), "aria-label": "Toggle menu", children: /*#__PURE__*/ _jsx("svg", { className: "w-5 h-5 text-gray-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: menuOpen ? /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) : /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4 6h16M4 12h16M4 18h16" }) }) }) ] }) ] }), menuOpen && /*#__PURE__*/ _jsxs("div", { className: "md:hidden py-4 border-t border-gray-100 flex flex-col gap-3", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }), session ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "ml-1 px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full", children: unreadChat }) ] }), isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/favorites", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ _jsxs(Link, { href: "/schedule", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/admin", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsxs("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/profile", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ _jsxs("button", { onClick: ()=>{ setMenuOpen(false); signOut().then(()=>{ window.location.href = '/'; }); }, className: "flex items-center gap-2 text-left text-red-500 py-1 font-medium", children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/login", className: "text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.login') }), /*#__PURE__*/ _jsx(Link, { href: "/register", className: "text-blue-600 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.register') }) ] }) ] }) ] }) }), msgToast && /*#__PURE__*/ _jsx("div", { className: "fixed bottom-5 right-5 z-[200] max-w-sm w-full", children: /*#__PURE__*/ _jsxs("div", { className: "bg-white border border-gray-200 rounded-xl shadow-xl p-4 flex items-start gap-3 animate-fade-in", children: [ /*#__PURE__*/ _jsx("span", { className: "text-2xl shrink-0", children: "\uD83D\uDCAC" }), /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-0", children: [ /*#__PURE__*/ _jsx("p", { className: "font-semibold text-gray-900 text-sm", children: t('chat.toast_title') }), /*#__PURE__*/ _jsx("p", { className: "text-xs text-gray-500 truncate mt-0.5", children: msgToast.body }) ] }), /*#__PURE__*/ _jsxs("div", { className: "flex flex-col items-end gap-2 shrink-0", children: [ /*#__PURE__*/ _jsx("button", { onClick: ()=>setMsgToast(null), className: "text-gray-400 hover:text-gray-600 text-lg leading-none", "aria-label": "close", children: "\xd7" }), /*#__PURE__*/ _jsx(Link, { href: `/chat?room=${msgToast.roomId}`, onClick: ()=>setMsgToast(null), className: "text-xs text-blue-600 hover:underline font-medium", children: t('chat.toast_open') }) ] }) ] }) }) ] }); } PT60145undefined147175undefined177233undefined235283undefined285329undefined331381undefined383436undefined438489undefined491549undefined551588undefined606636"https://api.canhelp.gr"undefined6416630undefined666672undefined712720__WEBPACK_MODULE_REFERENCE__2_5b22757365526f75746572225d_call_directImport_asiSafe1__._undefined746756__WEBPACK_MODULE_REFERENCE__2_5b22757365506174686e616d65225d_call_directImport_asiSafe1__._undefined791800__WEBPACK_MODULE_REFERENCE__3_5b2275736553657373696f6e225d_call_directImport_asiSafe1__._undefined831839__WEBPACK_MODULE_REFERENCE__4_5b227573654c6f63616c65225d_call_directImport_asiSafe1__._undefined880887__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined939946__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined9981005__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined10511058__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined11001107__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined11521159__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined11911196__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined12271232__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined12641269__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined13731381__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined19281936__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined20852093__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined21542155__WEBPACK_MODULE_REFERENCE__10_5b22696f225d_call_directImport_asiSafe1__._undefined28642872__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined29913004__WEBPACK_MODULE_REFERENCE__9_5b22676574556e72656164436f756e74225d_call_directImport_asiSafe1__._undefined32533261__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined33623375__WEBPACK_MODULE_REFERENCE__9_5b226765744d7944617368626f617264225d_call_directImport_asiSafe1__._undefined35273535__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined39953999__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined40014009__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined40604063__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined42714275__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined44294433__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined46544657__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined46594662__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined48514854__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined51725176__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined53965400__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined54025410__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined55335536__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined55385541__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined59305933__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined59355938__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined63726376__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined63786386__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined65096512__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined65146517__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined69146917__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined69196922__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined73997402__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined74047407__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined78367840__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined78427850__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined79737977__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined79797982__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined83248327__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined88668869__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined95499552__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1013010134__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1013610139__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined1047210475__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1101211015__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1164211645__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1222312227__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1251612520__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1294112944__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1313913153__WEBPACK_MODULE_REFERENCE__5_5b22666f726d617453686f72744e616d65225d_call_directImport_asiSafe1__._undefined1338913392__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1385613859__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1437214375__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1492514928__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1557015574__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1591415918__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1592015928__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined1609916103__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1610516108__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined1666816671__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1733317336__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1819018194__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1819618199__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined1876118764__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1942619429__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2053920543__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2054520553__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined2072420728__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2073020733__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined2129721300__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2200522008__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2281322817__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2328223285__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2412824132__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2413424137__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined2469224695__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2539825401__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2615426158__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2661326616__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2745927463__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2746527468__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined2802828031__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2869328696__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2982129825__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2982729830__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3034630349__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3096330966__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3180831812__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3181431817__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3233632339__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3295332956__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3382133825__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3382733830__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3434634350__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3504635049__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3602936032__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3692336927__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3692936932__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3745037453__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3806738070__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3890438908__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3891038913__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3943339436__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4005040053__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4094540948__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4120641210__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4163641642__WEBPACK_MODULE_REFERENCE__3_5b227369676e4f7574225d_call_directImport_asiSafe1__._undefined4207442077__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4267742680__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4378743791__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4379343801__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined4392443927__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4392943932__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4431644319__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4432144324__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4482344826__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4482844843__WEBPACK_MODULE_REFERENCE__8_5b224c616e67756167655377697463686572225d_directImport_asiSafe1__._undefined4497044974__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4517145174__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4517645191__WEBPACK_MODULE_REFERENCE__8_5b224c616e67756167655377697463686572225d_directImport_asiSafe1__._undefined4525345256__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4555445557__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4600346006__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4631646319__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4688746891__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4710547109__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4711147119__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined4722647230__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4723247235__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4760847611__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4807248075__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4867248676__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4867848681__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4905849061__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4952249525__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5025650260__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5026250270__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5037750381__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5038350386__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5076350766__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5122751230__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5179651800__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5180251805__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5218452187__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5264852651__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5348253486__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5348853496__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5360353607__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5360953612__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5398453987__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5448954492__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5513455137__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5557655580__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5558255590__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5571355717__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5571955722__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5613956142__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5665156654__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5729257296__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5729857301__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5772057723__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5823258235__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5910559109__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5911159119__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5924259246__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5924859251__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5967259675__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6022760230__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6089160895__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6126461267__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6190561909__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6191161914__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6233162334__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6284362846__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6369663700__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6370263705__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6408264085__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6454664549__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6525465258__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6526065263__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6563965642__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6610366106__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6675566759__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6676166764__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6713767141__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6766067663__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6852368526__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6917769181__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6918369186__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6956169564__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7002570028__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7064670650__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7083970845__WEBPACK_MODULE_REFERENCE__3_5b227369676e4f7574225d_call_directImport_asiSafe1__._undefined7127971282__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7172971732__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7240572409__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7241172419__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined7252672529__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7253172534__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined7293272935__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7293772940__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined7351473517__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7364573649__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7386073863__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7405474058__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7421274215__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7446074463__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7475174755__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7493374936__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7531775320__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7532275325__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined_ fV[edCcq  _  [ vMFaOgi5Q7^`j>_fh2|~P!!!8""""L#$#%%%r%O'''')))2**_**H+,,/M/1?24445i6689;;>a>??sAABBCDE2F3H_}HJJoMMO[O]OOWPPPP"SlSVLVYYY=Zo\\O__c;d=dd7eee_ehPhk[knnpp2t~tttvBwzKz<}}O02و>_ٍݏ'ג!moØ sjl ߨ)?E?_͵ϵ$nԺ2.(ik5N$&_P_aHrzD|;Al_ Y_"9o %qs-y{_<|HIa .    G41{-/~_EG9G  #[#]##K%%''.+z+|++B--Y//d2222w4_466a9999q;;=>jAA?DDDDQFFhHHKhK%LwL)NsN2P|PSiSkS\S%ToTqTTLVVVV#YmYY9Z [V[\a\\E]:^^__``ibbbc(0,navigation.useRouter)(0,navigation.usePathname)(0,auth/* useSession */.wV)(0,esm_debug.io)(0,api/* getUnreadCount */.$M)(0,api/* getMyDashboard */.H)react_jsx_runtime.Fragment(link_default())(0,formatName/* formatShortName */.H)(0,auth/* signOut */.CI)LanguageSwitcherbuffersourcesizemapshashI // EXPORTS __webpack_require__.d(__webpack_exports__, { Header: () => (/* binding */ Header) }); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js var react_jsx_runtime = __webpack_require__(78157); // EXTERNAL MODULE: ../../node_modules/next/dist/client/app-dir/link.js var app_dir_link = __webpack_require__(94496); var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); // EXTERNAL MODULE: ../../node_modules/next/dist/api/navigation.js var navigation = __webpack_require__(71159); // EXTERNAL MODULE: ./src/lib/auth.ts var auth = __webpack_require__(13260); // EXTERNAL MODULE: ./src/context/locale.tsx var context_locale = __webpack_require__(96484); // EXTERNAL MODULE: ./src/lib/formatName.ts var formatName = __webpack_require__(48178); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react.js var react = __webpack_require__(31768); // EXTERNAL MODULE: ./src/lib/translations.ts var translations = __webpack_require__(12998); ;// ./src/components/LanguageSwitcher.tsx /* __next_internal_client_entry_do_not_use__ LanguageSwitcher auto */ function LanguageSwitcher() { const { locale, setLocale } = (0,context_locale/* useLocale */.Y)(); const [open, setOpen] = (0,react.useState)(false); const ref = (0,react.useRef)(null); const current = translations/* LOCALES */.YZ.find((l)=>l.code === locale) ?? translations/* LOCALES */.YZ[0]; // Close on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ function handleClick(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false); } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); return /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { ref: ref, className: "relative", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { onClick: ()=>setOpen(!open), className: "flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg border border-gray-200 hover:border-blue-400 hover:bg-blue-50 transition text-sm font-medium text-gray-700", "aria-label": "Change language", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { children: current.code.toUpperCase() }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-3.5 h-3.5 text-gray-400 transition-transform ${open ? 'rotate-180' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), open && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("div", { className: "absolute right-0 mt-1 w-40 bg-white border border-gray-200 rounded-xl shadow-lg z-50 overflow-hidden", children: translations/* LOCALES */.YZ.map((loc)=>/*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { onClick: ()=>{ setLocale(loc.code); setOpen(false); }, className: `w-full flex items-center gap-2.5 px-3.5 py-2.5 text-sm hover:bg-blue-50 transition ${locale === loc.code ? 'bg-blue-50 text-blue-700 font-medium' : 'text-gray-700'}`, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { children: loc.label }), locale === loc.code && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-3.5 h-3.5 ml-auto text-blue-600", fill: "currentColor", viewBox: "0 0 20 20", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { fillRule: "evenodd", d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", clipRule: "evenodd" }) }) ] }, loc.code)) }) ] }); } // EXTERNAL MODULE: ./src/lib/api.ts var api = __webpack_require__(91864); // EXTERNAL MODULE: ../../node_modules/socket.io-client/build/esm-debug/index.js + 30 modules var esm_debug = __webpack_require__(44826); ;// ./src/components/Header.tsx /* __next_internal_client_entry_do_not_use__ Header auto */ const API_URL = "https://api.canhelp.gr" || 0; function Header() { const router = (0,navigation.useRouter)(); const pathname = (0,navigation.usePathname)(); const { data: session } = (0,auth/* useSession */.wV)(); const { t, locale } = (0,context_locale/* useLocale */.Y)(); const [menuOpen, setMenuOpen] = (0,react.useState)(false); const [profileOpen, setProfileOpen] = (0,react.useState)(false); const [unreadNotif, setUnreadNotif] = (0,react.useState)(0); const [unreadChat, setUnreadChat] = (0,react.useState)(0); const [msgToast, setMsgToast] = (0,react.useState)(null); const [planTier, setPlanTier] = (0,react.useState)(null); const profileRef = (0,react.useRef)(null); const headerRef = (0,react.useRef)(null); const toastTimer = (0,react.useRef)(null); // Close dropdowns on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ function handleClick(e) { if (profileRef.current && !profileRef.current.contains(e.target)) { setProfileOpen(false); } } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); const isAdmin = session?.user?.role === 'admin'; const isSpecialist = session?.user?.role === 'specialist'; // Reset chat badge when entering chat process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ if (pathname === '/chat') setUnreadChat(0); }, [ pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ if (!session) return; const socket = (0,esm_debug.io)(API_URL, { withCredentials: true, transports: [ 'websocket', 'polling' ] }); socket.on('new_message', (msg)=>{ if (pathname === '/chat') return; setUnreadChat((c)=>c + 1); if (toastTimer.current) clearTimeout(toastTimer.current); setMsgToast(msg); toastTimer.current = setTimeout(()=>setMsgToast(null), 5000); }); return ()=>{ socket.disconnect(); if (toastTimer.current) clearTimeout(toastTimer.current); }; }, [ session, pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ if (!session) { setUnreadNotif(0); return; } const fetch = ()=>(0,api/* getUnreadCount */.$M)().then((r)=>setUnreadNotif(r.count)).catch(()=>{}); fetch(); const timer = setInterval(fetch, 30000); return ()=>clearInterval(timer); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ if (!session) { setPlanTier(null); return; } (0,api/* getMyDashboard */.H)().then((d)=>setPlanTier(d.plan?.tier ?? null)).catch(()=>{}); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ const onScroll = ()=>{ if (!headerRef.current) return; if (window.scrollY > 40) { headerRef.current.classList.add('header-shrink'); } else { headerRef.current.classList.remove('header-shrink'); } }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("header", { ref: headerRef, className: "header-base bg-white border-b border-gray-200 sticky top-0 z-50 transition-all duration-300", children: /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between h-16 header-content transition-all duration-300", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/", className: "flex items-center shrink-0", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "logo-text text-2xl font-bold text-blue-600 transition-all duration-300", children: "CanHelp" }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("nav", { className: "hidden md:flex items-center gap-5 ml-auto", children: [ isSpecialist ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/tasks", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.find_tasks') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/dashboard", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.dashboard') }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/tasks/new", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('dashboard.new_task') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/specialists", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.specialists') }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/pricing", className: `font-medium text-sm transition ${pathname === '/pricing' ? 'text-blue-600' : 'text-gray-600 hover:text-blue-600'}`, children: t('nav.pricing', 'Pricing') }), session ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/notifications", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-5 h-5 ${unreadNotif > 0 ? 'text-orange-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), unreadNotif > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/chat", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-5 h-5 ${unreadChat > 0 ? 'text-green-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), unreadChat > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "relative", ref: profileRef, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { onClick: ()=>setProfileOpen(!profileOpen), className: "flex items-center gap-1.5 text-sm font-medium text-gray-600 hover:text-blue-600", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "truncate max-w-[100px]", children: (0,formatName/* formatShortName */.H)(session.user.firstName, session.user.lastName, session.user.name) }), planTier === 'pro' && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-blue-100 text-blue-700 leading-none", children: "Pro" }), planTier === 'ultimate' && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-gradient-to-r from-amber-400 via-yellow-400 to-amber-400 text-gray-900 shadow-sm shadow-amber-300/50 leading-none", children: "★" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), profileOpen && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "absolute right-0 mt-2 w-52 bg-white border border-gray-200 rounded-xl shadow-lg py-1 z-50", children: [ isSpecialist ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks/new", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/specialists", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/notifications", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-4 h-4 shrink-0 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/chat", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-4 h-4 shrink-0 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("span", { className: "flex items-center gap-1.5", children: [ t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/dashboard", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), isAdmin && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/schedule", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/admin", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/profile", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/favorites", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("hr", { className: "my-1 border-gray-100" }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { className: "w-full flex items-center gap-2.5 px-4 py-2 text-sm text-red-500 hover:bg-red-50", onClick: ()=>{ setProfileOpen(false); (0,auth/* signOut */.CI)().then(()=>{ window.location.href = '/'; }); }, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/login", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.login') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/register", className: "bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 font-medium text-sm", children: t('nav.register') }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)(LanguageSwitcher, {}) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "md:hidden flex items-center gap-2", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)(LanguageSwitcher, {}), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("button", { className: "p-2", onClick: ()=>setMenuOpen(!menuOpen), "aria-label": "Toggle menu", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-5 h-5 text-gray-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: menuOpen ? /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) : /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4 6h16M4 12h16M4 18h16" }) }) }) ] }) ] }), menuOpen && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "md:hidden py-4 border-t border-gray-100 flex flex-col gap-3", children: [ isSpecialist ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }), session ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/chat", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-4 h-4 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "ml-1 px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full", children: unreadChat }) ] }), isSpecialist ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/notifications", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-4 h-4 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/favorites", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/schedule", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/admin", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/profile", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { onClick: ()=>{ setMenuOpen(false); (0,auth/* signOut */.CI)().then(()=>{ window.location.href = '/'; }); }, className: "flex items-center gap-2 text-left text-red-500 py-1 font-medium", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/login", className: "text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.login') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/register", className: "text-blue-600 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.register') }) ] }) ] }) ] }) }), msgToast && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("div", { className: "fixed bottom-5 right-5 z-[200] max-w-sm w-full", children: /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "bg-white border border-gray-200 rounded-xl shadow-xl p-4 flex items-start gap-3 animate-fade-in", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "text-2xl shrink-0", children: "\uD83D\uDCAC" }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-0", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("p", { className: "font-semibold text-gray-900 text-sm", children: t('chat.toast_title') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("p", { className: "text-xs text-gray-500 truncate mt-0.5", children: msgToast.body }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex flex-col items-end gap-2 shrink-0", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("button", { onClick: ()=>setMsgToast(null), className: "text-gray-400 hover:text-gray-600 text-lg leading-none", "aria-label": "close", children: "\xd7" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: `/chat?room=${msgToast.roomId}`, onClick: ()=>setMsgToast(null), className: "text-xs text-blue-600 hover:underline font-medium", children: t('chat.toast_open') }) ] }) ] }) }) ] }); } {"finalSource":true}mapbufferedMap ` ConcatSourceRawSourceN // EXPORTS __webpack_require__.d(__webpack_exports__, { Header: () => (/* binding */ Header) }); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js var react_jsx_runtime = __webpack_require__(78157); // EXTERNAL MODULE: ../../node_modules/next/dist/client/app-dir/link.js var app_dir_link = __webpack_require__(94496); var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); // EXTERNAL MODULE: ../../node_modules/next/dist/api/navigation.js var navigation = __webpack_require__(71159); // EXTERNAL MODULE: ./src/lib/auth.ts var auth = __webpack_require__(13260); // EXTERNAL MODULE: ./src/context/locale.tsx var context_locale = __webpack_require__(96484); // EXTERNAL MODULE: ./src/lib/formatName.ts var formatName = __webpack_require__(48178); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react.js var react = __webpack_require__(31768); // EXTERNAL MODULE: ./src/lib/translations.ts var translations = __webpack_require__(12998); ;// ./src/components/LanguageSwitcher.tsx  ReplaceSourceReplaceSourceRawSource]/* __next_internal_client_entry_do_not_use__ LanguageSwitcher auto */ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useState, useRef, useEffect } from 'react'; import { useLocale } from '@/context/locale'; import { LOCALES } from '@/lib/translations'; export function LanguageSwitcher() { const { locale, setLocale } = useLocale(); const [open, setOpen] = useState(false); const ref = useRef(null); const current = LOCALES.find((l)=>l.code === locale) ?? LOCALES[0]; // Close on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ function handleClick(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false); } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); return /*#__PURE__*/ _jsxs("div", { ref: ref, className: "relative", children: [ /*#__PURE__*/ _jsxs("button", { onClick: ()=>setOpen(!open), className: "flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg border border-gray-200 hover:border-blue-400 hover:bg-blue-50 transition text-sm font-medium text-gray-700", "aria-label": "Change language", children: [ /*#__PURE__*/ _jsx("span", { children: current.code.toUpperCase() }), /*#__PURE__*/ _jsx("svg", { className: `w-3.5 h-3.5 text-gray-400 transition-transform ${open ? 'rotate-180' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), open && /*#__PURE__*/ _jsx("div", { className: "absolute right-0 mt-1 w-40 bg-white border border-gray-200 rounded-xl shadow-lg z-50 overflow-hidden", children: LOCALES.map((loc)=>/*#__PURE__*/ _jsxs("button", { onClick: ()=>{ setLocale(loc.code); setOpen(false); }, className: `w-full flex items-center gap-2.5 px-3.5 py-2.5 text-sm hover:bg-blue-50 transition ${locale === loc.code ? 'bg-blue-50 text-blue-700 font-medium' : 'text-gray-700'}`, children: [ /*#__PURE__*/ _jsx("span", { children: loc.label }), locale === loc.code && /*#__PURE__*/ _jsx("svg", { className: "w-3.5 h-3.5 ml-auto text-blue-600", fill: "currentColor", viewBox: "0 0 20 20", children: /*#__PURE__*/ _jsx("path", { fillRule: "evenodd", d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", clipRule: "evenodd" }) }) ] }, loc.code)) }) ] }); } r70132undefined134185undefined187231undefined233277undefined279285undefined350358__WEBPACK_MODULE_REFERENCE__4_5b227573654c6f63616c65225d_call_directImport_asiSafe1__._undefined391398__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined424429__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined458464__WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_call_asiSafe1__._undefined498504__WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_asiSafe1__._undefined595603__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined908912__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined10181022__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined13801383__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined15141517__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined18611864__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined21472150__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined23182324__WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_call_asiSafe1__._undefined23512355__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined28092812__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined29732976__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined32313234__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined138224(0,context_locale/* useLocale */.Y)undefined257341(0,react.useState)undefined367447(0,react.useRef)undefined476545translations/* LOCALES */.YZundefined579643translations/* LOCALES */.YZundefined734820(0,react.useEffect)undefined11251201(0,react_jsx_runtime.jsxs)undefined13071383(0,react_jsx_runtime.jsxs)undefined17411815(0,react_jsx_runtime.jsx)undefined19462020(0,react_jsx_runtime.jsx)undefined23642438(0,react_jsx_runtime.jsx)undefined27212795(0,react_jsx_runtime.jsx)undefined29633032translations/* LOCALES */.YZundefined30593135(0,react_jsx_runtime.jsxs)undefined35893663(0,react_jsx_runtime.jsx)undefined38243898(0,react_jsx_runtime.jsx)undefined41534227(0,react_jsx_runtime.jsx)undefinedRawSource // EXTERNAL MODULE: ./src/lib/api.ts var api = __webpack_require__(91864); // EXTERNAL MODULE: ../../node_modules/socket.io-client/build/esm-debug/index.js + 30 modules var esm_debug = __webpack_require__(44826); ;// ./src/components/Header.tsx "(/* __next_internal_client_entry_do_not_use__ Header auto */ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; import Link from 'next/link'; import { useRouter, usePathname } from 'next/navigation'; import { useSession, signOut } from '@/lib/auth'; import { useLocale } from '@/context/locale'; import { formatShortName } from '@/lib/formatName'; import { LanguageSwitcher } from './LanguageSwitcher'; import { useState, useRef, useEffect } from 'react'; import { getUnreadCount, getMyDashboard } from '@/lib/api'; import { io } from 'socket.io-client'; const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; export function Header() { const router = useRouter(); const pathname = usePathname(); const { data: session } = useSession(); const { t, locale } = useLocale(); const [menuOpen, setMenuOpen] = useState(false); const [profileOpen, setProfileOpen] = useState(false); const [unreadNotif, setUnreadNotif] = useState(0); const [unreadChat, setUnreadChat] = useState(0); const [msgToast, setMsgToast] = useState(null); const [planTier, setPlanTier] = useState(null); const profileRef = useRef(null); const headerRef = useRef(null); const toastTimer = useRef(null); // Close dropdowns on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ function handleClick(e) { if (profileRef.current && !profileRef.current.contains(e.target)) { setProfileOpen(false); } } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); const isAdmin = session?.user?.role === 'admin'; const isSpecialist = session?.user?.role === 'specialist'; // Reset chat badge when entering chat process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (pathname === '/chat') setUnreadChat(0); }, [ pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) return; const socket = io(API_URL, { withCredentials: true, transports: [ 'websocket', 'polling' ] }); socket.on('new_message', (msg)=>{ if (pathname === '/chat') return; setUnreadChat((c)=>c + 1); if (toastTimer.current) clearTimeout(toastTimer.current); setMsgToast(msg); toastTimer.current = setTimeout(()=>setMsgToast(null), 5000); }); return ()=>{ socket.disconnect(); if (toastTimer.current) clearTimeout(toastTimer.current); }; }, [ session, pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) { setUnreadNotif(0); return; } const fetch = ()=>getUnreadCount().then((r)=>setUnreadNotif(r.count)).catch(()=>{}); fetch(); const timer = setInterval(fetch, 30000); return ()=>clearInterval(timer); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) { setPlanTier(null); return; } getMyDashboard().then((d)=>setPlanTier(d.plan?.tier ?? null)).catch(()=>{}); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const onScroll = ()=>{ if (!headerRef.current) return; if (window.scrollY > 40) { headerRef.current.classList.add('header-shrink'); } else { headerRef.current.classList.remove('header-shrink'); } }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx("header", { ref: headerRef, className: "header-base bg-white border-b border-gray-200 sticky top-0 z-50 transition-all duration-300", children: /*#__PURE__*/ _jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [ /*#__PURE__*/ _jsxs("div", { className: "flex items-center justify-between h-16 header-content transition-all duration-300", children: [ /*#__PURE__*/ _jsx(Link, { href: "/", className: "flex items-center shrink-0", children: /*#__PURE__*/ _jsx("span", { className: "logo-text text-2xl font-bold text-blue-600 transition-all duration-300", children: "CanHelp" }) }), /*#__PURE__*/ _jsxs("nav", { className: "hidden md:flex items-center gap-5 ml-auto", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/tasks", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.find_tasks') }), /*#__PURE__*/ _jsx(Link, { href: "/dashboard", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.dashboard') }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/tasks/new", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('dashboard.new_task') }), /*#__PURE__*/ _jsx(Link, { href: "/specialists", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.specialists') }) ] }), /*#__PURE__*/ _jsx(Link, { href: "/pricing", className: `font-medium text-sm transition ${pathname === '/pricing' ? 'text-blue-600' : 'text-gray-600 hover:text-blue-600'}`, children: t('nav.pricing', 'Pricing') }), session ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ _jsx("svg", { className: `w-5 h-5 ${unreadNotif > 0 ? 'text-orange-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ _jsx("svg", { className: `w-5 h-5 ${unreadChat > 0 ? 'text-green-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }), /*#__PURE__*/ _jsxs("div", { className: "relative", ref: profileRef, children: [ /*#__PURE__*/ _jsxs("button", { onClick: ()=>setProfileOpen(!profileOpen), className: "flex items-center gap-1.5 text-sm font-medium text-gray-600 hover:text-blue-600", children: [ /*#__PURE__*/ _jsx("span", { className: "truncate max-w-[100px]", children: formatShortName(session.user.firstName, session.user.lastName, session.user.name) }), planTier === 'pro' && /*#__PURE__*/ _jsx("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-blue-100 text-blue-700 leading-none", children: "Pro" }), planTier === 'ultimate' && /*#__PURE__*/ _jsx("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-gradient-to-r from-amber-400 via-yellow-400 to-amber-400 text-gray-900 shadow-sm shadow-amber-300/50 leading-none", children: "★" }), /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), profileOpen && /*#__PURE__*/ _jsxs("div", { className: "absolute right-0 mt-2 w-52 bg-white border border-gray-200 rounded-xl shadow-lg py-1 z-50", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 shrink-0 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 shrink-0 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/tasks", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ _jsxs(Link, { href: "/schedule", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/admin", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsxs("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/profile", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/favorites", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), /*#__PURE__*/ _jsx("hr", { className: "my-1 border-gray-100" }), /*#__PURE__*/ _jsxs("button", { className: "w-full flex items-center gap-2.5 px-4 py-2 text-sm text-red-500 hover:bg-red-50", onClick: ()=>{ setProfileOpen(false); signOut().then(()=>{ window.location.href = '/'; }); }, children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/login", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.login') }), /*#__PURE__*/ _jsx(Link, { href: "/register", className: "bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 font-medium text-sm", children: t('nav.register') }) ] }), /*#__PURE__*/ _jsx(LanguageSwitcher, {}) ] }), /*#__PURE__*/ _jsxs("div", { className: "md:hidden flex items-center gap-2", children: [ /*#__PURE__*/ _jsx(LanguageSwitcher, {}), /*#__PURE__*/ _jsx("button", { className: "p-2", onClick: ()=>setMenuOpen(!menuOpen), "aria-label": "Toggle menu", children: /*#__PURE__*/ _jsx("svg", { className: "w-5 h-5 text-gray-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: menuOpen ? /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) : /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4 6h16M4 12h16M4 18h16" }) }) }) ] }) ] }), menuOpen && /*#__PURE__*/ _jsxs("div", { className: "md:hidden py-4 border-t border-gray-100 flex flex-col gap-3", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }), session ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "ml-1 px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full", children: unreadChat }) ] }), isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/favorites", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ _jsxs(Link, { href: "/schedule", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/admin", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsxs("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/profile", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ _jsxs("button", { onClick: ()=>{ setMenuOpen(false); signOut().then(()=>{ window.location.href = '/'; }); }, className: "flex items-center gap-2 text-left text-red-500 py-1 font-medium", children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/login", className: "text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.login') }), /*#__PURE__*/ _jsx(Link, { href: "/register", className: "text-blue-600 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.register') }) ] }) ] }) ] }) }), msgToast && /*#__PURE__*/ _jsx("div", { className: "fixed bottom-5 right-5 z-[200] max-w-sm w-full", children: /*#__PURE__*/ _jsxs("div", { className: "bg-white border border-gray-200 rounded-xl shadow-xl p-4 flex items-start gap-3 animate-fade-in", children: [ /*#__PURE__*/ _jsx("span", { className: "text-2xl shrink-0", children: "\uD83D\uDCAC" }), /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-0", children: [ /*#__PURE__*/ _jsx("p", { className: "font-semibold text-gray-900 text-sm", children: t('chat.toast_title') }), /*#__PURE__*/ _jsx("p", { className: "text-xs text-gray-500 truncate mt-0.5", children: msgToast.body }) ] }), /*#__PURE__*/ _jsxs("div", { className: "flex flex-col items-end gap-2 shrink-0", children: [ /*#__PURE__*/ _jsx("button", { onClick: ()=>setMsgToast(null), className: "text-gray-400 hover:text-gray-600 text-lg leading-none", "aria-label": "close", children: "\xd7" }), /*#__PURE__*/ _jsx(Link, { href: `/chat?room=${msgToast.roomId}`, onClick: ()=>setMsgToast(null), className: "text-xs text-blue-600 hover:underline font-medium", children: t('chat.toast_open') }) ] }) ] }) }) ] }); } PT60145undefined147175undefined177233undefined235283undefined285329undefined331381undefined383436undefined438489undefined491549undefined551588undefined606636"https://api.canhelp.gr"undefined6416630undefined666672undefined712720__WEBPACK_MODULE_REFERENCE__2_5b22757365526f75746572225d_call_directImport_asiSafe1__._undefined746756__WEBPACK_MODULE_REFERENCE__2_5b22757365506174686e616d65225d_call_directImport_asiSafe1__._undefined791800__WEBPACK_MODULE_REFERENCE__3_5b2275736553657373696f6e225d_call_directImport_asiSafe1__._undefined831839__WEBPACK_MODULE_REFERENCE__4_5b227573654c6f63616c65225d_call_directImport_asiSafe1__._undefined880887__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined939946__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined9981005__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined10511058__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined11001107__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined11521159__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined11911196__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined12271232__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined12641269__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined13731381__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined19281936__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined20852093__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined21542155__WEBPACK_MODULE_REFERENCE__10_5b22696f225d_call_directImport_asiSafe1__._undefined28642872__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined29913004__WEBPACK_MODULE_REFERENCE__9_5b22676574556e72656164436f756e74225d_call_directImport_asiSafe1__._undefined32533261__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined33623375__WEBPACK_MODULE_REFERENCE__9_5b226765744d7944617368626f617264225d_call_directImport_asiSafe1__._undefined35273535__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined39953999__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined40014009__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined40604063__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined42714275__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined44294433__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined46544657__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined46594662__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined48514854__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined51725176__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined53965400__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined54025410__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined55335536__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined55385541__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined59305933__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined59355938__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined63726376__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined63786386__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined65096512__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined65146517__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined69146917__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined69196922__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined73997402__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined74047407__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined78367840__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined78427850__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined79737977__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined79797982__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined83248327__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined88668869__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined95499552__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1013010134__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1013610139__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined1047210475__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1101211015__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1164211645__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1222312227__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1251612520__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1294112944__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1313913153__WEBPACK_MODULE_REFERENCE__5_5b22666f726d617453686f72744e616d65225d_call_directImport_asiSafe1__._undefined1338913392__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1385613859__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1437214375__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1492514928__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1557015574__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1591415918__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1592015928__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined1609916103__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1610516108__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined1666816671__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1733317336__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1819018194__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1819618199__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined1876118764__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1942619429__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2053920543__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2054520553__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined2072420728__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2073020733__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined2129721300__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2200522008__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2281322817__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2328223285__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2412824132__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2413424137__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined2469224695__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2539825401__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2615426158__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2661326616__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2745927463__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2746527468__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined2802828031__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2869328696__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2982129825__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2982729830__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3034630349__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3096330966__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3180831812__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3181431817__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3233632339__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3295332956__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3382133825__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3382733830__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3434634350__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3504635049__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3602936032__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3692336927__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3692936932__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3745037453__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3806738070__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3890438908__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3891038913__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3943339436__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4005040053__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4094540948__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4120641210__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4163641642__WEBPACK_MODULE_REFERENCE__3_5b227369676e4f7574225d_call_directImport_asiSafe1__._undefined4207442077__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4267742680__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4378743791__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4379343801__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined4392443927__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4392943932__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4431644319__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4432144324__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4482344826__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4482844843__WEBPACK_MODULE_REFERENCE__8_5b224c616e67756167655377697463686572225d_directImport_asiSafe1__._undefined4497044974__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4517145174__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4517645191__WEBPACK_MODULE_REFERENCE__8_5b224c616e67756167655377697463686572225d_directImport_asiSafe1__._undefined4525345256__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4555445557__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4600346006__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4631646319__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4688746891__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4710547109__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4711147119__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined4722647230__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4723247235__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4760847611__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4807248075__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4867248676__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4867848681__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4905849061__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4952249525__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5025650260__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5026250270__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5037750381__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5038350386__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5076350766__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5122751230__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5179651800__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5180251805__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5218452187__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5264852651__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5348253486__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5348853496__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5360353607__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5360953612__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5398453987__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5448954492__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5513455137__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5557655580__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5558255590__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5571355717__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5571955722__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5613956142__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5665156654__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5729257296__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5729857301__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5772057723__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5823258235__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5910559109__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5911159119__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5924259246__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5924859251__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5967259675__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6022760230__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6089160895__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6126461267__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6190561909__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6191161914__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6233162334__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6284362846__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6369663700__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6370263705__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6408264085__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6454664549__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6525465258__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6526065263__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6563965642__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6610366106__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6675566759__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6676166764__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6713767141__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6766067663__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6852368526__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6917769181__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6918369186__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6956169564__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7002570028__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7064670650__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7083970845__WEBPACK_MODULE_REFERENCE__3_5b227369676e4f7574225d_call_directImport_asiSafe1__._undefined7127971282__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7172971732__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7240572409__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7241172419__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined7252672529__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7253172534__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined7293272935__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7293772940__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined7351473517__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7364573649__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7386073863__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7405474058__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7421274215__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7446074463__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7475174755__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7493374936__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7531775320__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7532275325__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined`$156242(0,navigation.useRouter)undefined268358(0,navigation.usePathname)undefined393481(0,auth/* useSession */.wV)undefined512598(0,context_locale/* useLocale */.Y)undefined639723(0,react.useState)undefined775859(0,react.useState)undefined911995(0,react.useState)undefined10411125(0,react.useState)undefined11671251(0,react.useState)undefined12961380(0,react.useState)undefined14121492(0,react.useRef)undefined15231603(0,react.useRef)undefined16351715(0,react.useRef)undefined18191905(0,react.useEffect)undefined24522538(0,react.useEffect)undefined26872773(0,react.useEffect)undefined28342907(0,esm_debug.io)undefined36163702(0,react.useEffect)undefined38213917(0,api/* getUnreadCount */.$M)undefined41664252(0,react.useEffect)undefined43534449(0,api/* getMyDashboard */.H)undefined46014687(0,react.useEffect)undefined51475223(0,react_jsx_runtime.jsxs)undefined52255304react_jsx_runtime.Fragmentundefined53555429(0,react_jsx_runtime.jsx)undefined56375713(0,react_jsx_runtime.jsxs)undefined58675943(0,react_jsx_runtime.jsxs)undefined61646238(0,react_jsx_runtime.jsx)undefined62406317(link_default())undefined65066580(0,react_jsx_runtime.jsx)undefined68986974(0,react_jsx_runtime.jsxs)undefined71947270(0,react_jsx_runtime.jsxs)undefined72727351react_jsx_runtime.Fragmentundefined74747548(0,react_jsx_runtime.jsx)undefined75507627(link_default())undefined80168090(0,react_jsx_runtime.jsx)undefined80928169(link_default())undefined86038679(0,react_jsx_runtime.jsxs)undefined86818760react_jsx_runtime.Fragmentundefined88838957(0,react_jsx_runtime.jsx)undefined89599036(link_default())undefined94339507(0,react_jsx_runtime.jsx)undefined95099586(link_default())undefined1006310137(0,react_jsx_runtime.jsx)undefined1013910216(link_default())undefined1064510721(0,react_jsx_runtime.jsxs)undefined1072310802react_jsx_runtime.Fragmentundefined1092511001(0,react_jsx_runtime.jsxs)undefined1100311080(link_default())undefined1142211496(0,react_jsx_runtime.jsx)undefined1203512109(0,react_jsx_runtime.jsx)undefined1278912863(0,react_jsx_runtime.jsx)undefined1344113517(0,react_jsx_runtime.jsxs)undefined1351913596(link_default())undefined1392914003(0,react_jsx_runtime.jsx)undefined1454014614(0,react_jsx_runtime.jsx)undefined1524115315(0,react_jsx_runtime.jsx)undefined1589315969(0,react_jsx_runtime.jsxs)undefined1625816334(0,react_jsx_runtime.jsxs)undefined1675516829(0,react_jsx_runtime.jsx)undefined1702417122(0,formatName/* formatShortName */.H)undefined1735817432(0,react_jsx_runtime.jsx)undefined1789617970(0,react_jsx_runtime.jsx)undefined1848318557(0,react_jsx_runtime.jsx)undefined1910719181(0,react_jsx_runtime.jsx)undefined1982319899(0,react_jsx_runtime.jsxs)undefined2023920315(0,react_jsx_runtime.jsxs)undefined2031720396react_jsx_runtime.Fragmentundefined2056720643(0,react_jsx_runtime.jsxs)undefined2064520722(link_default())undefined2128221356(0,react_jsx_runtime.jsx)undefined2201822092(0,react_jsx_runtime.jsx)undefined2294623022(0,react_jsx_runtime.jsxs)undefined2302423101(link_default())undefined2366323737(0,react_jsx_runtime.jsx)undefined2439924473(0,react_jsx_runtime.jsx)undefined2558325659(0,react_jsx_runtime.jsxs)undefined2566125740react_jsx_runtime.Fragmentundefined2591125987(0,react_jsx_runtime.jsxs)undefined2598926066(link_default())undefined2663026704(0,react_jsx_runtime.jsx)undefined2740927483(0,react_jsx_runtime.jsx)undefined2828828364(0,react_jsx_runtime.jsxs)undefined2882928903(0,react_jsx_runtime.jsx)undefined2974629822(0,react_jsx_runtime.jsxs)undefined2982429901(link_default())undefined3045630530(0,react_jsx_runtime.jsx)undefined3123331307(0,react_jsx_runtime.jsx)undefined3206032136(0,react_jsx_runtime.jsxs)undefined3259132665(0,react_jsx_runtime.jsx)undefined3350833584(0,react_jsx_runtime.jsxs)undefined3358633663(link_default())undefined3422334297(0,react_jsx_runtime.jsx)undefined3495935033(0,react_jsx_runtime.jsx)undefined3615836234(0,react_jsx_runtime.jsxs)undefined3623636313(link_default())undefined3682936903(0,react_jsx_runtime.jsx)undefined3751737591(0,react_jsx_runtime.jsx)undefined3843338509(0,react_jsx_runtime.jsxs)undefined3851138588(link_default())undefined3910739181(0,react_jsx_runtime.jsx)undefined3979539869(0,react_jsx_runtime.jsx)undefined4073440810(0,react_jsx_runtime.jsxs)undefined4081240889(link_default())undefined4140541481(0,react_jsx_runtime.jsxs)undefined4217742251(0,react_jsx_runtime.jsx)undefined4323143305(0,react_jsx_runtime.jsx)undefined4419644272(0,react_jsx_runtime.jsxs)undefined4427444351(link_default())undefined4486944943(0,react_jsx_runtime.jsx)undefined4555745631(0,react_jsx_runtime.jsx)undefined4646546541(0,react_jsx_runtime.jsxs)undefined4654346620(link_default())undefined4714047214(0,react_jsx_runtime.jsx)undefined4782847902(0,react_jsx_runtime.jsx)undefined4879448868(0,react_jsx_runtime.jsx)undefined4912649202(0,react_jsx_runtime.jsxs)undefined4962849710(0,auth/* signOut */.CI)undefined5014250216(0,react_jsx_runtime.jsx)undefined5081650890(0,react_jsx_runtime.jsx)undefined5199752073(0,react_jsx_runtime.jsxs)undefined5207552154react_jsx_runtime.Fragmentundefined5227752351(0,react_jsx_runtime.jsx)undefined5235352430(link_default())undefined5281452888(0,react_jsx_runtime.jsx)undefined5289052967(link_default())undefined5346653540(0,react_jsx_runtime.jsx)undefined5354253637LanguageSwitcherundefined5376453840(0,react_jsx_runtime.jsxs)undefined5403754111(0,react_jsx_runtime.jsx)undefined5411354208LanguageSwitcherundefined5427054344(0,react_jsx_runtime.jsx)undefined5464254716(0,react_jsx_runtime.jsx)undefined5516255236(0,react_jsx_runtime.jsx)undefined5554655620(0,react_jsx_runtime.jsx)undefined5618856264(0,react_jsx_runtime.jsxs)undefined5647856554(0,react_jsx_runtime.jsxs)undefined5655656635react_jsx_runtime.Fragmentundefined5674256818(0,react_jsx_runtime.jsxs)undefined5682056897(link_default())undefined5727057344(0,react_jsx_runtime.jsx)undefined5780557879(0,react_jsx_runtime.jsx)undefined5847658552(0,react_jsx_runtime.jsxs)undefined5855458631(link_default())undefined5900859082(0,react_jsx_runtime.jsx)undefined5954359617(0,react_jsx_runtime.jsx)undefined6034860424(0,react_jsx_runtime.jsxs)undefined6042660505react_jsx_runtime.Fragmentundefined6061260688(0,react_jsx_runtime.jsxs)undefined6069060767(link_default())undefined6114461218(0,react_jsx_runtime.jsx)undefined6167961753(0,react_jsx_runtime.jsx)undefined6231962395(0,react_jsx_runtime.jsxs)undefined6239762474(link_default())undefined6285362927(0,react_jsx_runtime.jsx)undefined6338863462(0,react_jsx_runtime.jsx)undefined6429364369(0,react_jsx_runtime.jsxs)undefined6437164450react_jsx_runtime.Fragmentundefined6455764633(0,react_jsx_runtime.jsxs)undefined6463564712(link_default())undefined6508465158(0,react_jsx_runtime.jsx)undefined6566065734(0,react_jsx_runtime.jsx)undefined6637666450(0,react_jsx_runtime.jsx)undefined6688966965(0,react_jsx_runtime.jsxs)undefined6696767046react_jsx_runtime.Fragmentundefined6716967245(0,react_jsx_runtime.jsxs)undefined6724767324(link_default())undefined6774167815(0,react_jsx_runtime.jsx)undefined6832468398(0,react_jsx_runtime.jsx)undefined6903669112(0,react_jsx_runtime.jsxs)undefined6911469191(link_default())undefined6961069684(0,react_jsx_runtime.jsx)undefined7019370267(0,react_jsx_runtime.jsx)undefined7113771213(0,react_jsx_runtime.jsxs)undefined7121571294react_jsx_runtime.Fragmentundefined7141771493(0,react_jsx_runtime.jsxs)undefined7149571572(link_default())undefined7199372067(0,react_jsx_runtime.jsx)undefined7261972693(0,react_jsx_runtime.jsx)undefined7335473430(0,react_jsx_runtime.jsxs)undefined7379973873(0,react_jsx_runtime.jsx)undefined7451174587(0,react_jsx_runtime.jsxs)undefined7458974666(link_default())undefined7508375157(0,react_jsx_runtime.jsx)undefined7566675740(0,react_jsx_runtime.jsx)undefined7659076666(0,react_jsx_runtime.jsxs)undefined7666876745(link_default())undefined7712277196(0,react_jsx_runtime.jsx)undefined7765777731(0,react_jsx_runtime.jsx)undefined7843678512(0,react_jsx_runtime.jsxs)undefined7851478591(link_default())undefined7896779041(0,react_jsx_runtime.jsx)undefined7950279576(0,react_jsx_runtime.jsx)undefined8022580301(0,react_jsx_runtime.jsxs)undefined8030380380(link_default())undefined8075380829(0,react_jsx_runtime.jsxs)undefined8134881422(0,react_jsx_runtime.jsx)undefined8228282356(0,react_jsx_runtime.jsx)undefined8300783083(0,react_jsx_runtime.jsxs)undefined8308583162(link_default())undefined8353783611(0,react_jsx_runtime.jsx)undefined8407284146(0,react_jsx_runtime.jsx)undefined8476484840(0,react_jsx_runtime.jsxs)undefined8502985111(0,auth/* signOut */.CI)undefined8554585619(0,react_jsx_runtime.jsx)undefined8606686140(0,react_jsx_runtime.jsx)undefined8681386889(0,react_jsx_runtime.jsxs)undefined8689186970react_jsx_runtime.Fragmentundefined8707787151(0,react_jsx_runtime.jsx)undefined8715387230(link_default())undefined8762887702(0,react_jsx_runtime.jsx)undefined8770487781(link_default())undefined8835588429(0,react_jsx_runtime.jsx)undefined8855788633(0,react_jsx_runtime.jsxs)undefined8884488918(0,react_jsx_runtime.jsx)undefined8910989185(0,react_jsx_runtime.jsxs)undefined8933989413(0,react_jsx_runtime.jsx)undefined8965889732(0,react_jsx_runtime.jsx)undefined9002090096(0,react_jsx_runtime.jsxs)undefined9027490348(0,react_jsx_runtime.jsx)undefined9072990803(0,react_jsx_runtime.jsx)undefined9080590882(link_default())undefined /***/ }) =@J/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; // EXPORTS __webpack_require__.d(__webpack_exports__, { Header: () => (/* binding */ Header) }); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js var react_jsx_runtime = __webpack_require__(78157); // EXTERNAL MODULE: ../../node_modules/next/dist/client/app-dir/link.js var app_dir_link = __webpack_require__(94496); var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); // EXTERNAL MODULE: ../../node_modules/next/dist/api/navigation.js var navigation = __webpack_require__(71159); // EXTERNAL MODULE: ./src/lib/auth.ts var auth = __webpack_require__(13260); // EXTERNAL MODULE: ./src/context/locale.tsx var context_locale = __webpack_require__(96484); // EXTERNAL MODULE: ./src/lib/formatName.ts var formatName = __webpack_require__(48178); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react.js var react = __webpack_require__(31768); // EXTERNAL MODULE: ./src/lib/translations.ts var translations = __webpack_require__(12998); ;// ./src/components/LanguageSwitcher.tsx /* __next_internal_client_entry_do_not_use__ LanguageSwitcher auto */ function LanguageSwitcher() { const { locale, setLocale } = (0,context_locale/* useLocale */.Y)(); const [open, setOpen] = (0,react.useState)(false); const ref = (0,react.useRef)(null); const current = translations/* LOCALES */.YZ.find((l)=>l.code === locale) ?? translations/* LOCALES */.YZ[0]; // Close on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ function handleClick(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false); } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); return /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { ref: ref, className: "relative", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { onClick: ()=>setOpen(!open), className: "flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg border border-gray-200 hover:border-blue-400 hover:bg-blue-50 transition text-sm font-medium text-gray-700", "aria-label": "Change language", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { children: current.code.toUpperCase() }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-3.5 h-3.5 text-gray-400 transition-transform ${open ? 'rotate-180' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), open && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("div", { className: "absolute right-0 mt-1 w-40 bg-white border border-gray-200 rounded-xl shadow-lg z-50 overflow-hidden", children: translations/* LOCALES */.YZ.map((loc)=>/*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { onClick: ()=>{ setLocale(loc.code); setOpen(false); }, className: `w-full flex items-center gap-2.5 px-3.5 py-2.5 text-sm hover:bg-blue-50 transition ${locale === loc.code ? 'bg-blue-50 text-blue-700 font-medium' : 'text-gray-700'}`, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { children: loc.label }), locale === loc.code && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-3.5 h-3.5 ml-auto text-blue-600", fill: "currentColor", viewBox: "0 0 20 20", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { fillRule: "evenodd", d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", clipRule: "evenodd" }) }) ] }, loc.code)) }) ] }); } // EXTERNAL MODULE: ./src/lib/api.ts var api = __webpack_require__(91864); // EXTERNAL MODULE: ../../node_modules/socket.io-client/build/esm-debug/index.js + 30 modules var esm_debug = __webpack_require__(44826); ;// ./src/components/Header.tsx /* __next_internal_client_entry_do_not_use__ Header auto */ const API_URL = "https://api.canhelp.gr" || 0; function Header() { const router = (0,navigation.useRouter)(); const pathname = (0,navigation.usePathname)(); const { data: session } = (0,auth/* useSession */.wV)(); const { t, locale } = (0,context_locale/* useLocale */.Y)(); const [menuOpen, setMenuOpen] = (0,react.useState)(false); const [profileOpen, setProfileOpen] = (0,react.useState)(false); const [unreadNotif, setUnreadNotif] = (0,react.useState)(0); const [unreadChat, setUnreadChat] = (0,react.useState)(0); const [msgToast, setMsgToast] = (0,react.useState)(null); const [planTier, setPlanTier] = (0,react.useState)(null); const profileRef = (0,react.useRef)(null); const headerRef = (0,react.useRef)(null); const toastTimer = (0,react.useRef)(null); // Close dropdowns on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ function handleClick(e) { if (profileRef.current && !profileRef.current.contains(e.target)) { setProfileOpen(false); } } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); const isAdmin = session?.user?.role === 'admin'; const isSpecialist = session?.user?.role === 'specialist'; // Reset chat badge when entering chat process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ if (pathname === '/chat') setUnreadChat(0); }, [ pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ if (!session) return; const socket = (0,esm_debug.io)(API_URL, { withCredentials: true, transports: [ 'websocket', 'polling' ] }); socket.on('new_message', (msg)=>{ if (pathname === '/chat') return; setUnreadChat((c)=>c + 1); if (toastTimer.current) clearTimeout(toastTimer.current); setMsgToast(msg); toastTimer.current = setTimeout(()=>setMsgToast(null), 5000); }); return ()=>{ socket.disconnect(); if (toastTimer.current) clearTimeout(toastTimer.current); }; }, [ session, pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ if (!session) { setUnreadNotif(0); return; } const fetch = ()=>(0,api/* getUnreadCount */.$M)().then((r)=>setUnreadNotif(r.count)).catch(()=>{}); fetch(); const timer = setInterval(fetch, 30000); return ()=>clearInterval(timer); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ if (!session) { setPlanTier(null); return; } (0,api/* getMyDashboard */.H)().then((d)=>setPlanTier(d.plan?.tier ?? null)).catch(()=>{}); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ const onScroll = ()=>{ if (!headerRef.current) return; if (window.scrollY > 40) { headerRef.current.classList.add('header-shrink'); } else { headerRef.current.classList.remove('header-shrink'); } }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("header", { ref: headerRef, className: "header-base bg-white border-b border-gray-200 sticky top-0 z-50 transition-all duration-300", children: /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between h-16 header-content transition-all duration-300", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/", className: "flex items-center shrink-0", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "logo-text text-2xl font-bold text-blue-600 transition-all duration-300", children: "CanHelp" }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("nav", { className: "hidden md:flex items-center gap-5 ml-auto", children: [ isSpecialist ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/tasks", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.find_tasks') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/dashboard", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.dashboard') }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/tasks/new", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('dashboard.new_task') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/specialists", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.specialists') }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/pricing", className: `font-medium text-sm transition ${pathname === '/pricing' ? 'text-blue-600' : 'text-gray-600 hover:text-blue-600'}`, children: t('nav.pricing', 'Pricing') }), session ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/notifications", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-5 h-5 ${unreadNotif > 0 ? 'text-orange-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), unreadNotif > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/chat", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-5 h-5 ${unreadChat > 0 ? 'text-green-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), unreadChat > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "relative", ref: profileRef, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { onClick: ()=>setProfileOpen(!profileOpen), className: "flex items-center gap-1.5 text-sm font-medium text-gray-600 hover:text-blue-600", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "truncate max-w-[100px]", children: (0,formatName/* formatShortName */.H)(session.user.firstName, session.user.lastName, session.user.name) }), planTier === 'pro' && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-blue-100 text-blue-700 leading-none", children: "Pro" }), planTier === 'ultimate' && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-gradient-to-r from-amber-400 via-yellow-400 to-amber-400 text-gray-900 shadow-sm shadow-amber-300/50 leading-none", children: "★" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), profileOpen && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "absolute right-0 mt-2 w-52 bg-white border border-gray-200 rounded-xl shadow-lg py-1 z-50", children: [ isSpecialist ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks/new", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/specialists", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/notifications", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-4 h-4 shrink-0 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/chat", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-4 h-4 shrink-0 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("span", { className: "flex items-center gap-1.5", children: [ t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/dashboard", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), isAdmin && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/schedule", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/admin", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/profile", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/favorites", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("hr", { className: "my-1 border-gray-100" }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { className: "w-full flex items-center gap-2.5 px-4 py-2 text-sm text-red-500 hover:bg-red-50", onClick: ()=>{ setProfileOpen(false); (0,auth/* signOut */.CI)().then(()=>{ window.location.href = '/'; }); }, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/login", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.login') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/register", className: "bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 font-medium text-sm", children: t('nav.register') }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)(LanguageSwitcher, {}) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "md:hidden flex items-center gap-2", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)(LanguageSwitcher, {}), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("button", { className: "p-2", onClick: ()=>setMenuOpen(!menuOpen), "aria-label": "Toggle menu", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-5 h-5 text-gray-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: menuOpen ? /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) : /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4 6h16M4 12h16M4 18h16" }) }) }) ] }) ] }), menuOpen && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "md:hidden py-4 border-t border-gray-100 flex flex-col gap-3", children: [ isSpecialist ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }), session ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/chat", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-4 h-4 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "ml-1 px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full", children: unreadChat }) ] }), isSpecialist ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/notifications", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-4 h-4 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/favorites", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/schedule", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/admin", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/profile", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { onClick: ()=>{ setMenuOpen(false); (0,auth/* signOut */.CI)().then(()=>{ window.location.href = '/'; }); }, className: "flex items-center gap-2 text-left text-red-500 py-1 font-medium", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/login", className: "text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.login') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/register", className: "text-blue-600 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.register') }) ] }) ] }) ] }) }), msgToast && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("div", { className: "fixed bottom-5 right-5 z-[200] max-w-sm w-full", children: /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "bg-white border border-gray-200 rounded-xl shadow-xl p-4 flex items-start gap-3 animate-fade-in", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "text-2xl shrink-0", children: "\uD83D\uDCAC" }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-0", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("p", { className: "font-semibold text-gray-900 text-sm", children: t('chat.toast_title') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("p", { className: "text-xs text-gray-500 truncate mt-0.5", children: msgToast.body }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex flex-col items-end gap-2 shrink-0", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("button", { onClick: ()=>setMsgToast(null), className: "text-gray-400 hover:text-gray-600 text-lg leading-none", "aria-label": "close", children: "\xd7" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: `/chat?room=${msgToast.roomId}`, onClick: ()=>setMsgToast(null), className: "text-xs text-blue-600 hover:underline font-medium", children: t('chat.toast_open') }) ] }) ] }) }) ] }); } /***/ }) >A `BOBN // EXPORTS __webpack_require__.d(__webpack_exports__, { Header: () => (/* binding */ Header) }); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js var react_jsx_runtime = __webpack_require__(78157); // EXTERNAL MODULE: ../../node_modules/next/dist/client/app-dir/link.js var app_dir_link = __webpack_require__(94496); var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); // EXTERNAL MODULE: ../../node_modules/next/dist/api/navigation.js var navigation = __webpack_require__(71159); // EXTERNAL MODULE: ./src/lib/auth.ts var auth = __webpack_require__(13260); // EXTERNAL MODULE: ./src/context/locale.tsx var context_locale = __webpack_require__(96484); // EXTERNAL MODULE: ./src/lib/formatName.ts var formatName = __webpack_require__(48178); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react.js var react = __webpack_require__(31768); // EXTERNAL MODULE: ./src/lib/translations.ts var translations = __webpack_require__(12998); ;// ./src/components/LanguageSwitcher.tsx {P]/* __next_internal_client_entry_do_not_use__ LanguageSwitcher auto */ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useState, useRef, useEffect } from 'react'; import { useLocale } from '@/context/locale'; import { LOCALES } from '@/lib/translations'; export function LanguageSwitcher() { const { locale, setLocale } = useLocale(); const [open, setOpen] = useState(false); const ref = useRef(null); const current = LOCALES.find((l)=>l.code === locale) ?? LOCALES[0]; // Close on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ function handleClick(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false); } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); return /*#__PURE__*/ _jsxs("div", { ref: ref, className: "relative", children: [ /*#__PURE__*/ _jsxs("button", { onClick: ()=>setOpen(!open), className: "flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg border border-gray-200 hover:border-blue-400 hover:bg-blue-50 transition text-sm font-medium text-gray-700", "aria-label": "Change language", children: [ /*#__PURE__*/ _jsx("span", { children: current.code.toUpperCase() }), /*#__PURE__*/ _jsx("svg", { className: `w-3.5 h-3.5 text-gray-400 transition-transform ${open ? 'rotate-180' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), open && /*#__PURE__*/ _jsx("div", { className: "absolute right-0 mt-1 w-40 bg-white border border-gray-200 rounded-xl shadow-lg z-50 overflow-hidden", children: LOCALES.map((loc)=>/*#__PURE__*/ _jsxs("button", { onClick: ()=>{ setLocale(loc.code); setOpen(false); }, className: `w-full flex items-center gap-2.5 px-3.5 py-2.5 text-sm hover:bg-blue-50 transition ${locale === loc.code ? 'bg-blue-50 text-blue-700 font-medium' : 'text-gray-700'}`, children: [ /*#__PURE__*/ _jsx("span", { children: loc.label }), locale === loc.code && /*#__PURE__*/ _jsx("svg", { className: "w-3.5 h-3.5 ml-auto text-blue-600", fill: "currentColor", viewBox: "0 0 20 20", children: /*#__PURE__*/ _jsx("path", { fillRule: "evenodd", d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", clipRule: "evenodd" }) }) ] }, loc.code)) }) ] }); } r70132undefined134185undefined187231undefined233277undefined279285undefined350358__WEBPACK_MODULE_REFERENCE__4_5b227573654c6f63616c65225d_call_directImport_asiSafe1__._undefined391398__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined424429__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined458464__WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_call_asiSafe1__._undefined498504__WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_asiSafe1__._undefined595603__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined908912__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined10181022__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined13801383__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined15141517__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined18611864__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined21472150__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined23182324__WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_call_asiSafe1__._undefined23512355__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined28092812__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined29732976__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined32313234__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined138224(0,context_locale/* useLocale */.Y)undefined257341(0,react.useState)undefined367447(0,react.useRef)undefined476545translations/* LOCALES */.YZundefined579643translations/* LOCALES */.YZundefined734820(0,react.useEffect)undefined11251201(0,react_jsx_runtime.jsxs)undefined13071383(0,react_jsx_runtime.jsxs)undefined17411815(0,react_jsx_runtime.jsx)undefined19462020(0,react_jsx_runtime.jsx)undefined23642438(0,react_jsx_runtime.jsx)undefined27212795(0,react_jsx_runtime.jsx)undefined29633032translations/* LOCALES */.YZundefined30593135(0,react_jsx_runtime.jsxs)undefined35893663(0,react_jsx_runtime.jsx)undefined38243898(0,react_jsx_runtime.jsx)undefined41534227(0,react_jsx_runtime.jsx)undefinedRawSource // EXTERNAL MODULE: ./src/lib/api.ts var api = __webpack_require__(91864); // EXTERNAL MODULE: ../../node_modules/socket.io-client/build/esm-debug/index.js + 30 modules var esm_debug = __webpack_require__(44826); ;// ./src/components/Header.tsx wL"(/* __next_internal_client_entry_do_not_use__ Header auto */ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; import Link from 'next/link'; import { useRouter, usePathname } from 'next/navigation'; import { useSession, signOut } from '@/lib/auth'; import { useLocale } from '@/context/locale'; import { formatShortName } from '@/lib/formatName'; import { LanguageSwitcher } from './LanguageSwitcher'; import { useState, useRef, useEffect } from 'react'; import { getUnreadCount, getMyDashboard } from '@/lib/api'; import { io } from 'socket.io-client'; const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; export function Header() { const router = useRouter(); const pathname = usePathname(); const { data: session } = useSession(); const { t, locale } = useLocale(); const [menuOpen, setMenuOpen] = useState(false); const [profileOpen, setProfileOpen] = useState(false); const [unreadNotif, setUnreadNotif] = useState(0); const [unreadChat, setUnreadChat] = useState(0); const [msgToast, setMsgToast] = useState(null); const [planTier, setPlanTier] = useState(null); const profileRef = useRef(null); const headerRef = useRef(null); const toastTimer = useRef(null); // Close dropdowns on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ function handleClick(e) { if (profileRef.current && !profileRef.current.contains(e.target)) { setProfileOpen(false); } } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); const isAdmin = session?.user?.role === 'admin'; const isSpecialist = session?.user?.role === 'specialist'; // Reset chat badge when entering chat process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (pathname === '/chat') setUnreadChat(0); }, [ pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) return; const socket = io(API_URL, { withCredentials: true, transports: [ 'websocket', 'polling' ] }); socket.on('new_message', (msg)=>{ if (pathname === '/chat') return; setUnreadChat((c)=>c + 1); if (toastTimer.current) clearTimeout(toastTimer.current); setMsgToast(msg); toastTimer.current = setTimeout(()=>setMsgToast(null), 5000); }); return ()=>{ socket.disconnect(); if (toastTimer.current) clearTimeout(toastTimer.current); }; }, [ session, pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) { setUnreadNotif(0); return; } const fetch = ()=>getUnreadCount().then((r)=>setUnreadNotif(r.count)).catch(()=>{}); fetch(); const timer = setInterval(fetch, 30000); return ()=>clearInterval(timer); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) { setPlanTier(null); return; } getMyDashboard().then((d)=>setPlanTier(d.plan?.tier ?? null)).catch(()=>{}); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const onScroll = ()=>{ if (!headerRef.current) return; if (window.scrollY > 40) { headerRef.current.classList.add('header-shrink'); } else { headerRef.current.classList.remove('header-shrink'); } }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx("header", { ref: headerRef, className: "header-base bg-white border-b border-gray-200 sticky top-0 z-50 transition-all duration-300", children: /*#__PURE__*/ _jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [ /*#__PURE__*/ _jsxs("div", { className: "flex items-center justify-between h-16 header-content transition-all duration-300", children: [ /*#__PURE__*/ _jsx(Link, { href: "/", className: "flex items-center shrink-0", children: /*#__PURE__*/ _jsx("span", { className: "logo-text text-2xl font-bold text-blue-600 transition-all duration-300", children: "CanHelp" }) }), /*#__PURE__*/ _jsxs("nav", { className: "hidden md:flex items-center gap-5 ml-auto", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/tasks", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.find_tasks') }), /*#__PURE__*/ _jsx(Link, { href: "/dashboard", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.dashboard') }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/tasks/new", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('dashboard.new_task') }), /*#__PURE__*/ _jsx(Link, { href: "/specialists", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.specialists') }) ] }), /*#__PURE__*/ _jsx(Link, { href: "/pricing", className: `font-medium text-sm transition ${pathname === '/pricing' ? 'text-blue-600' : 'text-gray-600 hover:text-blue-600'}`, children: t('nav.pricing', 'Pricing') }), session ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ _jsx("svg", { className: `w-5 h-5 ${unreadNotif > 0 ? 'text-orange-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ _jsx("svg", { className: `w-5 h-5 ${unreadChat > 0 ? 'text-green-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }), /*#__PURE__*/ _jsxs("div", { className: "relative", ref: profileRef, children: [ /*#__PURE__*/ _jsxs("button", { onClick: ()=>setProfileOpen(!profileOpen), className: "flex items-center gap-1.5 text-sm font-medium text-gray-600 hover:text-blue-600", children: [ /*#__PURE__*/ _jsx("span", { className: "truncate max-w-[100px]", children: formatShortName(session.user.firstName, session.user.lastName, session.user.name) }), planTier === 'pro' && /*#__PURE__*/ _jsx("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-blue-100 text-blue-700 leading-none", children: "Pro" }), planTier === 'ultimate' && /*#__PURE__*/ _jsx("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-gradient-to-r from-amber-400 via-yellow-400 to-amber-400 text-gray-900 shadow-sm shadow-amber-300/50 leading-none", children: "★" }), /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), profileOpen && /*#__PURE__*/ _jsxs("div", { className: "absolute right-0 mt-2 w-52 bg-white border border-gray-200 rounded-xl shadow-lg py-1 z-50", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 shrink-0 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 shrink-0 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/tasks", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ _jsxs(Link, { href: "/schedule", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/admin", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsxs("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/profile", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/favorites", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), /*#__PURE__*/ _jsx("hr", { className: "my-1 border-gray-100" }), /*#__PURE__*/ _jsxs("button", { className: "w-full flex items-center gap-2.5 px-4 py-2 text-sm text-red-500 hover:bg-red-50", onClick: ()=>{ setProfileOpen(false); signOut().then(()=>{ window.location.href = '/'; }); }, children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/login", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.login') }), /*#__PURE__*/ _jsx(Link, { href: "/register", className: "bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 font-medium text-sm", children: t('nav.register') }) ] }), /*#__PURE__*/ _jsx(LanguageSwitcher, {}) ] }), /*#__PURE__*/ _jsxs("div", { className: "md:hidden flex items-center gap-2", children: [ /*#__PURE__*/ _jsx(LanguageSwitcher, {}), /*#__PURE__*/ _jsx("button", { className: "p-2", onClick: ()=>setMenuOpen(!menuOpen), "aria-label": "Toggle menu", children: /*#__PURE__*/ _jsx("svg", { className: "w-5 h-5 text-gray-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: menuOpen ? /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) : /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4 6h16M4 12h16M4 18h16" }) }) }) ] }) ] }), menuOpen && /*#__PURE__*/ _jsxs("div", { className: "md:hidden py-4 border-t border-gray-100 flex flex-col gap-3", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }), session ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "ml-1 px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full", children: unreadChat }) ] }), isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/favorites", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ _jsxs(Link, { href: "/schedule", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/admin", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsxs("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/profile", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ _jsxs("button", { onClick: ()=>{ setMenuOpen(false); signOut().then(()=>{ window.location.href = '/'; }); }, className: "flex items-center gap-2 text-left text-red-500 py-1 font-medium", children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/login", className: "text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.login') }), /*#__PURE__*/ _jsx(Link, { href: "/register", className: "text-blue-600 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.register') }) ] }) ] }) ] }) }), msgToast && /*#__PURE__*/ _jsx("div", { className: "fixed bottom-5 right-5 z-[200] max-w-sm w-full", children: /*#__PURE__*/ _jsxs("div", { className: "bg-white border border-gray-200 rounded-xl shadow-xl p-4 flex items-start gap-3 animate-fade-in", children: [ /*#__PURE__*/ _jsx("span", { className: "text-2xl shrink-0", children: "\uD83D\uDCAC" }), /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-0", children: [ /*#__PURE__*/ _jsx("p", { className: "font-semibold text-gray-900 text-sm", children: t('chat.toast_title') }), /*#__PURE__*/ _jsx("p", { className: "text-xs text-gray-500 truncate mt-0.5", children: msgToast.body }) ] }), /*#__PURE__*/ _jsxs("div", { className: "flex flex-col items-end gap-2 shrink-0", children: [ /*#__PURE__*/ _jsx("button", { onClick: ()=>setMsgToast(null), className: "text-gray-400 hover:text-gray-600 text-lg leading-none", "aria-label": "close", children: "\xd7" }), /*#__PURE__*/ _jsx(Link, { href: `/chat?room=${msgToast.roomId}`, onClick: ()=>setMsgToast(null), className: "text-xs text-blue-600 hover:underline font-medium", children: t('chat.toast_open') }) ] }) ] }) }) ] }); } PT60145undefined147175undefined177233undefined235283undefined285329undefined331381undefined383436undefined438489undefined491549undefined551588undefined606636"https://api.canhelp.gr"undefined6416630undefined666672undefined712720__WEBPACK_MODULE_REFERENCE__2_5b22757365526f75746572225d_call_directImport_asiSafe1__._undefined746756__WEBPACK_MODULE_REFERENCE__2_5b22757365506174686e616d65225d_call_directImport_asiSafe1__._undefined791800__WEBPACK_MODULE_REFERENCE__3_5b2275736553657373696f6e225d_call_directImport_asiSafe1__._undefined831839__WEBPACK_MODULE_REFERENCE__4_5b227573654c6f63616c65225d_call_directImport_asiSafe1__._undefined880887__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined939946__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined9981005__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined10511058__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined11001107__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined11521159__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined11911196__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined12271232__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined12641269__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined13731381__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined19281936__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined20852093__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined21542155__WEBPACK_MODULE_REFERENCE__10_5b22696f225d_call_directImport_asiSafe1__._undefined28642872__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined29913004__WEBPACK_MODULE_REFERENCE__9_5b22676574556e72656164436f756e74225d_call_directImport_asiSafe1__._undefined32533261__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined33623375__WEBPACK_MODULE_REFERENCE__9_5b226765744d7944617368626f617264225d_call_directImport_asiSafe1__._undefined35273535__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined39953999__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined40014009__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined40604063__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined42714275__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined44294433__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined46544657__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined46594662__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined48514854__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined51725176__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined53965400__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined54025410__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined55335536__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined55385541__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined59305933__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined59355938__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined63726376__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined63786386__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined65096512__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined65146517__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined69146917__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined69196922__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined73997402__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined74047407__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined78367840__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined78427850__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined79737977__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined79797982__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined83248327__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined88668869__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined95499552__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1013010134__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1013610139__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined1047210475__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1101211015__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1164211645__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1222312227__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1251612520__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1294112944__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1313913153__WEBPACK_MODULE_REFERENCE__5_5b22666f726d617453686f72744e616d65225d_call_directImport_asiSafe1__._undefined1338913392__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1385613859__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1437214375__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1492514928__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1557015574__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1591415918__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1592015928__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined1609916103__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1610516108__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined1666816671__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1733317336__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1819018194__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1819618199__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined1876118764__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1942619429__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2053920543__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2054520553__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined2072420728__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2073020733__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined2129721300__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2200522008__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2281322817__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2328223285__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2412824132__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2413424137__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined2469224695__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2539825401__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2615426158__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2661326616__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2745927463__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2746527468__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined2802828031__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2869328696__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2982129825__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2982729830__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3034630349__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3096330966__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3180831812__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3181431817__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3233632339__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3295332956__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3382133825__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3382733830__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3434634350__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3504635049__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3602936032__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3692336927__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3692936932__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3745037453__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3806738070__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3890438908__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3891038913__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3943339436__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4005040053__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4094540948__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4120641210__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4163641642__WEBPACK_MODULE_REFERENCE__3_5b227369676e4f7574225d_call_directImport_asiSafe1__._undefined4207442077__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4267742680__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4378743791__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4379343801__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined4392443927__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4392943932__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4431644319__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4432144324__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4482344826__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4482844843__WEBPACK_MODULE_REFERENCE__8_5b224c616e67756167655377697463686572225d_directImport_asiSafe1__._undefined4497044974__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4517145174__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4517645191__WEBPACK_MODULE_REFERENCE__8_5b224c616e67756167655377697463686572225d_directImport_asiSafe1__._undefined4525345256__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4555445557__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4600346006__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4631646319__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4688746891__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4710547109__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4711147119__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined4722647230__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4723247235__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4760847611__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4807248075__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4867248676__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4867848681__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4905849061__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4952249525__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5025650260__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5026250270__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5037750381__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5038350386__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5076350766__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5122751230__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5179651800__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5180251805__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5218452187__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5264852651__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5348253486__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5348853496__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5360353607__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5360953612__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5398453987__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5448954492__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5513455137__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5557655580__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5558255590__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5571355717__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5571955722__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5613956142__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5665156654__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5729257296__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5729857301__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5772057723__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5823258235__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5910559109__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5911159119__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5924259246__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5924859251__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5967259675__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6022760230__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6089160895__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6126461267__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6190561909__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6191161914__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6233162334__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6284362846__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6369663700__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6370263705__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6408264085__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6454664549__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6525465258__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6526065263__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6563965642__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6610366106__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6675566759__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6676166764__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6713767141__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6766067663__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6852368526__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6917769181__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6918369186__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6956169564__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7002570028__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7064670650__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7083970845__WEBPACK_MODULE_REFERENCE__3_5b227369676e4f7574225d_call_directImport_asiSafe1__._undefined7127971282__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7172971732__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7240572409__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7241172419__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined7252672529__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7253172534__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined7293272935__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7293772940__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined7351473517__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7364573649__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7386073863__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7405474058__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7421274215__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7446074463__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7475174755__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7493374936__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7531775320__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7532275325__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined`$156242(0,navigation.useRouter)undefined268358(0,navigation.usePathname)undefined393481(0,auth/* useSession */.wV)undefined512598(0,context_locale/* useLocale */.Y)undefined639723(0,react.useState)undefined775859(0,react.useState)undefined911995(0,react.useState)undefined10411125(0,react.useState)undefined11671251(0,react.useState)undefined12961380(0,react.useState)undefined14121492(0,react.useRef)undefined15231603(0,react.useRef)undefined16351715(0,react.useRef)undefined18191905(0,react.useEffect)undefined24522538(0,react.useEffect)undefined26872773(0,react.useEffect)undefined28342907(0,esm_debug.io)undefined36163702(0,react.useEffect)undefined38213917(0,api/* getUnreadCount */.$M)undefined41664252(0,react.useEffect)undefined43534449(0,api/* getMyDashboard */.H)undefined46014687(0,react.useEffect)undefined51475223(0,react_jsx_runtime.jsxs)undefined52255304react_jsx_runtime.Fragmentundefined53555429(0,react_jsx_runtime.jsx)undefined56375713(0,react_jsx_runtime.jsxs)undefined58675943(0,react_jsx_runtime.jsxs)undefined61646238(0,react_jsx_runtime.jsx)undefined62406317(link_default())undefined65066580(0,react_jsx_runtime.jsx)undefined68986974(0,react_jsx_runtime.jsxs)undefined71947270(0,react_jsx_runtime.jsxs)undefined72727351react_jsx_runtime.Fragmentundefined74747548(0,react_jsx_runtime.jsx)undefined75507627(link_default())undefined80168090(0,react_jsx_runtime.jsx)undefined80928169(link_default())undefined86038679(0,react_jsx_runtime.jsxs)undefined86818760react_jsx_runtime.Fragmentundefined88838957(0,react_jsx_runtime.jsx)undefined89599036(link_default())undefined94339507(0,react_jsx_runtime.jsx)undefined95099586(link_default())undefined1006310137(0,react_jsx_runtime.jsx)undefined1013910216(link_default())undefined1064510721(0,react_jsx_runtime.jsxs)undefined1072310802react_jsx_runtime.Fragmentundefined1092511001(0,react_jsx_runtime.jsxs)undefined1100311080(link_default())undefined1142211496(0,react_jsx_runtime.jsx)undefined1203512109(0,react_jsx_runtime.jsx)undefined1278912863(0,react_jsx_runtime.jsx)undefined1344113517(0,react_jsx_runtime.jsxs)undefined1351913596(link_default())undefined1392914003(0,react_jsx_runtime.jsx)undefined1454014614(0,react_jsx_runtime.jsx)undefined1524115315(0,react_jsx_runtime.jsx)undefined1589315969(0,react_jsx_runtime.jsxs)undefined1625816334(0,react_jsx_runtime.jsxs)undefined1675516829(0,react_jsx_runtime.jsx)undefined1702417122(0,formatName/* formatShortName */.H)undefined1735817432(0,react_jsx_runtime.jsx)undefined1789617970(0,react_jsx_runtime.jsx)undefined1848318557(0,react_jsx_runtime.jsx)undefined1910719181(0,react_jsx_runtime.jsx)undefined1982319899(0,react_jsx_runtime.jsxs)undefined2023920315(0,react_jsx_runtime.jsxs)undefined2031720396react_jsx_runtime.Fragmentundefined2056720643(0,react_jsx_runtime.jsxs)undefined2064520722(link_default())undefined2128221356(0,react_jsx_runtime.jsx)undefined2201822092(0,react_jsx_runtime.jsx)undefined2294623022(0,react_jsx_runtime.jsxs)undefined2302423101(link_default())undefined2366323737(0,react_jsx_runtime.jsx)undefined2439924473(0,react_jsx_runtime.jsx)undefined2558325659(0,react_jsx_runtime.jsxs)undefined2566125740react_jsx_runtime.Fragmentundefined2591125987(0,react_jsx_runtime.jsxs)undefined2598926066(link_default())undefined2663026704(0,react_jsx_runtime.jsx)undefined2740927483(0,react_jsx_runtime.jsx)undefined2828828364(0,react_jsx_runtime.jsxs)undefined2882928903(0,react_jsx_runtime.jsx)undefined2974629822(0,react_jsx_runtime.jsxs)undefined2982429901(link_default())undefined3045630530(0,react_jsx_runtime.jsx)undefined3123331307(0,react_jsx_runtime.jsx)undefined3206032136(0,react_jsx_runtime.jsxs)undefined3259132665(0,react_jsx_runtime.jsx)undefined3350833584(0,react_jsx_runtime.jsxs)undefined3358633663(link_default())undefined3422334297(0,react_jsx_runtime.jsx)undefined3495935033(0,react_jsx_runtime.jsx)undefined3615836234(0,react_jsx_runtime.jsxs)undefined3623636313(link_default())undefined3682936903(0,react_jsx_runtime.jsx)undefined3751737591(0,react_jsx_runtime.jsx)undefined3843338509(0,react_jsx_runtime.jsxs)undefined3851138588(link_default())undefined3910739181(0,react_jsx_runtime.jsx)undefined3979539869(0,react_jsx_runtime.jsx)undefined4073440810(0,react_jsx_runtime.jsxs)undefined4081240889(link_default())undefined4140541481(0,react_jsx_runtime.jsxs)undefined4217742251(0,react_jsx_runtime.jsx)undefined4323143305(0,react_jsx_runtime.jsx)undefined4419644272(0,react_jsx_runtime.jsxs)undefined4427444351(link_default())undefined4486944943(0,react_jsx_runtime.jsx)undefined4555745631(0,react_jsx_runtime.jsx)undefined4646546541(0,react_jsx_runtime.jsxs)undefined4654346620(link_default())undefined4714047214(0,react_jsx_runtime.jsx)undefined4782847902(0,react_jsx_runtime.jsx)undefined4879448868(0,react_jsx_runtime.jsx)undefined4912649202(0,react_jsx_runtime.jsxs)undefined4962849710(0,auth/* signOut */.CI)undefined5014250216(0,react_jsx_runtime.jsx)undefined5081650890(0,react_jsx_runtime.jsx)undefined5199752073(0,react_jsx_runtime.jsxs)undefined5207552154react_jsx_runtime.Fragmentundefined5227752351(0,react_jsx_runtime.jsx)undefined5235352430(link_default())undefined5281452888(0,react_jsx_runtime.jsx)undefined5289052967(link_default())undefined5346653540(0,react_jsx_runtime.jsx)undefined5354253637LanguageSwitcherundefined5376453840(0,react_jsx_runtime.jsxs)undefined5403754111(0,react_jsx_runtime.jsx)undefined5411354208LanguageSwitcherundefined5427054344(0,react_jsx_runtime.jsx)undefined5464254716(0,react_jsx_runtime.jsx)undefined5516255236(0,react_jsx_runtime.jsx)undefined5554655620(0,react_jsx_runtime.jsx)undefined5618856264(0,react_jsx_runtime.jsxs)undefined5647856554(0,react_jsx_runtime.jsxs)undefined5655656635react_jsx_runtime.Fragmentundefined5674256818(0,react_jsx_runtime.jsxs)undefined5682056897(link_default())undefined5727057344(0,react_jsx_runtime.jsx)undefined5780557879(0,react_jsx_runtime.jsx)undefined5847658552(0,react_jsx_runtime.jsxs)undefined5855458631(link_default())undefined5900859082(0,react_jsx_runtime.jsx)undefined5954359617(0,react_jsx_runtime.jsx)undefined6034860424(0,react_jsx_runtime.jsxs)undefined6042660505react_jsx_runtime.Fragmentundefined6061260688(0,react_jsx_runtime.jsxs)undefined6069060767(link_default())undefined6114461218(0,react_jsx_runtime.jsx)undefined6167961753(0,react_jsx_runtime.jsx)undefined6231962395(0,react_jsx_runtime.jsxs)undefined6239762474(link_default())undefined6285362927(0,react_jsx_runtime.jsx)undefined6338863462(0,react_jsx_runtime.jsx)undefined6429364369(0,react_jsx_runtime.jsxs)undefined6437164450react_jsx_runtime.Fragmentundefined6455764633(0,react_jsx_runtime.jsxs)undefined6463564712(link_default())undefined6508465158(0,react_jsx_runtime.jsx)undefined6566065734(0,react_jsx_runtime.jsx)undefined6637666450(0,react_jsx_runtime.jsx)undefined6688966965(0,react_jsx_runtime.jsxs)undefined6696767046react_jsx_runtime.Fragmentundefined6716967245(0,react_jsx_runtime.jsxs)undefined6724767324(link_default())undefined6774167815(0,react_jsx_runtime.jsx)undefined6832468398(0,react_jsx_runtime.jsx)undefined6903669112(0,react_jsx_runtime.jsxs)undefined6911469191(link_default())undefined6961069684(0,react_jsx_runtime.jsx)undefined7019370267(0,react_jsx_runtime.jsx)undefined7113771213(0,react_jsx_runtime.jsxs)undefined7121571294react_jsx_runtime.Fragmentundefined7141771493(0,react_jsx_runtime.jsxs)undefined7149571572(link_default())undefined7199372067(0,react_jsx_runtime.jsx)undefined7261972693(0,react_jsx_runtime.jsx)undefined7335473430(0,react_jsx_runtime.jsxs)undefined7379973873(0,react_jsx_runtime.jsx)undefined7451174587(0,react_jsx_runtime.jsxs)undefined7458974666(link_default())undefined7508375157(0,react_jsx_runtime.jsx)undefined7566675740(0,react_jsx_runtime.jsx)undefined7659076666(0,react_jsx_runtime.jsxs)undefined7666876745(link_default())undefined7712277196(0,react_jsx_runtime.jsx)undefined7765777731(0,react_jsx_runtime.jsx)undefined7843678512(0,react_jsx_runtime.jsxs)undefined7851478591(link_default())undefined7896779041(0,react_jsx_runtime.jsx)undefined7950279576(0,react_jsx_runtime.jsx)undefined8022580301(0,react_jsx_runtime.jsxs)undefined8030380380(link_default())undefined8075380829(0,react_jsx_runtime.jsxs)undefined8134881422(0,react_jsx_runtime.jsx)undefined8228282356(0,react_jsx_runtime.jsx)undefined8300783083(0,react_jsx_runtime.jsxs)undefined8308583162(link_default())undefined8353783611(0,react_jsx_runtime.jsx)undefined8407284146(0,react_jsx_runtime.jsx)undefined8476484840(0,react_jsx_runtime.jsxs)undefined8502985111(0,auth/* signOut */.CI)undefined8554585619(0,react_jsx_runtime.jsx)undefined8606686140(0,react_jsx_runtime.jsx)undefined8681386889(0,react_jsx_runtime.jsxs)undefined8689186970react_jsx_runtime.Fragmentundefined8707787151(0,react_jsx_runtime.jsx)undefined8715387230(link_default())undefined8762887702(0,react_jsx_runtime.jsx)undefined8770487781(link_default())undefined8835588429(0,react_jsx_runtime.jsx)undefined8855788633(0,react_jsx_runtime.jsxs)undefined8884488918(0,react_jsx_runtime.jsx)undefined8910989185(0,react_jsx_runtime.jsxs)undefined8933989413(0,react_jsx_runtime.jsx)undefined8965889732(0,react_jsx_runtime.jsx)undefined9002090096(0,react_jsx_runtime.jsxs)undefined9027490348(0,react_jsx_runtime.jsx)undefined9072990803(0,react_jsx_runtime.jsx)undefined9080590882(link_default())undefined<>, /***/ 64271:  vwebpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceV/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceimport(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/builtin/global-error.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/client-page.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/client-segment.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/layout-router.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/metadata/async-metadata.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/render-from-template-context.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/lib/framework/boundary-components.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/lib/metadata/generate/icon-mark.js");  aqvNNSBG9>Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 58671, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56542, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 88248, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 49743, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 96231, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 10959, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 72041, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 95094, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 67487, 23))buffersourcesizemapshashPromise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 58671, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56542, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 88248, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 49743, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 96231, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 10959, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 72041, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 95094, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 67487, 23)); {"finalSource":true}mapbufferedMap ReplaceSourceRawSourceimport(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/builtin/global-error.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/client-page.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/client-segment.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/layout-router.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/metadata/async-metadata.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/render-from-template-context.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/lib/framework/boundary-components.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/lib/metadata/generate/icon-mark.js"); 0113Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 58671, 23))undefined118222Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56542, 23))undefined227334Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 88248, 23))undefined339467Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 49743, 23))undefined472578Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 96231, 23))undefined583699Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 10959, 23))undefined704825Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 72041, 23))undefined830938Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 95094, 23))undefined9431049Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 67487, 23))undefined /***/ }) -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 58671, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56542, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 88248, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 49743, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 96231, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 10959, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 72041, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 95094, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 67487, 23)); /***/ }) .1 2Aimport(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/builtin/global-error.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/client-page.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/client-segment.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/layout-router.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/metadata/async-metadata.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/render-from-template-context.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/lib/framework/boundary-components.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/lib/metadata/generate/icon-mark.js"); 0113Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 58671, 23))undefined118222Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56542, 23))undefined227334Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 88248, 23))undefined339467Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 49743, 23))undefined472578Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 96231, 23))undefined583699Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 10959, 23))undefined704825Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 72041, 23))undefined830938Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 95094, 23))undefined9431049Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 67487, 23))undefined24, /***/ 67674:  (webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource *webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Header: () => (/* binding */ Header) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const Header = registerClientReference( function() { throw new Error("Attempted to call Header() from the server but Header is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/Header.tsx", "Header", ); `=D(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)buffersourcesizemapshash/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Header: () => (/* binding */ Header) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const Header = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call Header() from the server but Header is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/Header.tsx", "Header", ); {"finalSource":true}mapbufferedMap ConcatSourceRawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Header: () => (/* binding */ Header) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); ReplaceSourceRawSource// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const Header = registerClientReference( function() { throw new Error("Attempted to call Header() from the server but Header is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/Header.tsx", "Header", );61134undefined136142undefined158180(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined /***/ }) #/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Header: () => (/* binding */ Header) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const Header = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call Header() from the server but Header is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/Header.tsx", "Header", ); /***/ }) $'  (5(/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Header: () => (/* binding */ Header) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); 6// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const Header = registerClientReference( function() { throw new Error("Attempted to call Header() from the server but Header is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/Header.tsx", "Header", );(*, /***/ 72088:  webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource/***/ (() => { /* (ignored) */  /***/ })    !"!#, /***/ 72519:  dwebpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceV/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceimport(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/builtin/global-error.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/client-page.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/client-segment.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/layout-router.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/metadata/async-metadata.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/render-from-template-context.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/lib/framework/boundary-components.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/lib/metadata/generate/icon-mark.js");  aqvNNSBG9>Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 48365, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 64596, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56186, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 67805, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 27561, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 47569, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 42747, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56676, 23))Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 97225))buffersourcesizemapshashPromise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 48365, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 64596, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56186, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 67805, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 27561, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 47569, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 42747, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56676, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 97225)); {"finalSource":true}mapbufferedMap ReplaceSourceRawSourceimport(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/builtin/global-error.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/client-page.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/client-segment.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/layout-router.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/metadata/async-metadata.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/render-from-template-context.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/lib/framework/boundary-components.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/lib/metadata/generate/icon-mark.js"); 0113Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 48365, 23))undefined118222Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 64596, 23))undefined227334Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56186, 23))undefined339467Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 67805, 23))undefined472578Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 27561, 23))undefined583699Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 47569, 23))undefined704825Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 42747, 23))undefined830938Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56676, 23))undefined9431049Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 97225))undefined /***/ }) /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 48365, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 64596, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56186, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 67805, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 27561, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 47569, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 42747, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56676, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 97225)); /***/ })  &0113Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 48365, 23))undefined118222Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 64596, 23))undefined227334Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56186, 23))undefined339467Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 67805, 23))undefined472578Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 27561, 23))undefined583699Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 47569, 23))undefined704825Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 42747, 23))undefined830938Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56676, 23))undefined9431049Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 97225))undefined, /***/ 85998:  webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceV/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceimport(/* webpackMode: "eager", webpackExports: ["__esModule","default"] */ "/opt/canhelp/node_modules/next/dist/client/app-dir/link.js"); @Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 3498, 23))buffersourcesizemapshashgPromise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 3498, 23)); {"finalSource":true}mapbufferedMap ReplaceSourceRawSourceimport(/* webpackMode: "eager", webpackExports: ["__esModule","default"] */ "/opt/canhelp/node_modules/next/dist/client/app-dir/link.js"); r0136Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 3498, 23))undefined /***/ })  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 3498, 23)); /***/ })    r0136Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 3498, 23))undefined, /***/ 91864:  HUwebpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource Nswebpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $7: () => (/* binding */ updateCategory), /* harmony export */ $H: () => (/* binding */ acceptOffer), /* harmony export */ $M: () => (/* binding */ getUnreadCount), /* harmony export */ Bb: () => (/* binding */ getMySpecialistCards), /* harmony export */ Bm: () => (/* binding */ getUserRating), /* harmony export */ Bq: () => (/* binding */ getSpecialistCards), /* harmony export */ Br: () => (/* binding */ getAdminNotifLogs), /* harmony export */ CX: () => (/* binding */ updateAdminSettings), /* harmony export */ Cs: () => (/* binding */ previewPlanChange), /* harmony export */ D1: () => (/* binding */ setAvailabilityRange), /* harmony export */ Em: () => (/* binding */ request), /* harmony export */ F7: () => (/* binding */ getSpecialists), /* harmony export */ F9: () => (/* binding */ getTaskInvite), /* harmony export */ FI: () => (/* binding */ sendTestEmail), /* harmony export */ Fu: () => (/* binding */ getMyTasks), /* harmony export */ GB: () => (/* binding */ deleteTaskAdmin), /* harmony export */ Gp: () => (/* binding */ getAutoResponseSettings), /* harmony export */ H: () => (/* binding */ getMyDashboard), /* harmony export */ H6: () => (/* binding */ getTaskReviews), /* harmony export */ He: () => (/* binding */ activateUser), /* harmony export */ Ip: () => (/* binding */ markRead), /* harmony export */ Je: () => (/* binding */ purchasePlan), /* harmony export */ K7: () => (/* binding */ deleteCategory), /* harmony export */ KD: () => (/* binding */ getAdminCategories), /* harmony export */ Lb: () => (/* binding */ declineOffer), /* harmony export */ Lp: () => (/* binding */ getAdminEmailTemplates), /* harmony export */ ML: () => (/* binding */ getCustomerFomoDashboard), /* harmony export */ Mm: () => (/* binding */ changeUserRole), /* harmony export */ NL: () => (/* binding */ markAllRead), /* harmony export */ Nt: () => (/* binding */ updateLocation), /* harmony export */ OM: () => (/* binding */ setAvailability), /* harmony export */ OV: () => (/* binding */ runAutoMatch), /* harmony export */ OX: () => (/* binding */ getAdminPlans), /* harmony export */ On: () => (/* binding */ getCanMessage), /* harmony export */ P0: () => (/* binding */ adminTopUpUserBalance), /* harmony export */ QN: () => (/* binding */ getOrCreateDirectRoom), /* harmony export */ RN: () => (/* binding */ getSiteStats), /* harmony export */ RQ: () => (/* binding */ updateAutoResponseSettings), /* harmony export */ Rt: () => (/* binding */ completeTask), /* harmony export */ S$: () => (/* binding */ getPublicSiteProfile), /* harmony export */ Sw: () => (/* binding */ getOffers), /* harmony export */ T9: () => (/* binding */ getPlans), /* harmony export */ Tr: () => (/* binding */ getNotifications), /* harmony export */ UE: () => (/* binding */ trackSiteMessage), /* harmony export */ UT: () => (/* binding */ createTask), /* harmony export */ V: () => (/* binding */ addSpecialistFavorite), /* harmony export */ VL: () => (/* binding */ getMessages), /* harmony export */ VM: () => (/* binding */ getUserProfile), /* harmony export */ Vs: () => (/* binding */ getLocations), /* harmony export */ Wi: () => (/* binding */ deactivateUser), /* harmony export */ Xz: () => (/* binding */ getSpecialistAvailability), /* harmony export */ Yj: () => (/* binding */ getAdminTasks), /* harmony export */ Zp: () => (/* binding */ getChatRooms), /* harmony export */ _z: () => (/* binding */ sendMessage), /* harmony export */ aT: () => (/* binding */ getMyOffers), /* harmony export */ bR: () => (/* binding */ deletePlan), /* harmony export */ bW: () => (/* binding */ getCategories), /* harmony export */ bc: () => (/* binding */ toggleStatus), /* harmony export */ bi: () => (/* binding */ getAdminNotifStats), /* harmony export */ bx: () => (/* binding */ createReview), /* harmony export */ cS: () => (/* binding */ getAdminUsers), /* harmony export */ dE: () => (/* binding */ getAdminStats), /* harmony export */ eR: () => (/* binding */ createSpecialistCard), /* harmony export */ eU: () => (/* binding */ updateReportStatus), /* harmony export */ f5: () => (/* binding */ deleteSpecialistCard), /* harmony export */ fm: () => (/* binding */ getBalanceHistory), /* harmony export */ g0: () => (/* binding */ getAdminBalanceHistory), /* harmony export */ gg: () => (/* binding */ getTask), /* harmony export */ hD: () => (/* binding */ adminWithdrawUserBalance), /* harmony export */ hl: () => (/* binding */ updatePortfolioItem), /* harmony export */ iN: () => (/* binding */ getMyAvailability), /* harmony export */ j_: () => (/* binding */ getAdminAiLogs), /* harmony export */ jd: () => (/* binding */ getAdminUser), /* harmony export */ jg: () => (/* binding */ updateAdminEmailTemplate), /* harmony export */ k_: () => (/* binding */ getAdminLocations), /* harmony export */ lC: () => (/* binding */ updateTask), /* harmony export */ nf: () => (/* binding */ cancelTaskAdmin), /* harmony export */ oh: () => (/* binding */ initiateTopUp), /* harmony export */ oq: () => (/* binding */ adminUpdateSpecialistCard), /* harmony export */ pD: () => (/* binding */ getSpecialistFavorites), /* harmony export */ pK: () => (/* binding */ getPaymentHistory), /* harmony export */ q7: () => (/* binding */ getMyReviews), /* harmony export */ qT: () => (/* binding */ createPlan), /* harmony export */ qt: () => (/* binding */ getAdminMailLogs), /* harmony export */ rC: () => (/* binding */ getAdminSettings), /* harmony export */ rl: () => (/* binding */ getSkillSuggestions), /* harmony export */ sD: () => (/* binding */ removeSpecialistFavorite), /* harmony export */ st: () => (/* binding */ getMyReferralInfo), /* harmony export */ td: () => (/* binding */ updatePlan), /* harmony export */ ts: () => (/* binding */ createOffer), /* harmony export */ u4: () => (/* binding */ getAdminMailStats), /* harmony export */ v9: () => (/* binding */ getUserReviews), /* harmony export */ vh: () => (/* binding */ getTaskStats), /* harmony export */ vy: () => (/* binding */ getAdminUserSpecialistCards), /* harmony export */ wc: () => (/* binding */ translateAdminEmailTemplate), /* harmony export */ wl: () => (/* binding */ updateAdminUser), /* harmony export */ yJ: () => (/* binding */ createLocation), /* harmony export */ yO: () => (/* binding */ getAdminActivityLogs), /* harmony export */ yk: () => (/* binding */ dismissNotification), /* harmony export */ z4: () => (/* binding */ getDailyUsage), /* harmony export */ z5: () => (/* binding */ getAdminReports), /* harmony export */ z6: () => (/* binding */ getMyStatuses), /* harmony export */ zB: () => (/* binding */ deletePortfolioItem), /* harmony export */ zR: () => (/* binding */ deleteLocation), /* harmony export */ zZ: () => (/* binding */ createCategory), /* harmony export */ zc: () => (/* binding */ updateSpecialistCard), /* harmony export */ zk: () => (/* binding */ getSpecialistFomoDashboard) /* harmony export */ }); /* unused harmony exports getTasks, getTaskBudgetRange, searchTasks, getTasksForSpecialist, getTaskCountsByCategory, cancelTask, updateNotifSettings, getFavorites, addFavorite, removeFavorite, getMyPortfolio, addPortfolioItem, getSpecialistPortfolio, getFomoRecommendations, getAutoMatchResults, getGoogleCalendarStatus, disconnectGoogleCalendar, importFromGoogleCalendar, getGoogleCalendarConnectUrl */ webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource~Oconst BASE = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; export async function request(path, init) { const res = await fetch(`${BASE}/api${path}`, { ...init, credentials: 'include', headers: { 'Content-Type': 'application/json', ...init?.headers } }); if (!res.ok) { const err = await res.json().catch(()=>({ error: res.statusText })); const msg = typeof err.error === 'string' ? err.error : typeof err.message === 'string' ? err.message : res.statusText || 'Request failed'; throw new Error(msg); } return res.json(); } // ─── Tasks ──────────────────────────────────────────────────────────────── export const getTasks = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks${qs}`); }; export const getTaskBudgetRange = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks/budget-range${qs}`); }; export const searchTasks = (params)=>request(`/tasks/search?${new URLSearchParams(params)}`); export const getMyTasks = ()=>request('/tasks/my'); export const getTasksForSpecialist = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks/for-me${qs}`); }; export const getTaskCountsByCategory = ()=>request('/tasks/counts-by-category'); export const getTask = (id)=>request(`/tasks/${id}`); export const createTask = (data)=>request('/tasks', { method: 'POST', body: JSON.stringify(data) }); export const updateTask = (id, data)=>request(`/tasks/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const completeTask = (id)=>request(`/tasks/${id}/complete`, { method: 'PATCH' }); export const cancelTask = (id)=>request(`/tasks/${id}/cancel`, { method: 'PATCH' }); // ─── Offers ──────────────────────────────────────────────────────────────── export const getOffers = (taskId)=>request(`/offers?taskId=${taskId}`); export const getMyOffers = ()=>request('/offers/my'); export const createOffer = (data)=>request('/offers', { method: 'POST', body: JSON.stringify(data) }); export const acceptOffer = (id)=>request(`/offers/${id}/accept`, { method: 'PATCH' }); export const declineOffer = (id)=>request(`/offers/${id}/decline`, { method: 'PATCH' }); export const getUserProfile = (id)=>request(`/users/${id}/profile`); export const getSpecialists = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/users/specialists${qs}`); }; export const createReview = (data)=>request('/reviews', { method: 'POST', body: JSON.stringify(data) }); export const getTaskReviews = (taskId)=>request(`/reviews/task/${taskId}`); export const getMyReviews = ()=>request('/reviews/my'); // ─── Chat ────────────────────────────────────────────────────────────────── export const getChatRooms = ()=>request('/chat/rooms'); export const getOrCreateDirectRoom = (userId)=>request(`/chat/direct/${userId}`); export const getCanMessage = (userId)=>request(`/chat/can-message/${userId}`); export const getMessages = (roomId)=>request(`/chat/rooms/${roomId}/messages`); export const sendMessage = (roomId, body)=>request('/chat/messages', { method: 'POST', body: JSON.stringify({ roomId, body }) }); // ─── Notifications ──────────────────────────────────────────────────────── export const updateNotifSettings = (data)=>request('/users/me', { method: 'PATCH', body: JSON.stringify(data) }); export const getNotifications = ()=>request('/notifications'); export const getUnreadCount = ()=>request('/notifications/count'); export const markRead = (id)=>request(`/notifications/${id}/read`, { method: 'PATCH' }); export const markAllRead = ()=>request('/notifications/read-all', { method: 'PATCH' }); export const getTaskInvite = (taskId)=>request(`/notifications?type=task_invite&referenceId=${taskId}`); export const dismissNotification = (id)=>request(`/notifications/${id}`, { method: 'DELETE' }); // ─── Referral ───────────────────────────────────────────────────────────── export const getMyReferralInfo = ()=>request('/users/me/referral'); // ─── Reviews ────────────────────────────────────────────────────────────── export const getUserReviews = (userId)=>request(`/reviews/user/${userId}`); export const getUserRating = (userId)=>request(`/reviews/user/${userId}/rating`); // ─── Categories ─────────────────────────────────────────────────────────── export const getCategories = ()=>request('/categories'); // ─── Locations ──────────────────────────────────────────────────────────── export const getLocations = ()=>request('/locations'); // ─── Favorites ──────────────────────────────────────────────────────────── export const getFavorites = ()=>request('/favorites'); export const addFavorite = (taskId)=>request(`/favorites/${taskId}`, { method: 'POST' }); export const removeFavorite = (taskId)=>request(`/favorites/${taskId}`, { method: 'DELETE' }); export const getSpecialistFavorites = ()=>request('/favorites/specialists'); export const addSpecialistFavorite = (specialistId)=>request(`/favorites/specialists/${specialistId}`, { method: 'POST' }); export const removeSpecialistFavorite = (specialistId)=>request(`/favorites/specialists/${specialistId}`, { method: 'DELETE' }); // ─── Admin ───────────────────────────────────────────────────────────────── // ─── Admin Categories ────────────────────────────────────────────────────── export const getAdminCategories = ()=>request('/admin/categories'); export const createCategory = (data)=>request('/admin/categories', { method: 'POST', body: JSON.stringify(data) }); export const updateCategory = (id, data)=>request(`/admin/categories/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deleteCategory = (id)=>request(`/admin/categories/${id}`, { method: 'DELETE' }); // ─── Admin ───────────────────────────────────────────────────────────────── export const getAdminStats = ()=>request('/admin/stats'); export const getAdminUsers = (page = 1, q, role)=>{ const p = new URLSearchParams({ page: String(page), limit: '20' }); if (q) p.set('q', q); if (role) p.set('role', role); return request(`/admin/users?${p}`); }; export const deactivateUser = (id)=>request(`/admin/users/${id}/deactivate`, { method: 'PATCH' }); export const activateUser = (id)=>request(`/admin/users/${id}/activate`, { method: 'PATCH' }); export const changeUserRole = (id, role)=>request(`/admin/users/${id}/role`, { method: 'PATCH', body: JSON.stringify({ role }) }); export const getAdminUser = (id)=>request(`/admin/users/${id}`); export const getAdminUserSpecialistCards = (userId)=>request(`/admin/users/${userId}/specialist-cards`); export const adminUpdateSpecialistCard = (id, data)=>request(`/admin/specialist-cards/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const updateAdminUser = (id, data)=>request(`/admin/users/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const getAdminTasks = (page = 1, q, status)=>{ const p = new URLSearchParams({ page: String(page), limit: '20' }); if (q) p.set('q', q); if (status) p.set('status', status); return request(`/admin/tasks?${p}`); }; export const cancelTaskAdmin = (id)=>request(`/admin/tasks/${id}/cancel`, { method: 'PATCH' }); export const deleteTaskAdmin = (id)=>request(`/admin/tasks/${id}`, { method: 'DELETE' }); export const getAdminReports = (page = 1)=>request(`/admin/reports?page=${page}&limit=20`); export const updateReportStatus = (id, status)=>request(`/admin/reports/${id}/status`, { method: 'PATCH', body: JSON.stringify({ status }) }); export const getAdminAiLogs = (page = 1)=>request(`/admin/ai-logs?page=${page}&limit=50`); export const getAdminActivityLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.event) p.set('event', params.event); if (params.userId) p.set('userId', params.userId); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/activity-logs?${p}`); }; export const getAdminMailLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.event) p.set('event', params.event); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/mail-logs?${p}`); }; export const getAdminNotifLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.type) p.set('type', params.type); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/notification-logs?${p}`); }; export const getAdminNotifStats = ()=>request('/admin/notification-stats'); export const getAdminMailStats = ()=>request('/admin/mail-stats'); // ─── Admin Locations ─────────────────────────────────────────────────────── export const getAdminLocations = ()=>request('/admin/locations'); export const createLocation = (data)=>request('/admin/locations', { method: 'POST', body: JSON.stringify(data) }); export const updateLocation = (id, data)=>request(`/admin/locations/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deleteLocation = (id)=>request(`/admin/locations/${id}`, { method: 'DELETE' }); // ─── Admin Plans ─────────────────────────────────────────────────────────── export const getAdminPlans = ()=>request('/admin/plans'); export const createPlan = (data)=>request('/admin/plans', { method: 'POST', body: JSON.stringify(data) }); export const updatePlan = (id, data)=>request(`/admin/plans/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deletePlan = (id)=>request(`/admin/plans/${id}`, { method: 'DELETE' }); // ─── Admin Settings ──────────────────────────────────────────────────────── export const getAdminSettings = ()=>request('/admin/settings'); export const updateAdminSettings = (data)=>request('/admin/settings', { method: 'PUT', body: JSON.stringify(data) }); export const getAdminEmailTemplates = ()=>request('/admin/settings/templates'); export const updateAdminEmailTemplate = (key, data)=>request(`/admin/settings/templates/${key}`, { method: 'PUT', body: JSON.stringify(data) }); export const translateAdminEmailTemplate = (data)=>request('/admin/settings/templates/translate', { method: 'POST', body: JSON.stringify(data) }); export const sendTestEmail = ()=>request('/admin/settings/test-email', { method: 'POST' }); // ─── Availability ────────────────────────────────────────────────────────── export const getMyAvailability = (month)=>request(`/availability/my${month ? `?month=${month}` : ''}`); export const setAvailability = (date, status, note)=>request('/availability/set', { method: 'POST', body: JSON.stringify({ date, status, note }) }); export const setAvailabilityRange = (from, to, status)=>request('/availability/set-range', { method: 'POST', body: JSON.stringify({ from, to, status }) }); export const getSpecialistAvailability = (userId, month)=>request(`/availability/user/${userId}${month ? `?month=${month}` : ''}`); export const getMyPortfolio = ()=>request('/portfolio/my'); export const addPortfolioItem = (formData)=>fetch(`${BASE}/api/portfolio`, { method: 'POST', credentials: 'include', body: formData }).then(async (res)=>{ if (!res.ok) { const err = await res.json().catch(()=>({ error: res.statusText })); throw new Error(err.error || 'Upload failed'); } return res.json(); }); export const updatePortfolioItem = (id, data)=>request(`/portfolio/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deletePortfolioItem = (id)=>request(`/portfolio/${id}`, { method: 'DELETE' }); export const getSpecialistPortfolio = (userId)=>request(`/portfolio/user/${userId}`); export const getMySpecialistCards = ()=>request('/specialist-cards/my'); export const createSpecialistCard = (data)=>request('/specialist-cards', { method: 'POST', body: JSON.stringify(data) }); export const updateSpecialistCard = (id, data)=>request(`/specialist-cards/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deleteSpecialistCard = (id)=>request(`/specialist-cards/${id}`, { method: 'DELETE' }); export const getSpecialistCards = (userId)=>request(`/specialist-cards/user/${userId}`); export const getSkillSuggestions = (categorySlugs)=>{ const params = categorySlugs?.length ? '?' + categorySlugs.map((s)=>`category=${encodeURIComponent(s)}`).join('&') : ''; return request(`/skill-suggestions${params}`); }; export const initiateTopUp = (amount)=>request('/payments/topup/init', { method: 'POST', body: JSON.stringify({ amount }) }); export const getPaymentHistory = ()=>request('/payments/history'); export const getBalanceHistory = (limit = 50)=>request(`/payments/balance-history?limit=${limit}`); export const getAdminBalanceHistory = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.userId) p.set('userId', params.userId); if (params.kind) p.set('kind', params.kind); p.set('limit', '50'); return request(`/admin/balance-history?${p}`); }; export const adminTopUpUserBalance = (id, data)=>request(`/admin/users/${id}/balance/topup`, { method: 'POST', body: JSON.stringify(data) }); export const adminWithdrawUserBalance = (id, data)=>request(`/admin/users/${id}/balance/withdraw`, { method: 'POST', body: JSON.stringify(data) }); export const previewPlanChange = (planId)=>request('/payments/plan/preview', { method: 'POST', body: JSON.stringify({ planId }) }); export const getPlans = (role)=>{ const qs = role ? `?role=${role}` : ''; return request(`/plans${qs}`); }; export const getMyDashboard = ()=>request('/dashboard/me'); export const getDailyUsage = ()=>request('/plans/daily-usage'); export const purchasePlan = (planId, payFromBalance = true)=>request('/payments/plan/purchase', { method: 'POST', body: JSON.stringify({ planId, payFromBalance }) }); // ─── Statuses ────────────────────────────────────────────────────────────── export const getMyStatuses = ()=>request('/statuses/me'); export const toggleStatus = (statusType, active)=>request('/statuses/toggle', { method: 'POST', body: JSON.stringify({ statusType, active }) }); export const getAutoResponseSettings = ()=>request('/auto-response'); export const updateAutoResponseSettings = (data)=>request('/auto-response', { method: 'PUT', body: JSON.stringify(data) }); // ─── FOMO ────────────────────────────────────────────────────────────────── export const getSpecialistFomoDashboard = ()=>request('/fomo/specialist'); export const getCustomerFomoDashboard = ()=>request('/fomo/customer'); export const getFomoRecommendations = ()=>request('/fomo/recommendations'); // ─── Auto-match ──────────────────────────────────────────────────────────── export const getAutoMatchResults = (taskId)=>request(`/auto-match/${taskId}`); export const runAutoMatch = (taskId)=>request(`/auto-match/${taskId}`, { method: 'POST' }); // ─── Google Calendar ─────────────────────────────────────────────────────── export const getGoogleCalendarStatus = ()=>request('/google/calendar/status'); export const disconnectGoogleCalendar = ()=>request('/google/calendar/disconnect', { method: 'DELETE' }); export const importFromGoogleCalendar = ()=>request('/google/calendar/import', { method: 'POST' }); export const getGoogleCalendarConnectUrl = ()=>`${BASE}/api/google/calendar/connect`; // ─── Personal site ───────────────────────────────────────────────────────── export const getPublicSiteProfile = (slug)=>request(`/users/site/${slug}`); export const getSiteStats = ()=>request('/users/me/site-stats'); export const trackSiteMessage = (slug)=>request(`/users/site/${slug}/track-message`, { method: 'POST' }).catch(()=>{}); // ─── Task stats (FOMO) ───────────────────────────────────────────────────── export const getTaskStats = (taskId)=>request(`/tasks/${taskId}/stats`); @e +0FIO_qwpvBHBH+1#)Y_7 = _ } F L  W ] gm_4:lrx~U[LR_:@PV-3.4\b  n t _."4"##6%<%%%&&V&\&&&o'u''(-(a(g(((j)p)* *Z*`***4+:+_++,,7-=---t.z.P/V///0011L2R222 33S3Y333z4444_C5I5,6266677y7788h9n9::::0;6;l;r;;;<<====>!>Y>?E?K???'@-@v@|@-A3A|AAAAbBhBC CSCYCCCgDmD"https://api.canhelp.gr"0buffersourcesizemapshashi/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $7: () => (/* binding */ updateCategory), /* harmony export */ $H: () => (/* binding */ acceptOffer), /* harmony export */ $M: () => (/* binding */ getUnreadCount), /* harmony export */ Bb: () => (/* binding */ getMySpecialistCards), /* harmony export */ Bm: () => (/* binding */ getUserRating), /* harmony export */ Bq: () => (/* binding */ getSpecialistCards), /* harmony export */ Br: () => (/* binding */ getAdminNotifLogs), /* harmony export */ CX: () => (/* binding */ updateAdminSettings), /* harmony export */ Cs: () => (/* binding */ previewPlanChange), /* harmony export */ D1: () => (/* binding */ setAvailabilityRange), /* harmony export */ Em: () => (/* binding */ request), /* harmony export */ F7: () => (/* binding */ getSpecialists), /* harmony export */ F9: () => (/* binding */ getTaskInvite), /* harmony export */ FI: () => (/* binding */ sendTestEmail), /* harmony export */ Fu: () => (/* binding */ getMyTasks), /* harmony export */ GB: () => (/* binding */ deleteTaskAdmin), /* harmony export */ Gp: () => (/* binding */ getAutoResponseSettings), /* harmony export */ H: () => (/* binding */ getMyDashboard), /* harmony export */ H6: () => (/* binding */ getTaskReviews), /* harmony export */ He: () => (/* binding */ activateUser), /* harmony export */ Ip: () => (/* binding */ markRead), /* harmony export */ Je: () => (/* binding */ purchasePlan), /* harmony export */ K7: () => (/* binding */ deleteCategory), /* harmony export */ KD: () => (/* binding */ getAdminCategories), /* harmony export */ Lb: () => (/* binding */ declineOffer), /* harmony export */ Lp: () => (/* binding */ getAdminEmailTemplates), /* harmony export */ ML: () => (/* binding */ getCustomerFomoDashboard), /* harmony export */ Mm: () => (/* binding */ changeUserRole), /* harmony export */ NL: () => (/* binding */ markAllRead), /* harmony export */ Nt: () => (/* binding */ updateLocation), /* harmony export */ OM: () => (/* binding */ setAvailability), /* harmony export */ OV: () => (/* binding */ runAutoMatch), /* harmony export */ OX: () => (/* binding */ getAdminPlans), /* harmony export */ On: () => (/* binding */ getCanMessage), /* harmony export */ P0: () => (/* binding */ adminTopUpUserBalance), /* harmony export */ QN: () => (/* binding */ getOrCreateDirectRoom), /* harmony export */ RN: () => (/* binding */ getSiteStats), /* harmony export */ RQ: () => (/* binding */ updateAutoResponseSettings), /* harmony export */ Rt: () => (/* binding */ completeTask), /* harmony export */ S$: () => (/* binding */ getPublicSiteProfile), /* harmony export */ Sw: () => (/* binding */ getOffers), /* harmony export */ T9: () => (/* binding */ getPlans), /* harmony export */ Tr: () => (/* binding */ getNotifications), /* harmony export */ UE: () => (/* binding */ trackSiteMessage), /* harmony export */ UT: () => (/* binding */ createTask), /* harmony export */ V: () => (/* binding */ addSpecialistFavorite), /* harmony export */ VL: () => (/* binding */ getMessages), /* harmony export */ VM: () => (/* binding */ getUserProfile), /* harmony export */ Vs: () => (/* binding */ getLocations), /* harmony export */ Wi: () => (/* binding */ deactivateUser), /* harmony export */ Xz: () => (/* binding */ getSpecialistAvailability), /* harmony export */ Yj: () => (/* binding */ getAdminTasks), /* harmony export */ Zp: () => (/* binding */ getChatRooms), /* harmony export */ _z: () => (/* binding */ sendMessage), /* harmony export */ aT: () => (/* binding */ getMyOffers), /* harmony export */ bR: () => (/* binding */ deletePlan), /* harmony export */ bW: () => (/* binding */ getCategories), /* harmony export */ bc: () => (/* binding */ toggleStatus), /* harmony export */ bi: () => (/* binding */ getAdminNotifStats), /* harmony export */ bx: () => (/* binding */ createReview), /* harmony export */ cS: () => (/* binding */ getAdminUsers), /* harmony export */ dE: () => (/* binding */ getAdminStats), /* harmony export */ eR: () => (/* binding */ createSpecialistCard), /* harmony export */ eU: () => (/* binding */ updateReportStatus), /* harmony export */ f5: () => (/* binding */ deleteSpecialistCard), /* harmony export */ fm: () => (/* binding */ getBalanceHistory), /* harmony export */ g0: () => (/* binding */ getAdminBalanceHistory), /* harmony export */ gg: () => (/* binding */ getTask), /* harmony export */ hD: () => (/* binding */ adminWithdrawUserBalance), /* harmony export */ hl: () => (/* binding */ updatePortfolioItem), /* harmony export */ iN: () => (/* binding */ getMyAvailability), /* harmony export */ j_: () => (/* binding */ getAdminAiLogs), /* harmony export */ jd: () => (/* binding */ getAdminUser), /* harmony export */ jg: () => (/* binding */ updateAdminEmailTemplate), /* harmony export */ k_: () => (/* binding */ getAdminLocations), /* harmony export */ lC: () => (/* binding */ updateTask), /* harmony export */ nf: () => (/* binding */ cancelTaskAdmin), /* harmony export */ oh: () => (/* binding */ initiateTopUp), /* harmony export */ oq: () => (/* binding */ adminUpdateSpecialistCard), /* harmony export */ pD: () => (/* binding */ getSpecialistFavorites), /* harmony export */ pK: () => (/* binding */ getPaymentHistory), /* harmony export */ q7: () => (/* binding */ getMyReviews), /* harmony export */ qT: () => (/* binding */ createPlan), /* harmony export */ qt: () => (/* binding */ getAdminMailLogs), /* harmony export */ rC: () => (/* binding */ getAdminSettings), /* harmony export */ rl: () => (/* binding */ getSkillSuggestions), /* harmony export */ sD: () => (/* binding */ removeSpecialistFavorite), /* harmony export */ st: () => (/* binding */ getMyReferralInfo), /* harmony export */ td: () => (/* binding */ updatePlan), /* harmony export */ ts: () => (/* binding */ createOffer), /* harmony export */ u4: () => (/* binding */ getAdminMailStats), /* harmony export */ v9: () => (/* binding */ getUserReviews), /* harmony export */ vh: () => (/* binding */ getTaskStats), /* harmony export */ vy: () => (/* binding */ getAdminUserSpecialistCards), /* harmony export */ wc: () => (/* binding */ translateAdminEmailTemplate), /* harmony export */ wl: () => (/* binding */ updateAdminUser), /* harmony export */ yJ: () => (/* binding */ createLocation), /* harmony export */ yO: () => (/* binding */ getAdminActivityLogs), /* harmony export */ yk: () => (/* binding */ dismissNotification), /* harmony export */ z4: () => (/* binding */ getDailyUsage), /* harmony export */ z5: () => (/* binding */ getAdminReports), /* harmony export */ z6: () => (/* binding */ getMyStatuses), /* harmony export */ zB: () => (/* binding */ deletePortfolioItem), /* harmony export */ zR: () => (/* binding */ deleteLocation), /* harmony export */ zZ: () => (/* binding */ createCategory), /* harmony export */ zc: () => (/* binding */ updateSpecialistCard), /* harmony export */ zk: () => (/* binding */ getSpecialistFomoDashboard) /* harmony export */ }); /* unused harmony exports getTasks, getTaskBudgetRange, searchTasks, getTasksForSpecialist, getTaskCountsByCategory, cancelTask, updateNotifSettings, getFavorites, addFavorite, removeFavorite, getMyPortfolio, addPortfolioItem, getSpecialistPortfolio, getFomoRecommendations, getAutoMatchResults, getGoogleCalendarStatus, disconnectGoogleCalendar, importFromGoogleCalendar, getGoogleCalendarConnectUrl */ const BASE = "https://api.canhelp.gr" || 0; async function request(path, init) { const res = await fetch(`${BASE}/api${path}`, { ...init, credentials: 'include', headers: { 'Content-Type': 'application/json', ...init?.headers } }); if (!res.ok) { const err = await res.json().catch(()=>({ error: res.statusText })); const msg = typeof err.error === 'string' ? err.error : typeof err.message === 'string' ? err.message : res.statusText || 'Request failed'; throw new Error(msg); } return res.json(); } // ─── Tasks ──────────────────────────────────────────────────────────────── const getTasks = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks${qs}`); }; const getTaskBudgetRange = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks/budget-range${qs}`); }; const searchTasks = (params)=>request(`/tasks/search?${new URLSearchParams(params)}`); const getMyTasks = ()=>request('/tasks/my'); const getTasksForSpecialist = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks/for-me${qs}`); }; const getTaskCountsByCategory = ()=>request('/tasks/counts-by-category'); const getTask = (id)=>request(`/tasks/${id}`); const createTask = (data)=>request('/tasks', { method: 'POST', body: JSON.stringify(data) }); const updateTask = (id, data)=>request(`/tasks/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const completeTask = (id)=>request(`/tasks/${id}/complete`, { method: 'PATCH' }); const cancelTask = (id)=>request(`/tasks/${id}/cancel`, { method: 'PATCH' }); // ─── Offers ──────────────────────────────────────────────────────────────── const getOffers = (taskId)=>request(`/offers?taskId=${taskId}`); const getMyOffers = ()=>request('/offers/my'); const createOffer = (data)=>request('/offers', { method: 'POST', body: JSON.stringify(data) }); const acceptOffer = (id)=>request(`/offers/${id}/accept`, { method: 'PATCH' }); const declineOffer = (id)=>request(`/offers/${id}/decline`, { method: 'PATCH' }); const getUserProfile = (id)=>request(`/users/${id}/profile`); const getSpecialists = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/users/specialists${qs}`); }; const createReview = (data)=>request('/reviews', { method: 'POST', body: JSON.stringify(data) }); const getTaskReviews = (taskId)=>request(`/reviews/task/${taskId}`); const getMyReviews = ()=>request('/reviews/my'); // ─── Chat ────────────────────────────────────────────────────────────────── const getChatRooms = ()=>request('/chat/rooms'); const getOrCreateDirectRoom = (userId)=>request(`/chat/direct/${userId}`); const getCanMessage = (userId)=>request(`/chat/can-message/${userId}`); const getMessages = (roomId)=>request(`/chat/rooms/${roomId}/messages`); const sendMessage = (roomId, body)=>request('/chat/messages', { method: 'POST', body: JSON.stringify({ roomId, body }) }); // ─── Notifications ──────────────────────────────────────────────────────── const updateNotifSettings = (data)=>request('/users/me', { method: 'PATCH', body: JSON.stringify(data) }); const getNotifications = ()=>request('/notifications'); const getUnreadCount = ()=>request('/notifications/count'); const markRead = (id)=>request(`/notifications/${id}/read`, { method: 'PATCH' }); const markAllRead = ()=>request('/notifications/read-all', { method: 'PATCH' }); const getTaskInvite = (taskId)=>request(`/notifications?type=task_invite&referenceId=${taskId}`); const dismissNotification = (id)=>request(`/notifications/${id}`, { method: 'DELETE' }); // ─── Referral ───────────────────────────────────────────────────────────── const getMyReferralInfo = ()=>request('/users/me/referral'); // ─── Reviews ────────────────────────────────────────────────────────────── const getUserReviews = (userId)=>request(`/reviews/user/${userId}`); const getUserRating = (userId)=>request(`/reviews/user/${userId}/rating`); // ─── Categories ─────────────────────────────────────────────────────────── const getCategories = ()=>request('/categories'); // ─── Locations ──────────────────────────────────────────────────────────── const getLocations = ()=>request('/locations'); // ─── Favorites ──────────────────────────────────────────────────────────── const getFavorites = ()=>request('/favorites'); const addFavorite = (taskId)=>request(`/favorites/${taskId}`, { method: 'POST' }); const removeFavorite = (taskId)=>request(`/favorites/${taskId}`, { method: 'DELETE' }); const getSpecialistFavorites = ()=>request('/favorites/specialists'); const addSpecialistFavorite = (specialistId)=>request(`/favorites/specialists/${specialistId}`, { method: 'POST' }); const removeSpecialistFavorite = (specialistId)=>request(`/favorites/specialists/${specialistId}`, { method: 'DELETE' }); // ─── Admin ───────────────────────────────────────────────────────────────── // ─── Admin Categories ────────────────────────────────────────────────────── const getAdminCategories = ()=>request('/admin/categories'); const createCategory = (data)=>request('/admin/categories', { method: 'POST', body: JSON.stringify(data) }); const updateCategory = (id, data)=>request(`/admin/categories/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deleteCategory = (id)=>request(`/admin/categories/${id}`, { method: 'DELETE' }); // ─── Admin ───────────────────────────────────────────────────────────────── const getAdminStats = ()=>request('/admin/stats'); const getAdminUsers = (page = 1, q, role)=>{ const p = new URLSearchParams({ page: String(page), limit: '20' }); if (q) p.set('q', q); if (role) p.set('role', role); return request(`/admin/users?${p}`); }; const deactivateUser = (id)=>request(`/admin/users/${id}/deactivate`, { method: 'PATCH' }); const activateUser = (id)=>request(`/admin/users/${id}/activate`, { method: 'PATCH' }); const changeUserRole = (id, role)=>request(`/admin/users/${id}/role`, { method: 'PATCH', body: JSON.stringify({ role }) }); const getAdminUser = (id)=>request(`/admin/users/${id}`); const getAdminUserSpecialistCards = (userId)=>request(`/admin/users/${userId}/specialist-cards`); const adminUpdateSpecialistCard = (id, data)=>request(`/admin/specialist-cards/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const updateAdminUser = (id, data)=>request(`/admin/users/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const getAdminTasks = (page = 1, q, status)=>{ const p = new URLSearchParams({ page: String(page), limit: '20' }); if (q) p.set('q', q); if (status) p.set('status', status); return request(`/admin/tasks?${p}`); }; const cancelTaskAdmin = (id)=>request(`/admin/tasks/${id}/cancel`, { method: 'PATCH' }); const deleteTaskAdmin = (id)=>request(`/admin/tasks/${id}`, { method: 'DELETE' }); const getAdminReports = (page = 1)=>request(`/admin/reports?page=${page}&limit=20`); const updateReportStatus = (id, status)=>request(`/admin/reports/${id}/status`, { method: 'PATCH', body: JSON.stringify({ status }) }); const getAdminAiLogs = (page = 1)=>request(`/admin/ai-logs?page=${page}&limit=50`); const getAdminActivityLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.event) p.set('event', params.event); if (params.userId) p.set('userId', params.userId); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/activity-logs?${p}`); }; const getAdminMailLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.event) p.set('event', params.event); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/mail-logs?${p}`); }; const getAdminNotifLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.type) p.set('type', params.type); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/notification-logs?${p}`); }; const getAdminNotifStats = ()=>request('/admin/notification-stats'); const getAdminMailStats = ()=>request('/admin/mail-stats'); // ─── Admin Locations ─────────────────────────────────────────────────────── const getAdminLocations = ()=>request('/admin/locations'); const createLocation = (data)=>request('/admin/locations', { method: 'POST', body: JSON.stringify(data) }); const updateLocation = (id, data)=>request(`/admin/locations/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deleteLocation = (id)=>request(`/admin/locations/${id}`, { method: 'DELETE' }); // ─── Admin Plans ─────────────────────────────────────────────────────────── const getAdminPlans = ()=>request('/admin/plans'); const createPlan = (data)=>request('/admin/plans', { method: 'POST', body: JSON.stringify(data) }); const updatePlan = (id, data)=>request(`/admin/plans/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deletePlan = (id)=>request(`/admin/plans/${id}`, { method: 'DELETE' }); // ─── Admin Settings ──────────────────────────────────────────────────────── const getAdminSettings = ()=>request('/admin/settings'); const updateAdminSettings = (data)=>request('/admin/settings', { method: 'PUT', body: JSON.stringify(data) }); const getAdminEmailTemplates = ()=>request('/admin/settings/templates'); const updateAdminEmailTemplate = (key, data)=>request(`/admin/settings/templates/${key}`, { method: 'PUT', body: JSON.stringify(data) }); const translateAdminEmailTemplate = (data)=>request('/admin/settings/templates/translate', { method: 'POST', body: JSON.stringify(data) }); const sendTestEmail = ()=>request('/admin/settings/test-email', { method: 'POST' }); // ─── Availability ────────────────────────────────────────────────────────── const getMyAvailability = (month)=>request(`/availability/my${month ? `?month=${month}` : ''}`); const setAvailability = (date, status, note)=>request('/availability/set', { method: 'POST', body: JSON.stringify({ date, status, note }) }); const setAvailabilityRange = (from, to, status)=>request('/availability/set-range', { method: 'POST', body: JSON.stringify({ from, to, status }) }); const getSpecialistAvailability = (userId, month)=>request(`/availability/user/${userId}${month ? `?month=${month}` : ''}`); const getMyPortfolio = ()=>request('/portfolio/my'); const addPortfolioItem = (formData)=>fetch(`${BASE}/api/portfolio`, { method: 'POST', credentials: 'include', body: formData }).then(async (res)=>{ if (!res.ok) { const err = await res.json().catch(()=>({ error: res.statusText })); throw new Error(err.error || 'Upload failed'); } return res.json(); }); const updatePortfolioItem = (id, data)=>request(`/portfolio/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deletePortfolioItem = (id)=>request(`/portfolio/${id}`, { method: 'DELETE' }); const getSpecialistPortfolio = (userId)=>request(`/portfolio/user/${userId}`); const getMySpecialistCards = ()=>request('/specialist-cards/my'); const createSpecialistCard = (data)=>request('/specialist-cards', { method: 'POST', body: JSON.stringify(data) }); const updateSpecialistCard = (id, data)=>request(`/specialist-cards/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deleteSpecialistCard = (id)=>request(`/specialist-cards/${id}`, { method: 'DELETE' }); const getSpecialistCards = (userId)=>request(`/specialist-cards/user/${userId}`); const getSkillSuggestions = (categorySlugs)=>{ const params = categorySlugs?.length ? '?' + categorySlugs.map((s)=>`category=${encodeURIComponent(s)}`).join('&') : ''; return request(`/skill-suggestions${params}`); }; const initiateTopUp = (amount)=>request('/payments/topup/init', { method: 'POST', body: JSON.stringify({ amount }) }); const getPaymentHistory = ()=>request('/payments/history'); const getBalanceHistory = (limit = 50)=>request(`/payments/balance-history?limit=${limit}`); const getAdminBalanceHistory = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.userId) p.set('userId', params.userId); if (params.kind) p.set('kind', params.kind); p.set('limit', '50'); return request(`/admin/balance-history?${p}`); }; const adminTopUpUserBalance = (id, data)=>request(`/admin/users/${id}/balance/topup`, { method: 'POST', body: JSON.stringify(data) }); const adminWithdrawUserBalance = (id, data)=>request(`/admin/users/${id}/balance/withdraw`, { method: 'POST', body: JSON.stringify(data) }); const previewPlanChange = (planId)=>request('/payments/plan/preview', { method: 'POST', body: JSON.stringify({ planId }) }); const getPlans = (role)=>{ const qs = role ? `?role=${role}` : ''; return request(`/plans${qs}`); }; const getMyDashboard = ()=>request('/dashboard/me'); const getDailyUsage = ()=>request('/plans/daily-usage'); const purchasePlan = (planId, payFromBalance = true)=>request('/payments/plan/purchase', { method: 'POST', body: JSON.stringify({ planId, payFromBalance }) }); // ─── Statuses ────────────────────────────────────────────────────────────── const getMyStatuses = ()=>request('/statuses/me'); const toggleStatus = (statusType, active)=>request('/statuses/toggle', { method: 'POST', body: JSON.stringify({ statusType, active }) }); const getAutoResponseSettings = ()=>request('/auto-response'); const updateAutoResponseSettings = (data)=>request('/auto-response', { method: 'PUT', body: JSON.stringify(data) }); // ─── FOMO ────────────────────────────────────────────────────────────────── const getSpecialistFomoDashboard = ()=>request('/fomo/specialist'); const getCustomerFomoDashboard = ()=>request('/fomo/customer'); const getFomoRecommendations = ()=>request('/fomo/recommendations'); // ─── Auto-match ──────────────────────────────────────────────────────────── const getAutoMatchResults = (taskId)=>request(`/auto-match/${taskId}`); const runAutoMatch = (taskId)=>request(`/auto-match/${taskId}`, { method: 'POST' }); // ─── Google Calendar ─────────────────────────────────────────────────────── const getGoogleCalendarStatus = ()=>request('/google/calendar/status'); const disconnectGoogleCalendar = ()=>request('/google/calendar/disconnect', { method: 'DELETE' }); const importFromGoogleCalendar = ()=>request('/google/calendar/import', { method: 'POST' }); const getGoogleCalendarConnectUrl = ()=>`${BASE}/api/google/calendar/connect`; // ─── Personal site ───────────────────────────────────────────────────────── const getPublicSiteProfile = (slug)=>request(`/users/site/${slug}`); const getSiteStats = ()=>request('/users/me/site-stats'); const trackSiteMessage = (slug)=>request(`/users/site/${slug}/track-message`, { method: 'POST' }).catch(()=>{}); // ─── Task stats (FOMO) ───────────────────────────────────────────────────── const getTaskStats = (taskId)=>request(`/tasks/${taskId}/stats`); {"finalSource":true}mapbufferedMap ConcatSourceRawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $7: () => (/* binding */ updateCategory), /* harmony export */ $H: () => (/* binding */ acceptOffer), /* harmony export */ $M: () => (/* binding */ getUnreadCount), /* harmony export */ Bb: () => (/* binding */ getMySpecialistCards), /* harmony export */ Bm: () => (/* binding */ getUserRating), /* harmony export */ Bq: () => (/* binding */ getSpecialistCards), /* harmony export */ Br: () => (/* binding */ getAdminNotifLogs), /* harmony export */ CX: () => (/* binding */ updateAdminSettings), /* harmony export */ Cs: () => (/* binding */ previewPlanChange), /* harmony export */ D1: () => (/* binding */ setAvailabilityRange), /* harmony export */ Em: () => (/* binding */ request), /* harmony export */ F7: () => (/* binding */ getSpecialists), /* harmony export */ F9: () => (/* binding */ getTaskInvite), /* harmony export */ FI: () => (/* binding */ sendTestEmail), /* harmony export */ Fu: () => (/* binding */ getMyTasks), /* harmony export */ GB: () => (/* binding */ deleteTaskAdmin), /* harmony export */ Gp: () => (/* binding */ getAutoResponseSettings), /* harmony export */ H: () => (/* binding */ getMyDashboard), /* harmony export */ H6: () => (/* binding */ getTaskReviews), /* harmony export */ He: () => (/* binding */ activateUser), /* harmony export */ Ip: () => (/* binding */ markRead), /* harmony export */ Je: () => (/* binding */ purchasePlan), /* harmony export */ K7: () => (/* binding */ deleteCategory), /* harmony export */ KD: () => (/* binding */ getAdminCategories), /* harmony export */ Lb: () => (/* binding */ declineOffer), /* harmony export */ Lp: () => (/* binding */ getAdminEmailTemplates), /* harmony export */ ML: () => (/* binding */ getCustomerFomoDashboard), /* harmony export */ Mm: () => (/* binding */ changeUserRole), /* harmony export */ NL: () => (/* binding */ markAllRead), /* harmony export */ Nt: () => (/* binding */ updateLocation), /* harmony export */ OM: () => (/* binding */ setAvailability), /* harmony export */ OV: () => (/* binding */ runAutoMatch), /* harmony export */ OX: () => (/* binding */ getAdminPlans), /* harmony export */ On: () => (/* binding */ getCanMessage), /* harmony export */ P0: () => (/* binding */ adminTopUpUserBalance), /* harmony export */ QN: () => (/* binding */ getOrCreateDirectRoom), /* harmony export */ RN: () => (/* binding */ getSiteStats), /* harmony export */ RQ: () => (/* binding */ updateAutoResponseSettings), /* harmony export */ Rt: () => (/* binding */ completeTask), /* harmony export */ S$: () => (/* binding */ getPublicSiteProfile), /* harmony export */ Sw: () => (/* binding */ getOffers), /* harmony export */ T9: () => (/* binding */ getPlans), /* harmony export */ Tr: () => (/* binding */ getNotifications), /* harmony export */ UE: () => (/* binding */ trackSiteMessage), /* harmony export */ UT: () => (/* binding */ createTask), /* harmony export */ V: () => (/* binding */ addSpecialistFavorite), /* harmony export */ VL: () => (/* binding */ getMessages), /* harmony export */ VM: () => (/* binding */ getUserProfile), /* harmony export */ Vs: () => (/* binding */ getLocations), /* harmony export */ Wi: () => (/* binding */ deactivateUser), /* harmony export */ Xz: () => (/* binding */ getSpecialistAvailability), /* harmony export */ Yj: () => (/* binding */ getAdminTasks), /* harmony export */ Zp: () => (/* binding */ getChatRooms), /* harmony export */ _z: () => (/* binding */ sendMessage), /* harmony export */ aT: () => (/* binding */ getMyOffers), /* harmony export */ bR: () => (/* binding */ deletePlan), /* harmony export */ bW: () => (/* binding */ getCategories), /* harmony export */ bc: () => (/* binding */ toggleStatus), /* harmony export */ bi: () => (/* binding */ getAdminNotifStats), /* harmony export */ bx: () => (/* binding */ createReview), /* harmony export */ cS: () => (/* binding */ getAdminUsers), /* harmony export */ dE: () => (/* binding */ getAdminStats), /* harmony export */ eR: () => (/* binding */ createSpecialistCard), /* harmony export */ eU: () => (/* binding */ updateReportStatus), /* harmony export */ f5: () => (/* binding */ deleteSpecialistCard), /* harmony export */ fm: () => (/* binding */ getBalanceHistory), /* harmony export */ g0: () => (/* binding */ getAdminBalanceHistory), /* harmony export */ gg: () => (/* binding */ getTask), /* harmony export */ hD: () => (/* binding */ adminWithdrawUserBalance), /* harmony export */ hl: () => (/* binding */ updatePortfolioItem), /* harmony export */ iN: () => (/* binding */ getMyAvailability), /* harmony export */ j_: () => (/* binding */ getAdminAiLogs), /* harmony export */ jd: () => (/* binding */ getAdminUser), /* harmony export */ jg: () => (/* binding */ updateAdminEmailTemplate), /* harmony export */ k_: () => (/* binding */ getAdminLocations), /* harmony export */ lC: () => (/* binding */ updateTask), /* harmony export */ nf: () => (/* binding */ cancelTaskAdmin), /* harmony export */ oh: () => (/* binding */ initiateTopUp), /* harmony export */ oq: () => (/* binding */ adminUpdateSpecialistCard), /* harmony export */ pD: () => (/* binding */ getSpecialistFavorites), /* harmony export */ pK: () => (/* binding */ getPaymentHistory), /* harmony export */ q7: () => (/* binding */ getMyReviews), /* harmony export */ qT: () => (/* binding */ createPlan), /* harmony export */ qt: () => (/* binding */ getAdminMailLogs), /* harmony export */ rC: () => (/* binding */ getAdminSettings), /* harmony export */ rl: () => (/* binding */ getSkillSuggestions), /* harmony export */ sD: () => (/* binding */ removeSpecialistFavorite), /* harmony export */ st: () => (/* binding */ getMyReferralInfo), /* harmony export */ td: () => (/* binding */ updatePlan), /* harmony export */ ts: () => (/* binding */ createOffer), /* harmony export */ u4: () => (/* binding */ getAdminMailStats), /* harmony export */ v9: () => (/* binding */ getUserReviews), /* harmony export */ vh: () => (/* binding */ getTaskStats), /* harmony export */ vy: () => (/* binding */ getAdminUserSpecialistCards), /* harmony export */ wc: () => (/* binding */ translateAdminEmailTemplate), /* harmony export */ wl: () => (/* binding */ updateAdminUser), /* harmony export */ yJ: () => (/* binding */ createLocation), /* harmony export */ yO: () => (/* binding */ getAdminActivityLogs), /* harmony export */ yk: () => (/* binding */ dismissNotification), /* harmony export */ z4: () => (/* binding */ getDailyUsage), /* harmony export */ z5: () => (/* binding */ getAdminReports), /* harmony export */ z6: () => (/* binding */ getMyStatuses), /* harmony export */ zB: () => (/* binding */ deletePortfolioItem), /* harmony export */ zR: () => (/* binding */ deleteLocation), /* harmony export */ zZ: () => (/* binding */ createCategory), /* harmony export */ zc: () => (/* binding */ updateSpecialistCard), /* harmony export */ zk: () => (/* binding */ getSpecialistFomoDashboard) /* harmony export */ }); /* unused harmony exports getTasks, getTaskBudgetRange, searchTasks, getTasksForSpecialist, getTaskCountsByCategory, cancelTask, updateNotifSettings, getFavorites, addFavorite, removeFavorite, getMyPortfolio, addPortfolioItem, getSpecialistPortfolio, getFomoRecommendations, getAutoMatchResults, getGoogleCalendarStatus, disconnectGoogleCalendar, importFromGoogleCalendar, getGoogleCalendarConnectUrl */ ReplaceSourceRawSource~Oconst BASE = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; export async function request(path, init) { const res = await fetch(`${BASE}/api${path}`, { ...init, credentials: 'include', headers: { 'Content-Type': 'application/json', ...init?.headers } }); if (!res.ok) { const err = await res.json().catch(()=>({ error: res.statusText })); const msg = typeof err.error === 'string' ? err.error : typeof err.message === 'string' ? err.message : res.statusText || 'Request failed'; throw new Error(msg); } return res.json(); } // ─── Tasks ──────────────────────────────────────────────────────────────── export const getTasks = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks${qs}`); }; export const getTaskBudgetRange = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks/budget-range${qs}`); }; export const searchTasks = (params)=>request(`/tasks/search?${new URLSearchParams(params)}`); export const getMyTasks = ()=>request('/tasks/my'); export const getTasksForSpecialist = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks/for-me${qs}`); }; export const getTaskCountsByCategory = ()=>request('/tasks/counts-by-category'); export const getTask = (id)=>request(`/tasks/${id}`); export const createTask = (data)=>request('/tasks', { method: 'POST', body: JSON.stringify(data) }); export const updateTask = (id, data)=>request(`/tasks/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const completeTask = (id)=>request(`/tasks/${id}/complete`, { method: 'PATCH' }); export const cancelTask = (id)=>request(`/tasks/${id}/cancel`, { method: 'PATCH' }); // ─── Offers ──────────────────────────────────────────────────────────────── export const getOffers = (taskId)=>request(`/offers?taskId=${taskId}`); export const getMyOffers = ()=>request('/offers/my'); export const createOffer = (data)=>request('/offers', { method: 'POST', body: JSON.stringify(data) }); export const acceptOffer = (id)=>request(`/offers/${id}/accept`, { method: 'PATCH' }); export const declineOffer = (id)=>request(`/offers/${id}/decline`, { method: 'PATCH' }); export const getUserProfile = (id)=>request(`/users/${id}/profile`); export const getSpecialists = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/users/specialists${qs}`); }; export const createReview = (data)=>request('/reviews', { method: 'POST', body: JSON.stringify(data) }); export const getTaskReviews = (taskId)=>request(`/reviews/task/${taskId}`); export const getMyReviews = ()=>request('/reviews/my'); // ─── Chat ────────────────────────────────────────────────────────────────── export const getChatRooms = ()=>request('/chat/rooms'); export const getOrCreateDirectRoom = (userId)=>request(`/chat/direct/${userId}`); export const getCanMessage = (userId)=>request(`/chat/can-message/${userId}`); export const getMessages = (roomId)=>request(`/chat/rooms/${roomId}/messages`); export const sendMessage = (roomId, body)=>request('/chat/messages', { method: 'POST', body: JSON.stringify({ roomId, body }) }); // ─── Notifications ──────────────────────────────────────────────────────── export const updateNotifSettings = (data)=>request('/users/me', { method: 'PATCH', body: JSON.stringify(data) }); export const getNotifications = ()=>request('/notifications'); export const getUnreadCount = ()=>request('/notifications/count'); export const markRead = (id)=>request(`/notifications/${id}/read`, { method: 'PATCH' }); export const markAllRead = ()=>request('/notifications/read-all', { method: 'PATCH' }); export const getTaskInvite = (taskId)=>request(`/notifications?type=task_invite&referenceId=${taskId}`); export const dismissNotification = (id)=>request(`/notifications/${id}`, { method: 'DELETE' }); // ─── Referral ───────────────────────────────────────────────────────────── export const getMyReferralInfo = ()=>request('/users/me/referral'); // ─── Reviews ────────────────────────────────────────────────────────────── export const getUserReviews = (userId)=>request(`/reviews/user/${userId}`); export const getUserRating = (userId)=>request(`/reviews/user/${userId}/rating`); // ─── Categories ─────────────────────────────────────────────────────────── export const getCategories = ()=>request('/categories'); // ─── Locations ──────────────────────────────────────────────────────────── export const getLocations = ()=>request('/locations'); // ─── Favorites ──────────────────────────────────────────────────────────── export const getFavorites = ()=>request('/favorites'); export const addFavorite = (taskId)=>request(`/favorites/${taskId}`, { method: 'POST' }); export const removeFavorite = (taskId)=>request(`/favorites/${taskId}`, { method: 'DELETE' }); export const getSpecialistFavorites = ()=>request('/favorites/specialists'); export const addSpecialistFavorite = (specialistId)=>request(`/favorites/specialists/${specialistId}`, { method: 'POST' }); export const removeSpecialistFavorite = (specialistId)=>request(`/favorites/specialists/${specialistId}`, { method: 'DELETE' }); // ─── Admin ───────────────────────────────────────────────────────────────── // ─── Admin Categories ────────────────────────────────────────────────────── export const getAdminCategories = ()=>request('/admin/categories'); export const createCategory = (data)=>request('/admin/categories', { method: 'POST', body: JSON.stringify(data) }); export const updateCategory = (id, data)=>request(`/admin/categories/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deleteCategory = (id)=>request(`/admin/categories/${id}`, { method: 'DELETE' }); // ─── Admin ───────────────────────────────────────────────────────────────── export const getAdminStats = ()=>request('/admin/stats'); export const getAdminUsers = (page = 1, q, role)=>{ const p = new URLSearchParams({ page: String(page), limit: '20' }); if (q) p.set('q', q); if (role) p.set('role', role); return request(`/admin/users?${p}`); }; export const deactivateUser = (id)=>request(`/admin/users/${id}/deactivate`, { method: 'PATCH' }); export const activateUser = (id)=>request(`/admin/users/${id}/activate`, { method: 'PATCH' }); export const changeUserRole = (id, role)=>request(`/admin/users/${id}/role`, { method: 'PATCH', body: JSON.stringify({ role }) }); export const getAdminUser = (id)=>request(`/admin/users/${id}`); export const getAdminUserSpecialistCards = (userId)=>request(`/admin/users/${userId}/specialist-cards`); export const adminUpdateSpecialistCard = (id, data)=>request(`/admin/specialist-cards/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const updateAdminUser = (id, data)=>request(`/admin/users/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const getAdminTasks = (page = 1, q, status)=>{ const p = new URLSearchParams({ page: String(page), limit: '20' }); if (q) p.set('q', q); if (status) p.set('status', status); return request(`/admin/tasks?${p}`); }; export const cancelTaskAdmin = (id)=>request(`/admin/tasks/${id}/cancel`, { method: 'PATCH' }); export const deleteTaskAdmin = (id)=>request(`/admin/tasks/${id}`, { method: 'DELETE' }); export const getAdminReports = (page = 1)=>request(`/admin/reports?page=${page}&limit=20`); export const updateReportStatus = (id, status)=>request(`/admin/reports/${id}/status`, { method: 'PATCH', body: JSON.stringify({ status }) }); export const getAdminAiLogs = (page = 1)=>request(`/admin/ai-logs?page=${page}&limit=50`); export const getAdminActivityLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.event) p.set('event', params.event); if (params.userId) p.set('userId', params.userId); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/activity-logs?${p}`); }; export const getAdminMailLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.event) p.set('event', params.event); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/mail-logs?${p}`); }; export const getAdminNotifLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.type) p.set('type', params.type); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/notification-logs?${p}`); }; export const getAdminNotifStats = ()=>request('/admin/notification-stats'); export const getAdminMailStats = ()=>request('/admin/mail-stats'); // ─── Admin Locations ─────────────────────────────────────────────────────── export const getAdminLocations = ()=>request('/admin/locations'); export const createLocation = (data)=>request('/admin/locations', { method: 'POST', body: JSON.stringify(data) }); export const updateLocation = (id, data)=>request(`/admin/locations/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deleteLocation = (id)=>request(`/admin/locations/${id}`, { method: 'DELETE' }); // ─── Admin Plans ─────────────────────────────────────────────────────────── export const getAdminPlans = ()=>request('/admin/plans'); export const createPlan = (data)=>request('/admin/plans', { method: 'POST', body: JSON.stringify(data) }); export const updatePlan = (id, data)=>request(`/admin/plans/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deletePlan = (id)=>request(`/admin/plans/${id}`, { method: 'DELETE' }); // ─── Admin Settings ──────────────────────────────────────────────────────── export const getAdminSettings = ()=>request('/admin/settings'); export const updateAdminSettings = (data)=>request('/admin/settings', { method: 'PUT', body: JSON.stringify(data) }); export const getAdminEmailTemplates = ()=>request('/admin/settings/templates'); export const updateAdminEmailTemplate = (key, data)=>request(`/admin/settings/templates/${key}`, { method: 'PUT', body: JSON.stringify(data) }); export const translateAdminEmailTemplate = (data)=>request('/admin/settings/templates/translate', { method: 'POST', body: JSON.stringify(data) }); export const sendTestEmail = ()=>request('/admin/settings/test-email', { method: 'POST' }); // ─── Availability ────────────────────────────────────────────────────────── export const getMyAvailability = (month)=>request(`/availability/my${month ? `?month=${month}` : ''}`); export const setAvailability = (date, status, note)=>request('/availability/set', { method: 'POST', body: JSON.stringify({ date, status, note }) }); export const setAvailabilityRange = (from, to, status)=>request('/availability/set-range', { method: 'POST', body: JSON.stringify({ from, to, status }) }); export const getSpecialistAvailability = (userId, month)=>request(`/availability/user/${userId}${month ? `?month=${month}` : ''}`); export const getMyPortfolio = ()=>request('/portfolio/my'); export const addPortfolioItem = (formData)=>fetch(`${BASE}/api/portfolio`, { method: 'POST', credentials: 'include', body: formData }).then(async (res)=>{ if (!res.ok) { const err = await res.json().catch(()=>({ error: res.statusText })); throw new Error(err.error || 'Upload failed'); } return res.json(); }); export const updatePortfolioItem = (id, data)=>request(`/portfolio/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deletePortfolioItem = (id)=>request(`/portfolio/${id}`, { method: 'DELETE' }); export const getSpecialistPortfolio = (userId)=>request(`/portfolio/user/${userId}`); export const getMySpecialistCards = ()=>request('/specialist-cards/my'); export const createSpecialistCard = (data)=>request('/specialist-cards', { method: 'POST', body: JSON.stringify(data) }); export const updateSpecialistCard = (id, data)=>request(`/specialist-cards/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deleteSpecialistCard = (id)=>request(`/specialist-cards/${id}`, { method: 'DELETE' }); export const getSpecialistCards = (userId)=>request(`/specialist-cards/user/${userId}`); export const getSkillSuggestions = (categorySlugs)=>{ const params = categorySlugs?.length ? '?' + categorySlugs.map((s)=>`category=${encodeURIComponent(s)}`).join('&') : ''; return request(`/skill-suggestions${params}`); }; export const initiateTopUp = (amount)=>request('/payments/topup/init', { method: 'POST', body: JSON.stringify({ amount }) }); export const getPaymentHistory = ()=>request('/payments/history'); export const getBalanceHistory = (limit = 50)=>request(`/payments/balance-history?limit=${limit}`); export const getAdminBalanceHistory = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.userId) p.set('userId', params.userId); if (params.kind) p.set('kind', params.kind); p.set('limit', '50'); return request(`/admin/balance-history?${p}`); }; export const adminTopUpUserBalance = (id, data)=>request(`/admin/users/${id}/balance/topup`, { method: 'POST', body: JSON.stringify(data) }); export const adminWithdrawUserBalance = (id, data)=>request(`/admin/users/${id}/balance/withdraw`, { method: 'POST', body: JSON.stringify(data) }); export const previewPlanChange = (planId)=>request('/payments/plan/preview', { method: 'POST', body: JSON.stringify({ planId }) }); export const getPlans = (role)=>{ const qs = role ? `?role=${role}` : ''; return request(`/plans${qs}`); }; export const getMyDashboard = ()=>request('/dashboard/me'); export const getDailyUsage = ()=>request('/plans/daily-usage'); export const purchasePlan = (planId, payFromBalance = true)=>request('/payments/plan/purchase', { method: 'POST', body: JSON.stringify({ planId, payFromBalance }) }); // ─── Statuses ────────────────────────────────────────────────────────────── export const getMyStatuses = ()=>request('/statuses/me'); export const toggleStatus = (statusType, active)=>request('/statuses/toggle', { method: 'POST', body: JSON.stringify({ statusType, active }) }); export const getAutoResponseSettings = ()=>request('/auto-response'); export const updateAutoResponseSettings = (data)=>request('/auto-response', { method: 'PUT', body: JSON.stringify(data) }); // ─── FOMO ────────────────────────────────────────────────────────────────── export const getSpecialistFomoDashboard = ()=>request('/fomo/specialist'); export const getCustomerFomoDashboard = ()=>request('/fomo/customer'); export const getFomoRecommendations = ()=>request('/fomo/recommendations'); // ─── Auto-match ──────────────────────────────────────────────────────────── export const getAutoMatchResults = (taskId)=>request(`/auto-match/${taskId}`); export const runAutoMatch = (taskId)=>request(`/auto-match/${taskId}`, { method: 'POST' }); // ─── Google Calendar ─────────────────────────────────────────────────────── export const getGoogleCalendarStatus = ()=>request('/google/calendar/status'); export const disconnectGoogleCalendar = ()=>request('/google/calendar/disconnect', { method: 'DELETE' }); export const importFromGoogleCalendar = ()=>request('/google/calendar/import', { method: 'POST' }); export const getGoogleCalendarConnectUrl = ()=>`${BASE}/api/google/calendar/connect`; // ─── Personal site ───────────────────────────────────────────────────────── export const getPublicSiteProfile = (slug)=>request(`/users/site/${slug}`); export const getSiteStats = ()=>request('/users/me/site-stats'); export const trackSiteMessage = (slug)=>request(`/users/site/${slug}/track-message`, { method: 'POST' }).catch(()=>{}); // ─── Task stats (FOMO) ───────────────────────────────────────────────────── export const getTaskStats = (taskId)=>request(`/tasks/${taskId}/stats`); 1343"https://api.canhelp.gr"undefined48700undefined7379undefined743749undefined881887undefined10421048undefined11361142undefined11881194undefined13461352undefined14271433undefined14811487undefined16021608undefined17341740undefined18351841undefined20112017undefined20832089undefined21372143undefined22602266undefined23592365undefined24602466undefined25292535undefined26852691undefined28102816undefined28862892undefined30213027undefined30773083undefined31593165undefined32383244undefined33183324undefined35783584undefined37123718undefined37753781undefined38423848undefined39433949undefined40434049undefined41484154undefined43344340undefined44804486undefined45564562undefined47164722undefined48514857undefined49844990undefined50395045undefined51415147undefined52485254undefined53255331undefined54615467undefined57605766undefined58285834undefined59645970undefined61116117undefined62966302undefined63546360undefined66036609undefined67146720undefined68216827undefined69926998undefined70577063undefined71627168undefined73267332undefined74697475undefined77267732undefined78347840undefined79367942undefined80288034undefined82118217undefined83028308undefined87508756undefined91359141undefined95269532undefined96029608undefined97489754undefined98149820undefined99499955undefined1009510101undefined1027910285undefined1033710343undefined1046410470undefined1060210608undefined1077810784undefined1084210848undefined1098010986undefined1106011066undefined1122511231undefined1139211398undefined1157511581undefined1167911685undefined1189211898undefined1211212118undefined1224412250undefined1230412310undefined1273112737undefined1287612882undefined1298012986undefined1306613072undefined1313913145undefined1328113287undefined1343413440undefined1354613552undefined1363513641undefined1386813874undefined1403414040undefined1410114107undefined1420114207undefined1453414540undefined1469614702undefined1486414870undefined1503615042undefined1515215158undefined1521215218undefined1527615282undefined1557415580undefined1563215638undefined1582915835undefined1589915905undefined1612216128undefined1619716203undefined1626816274undefined1642316429undefined1650216508undefined1668516691undefined1676416770undefined1688216888undefined1699417000undefined1715917165undefined1723517241undefined1730017306undefined1751117517undefined /***/ }) j/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $7: () => (/* binding */ updateCategory), /* harmony export */ $H: () => (/* binding */ acceptOffer), /* harmony export */ $M: () => (/* binding */ getUnreadCount), /* harmony export */ Bb: () => (/* binding */ getMySpecialistCards), /* harmony export */ Bm: () => (/* binding */ getUserRating), /* harmony export */ Bq: () => (/* binding */ getSpecialistCards), /* harmony export */ Br: () => (/* binding */ getAdminNotifLogs), /* harmony export */ CX: () => (/* binding */ updateAdminSettings), /* harmony export */ Cs: () => (/* binding */ previewPlanChange), /* harmony export */ D1: () => (/* binding */ setAvailabilityRange), /* harmony export */ Em: () => (/* binding */ request), /* harmony export */ F7: () => (/* binding */ getSpecialists), /* harmony export */ F9: () => (/* binding */ getTaskInvite), /* harmony export */ FI: () => (/* binding */ sendTestEmail), /* harmony export */ Fu: () => (/* binding */ getMyTasks), /* harmony export */ GB: () => (/* binding */ deleteTaskAdmin), /* harmony export */ Gp: () => (/* binding */ getAutoResponseSettings), /* harmony export */ H: () => (/* binding */ getMyDashboard), /* harmony export */ H6: () => (/* binding */ getTaskReviews), /* harmony export */ He: () => (/* binding */ activateUser), /* harmony export */ Ip: () => (/* binding */ markRead), /* harmony export */ Je: () => (/* binding */ purchasePlan), /* harmony export */ K7: () => (/* binding */ deleteCategory), /* harmony export */ KD: () => (/* binding */ getAdminCategories), /* harmony export */ Lb: () => (/* binding */ declineOffer), /* harmony export */ Lp: () => (/* binding */ getAdminEmailTemplates), /* harmony export */ ML: () => (/* binding */ getCustomerFomoDashboard), /* harmony export */ Mm: () => (/* binding */ changeUserRole), /* harmony export */ NL: () => (/* binding */ markAllRead), /* harmony export */ Nt: () => (/* binding */ updateLocation), /* harmony export */ OM: () => (/* binding */ setAvailability), /* harmony export */ OV: () => (/* binding */ runAutoMatch), /* harmony export */ OX: () => (/* binding */ getAdminPlans), /* harmony export */ On: () => (/* binding */ getCanMessage), /* harmony export */ P0: () => (/* binding */ adminTopUpUserBalance), /* harmony export */ QN: () => (/* binding */ getOrCreateDirectRoom), /* harmony export */ RN: () => (/* binding */ getSiteStats), /* harmony export */ RQ: () => (/* binding */ updateAutoResponseSettings), /* harmony export */ Rt: () => (/* binding */ completeTask), /* harmony export */ S$: () => (/* binding */ getPublicSiteProfile), /* harmony export */ Sw: () => (/* binding */ getOffers), /* harmony export */ T9: () => (/* binding */ getPlans), /* harmony export */ Tr: () => (/* binding */ getNotifications), /* harmony export */ UE: () => (/* binding */ trackSiteMessage), /* harmony export */ UT: () => (/* binding */ createTask), /* harmony export */ V: () => (/* binding */ addSpecialistFavorite), /* harmony export */ VL: () => (/* binding */ getMessages), /* harmony export */ VM: () => (/* binding */ getUserProfile), /* harmony export */ Vs: () => (/* binding */ getLocations), /* harmony export */ Wi: () => (/* binding */ deactivateUser), /* harmony export */ Xz: () => (/* binding */ getSpecialistAvailability), /* harmony export */ Yj: () => (/* binding */ getAdminTasks), /* harmony export */ Zp: () => (/* binding */ getChatRooms), /* harmony export */ _z: () => (/* binding */ sendMessage), /* harmony export */ aT: () => (/* binding */ getMyOffers), /* harmony export */ bR: () => (/* binding */ deletePlan), /* harmony export */ bW: () => (/* binding */ getCategories), /* harmony export */ bc: () => (/* binding */ toggleStatus), /* harmony export */ bi: () => (/* binding */ getAdminNotifStats), /* harmony export */ bx: () => (/* binding */ createReview), /* harmony export */ cS: () => (/* binding */ getAdminUsers), /* harmony export */ dE: () => (/* binding */ getAdminStats), /* harmony export */ eR: () => (/* binding */ createSpecialistCard), /* harmony export */ eU: () => (/* binding */ updateReportStatus), /* harmony export */ f5: () => (/* binding */ deleteSpecialistCard), /* harmony export */ fm: () => (/* binding */ getBalanceHistory), /* harmony export */ g0: () => (/* binding */ getAdminBalanceHistory), /* harmony export */ gg: () => (/* binding */ getTask), /* harmony export */ hD: () => (/* binding */ adminWithdrawUserBalance), /* harmony export */ hl: () => (/* binding */ updatePortfolioItem), /* harmony export */ iN: () => (/* binding */ getMyAvailability), /* harmony export */ j_: () => (/* binding */ getAdminAiLogs), /* harmony export */ jd: () => (/* binding */ getAdminUser), /* harmony export */ jg: () => (/* binding */ updateAdminEmailTemplate), /* harmony export */ k_: () => (/* binding */ getAdminLocations), /* harmony export */ lC: () => (/* binding */ updateTask), /* harmony export */ nf: () => (/* binding */ cancelTaskAdmin), /* harmony export */ oh: () => (/* binding */ initiateTopUp), /* harmony export */ oq: () => (/* binding */ adminUpdateSpecialistCard), /* harmony export */ pD: () => (/* binding */ getSpecialistFavorites), /* harmony export */ pK: () => (/* binding */ getPaymentHistory), /* harmony export */ q7: () => (/* binding */ getMyReviews), /* harmony export */ qT: () => (/* binding */ createPlan), /* harmony export */ qt: () => (/* binding */ getAdminMailLogs), /* harmony export */ rC: () => (/* binding */ getAdminSettings), /* harmony export */ rl: () => (/* binding */ getSkillSuggestions), /* harmony export */ sD: () => (/* binding */ removeSpecialistFavorite), /* harmony export */ st: () => (/* binding */ getMyReferralInfo), /* harmony export */ td: () => (/* binding */ updatePlan), /* harmony export */ ts: () => (/* binding */ createOffer), /* harmony export */ u4: () => (/* binding */ getAdminMailStats), /* harmony export */ v9: () => (/* binding */ getUserReviews), /* harmony export */ vh: () => (/* binding */ getTaskStats), /* harmony export */ vy: () => (/* binding */ getAdminUserSpecialistCards), /* harmony export */ wc: () => (/* binding */ translateAdminEmailTemplate), /* harmony export */ wl: () => (/* binding */ updateAdminUser), /* harmony export */ yJ: () => (/* binding */ createLocation), /* harmony export */ yO: () => (/* binding */ getAdminActivityLogs), /* harmony export */ yk: () => (/* binding */ dismissNotification), /* harmony export */ z4: () => (/* binding */ getDailyUsage), /* harmony export */ z5: () => (/* binding */ getAdminReports), /* harmony export */ z6: () => (/* binding */ getMyStatuses), /* harmony export */ zB: () => (/* binding */ deletePortfolioItem), /* harmony export */ zR: () => (/* binding */ deleteLocation), /* harmony export */ zZ: () => (/* binding */ createCategory), /* harmony export */ zc: () => (/* binding */ updateSpecialistCard), /* harmony export */ zk: () => (/* binding */ getSpecialistFomoDashboard) /* harmony export */ }); /* unused harmony exports getTasks, getTaskBudgetRange, searchTasks, getTasksForSpecialist, getTaskCountsByCategory, cancelTask, updateNotifSettings, getFavorites, addFavorite, removeFavorite, getMyPortfolio, addPortfolioItem, getSpecialistPortfolio, getFomoRecommendations, getAutoMatchResults, getGoogleCalendarStatus, disconnectGoogleCalendar, importFromGoogleCalendar, getGoogleCalendarConnectUrl */ const BASE = "https://api.canhelp.gr" || 0; async function request(path, init) { const res = await fetch(`${BASE}/api${path}`, { ...init, credentials: 'include', headers: { 'Content-Type': 'application/json', ...init?.headers } }); if (!res.ok) { const err = await res.json().catch(()=>({ error: res.statusText })); const msg = typeof err.error === 'string' ? err.error : typeof err.message === 'string' ? err.message : res.statusText || 'Request failed'; throw new Error(msg); } return res.json(); } // ─── Tasks ──────────────────────────────────────────────────────────────── const getTasks = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks${qs}`); }; const getTaskBudgetRange = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks/budget-range${qs}`); }; const searchTasks = (params)=>request(`/tasks/search?${new URLSearchParams(params)}`); const getMyTasks = ()=>request('/tasks/my'); const getTasksForSpecialist = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks/for-me${qs}`); }; const getTaskCountsByCategory = ()=>request('/tasks/counts-by-category'); const getTask = (id)=>request(`/tasks/${id}`); const createTask = (data)=>request('/tasks', { method: 'POST', body: JSON.stringify(data) }); const updateTask = (id, data)=>request(`/tasks/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const completeTask = (id)=>request(`/tasks/${id}/complete`, { method: 'PATCH' }); const cancelTask = (id)=>request(`/tasks/${id}/cancel`, { method: 'PATCH' }); // ─── Offers ──────────────────────────────────────────────────────────────── const getOffers = (taskId)=>request(`/offers?taskId=${taskId}`); const getMyOffers = ()=>request('/offers/my'); const createOffer = (data)=>request('/offers', { method: 'POST', body: JSON.stringify(data) }); const acceptOffer = (id)=>request(`/offers/${id}/accept`, { method: 'PATCH' }); const declineOffer = (id)=>request(`/offers/${id}/decline`, { method: 'PATCH' }); const getUserProfile = (id)=>request(`/users/${id}/profile`); const getSpecialists = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/users/specialists${qs}`); }; const createReview = (data)=>request('/reviews', { method: 'POST', body: JSON.stringify(data) }); const getTaskReviews = (taskId)=>request(`/reviews/task/${taskId}`); const getMyReviews = ()=>request('/reviews/my'); // ─── Chat ────────────────────────────────────────────────────────────────── const getChatRooms = ()=>request('/chat/rooms'); const getOrCreateDirectRoom = (userId)=>request(`/chat/direct/${userId}`); const getCanMessage = (userId)=>request(`/chat/can-message/${userId}`); const getMessages = (roomId)=>request(`/chat/rooms/${roomId}/messages`); const sendMessage = (roomId, body)=>request('/chat/messages', { method: 'POST', body: JSON.stringify({ roomId, body }) }); // ─── Notifications ──────────────────────────────────────────────────────── const updateNotifSettings = (data)=>request('/users/me', { method: 'PATCH', body: JSON.stringify(data) }); const getNotifications = ()=>request('/notifications'); const getUnreadCount = ()=>request('/notifications/count'); const markRead = (id)=>request(`/notifications/${id}/read`, { method: 'PATCH' }); const markAllRead = ()=>request('/notifications/read-all', { method: 'PATCH' }); const getTaskInvite = (taskId)=>request(`/notifications?type=task_invite&referenceId=${taskId}`); const dismissNotification = (id)=>request(`/notifications/${id}`, { method: 'DELETE' }); // ─── Referral ───────────────────────────────────────────────────────────── const getMyReferralInfo = ()=>request('/users/me/referral'); // ─── Reviews ────────────────────────────────────────────────────────────── const getUserReviews = (userId)=>request(`/reviews/user/${userId}`); const getUserRating = (userId)=>request(`/reviews/user/${userId}/rating`); // ─── Categories ─────────────────────────────────────────────────────────── const getCategories = ()=>request('/categories'); // ─── Locations ──────────────────────────────────────────────────────────── const getLocations = ()=>request('/locations'); // ─── Favorites ──────────────────────────────────────────────────────────── const getFavorites = ()=>request('/favorites'); const addFavorite = (taskId)=>request(`/favorites/${taskId}`, { method: 'POST' }); const removeFavorite = (taskId)=>request(`/favorites/${taskId}`, { method: 'DELETE' }); const getSpecialistFavorites = ()=>request('/favorites/specialists'); const addSpecialistFavorite = (specialistId)=>request(`/favorites/specialists/${specialistId}`, { method: 'POST' }); const removeSpecialistFavorite = (specialistId)=>request(`/favorites/specialists/${specialistId}`, { method: 'DELETE' }); // ─── Admin ───────────────────────────────────────────────────────────────── // ─── Admin Categories ────────────────────────────────────────────────────── const getAdminCategories = ()=>request('/admin/categories'); const createCategory = (data)=>request('/admin/categories', { method: 'POST', body: JSON.stringify(data) }); const updateCategory = (id, data)=>request(`/admin/categories/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deleteCategory = (id)=>request(`/admin/categories/${id}`, { method: 'DELETE' }); // ─── Admin ───────────────────────────────────────────────────────────────── const getAdminStats = ()=>request('/admin/stats'); const getAdminUsers = (page = 1, q, role)=>{ const p = new URLSearchParams({ page: String(page), limit: '20' }); if (q) p.set('q', q); if (role) p.set('role', role); return request(`/admin/users?${p}`); }; const deactivateUser = (id)=>request(`/admin/users/${id}/deactivate`, { method: 'PATCH' }); const activateUser = (id)=>request(`/admin/users/${id}/activate`, { method: 'PATCH' }); const changeUserRole = (id, role)=>request(`/admin/users/${id}/role`, { method: 'PATCH', body: JSON.stringify({ role }) }); const getAdminUser = (id)=>request(`/admin/users/${id}`); const getAdminUserSpecialistCards = (userId)=>request(`/admin/users/${userId}/specialist-cards`); const adminUpdateSpecialistCard = (id, data)=>request(`/admin/specialist-cards/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const updateAdminUser = (id, data)=>request(`/admin/users/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const getAdminTasks = (page = 1, q, status)=>{ const p = new URLSearchParams({ page: String(page), limit: '20' }); if (q) p.set('q', q); if (status) p.set('status', status); return request(`/admin/tasks?${p}`); }; const cancelTaskAdmin = (id)=>request(`/admin/tasks/${id}/cancel`, { method: 'PATCH' }); const deleteTaskAdmin = (id)=>request(`/admin/tasks/${id}`, { method: 'DELETE' }); const getAdminReports = (page = 1)=>request(`/admin/reports?page=${page}&limit=20`); const updateReportStatus = (id, status)=>request(`/admin/reports/${id}/status`, { method: 'PATCH', body: JSON.stringify({ status }) }); const getAdminAiLogs = (page = 1)=>request(`/admin/ai-logs?page=${page}&limit=50`); const getAdminActivityLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.event) p.set('event', params.event); if (params.userId) p.set('userId', params.userId); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/activity-logs?${p}`); }; const getAdminMailLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.event) p.set('event', params.event); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/mail-logs?${p}`); }; const getAdminNotifLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.type) p.set('type', params.type); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/notification-logs?${p}`); }; const getAdminNotifStats = ()=>request('/admin/notification-stats'); const getAdminMailStats = ()=>request('/admin/mail-stats'); // ─── Admin Locations ─────────────────────────────────────────────────────── const getAdminLocations = ()=>request('/admin/locations'); const createLocation = (data)=>request('/admin/locations', { method: 'POST', body: JSON.stringify(data) }); const updateLocation = (id, data)=>request(`/admin/locations/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deleteLocation = (id)=>request(`/admin/locations/${id}`, { method: 'DELETE' }); // ─── Admin Plans ─────────────────────────────────────────────────────────── const getAdminPlans = ()=>request('/admin/plans'); const createPlan = (data)=>request('/admin/plans', { method: 'POST', body: JSON.stringify(data) }); const updatePlan = (id, data)=>request(`/admin/plans/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deletePlan = (id)=>request(`/admin/plans/${id}`, { method: 'DELETE' }); // ─── Admin Settings ──────────────────────────────────────────────────────── const getAdminSettings = ()=>request('/admin/settings'); const updateAdminSettings = (data)=>request('/admin/settings', { method: 'PUT', body: JSON.stringify(data) }); const getAdminEmailTemplates = ()=>request('/admin/settings/templates'); const updateAdminEmailTemplate = (key, data)=>request(`/admin/settings/templates/${key}`, { method: 'PUT', body: JSON.stringify(data) }); const translateAdminEmailTemplate = (data)=>request('/admin/settings/templates/translate', { method: 'POST', body: JSON.stringify(data) }); const sendTestEmail = ()=>request('/admin/settings/test-email', { method: 'POST' }); // ─── Availability ────────────────────────────────────────────────────────── const getMyAvailability = (month)=>request(`/availability/my${month ? `?month=${month}` : ''}`); const setAvailability = (date, status, note)=>request('/availability/set', { method: 'POST', body: JSON.stringify({ date, status, note }) }); const setAvailabilityRange = (from, to, status)=>request('/availability/set-range', { method: 'POST', body: JSON.stringify({ from, to, status }) }); const getSpecialistAvailability = (userId, month)=>request(`/availability/user/${userId}${month ? `?month=${month}` : ''}`); const getMyPortfolio = ()=>request('/portfolio/my'); const addPortfolioItem = (formData)=>fetch(`${BASE}/api/portfolio`, { method: 'POST', credentials: 'include', body: formData }).then(async (res)=>{ if (!res.ok) { const err = await res.json().catch(()=>({ error: res.statusText })); throw new Error(err.error || 'Upload failed'); } return res.json(); }); const updatePortfolioItem = (id, data)=>request(`/portfolio/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deletePortfolioItem = (id)=>request(`/portfolio/${id}`, { method: 'DELETE' }); const getSpecialistPortfolio = (userId)=>request(`/portfolio/user/${userId}`); const getMySpecialistCards = ()=>request('/specialist-cards/my'); const createSpecialistCard = (data)=>request('/specialist-cards', { method: 'POST', body: JSON.stringify(data) }); const updateSpecialistCard = (id, data)=>request(`/specialist-cards/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deleteSpecialistCard = (id)=>request(`/specialist-cards/${id}`, { method: 'DELETE' }); const getSpecialistCards = (userId)=>request(`/specialist-cards/user/${userId}`); const getSkillSuggestions = (categorySlugs)=>{ const params = categorySlugs?.length ? '?' + categorySlugs.map((s)=>`category=${encodeURIComponent(s)}`).join('&') : ''; return request(`/skill-suggestions${params}`); }; const initiateTopUp = (amount)=>request('/payments/topup/init', { method: 'POST', body: JSON.stringify({ amount }) }); const getPaymentHistory = ()=>request('/payments/history'); const getBalanceHistory = (limit = 50)=>request(`/payments/balance-history?limit=${limit}`); const getAdminBalanceHistory = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.userId) p.set('userId', params.userId); if (params.kind) p.set('kind', params.kind); p.set('limit', '50'); return request(`/admin/balance-history?${p}`); }; const adminTopUpUserBalance = (id, data)=>request(`/admin/users/${id}/balance/topup`, { method: 'POST', body: JSON.stringify(data) }); const adminWithdrawUserBalance = (id, data)=>request(`/admin/users/${id}/balance/withdraw`, { method: 'POST', body: JSON.stringify(data) }); const previewPlanChange = (planId)=>request('/payments/plan/preview', { method: 'POST', body: JSON.stringify({ planId }) }); const getPlans = (role)=>{ const qs = role ? `?role=${role}` : ''; return request(`/plans${qs}`); }; const getMyDashboard = ()=>request('/dashboard/me'); const getDailyUsage = ()=>request('/plans/daily-usage'); const purchasePlan = (planId, payFromBalance = true)=>request('/payments/plan/purchase', { method: 'POST', body: JSON.stringify({ planId, payFromBalance }) }); // ─── Statuses ────────────────────────────────────────────────────────────── const getMyStatuses = ()=>request('/statuses/me'); const toggleStatus = (statusType, active)=>request('/statuses/toggle', { method: 'POST', body: JSON.stringify({ statusType, active }) }); const getAutoResponseSettings = ()=>request('/auto-response'); const updateAutoResponseSettings = (data)=>request('/auto-response', { method: 'PUT', body: JSON.stringify(data) }); // ─── FOMO ────────────────────────────────────────────────────────────────── const getSpecialistFomoDashboard = ()=>request('/fomo/specialist'); const getCustomerFomoDashboard = ()=>request('/fomo/customer'); const getFomoRecommendations = ()=>request('/fomo/recommendations'); // ─── Auto-match ──────────────────────────────────────────────────────────── const getAutoMatchResults = (taskId)=>request(`/auto-match/${taskId}`); const runAutoMatch = (taskId)=>request(`/auto-match/${taskId}`, { method: 'POST' }); // ─── Google Calendar ─────────────────────────────────────────────────────── const getGoogleCalendarStatus = ()=>request('/google/calendar/status'); const disconnectGoogleCalendar = ()=>request('/google/calendar/disconnect', { method: 'DELETE' }); const importFromGoogleCalendar = ()=>request('/google/calendar/import', { method: 'POST' }); const getGoogleCalendarConnectUrl = ()=>`${BASE}/api/google/calendar/connect`; // ─── Personal site ───────────────────────────────────────────────────────── const getPublicSiteProfile = (slug)=>request(`/users/site/${slug}`); const getSiteStats = ()=>request('/users/me/site-stats'); const trackSiteMessage = (slug)=>request(`/users/site/${slug}/track-message`, { method: 'POST' }).catch(()=>{}); // ─── Task stats (FOMO) ───────────────────────────────────────────────────── const getTaskStats = (taskId)=>request(`/tasks/${taskId}/stats`); /***/ })   /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $7: () => (/* binding */ updateCategory), /* harmony export */ $H: () => (/* binding */ acceptOffer), /* harmony export */ $M: () => (/* binding */ getUnreadCount), /* harmony export */ Bb: () => (/* binding */ getMySpecialistCards), /* harmony export */ Bm: () => (/* binding */ getUserRating), /* harmony export */ Bq: () => (/* binding */ getSpecialistCards), /* harmony export */ Br: () => (/* binding */ getAdminNotifLogs), /* harmony export */ CX: () => (/* binding */ updateAdminSettings), /* harmony export */ Cs: () => (/* binding */ previewPlanChange), /* harmony export */ D1: () => (/* binding */ setAvailabilityRange), /* harmony export */ Em: () => (/* binding */ request), /* harmony export */ F7: () => (/* binding */ getSpecialists), /* harmony export */ F9: () => (/* binding */ getTaskInvite), /* harmony export */ FI: () => (/* binding */ sendTestEmail), /* harmony export */ Fu: () => (/* binding */ getMyTasks), /* harmony export */ GB: () => (/* binding */ deleteTaskAdmin), /* harmony export */ Gp: () => (/* binding */ getAutoResponseSettings), /* harmony export */ H: () => (/* binding */ getMyDashboard), /* harmony export */ H6: () => (/* binding */ getTaskReviews), /* harmony export */ He: () => (/* binding */ activateUser), /* harmony export */ Ip: () => (/* binding */ markRead), /* harmony export */ Je: () => (/* binding */ purchasePlan), /* harmony export */ K7: () => (/* binding */ deleteCategory), /* harmony export */ KD: () => (/* binding */ getAdminCategories), /* harmony export */ Lb: () => (/* binding */ declineOffer), /* harmony export */ Lp: () => (/* binding */ getAdminEmailTemplates), /* harmony export */ ML: () => (/* binding */ getCustomerFomoDashboard), /* harmony export */ Mm: () => (/* binding */ changeUserRole), /* harmony export */ NL: () => (/* binding */ markAllRead), /* harmony export */ Nt: () => (/* binding */ updateLocation), /* harmony export */ OM: () => (/* binding */ setAvailability), /* harmony export */ OV: () => (/* binding */ runAutoMatch), /* harmony export */ OX: () => (/* binding */ getAdminPlans), /* harmony export */ On: () => (/* binding */ getCanMessage), /* harmony export */ P0: () => (/* binding */ adminTopUpUserBalance), /* harmony export */ QN: () => (/* binding */ getOrCreateDirectRoom), /* harmony export */ RN: () => (/* binding */ getSiteStats), /* harmony export */ RQ: () => (/* binding */ updateAutoResponseSettings), /* harmony export */ Rt: () => (/* binding */ completeTask), /* harmony export */ S$: () => (/* binding */ getPublicSiteProfile), /* harmony export */ Sw: () => (/* binding */ getOffers), /* harmony export */ T9: () => (/* binding */ getPlans), /* harmony export */ Tr: () => (/* binding */ getNotifications), /* harmony export */ UE: () => (/* binding */ trackSiteMessage), /* harmony export */ UT: () => (/* binding */ createTask), /* harmony export */ V: () => (/* binding */ addSpecialistFavorite), /* harmony export */ VL: () => (/* binding */ getMessages), /* harmony export */ VM: () => (/* binding */ getUserProfile), /* harmony export */ Vs: () => (/* binding */ getLocations), /* harmony export */ Wi: () => (/* binding */ deactivateUser), /* harmony export */ Xz: () => (/* binding */ getSpecialistAvailability), /* harmony export */ Yj: () => (/* binding */ getAdminTasks), /* harmony export */ Zp: () => (/* binding */ getChatRooms), /* harmony export */ _z: () => (/* binding */ sendMessage), /* harmony export */ aT: () => (/* binding */ getMyOffers), /* harmony export */ bR: () => (/* binding */ deletePlan), /* harmony export */ bW: () => (/* binding */ getCategories), /* harmony export */ bc: () => (/* binding */ toggleStatus), /* harmony export */ bi: () => (/* binding */ getAdminNotifStats), /* harmony export */ bx: () => (/* binding */ createReview), /* harmony export */ cS: () => (/* binding */ getAdminUsers), /* harmony export */ dE: () => (/* binding */ getAdminStats), /* harmony export */ eR: () => (/* binding */ createSpecialistCard), /* harmony export */ eU: () => (/* binding */ updateReportStatus), /* harmony export */ f5: () => (/* binding */ deleteSpecialistCard), /* harmony export */ fm: () => (/* binding */ getBalanceHistory), /* harmony export */ g0: () => (/* binding */ getAdminBalanceHistory), /* harmony export */ gg: () => (/* binding */ getTask), /* harmony export */ hD: () => (/* binding */ adminWithdrawUserBalance), /* harmony export */ hl: () => (/* binding */ updatePortfolioItem), /* harmony export */ iN: () => (/* binding */ getMyAvailability), /* harmony export */ j_: () => (/* binding */ getAdminAiLogs), /* harmony export */ jd: () => (/* binding */ getAdminUser), /* harmony export */ jg: () => (/* binding */ updateAdminEmailTemplate), /* harmony export */ k_: () => (/* binding */ getAdminLocations), /* harmony export */ lC: () => (/* binding */ updateTask), /* harmony export */ nf: () => (/* binding */ cancelTaskAdmin), /* harmony export */ oh: () => (/* binding */ initiateTopUp), /* harmony export */ oq: () => (/* binding */ adminUpdateSpecialistCard), /* harmony export */ pD: () => (/* binding */ getSpecialistFavorites), /* harmony export */ pK: () => (/* binding */ getPaymentHistory), /* harmony export */ q7: () => (/* binding */ getMyReviews), /* harmony export */ qT: () => (/* binding */ createPlan), /* harmony export */ qt: () => (/* binding */ getAdminMailLogs), /* harmony export */ rC: () => (/* binding */ getAdminSettings), /* harmony export */ rl: () => (/* binding */ getSkillSuggestions), /* harmony export */ sD: () => (/* binding */ removeSpecialistFavorite), /* harmony export */ st: () => (/* binding */ getMyReferralInfo), /* harmony export */ td: () => (/* binding */ updatePlan), /* harmony export */ ts: () => (/* binding */ createOffer), /* harmony export */ u4: () => (/* binding */ getAdminMailStats), /* harmony export */ v9: () => (/* binding */ getUserReviews), /* harmony export */ vh: () => (/* binding */ getTaskStats), /* harmony export */ vy: () => (/* binding */ getAdminUserSpecialistCards), /* harmony export */ wc: () => (/* binding */ translateAdminEmailTemplate), /* harmony export */ wl: () => (/* binding */ updateAdminUser), /* harmony export */ yJ: () => (/* binding */ createLocation), /* harmony export */ yO: () => (/* binding */ getAdminActivityLogs), /* harmony export */ yk: () => (/* binding */ dismissNotification), /* harmony export */ z4: () => (/* binding */ getDailyUsage), /* harmony export */ z5: () => (/* binding */ getAdminReports), /* harmony export */ z6: () => (/* binding */ getMyStatuses), /* harmony export */ zB: () => (/* binding */ deletePortfolioItem), /* harmony export */ zR: () => (/* binding */ deleteLocation), /* harmony export */ zZ: () => (/* binding */ createCategory), /* harmony export */ zc: () => (/* binding */ updateSpecialistCard), /* harmony export */ zk: () => (/* binding */ getSpecialistFomoDashboard) /* harmony export */ }); /* unused harmony exports getTasks, getTaskBudgetRange, searchTasks, getTasksForSpecialist, getTaskCountsByCategory, cancelTask, updateNotifSettings, getFavorites, addFavorite, removeFavorite, getMyPortfolio, addPortfolioItem, getSpecialistPortfolio, getFomoRecommendations, getAutoMatchResults, getGoogleCalendarStatus, disconnectGoogleCalendar, importFromGoogleCalendar, getGoogleCalendarConnectUrl */ ~Oconst BASE = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; export async function request(path, init) { const res = await fetch(`${BASE}/api${path}`, { ...init, credentials: 'include', headers: { 'Content-Type': 'application/json', ...init?.headers } }); if (!res.ok) { const err = await res.json().catch(()=>({ error: res.statusText })); const msg = typeof err.error === 'string' ? err.error : typeof err.message === 'string' ? err.message : res.statusText || 'Request failed'; throw new Error(msg); } return res.json(); } // ─── Tasks ──────────────────────────────────────────────────────────────── export const getTasks = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks${qs}`); }; export const getTaskBudgetRange = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks/budget-range${qs}`); }; export const searchTasks = (params)=>request(`/tasks/search?${new URLSearchParams(params)}`); export const getMyTasks = ()=>request('/tasks/my'); export const getTasksForSpecialist = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks/for-me${qs}`); }; export const getTaskCountsByCategory = ()=>request('/tasks/counts-by-category'); export const getTask = (id)=>request(`/tasks/${id}`); export const createTask = (data)=>request('/tasks', { method: 'POST', body: JSON.stringify(data) }); export const updateTask = (id, data)=>request(`/tasks/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const completeTask = (id)=>request(`/tasks/${id}/complete`, { method: 'PATCH' }); export const cancelTask = (id)=>request(`/tasks/${id}/cancel`, { method: 'PATCH' }); // ─── Offers ──────────────────────────────────────────────────────────────── export const getOffers = (taskId)=>request(`/offers?taskId=${taskId}`); export const getMyOffers = ()=>request('/offers/my'); export const createOffer = (data)=>request('/offers', { method: 'POST', body: JSON.stringify(data) }); export const acceptOffer = (id)=>request(`/offers/${id}/accept`, { method: 'PATCH' }); export const declineOffer = (id)=>request(`/offers/${id}/decline`, { method: 'PATCH' }); export const getUserProfile = (id)=>request(`/users/${id}/profile`); export const getSpecialists = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/users/specialists${qs}`); }; export const createReview = (data)=>request('/reviews', { method: 'POST', body: JSON.stringify(data) }); export const getTaskReviews = (taskId)=>request(`/reviews/task/${taskId}`); export const getMyReviews = ()=>request('/reviews/my'); // ─── Chat ────────────────────────────────────────────────────────────────── export const getChatRooms = ()=>request('/chat/rooms'); export const getOrCreateDirectRoom = (userId)=>request(`/chat/direct/${userId}`); export const getCanMessage = (userId)=>request(`/chat/can-message/${userId}`); export const getMessages = (roomId)=>request(`/chat/rooms/${roomId}/messages`); export const sendMessage = (roomId, body)=>request('/chat/messages', { method: 'POST', body: JSON.stringify({ roomId, body }) }); // ─── Notifications ──────────────────────────────────────────────────────── export const updateNotifSettings = (data)=>request('/users/me', { method: 'PATCH', body: JSON.stringify(data) }); export const getNotifications = ()=>request('/notifications'); export const getUnreadCount = ()=>request('/notifications/count'); export const markRead = (id)=>request(`/notifications/${id}/read`, { method: 'PATCH' }); export const markAllRead = ()=>request('/notifications/read-all', { method: 'PATCH' }); export const getTaskInvite = (taskId)=>request(`/notifications?type=task_invite&referenceId=${taskId}`); export const dismissNotification = (id)=>request(`/notifications/${id}`, { method: 'DELETE' }); // ─── Referral ───────────────────────────────────────────────────────────── export const getMyReferralInfo = ()=>request('/users/me/referral'); // ─── Reviews ────────────────────────────────────────────────────────────── export const getUserReviews = (userId)=>request(`/reviews/user/${userId}`); export const getUserRating = (userId)=>request(`/reviews/user/${userId}/rating`); // ─── Categories ─────────────────────────────────────────────────────────── export const getCategories = ()=>request('/categories'); // ─── Locations ──────────────────────────────────────────────────────────── export const getLocations = ()=>request('/locations'); // ─── Favorites ──────────────────────────────────────────────────────────── export const getFavorites = ()=>request('/favorites'); export const addFavorite = (taskId)=>request(`/favorites/${taskId}`, { method: 'POST' }); export const removeFavorite = (taskId)=>request(`/favorites/${taskId}`, { method: 'DELETE' }); export const getSpecialistFavorites = ()=>request('/favorites/specialists'); export const addSpecialistFavorite = (specialistId)=>request(`/favorites/specialists/${specialistId}`, { method: 'POST' }); export const removeSpecialistFavorite = (specialistId)=>request(`/favorites/specialists/${specialistId}`, { method: 'DELETE' }); // ─── Admin ───────────────────────────────────────────────────────────────── // ─── Admin Categories ────────────────────────────────────────────────────── export const getAdminCategories = ()=>request('/admin/categories'); export const createCategory = (data)=>request('/admin/categories', { method: 'POST', body: JSON.stringify(data) }); export const updateCategory = (id, data)=>request(`/admin/categories/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deleteCategory = (id)=>request(`/admin/categories/${id}`, { method: 'DELETE' }); // ─── Admin ───────────────────────────────────────────────────────────────── export const getAdminStats = ()=>request('/admin/stats'); export const getAdminUsers = (page = 1, q, role)=>{ const p = new URLSearchParams({ page: String(page), limit: '20' }); if (q) p.set('q', q); if (role) p.set('role', role); return request(`/admin/users?${p}`); }; export const deactivateUser = (id)=>request(`/admin/users/${id}/deactivate`, { method: 'PATCH' }); export const activateUser = (id)=>request(`/admin/users/${id}/activate`, { method: 'PATCH' }); export const changeUserRole = (id, role)=>request(`/admin/users/${id}/role`, { method: 'PATCH', body: JSON.stringify({ role }) }); export const getAdminUser = (id)=>request(`/admin/users/${id}`); export const getAdminUserSpecialistCards = (userId)=>request(`/admin/users/${userId}/specialist-cards`); export const adminUpdateSpecialistCard = (id, data)=>request(`/admin/specialist-cards/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const updateAdminUser = (id, data)=>request(`/admin/users/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const getAdminTasks = (page = 1, q, status)=>{ const p = new URLSearchParams({ page: String(page), limit: '20' }); if (q) p.set('q', q); if (status) p.set('status', status); return request(`/admin/tasks?${p}`); }; export const cancelTaskAdmin = (id)=>request(`/admin/tasks/${id}/cancel`, { method: 'PATCH' }); export const deleteTaskAdmin = (id)=>request(`/admin/tasks/${id}`, { method: 'DELETE' }); export const getAdminReports = (page = 1)=>request(`/admin/reports?page=${page}&limit=20`); export const updateReportStatus = (id, status)=>request(`/admin/reports/${id}/status`, { method: 'PATCH', body: JSON.stringify({ status }) }); export const getAdminAiLogs = (page = 1)=>request(`/admin/ai-logs?page=${page}&limit=50`); export const getAdminActivityLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.event) p.set('event', params.event); if (params.userId) p.set('userId', params.userId); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/activity-logs?${p}`); }; export const getAdminMailLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.event) p.set('event', params.event); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/mail-logs?${p}`); }; export const getAdminNotifLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.type) p.set('type', params.type); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/notification-logs?${p}`); }; export const getAdminNotifStats = ()=>request('/admin/notification-stats'); export const getAdminMailStats = ()=>request('/admin/mail-stats'); // ─── Admin Locations ─────────────────────────────────────────────────────── export const getAdminLocations = ()=>request('/admin/locations'); export const createLocation = (data)=>request('/admin/locations', { method: 'POST', body: JSON.stringify(data) }); export const updateLocation = (id, data)=>request(`/admin/locations/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deleteLocation = (id)=>request(`/admin/locations/${id}`, { method: 'DELETE' }); // ─── Admin Plans ─────────────────────────────────────────────────────────── export const getAdminPlans = ()=>request('/admin/plans'); export const createPlan = (data)=>request('/admin/plans', { method: 'POST', body: JSON.stringify(data) }); export const updatePlan = (id, data)=>request(`/admin/plans/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deletePlan = (id)=>request(`/admin/plans/${id}`, { method: 'DELETE' }); // ─── Admin Settings ──────────────────────────────────────────────────────── export const getAdminSettings = ()=>request('/admin/settings'); export const updateAdminSettings = (data)=>request('/admin/settings', { method: 'PUT', body: JSON.stringify(data) }); export const getAdminEmailTemplates = ()=>request('/admin/settings/templates'); export const updateAdminEmailTemplate = (key, data)=>request(`/admin/settings/templates/${key}`, { method: 'PUT', body: JSON.stringify(data) }); export const translateAdminEmailTemplate = (data)=>request('/admin/settings/templates/translate', { method: 'POST', body: JSON.stringify(data) }); export const sendTestEmail = ()=>request('/admin/settings/test-email', { method: 'POST' }); // ─── Availability ────────────────────────────────────────────────────────── export const getMyAvailability = (month)=>request(`/availability/my${month ? `?month=${month}` : ''}`); export const setAvailability = (date, status, note)=>request('/availability/set', { method: 'POST', body: JSON.stringify({ date, status, note }) }); export const setAvailabilityRange = (from, to, status)=>request('/availability/set-range', { method: 'POST', body: JSON.stringify({ from, to, status }) }); export const getSpecialistAvailability = (userId, month)=>request(`/availability/user/${userId}${month ? `?month=${month}` : ''}`); export const getMyPortfolio = ()=>request('/portfolio/my'); export const addPortfolioItem = (formData)=>fetch(`${BASE}/api/portfolio`, { method: 'POST', credentials: 'include', body: formData }).then(async (res)=>{ if (!res.ok) { const err = await res.json().catch(()=>({ error: res.statusText })); throw new Error(err.error || 'Upload failed'); } return res.json(); }); export const updatePortfolioItem = (id, data)=>request(`/portfolio/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deletePortfolioItem = (id)=>request(`/portfolio/${id}`, { method: 'DELETE' }); export const getSpecialistPortfolio = (userId)=>request(`/portfolio/user/${userId}`); export const getMySpecialistCards = ()=>request('/specialist-cards/my'); export const createSpecialistCard = (data)=>request('/specialist-cards', { method: 'POST', body: JSON.stringify(data) }); export const updateSpecialistCard = (id, data)=>request(`/specialist-cards/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deleteSpecialistCard = (id)=>request(`/specialist-cards/${id}`, { method: 'DELETE' }); export const getSpecialistCards = (userId)=>request(`/specialist-cards/user/${userId}`); export const getSkillSuggestions = (categorySlugs)=>{ const params = categorySlugs?.length ? '?' + categorySlugs.map((s)=>`category=${encodeURIComponent(s)}`).join('&') : ''; return request(`/skill-suggestions${params}`); }; export const initiateTopUp = (amount)=>request('/payments/topup/init', { method: 'POST', body: JSON.stringify({ amount }) }); export const getPaymentHistory = ()=>request('/payments/history'); export const getBalanceHistory = (limit = 50)=>request(`/payments/balance-history?limit=${limit}`); export const getAdminBalanceHistory = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.userId) p.set('userId', params.userId); if (params.kind) p.set('kind', params.kind); p.set('limit', '50'); return request(`/admin/balance-history?${p}`); }; export const adminTopUpUserBalance = (id, data)=>request(`/admin/users/${id}/balance/topup`, { method: 'POST', body: JSON.stringify(data) }); export const adminWithdrawUserBalance = (id, data)=>request(`/admin/users/${id}/balance/withdraw`, { method: 'POST', body: JSON.stringify(data) }); export const previewPlanChange = (planId)=>request('/payments/plan/preview', { method: 'POST', body: JSON.stringify({ planId }) }); export const getPlans = (role)=>{ const qs = role ? `?role=${role}` : ''; return request(`/plans${qs}`); }; export const getMyDashboard = ()=>request('/dashboard/me'); export const getDailyUsage = ()=>request('/plans/daily-usage'); export const purchasePlan = (planId, payFromBalance = true)=>request('/payments/plan/purchase', { method: 'POST', body: JSON.stringify({ planId, payFromBalance }) }); // ─── Statuses ────────────────────────────────────────────────────────────── export const getMyStatuses = ()=>request('/statuses/me'); export const toggleStatus = (statusType, active)=>request('/statuses/toggle', { method: 'POST', body: JSON.stringify({ statusType, active }) }); export const getAutoResponseSettings = ()=>request('/auto-response'); export const updateAutoResponseSettings = (data)=>request('/auto-response', { method: 'PUT', body: JSON.stringify(data) }); // ─── FOMO ────────────────────────────────────────────────────────────────── export const getSpecialistFomoDashboard = ()=>request('/fomo/specialist'); export const getCustomerFomoDashboard = ()=>request('/fomo/customer'); export const getFomoRecommendations = ()=>request('/fomo/recommendations'); // ─── Auto-match ──────────────────────────────────────────────────────────── export const getAutoMatchResults = (taskId)=>request(`/auto-match/${taskId}`); export const runAutoMatch = (taskId)=>request(`/auto-match/${taskId}`, { method: 'POST' }); // ─── Google Calendar ─────────────────────────────────────────────────────── export const getGoogleCalendarStatus = ()=>request('/google/calendar/status'); export const disconnectGoogleCalendar = ()=>request('/google/calendar/disconnect', { method: 'DELETE' }); export const importFromGoogleCalendar = ()=>request('/google/calendar/import', { method: 'POST' }); export const getGoogleCalendarConnectUrl = ()=>`${BASE}/api/google/calendar/connect`; // ─── Personal site ───────────────────────────────────────────────────────── export const getPublicSiteProfile = (slug)=>request(`/users/site/${slug}`); export const getSiteStats = ()=>request('/users/me/site-stats'); export const trackSiteMessage = (slug)=>request(`/users/site/${slug}/track-message`, { method: 'POST' }).catch(()=>{}); // ─── Task stats (FOMO) ───────────────────────────────────────────────────── export const getTaskStats = (taskId)=>request(`/tasks/${taskId}/stats`); 1343"https://api.canhelp.gr"undefined48700undefined7379undefined743749undefined881887undefined10421048undefined11361142undefined11881194undefined13461352undefined14271433undefined14811487undefined16021608undefined17341740undefined18351841undefined20112017undefined20832089undefined21372143undefined22602266undefined23592365undefined24602466undefined25292535undefined26852691undefined28102816undefined28862892undefined30213027undefined30773083undefined31593165undefined32383244undefined33183324undefined35783584undefined37123718undefined37753781undefined38423848undefined39433949undefined40434049undefined41484154undefined43344340undefined44804486undefined45564562undefined47164722undefined48514857undefined49844990undefined50395045undefined51415147undefined52485254undefined53255331undefined54615467undefined57605766undefined58285834undefined59645970undefined61116117undefined62966302undefined63546360undefined66036609undefined67146720undefined68216827undefined69926998undefined70577063undefined71627168undefined73267332undefined74697475undefined77267732undefined78347840undefined79367942undefined80288034undefined82118217undefined83028308undefined87508756undefined91359141undefined95269532undefined96029608undefined97489754undefined98149820undefined99499955undefined1009510101undefined1027910285undefined1033710343undefined1046410470undefined1060210608undefined1077810784undefined1084210848undefined1098010986undefined1106011066undefined1122511231undefined1139211398undefined1157511581undefined1167911685undefined1189211898undefined1211212118undefined1224412250undefined1230412310undefined1273112737undefined1287612882undefined1298012986undefined1306613072undefined1313913145undefined1328113287undefined1343413440undefined1354613552undefined1363513641undefined1386813874undefined1403414040undefined1410114107undefined1420114207undefined1453414540undefined1469614702undefined1486414870undefined1503615042undefined1515215158undefined1521215218undefined1527615282undefined1557415580undefined1563215638undefined1582915835undefined1589915905undefined1612216128undefined1619716203undefined1626816274undefined1642316429undefined1650216508undefined1668516691undefined1676416770undefined1688216888undefined1699417000undefined1715917165undefined1723517241undefined1730017306undefined1751117517undefined, /***/ 91946:  Owebpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource 8webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43560); /* harmony import */ var next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__); webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourceZ import { fillMetadataSegment } from 'next/dist/lib/metadata/get-metadata-route' export default async (props) => { const imageData = {"type":"image/svg+xml","sizes":"any"} const imageUrl = fillMetadataSegment(".", await props.params, "icon.svg") return [{ ...imageData, url: imageUrl + "?71a523b2dd824001", }] } dPUcUcBZ u@/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__.fillMetadataSegment));buffersourcesizemapshash__webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43560); /* harmony import */ var next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (async (props) => { const imageData = {"type":"image/svg+xml","sizes":"any"} const imageUrl = (0,next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__.fillMetadataSegment)(".", await props.params, "icon.svg") return [{ ...imageData, url: imageUrl + "?71a523b2dd824001", }] }); {"finalSource":true}mapbufferedMap ConcatSourceRawSource __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43560); /* harmony import */ var next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__); ReplaceSourceRawSourceZ import { fillMetadataSegment } from 'next/dist/lib/metadata/get-metadata-route' export default async (props) => { const imageData = {"type":"image/svg+xml","sizes":"any"} const imageUrl = fillMetadataSegment(".", await props.params, "icon.svg") return [{ ...imageData, url: imageUrl + "?71a523b2dd824001", }] }280undefined8599/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (undefined8599undefined201219(0,next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__.fillMetadataSegment)undefined346345.5);undefined /***/ }) /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43560); /* harmony import */ var next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (async (props) => { const imageData = {"type":"image/svg+xml","sizes":"any"} const imageUrl = (0,next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__.fillMetadataSegment)(".", await props.params, "icon.svg") return [{ ...imageData, url: imageUrl + "?71a523b2dd824001", }] }); /***/ })    __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43560); /* harmony import */ var next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__); Z import { fillMetadataSegment } from 'next/dist/lib/metadata/get-metadata-route' export default async (props) => { const imageData = {"type":"image/svg+xml","sizes":"any"} const imageUrl = fillMetadataSegment(".", await props.params, "icon.svg") return [{ ...imageData, url: imageUrl + "?71a523b2dd824001", }] }280undefined8599/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (undefined8599undefined201219(0,next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__.fillMetadataSegment)undefined346345.5);undefined, /***/ 95837:  ywebpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceV/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceimport(/* webpackMode: "eager", webpackExports: ["Footer"] */ "/opt/canhelp/apps/web/src/components/Footer.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["Header"] */ "/opt/canhelp/apps/web/src/components/Header.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["ScrollToTopButton"] */ "/opt/canhelp/apps/web/src/components/ScrollToTopButton.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["LocaleProvider"] */ "/opt/canhelp/apps/web/src/context/locale.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["LocationProvider"] */ "/opt/canhelp/apps/web/src/context/location.tsx"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/script.js"); aotHmrchPromise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 39348))Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 67674))Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 32948))Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 20138))Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 1697))Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 33219, 23))buffersourcesizemapshash[Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 39348)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 67674)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 32948)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 20138)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 1697)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 33219, 23)); {"finalSource":true}mapbufferedMap ReplaceSourceRawSourceimport(/* webpackMode: "eager", webpackExports: ["Footer"] */ "/opt/canhelp/apps/web/src/components/Footer.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["Header"] */ "/opt/canhelp/apps/web/src/components/Header.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["ScrollToTopButton"] */ "/opt/canhelp/apps/web/src/components/ScrollToTopButton.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["LocaleProvider"] */ "/opt/canhelp/apps/web/src/context/locale.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["LocationProvider"] */ "/opt/canhelp/apps/web/src/context/location.tsx"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/script.js"); 0111Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 39348))undefined116227Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 67674))undefined232365Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 32948))undefined370486Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 20138))undefined491611Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 1697))undefined616704Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 33219, 23))undefined /***/ }) /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 39348)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 67674)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 32948)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 20138)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 1697)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 33219, 23)); /***/ })  wx0111Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 39348))undefined116227Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 67674))undefined232365Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 32948))undefined370486Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 20138))undefined491611Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 1697))undefined616704Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 33219, 23))undefined, /***/ 96484:  :5webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource_/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource +webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocaleProvider: () => (/* binding */ LocaleProvider), /* harmony export */ Y: () => (/* binding */ useLocale) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71159); /* harmony import */ var _lib_translations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12998); webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource /* __next_internal_client_entry_do_not_use__ LocaleProvider,useLocale auto */ import { jsx as _jsx } from "react/jsx-runtime"; import { createContext, useContext, useState, useEffect, useCallback } from 'react'; import { useRouter } from 'next/navigation'; import { getTranslations } from '@/lib/translations'; const COOKIE_KEY = 'canhelp_locale'; const DEFAULT_LOCALE = 'el'; const LocaleContext = /*#__PURE__*/ createContext({ locale: DEFAULT_LOCALE, setLocale: ()=>{}, t: (key)=>key }); function readCookieLocale() { if (typeof document === 'undefined') return DEFAULT_LOCALE; const match = document.cookie.match(/canhelp_locale=([^;]+)/); const val = match?.[1]; return val && [ 'el', 'en', 'ru' ].includes(val) ? val : DEFAULT_LOCALE; } export function LocaleProvider({ children, initialLocale }) { const router = useRouter(); const [locale, setLocaleState] = useState(initialLocale ?? DEFAULT_LOCALE); // Sync from cookie on mount (client-side) process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const cookieLocale = readCookieLocale(); if (cookieLocale !== locale) setLocaleState(cookieLocale); // Sync cookie locale to DB on first load (in case DB is out of sync) const apiBase = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; fetch(`${apiBase}/api/users/me`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ locale: cookieLocale }) }).catch(()=>{}); }, []); const setLocale = useCallback((next)=>{ setLocaleState(next); document.cookie = `${COOKIE_KEY}=${next}; path=/; max-age=31536000; SameSite=Lax`; document.documentElement.lang = next; // Persist locale to user profile in DB (best-effort, non-blocking) const apiBase = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; fetch(`${apiBase}/api/users/me`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ locale: next }) }).catch(()=>{}); // Re-render server components with new cookie router.refresh(); }, [ router ]); const t = useCallback((key, fallback)=>getTranslations(locale)(key, fallback), [ locale ]); return /*#__PURE__*/ _jsx(LocaleContext.Provider, { value: { locale, setLocale, t }, children: children }); } export function useLocale() { return useContext(LocaleContext); } cN}_5$ow2::?U  1 4 B (0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)(0,next_navigation__WEBPACK_IMPORTED_MODULE_2__.useRouter)(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)"https://api.canhelp.gr"0(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)0(0,_lib_translations__WEBPACK_IMPORTED_MODULE_3__/* .getTranslations */ .$)(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)buffersourcesizemapshash /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocaleProvider: () => (/* binding */ LocaleProvider), /* harmony export */ Y: () => (/* binding */ useLocale) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71159); /* harmony import */ var _lib_translations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12998); /* __next_internal_client_entry_do_not_use__ LocaleProvider,useLocale auto */ const COOKIE_KEY = 'canhelp_locale'; const DEFAULT_LOCALE = 'el'; const LocaleContext = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)({ locale: DEFAULT_LOCALE, setLocale: ()=>{}, t: (key)=>key }); function readCookieLocale() { if (typeof document === 'undefined') return DEFAULT_LOCALE; const match = document.cookie.match(/canhelp_locale=([^;]+)/); const val = match?.[1]; return val && [ 'el', 'en', 'ru' ].includes(val) ? val : DEFAULT_LOCALE; } function LocaleProvider({ children, initialLocale }) { const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_2__.useRouter)(); const [locale, setLocaleState] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(initialLocale ?? DEFAULT_LOCALE); // Sync from cookie on mount (client-side) process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{ const cookieLocale = readCookieLocale(); if (cookieLocale !== locale) setLocaleState(cookieLocale); // Sync cookie locale to DB on first load (in case DB is out of sync) const apiBase = "https://api.canhelp.gr" || 0; fetch(`${apiBase}/api/users/me`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ locale: cookieLocale }) }).catch(()=>{}); }, []); const setLocale = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((next)=>{ setLocaleState(next); document.cookie = `${COOKIE_KEY}=${next}; path=/; max-age=31536000; SameSite=Lax`; document.documentElement.lang = next; // Persist locale to user profile in DB (best-effort, non-blocking) const apiBase = "https://api.canhelp.gr" || 0; fetch(`${apiBase}/api/users/me`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ locale: next }) }).catch(()=>{}); // Re-render server components with new cookie router.refresh(); }, [ router ]); const t = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((key, fallback)=>(0,_lib_translations__WEBPACK_IMPORTED_MODULE_3__/* .getTranslations */ .$)(locale)(key, fallback), [ locale ]); return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(LocaleContext.Provider, { value: { locale, setLocale, t }, children: children }); } function useLocale() { return (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(LocaleContext); } {"finalSource":true}mapbufferedMap ConcatSourceRawSource/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocaleProvider: () => (/* binding */ LocaleProvider), /* harmony export */ Y: () => (/* binding */ useLocale) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71159); /* harmony import */ var _lib_translations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12998); ReplaceSourceRawSource /* __next_internal_client_entry_do_not_use__ LocaleProvider,useLocale auto */ import { jsx as _jsx } from "react/jsx-runtime"; import { createContext, useContext, useState, useEffect, useCallback } from 'react'; import { useRouter } from 'next/navigation'; import { getTranslations } from '@/lib/translations'; const COOKIE_KEY = 'canhelp_locale'; const DEFAULT_LOCALE = 'el'; const LocaleContext = /*#__PURE__*/ createContext({ locale: DEFAULT_LOCALE, setLocale: ()=>{}, t: (key)=>key }); function readCookieLocale() { if (typeof document === 'undefined') return DEFAULT_LOCALE; const match = document.cookie.match(/canhelp_locale=([^;]+)/); const val = match?.[1]; return val && [ 'el', 'en', 'ru' ].includes(val) ? val : DEFAULT_LOCALE; } export function LocaleProvider({ children, initialLocale }) { const router = useRouter(); const [locale, setLocaleState] = useState(initialLocale ?? DEFAULT_LOCALE); // Sync from cookie on mount (client-side) process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const cookieLocale = readCookieLocale(); if (cookieLocale !== locale) setLocaleState(cookieLocale); // Sync cookie locale to DB on first load (in case DB is out of sync) const apiBase = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; fetch(`${apiBase}/api/users/me`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ locale: cookieLocale }) }).catch(()=>{}); }, []); const setLocale = useCallback((next)=>{ setLocaleState(next); document.cookie = `${COOKIE_KEY}=${next}; path=/; max-age=31536000; SameSite=Lax`; document.documentElement.lang = next; // Persist locale to user profile in DB (best-effort, non-blocking) const apiBase = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; fetch(`${apiBase}/api/users/me`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ locale: next }) }).catch(()=>{}); // Re-render server components with new cookie router.refresh(); }, [ router ]); const t = useCallback((key, fallback)=>getTranslations(locale)(key, fallback), [ locale ]); return /*#__PURE__*/ _jsx(LocaleContext.Provider, { value: { locale, setLocale, t }, children: children }); } export function useLocale() { return useContext(LocaleContext); } G78125undefined127210undefined212255undefined257309undefined413425(0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)undefined798804undefined879887(0,next_navigation__WEBPACK_IMPORTED_MODULE_2__.useRouter)undefined929936(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined10741082(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)undefined13081338"https://api.canhelp.gr"undefined134313650undefined17121722(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)undefined20012031"https://api.canhelp.gr"undefined203620580undefined24902500(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)undefined25192533(0,_lib_translations__WEBPACK_IMPORTED_MODULE_3__/* .getTranslations */ .$)undefined26092612(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined27622768undefined28032812(0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)undefined /***/ }) u/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocaleProvider: () => (/* binding */ LocaleProvider), /* harmony export */ Y: () => (/* binding */ useLocale) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71159); /* harmony import */ var _lib_translations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12998); /* __next_internal_client_entry_do_not_use__ LocaleProvider,useLocale auto */ const COOKIE_KEY = 'canhelp_locale'; const DEFAULT_LOCALE = 'el'; const LocaleContext = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)({ locale: DEFAULT_LOCALE, setLocale: ()=>{}, t: (key)=>key }); function readCookieLocale() { if (typeof document === 'undefined') return DEFAULT_LOCALE; const match = document.cookie.match(/canhelp_locale=([^;]+)/); const val = match?.[1]; return val && [ 'el', 'en', 'ru' ].includes(val) ? val : DEFAULT_LOCALE; } function LocaleProvider({ children, initialLocale }) { const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_2__.useRouter)(); const [locale, setLocaleState] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(initialLocale ?? DEFAULT_LOCALE); // Sync from cookie on mount (client-side) process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{ const cookieLocale = readCookieLocale(); if (cookieLocale !== locale) setLocaleState(cookieLocale); // Sync cookie locale to DB on first load (in case DB is out of sync) const apiBase = "https://api.canhelp.gr" || 0; fetch(`${apiBase}/api/users/me`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ locale: cookieLocale }) }).catch(()=>{}); }, []); const setLocale = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((next)=>{ setLocaleState(next); document.cookie = `${COOKIE_KEY}=${next}; path=/; max-age=31536000; SameSite=Lax`; document.documentElement.lang = next; // Persist locale to user profile in DB (best-effort, non-blocking) const apiBase = "https://api.canhelp.gr" || 0; fetch(`${apiBase}/api/users/me`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ locale: next }) }).catch(()=>{}); // Re-render server components with new cookie router.refresh(); }, [ router ]); const t = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((key, fallback)=>(0,_lib_translations__WEBPACK_IMPORTED_MODULE_3__/* .getTranslations */ .$)(locale)(key, fallback), [ locale ]); return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(LocaleContext.Provider, { value: { locale, setLocale, t }, children: children }); } function useLocale() { return (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(LocaleContext); } /***/ })   /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocaleProvider: () => (/* binding */ LocaleProvider), /* harmony export */ Y: () => (/* binding */ useLocale) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71159); /* harmony import */ var _lib_translations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12998);  /* __next_internal_client_entry_do_not_use__ LocaleProvider,useLocale auto */ import { jsx as _jsx } from "react/jsx-runtime"; import { createContext, useContext, useState, useEffect, useCallback } from 'react'; import { useRouter } from 'next/navigation'; import { getTranslations } from '@/lib/translations'; const COOKIE_KEY = 'canhelp_locale'; const DEFAULT_LOCALE = 'el'; const LocaleContext = /*#__PURE__*/ createContext({ locale: DEFAULT_LOCALE, setLocale: ()=>{}, t: (key)=>key }); function readCookieLocale() { if (typeof document === 'undefined') return DEFAULT_LOCALE; const match = document.cookie.match(/canhelp_locale=([^;]+)/); const val = match?.[1]; return val && [ 'el', 'en', 'ru' ].includes(val) ? val : DEFAULT_LOCALE; } export function LocaleProvider({ children, initialLocale }) { const router = useRouter(); const [locale, setLocaleState] = useState(initialLocale ?? DEFAULT_LOCALE); // Sync from cookie on mount (client-side) process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const cookieLocale = readCookieLocale(); if (cookieLocale !== locale) setLocaleState(cookieLocale); // Sync cookie locale to DB on first load (in case DB is out of sync) const apiBase = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; fetch(`${apiBase}/api/users/me`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ locale: cookieLocale }) }).catch(()=>{}); }, []); const setLocale = useCallback((next)=>{ setLocaleState(next); document.cookie = `${COOKIE_KEY}=${next}; path=/; max-age=31536000; SameSite=Lax`; document.documentElement.lang = next; // Persist locale to user profile in DB (best-effort, non-blocking) const apiBase = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; fetch(`${apiBase}/api/users/me`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ locale: next }) }).catch(()=>{}); // Re-render server components with new cookie router.refresh(); }, [ router ]); const t = useCallback((key, fallback)=>getTranslations(locale)(key, fallback), [ locale ]); return /*#__PURE__*/ _jsx(LocaleContext.Provider, { value: { locale, setLocale, t }, children: children }); } export function useLocale() { return useContext(LocaleContext); } G78125undefined127210undefined212255undefined257309undefined413425(0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)undefined798804undefined879887(0,next_navigation__WEBPACK_IMPORTED_MODULE_2__.useRouter)undefined929936(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined10741082(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)undefined13081338"https://api.canhelp.gr"undefined134313650undefined17121722(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)undefined20012031"https://api.canhelp.gr"undefined203620580undefined24902500(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)undefined25192533(0,_lib_translations__WEBPACK_IMPORTED_MODULE_3__/* .getTranslations */ .$)undefined26092612(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined27622768undefined28032812(0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)undefined }; ; buffersourcesizemapshash1exports.id = 244; exports.ids = [244]; exports.modules = { /***/ 1241: /***/ (() => { /* (ignored) */ /***/ }), /***/ 1697: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocationProvider: () => (/* binding */ LocationProvider) /* harmony export */ }); /* unused harmony export useLocation */ /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const LocationProvider = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call LocationProvider() from the server but LocationProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/location.tsx", "LocationProvider", );const useLocation = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call useLocation() from the server but useLocation is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/location.tsx", "useLocation", ); /***/ }), /***/ 12998: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $: () => (/* binding */ getTranslations), /* harmony export */ YZ: () => (/* binding */ LOCALES) /* harmony export */ }); /* unused harmony export translations */ const LOCALES = [ { code: 'el', label: 'Ελληνικά', flag: '🇬🇷' }, { code: 'en', label: 'English', flag: '🇬🇧' }, { code: 'ru', label: 'Русский', flag: '🇷🇺' } ]; const translations = { el: { 'footer.slogan': 'Η εργασία σου — η φροντίδα μας! Λύνουμε κάθε ζήτημα γρήγορα και εύκολα.', 'footer.links': 'Σύνδεσμοι', 'footer.socials': 'Στα κοινωνικά δίκτυα', // Nav 'nav.home': 'Αρχική', 'nav.tasks': 'Εργασίες', 'nav.post': '+ Δημοσίευση', 'nav.dashboard': 'Πίνακας', 'nav.chat': 'Μηνύματα', 'nav.notifications': 'Ειδοποιήσεις', 'nav.profile': 'Προφίλ', 'nav.admin': 'Διαχείριση', 'nav.specialists': 'Ειδικοί', 'nav.new_task': 'Νέα εργασία', 'nav.login': 'Σύνδεση', 'nav.register': 'Εγγραφή', 'nav.logout': 'Έξοδος', // Hero 'hero.title': 'Βρες ειδικό για κάθε δουλειά', 'hero.subtitle': 'Δημοσίευσε εργασία, λάβε προσφορές και επίλεξε τον καλύτερο επαγγελματία', 'hero.cta.post': 'Δημοσίευσε εργασία', 'hero.cta.browse': 'Βρες εργασία', 'hero.search.placeholder': 'Τι χρειάζεσαι; π.χ. ηλεκτρολόγος, καθαρισμός...', 'stats.specialists': 'ειδικοί', 'stats.tasks': 'εργασίες', 'stats.categories': 'κατηγορίες', 'stats.free': 'δωρεάν εγγραφή', // Sections 'section.categories': 'Δημιούργησε εργασία σε οποιαδήποτε κατηγορία', 'section.how': 'Πώς λειτουργεί', 'section.recent': 'Πρόσφατες εργασίες', 'section.all': 'Δες όλες →', 'section.more': 'ακόμα', 'section.cities': 'Πόλεις & Περιοχές', 'section.community': 'Ένα κοινοτικό έργο για όλους', 'community.subtitle': 'Το CanHelp δεν είναι απλώς μια αγορά — είναι μια κοινότητα αμοιβαίας βοήθειας. Οποιοσδήποτε έχει γνώση ή δεξιότητα μπορεί να βρει έναν πελάτη. Οποιοσδήποτε έχει ένα πρόβλημα μπορεί να βρει έναν ειδικό.', 'community.point1.title': 'Είσαι ειδικός σε κάτι;', 'community.point1.desc': 'Επισκευές, μαθήματα, σχεδιασμός, μεταφράσεις, φροντίδα — κάθε δεξιότητα αξίζει. Δημιούργησε προφίλ και βρες πελάτες κοντά σου.', 'community.point2.title': 'Χρειάζεσαι βοήθεια;', 'community.point2.desc': 'Δημοσίευσε εργασία σε λιγότερο από ένα λεπτό και λάβε προσφορές από επαληθευμένους ειδικούς στην πόλη σου.', 'community.point3.title': 'Βοήθησε το έργο να αναπτυχθεί', 'community.point3.desc': 'Το CanHelp αναπτύσσεται χάρη στις κοινότητες. Μοιράσου το σύνδεσμο με φίλους και γνωστούς — μαζί χτίζουμε κάτι χρήσιμο για όλους.', 'community.share': 'Μοιράσου με φίλους', 'community.share.copied': 'Σύνδεσμος αντιγράφηκε!', // Referral section on home page 'section.referral': 'Πρόγραμμα παραπομπών', 'referral.home.subtitle': 'Μοιράσου τον σύνδεσμό σου — κάθε νέος χρήστης που εγγράφεται μέσα από αυτόν σου αποφέρει ανταμοιβή.', 'referral.home.step1.title': 'Εγγραφείσε και λάβε σύνδεσμο', 'referral.home.step1.desc': 'Δημιούργησε λογαριασμό και βρες τον μοναδικό σου σύνδεσμο παραπομπής στο προφίλ σου.', 'referral.home.step2.title': 'Μοιράσου με φίλους', 'referral.home.step2.desc': 'Στείλε τον σύνδεσμο σε φίλους, γνωστούς ή δημοσίευσέ τον στα social media.', 'referral.home.step3.title': 'Κέρδισε ανταμοιβές', 'referral.home.step3.desc': 'Μόλις ο φίλος σου επαληθεύσει το email του, λαμβάνεις αυτόματα την ανταμοιβή σου.', 'referral.home.cta': 'Πάρε τον σύνδεσμό σου', 'referral.home.badge': 'Πρόγραμμα παραπομπών', // FAQ section 'section.faq': 'Συχνές Ερωτήσεις', 'faq.q1': 'Πώς λειτουργεί το CanHelp;', 'faq.a1': 'Δημοσίευσε μια εργασία, λάβε προσφορές από ειδικούς, επέλεξε τον καλύτερο και ξεκίνα τη συνεργασία. Είναι γρήγορο, απλό και δωρεάν για πελάτες.', 'faq.q2': 'Πόσο κοστίζει η χρήση της πλατφόρμας;', 'faq.a2': 'Η εγγραφή και η δημοσίευση εργασιών είναι εντελώς δωρεάν για πελάτες. Οι ειδικοί έχουν στη διάθεσή τους δωρεάν πλάνο καθώς και premium επιλογές.', 'faq.q3': 'Πώς μπορώ να γίνω ειδικός;', 'faq.a3': 'Κάνε εγγραφή, πήγαινε στο «Γίνε Ειδικός», συμπλήρωσε το προφίλ σου με δεξιότητες και κατηγορίες και αρχίνισε να λαμβάνεις εργασίες.', 'faq.q4': 'Πώς επιλέγω τον κατάλληλο ειδικό;', 'faq.a4': 'Δες τις αξιολογήσεις, την εμπειρία, τις δεξιότητες και το χαρτοφυλάκιο κάθε ειδικού. Επικοινώνησε μαζί του μέσω chat και συζήτα τις λεπτομέρειες πριν αποφασίσεις.', 'faq.q5': 'Τι γίνεται αν δεν είμαι ικανοποιημένος;', 'faq.a5': 'Μπορείς να αφήσεις αξιολόγηση για τον ειδικό και να τον βαθμολογήσεις από 1 έως 5 αστέρια. Οι αξιολογήσεις βοηθούν άλλους χρήστες να επιλέξουν έμπιστους επαγγελματίες.', 'faq.q6': 'Μπορώ να επικοινωνήσω με τον ειδικό πριν την αποδοχή;', 'faq.a6': 'Ναι. Μόλις λάβεις μια προσφορά, μπορείς να ανοίξεις chat με τον ειδικό, να κάνεις ερωτήσεις και να συντονίσεις τις λεπτομέρειες πριν αποφασίσεις.', 'faq.q7': 'Πόσος χρόνος χρειάζεται για να λάβω προσφορές;', 'faq.a7': 'Συνήθως μέσα σε λίγες ώρες. Οι ειδικοί λαμβάνουν ειδοποίηση για νέες εργασίες και μπορούν να απαντήσουν γρήγορα.', 'faq.q8': 'Μπορώ να δημοσιεύσω εργασία σε οποιαδήποτε πόλη της Ελλάδας;', 'faq.a8': 'Ναι! Το CanHelp καλύπτει όλη την Ελλάδα. Μπορείς να βρεις ειδικούς στην Αθήνα, στη Θεσσαλονίκη, στην Πάτρα και αλλού.', 'faq.q9': 'Τι είδη εργασιών μπορώ να βρω στο CanHelp;', 'faq.a9': 'Επισκευές, καθαρισμό, ηλεκτρολόγους, μαθήματα, σχεδιασμό, IT, μετακομίσεις, ομορφιά και πολλά άλλα. Οι κατηγορίες αυξάνονται συνεχώς.', 'faq.q10': 'Υπάρχει εφαρμογή για κινητό;', 'faq.a10': 'Ναι! Το CanHelp διατίθεται για Android και iOS. Κατέβασε την εφαρμογή και διαχειρίσου τα πάντα από το τηλέφωνό σου.', // How it works 'how.step1.title': 'Δημοσίευσε εργασία', 'how.step1.desc': 'Περίγραψε τι χρειάζεσαι και ορίζε τον προϋπολογισμό σου', 'how.step2.title': 'Λάβε προσφορές', 'how.step2.desc': 'Ειδικοί θα σου στείλουν προσφορές με τιμή και χρόνο', 'how.step3.title': 'Επίλεξε & ξεκίνα', 'how.step3.desc': 'Επέλεξε τον καλύτερο επαγγελματία και ξεκίνα τη συνεργασία', // Tasks page 'tasks.title': 'εργασίες', 'tasks.filters': 'Φίλτρα', 'tasks.search': 'Αναζήτηση', 'tasks.search.placeholder': 'Τίτλος ή λέξη κλειδί...', 'tasks.search.btn': 'Αναζήτηση', 'tasks.publish': 'Δημοσίευση', 'tasks.category.all': 'Όλες', 'tasks.category.all_in': 'Όλα στην', 'tasks.category.label': 'Κατηγορία', 'tasks.location.label': 'Πόλη', 'tasks.location.placeholder': 'π.χ. Αθήνα', 'tasks.empty': 'Δεν βρέθηκαν εργασίες', 'tasks.empty.cta': 'Δημοσίευσε την πρώτη', // Task detail 'task.status.open': 'Ανοιχτή', 'task.status.in_progress': 'Σε εξέλιξη', 'task.status.completed': 'Ολοκληρωμένη', 'task.status.cancelled': 'Ακυρωμένη', 'task.status.draft': 'Πρόχειρο', 'task.budget': 'Προϋπολογισμός', 'task.location': 'Τοποθεσία', 'task.deadline': 'Ημερομηνία έναρξης', 'task.created_at': 'Δημιουργήθηκε', 'task.customer': 'Πελάτης', 'task.offer.btn': 'Υποβολή προσφοράς', 'task.invite.banner_title': 'Σας προσκαλούν σε αυτήν την εργασία', 'task.invite.banner_hint': 'Ο πελάτης σας πρόσκαλεσε προσωπικά', 'task.invite.accept': 'Αποστολή προσφοράς', 'task.invite.decline': 'Άρνηση', 'offer.accept': 'Αποδοχή', 'offer.decline': 'Απόρριψη', 'task.complete': 'Ολοκλήρωση εργασίας', 'task.complete.confirm': 'Να ολοκληρωθεί η εργασία;', 'task.edit': 'Επεξεργασία', 'task.status_label': 'Κατάσταση', 'task.yours': 'Η εργασία σου', 'task.offer.yours': 'Η προσφορά σου', 'review.leave': 'Άφησε αξιολόγηση', 'review.rating': 'Βαθμολογία', 'review.comment': 'Σχόλιο', 'review.comment.placeholder': 'Πες μας για την εμπειρία σου...', 'review.submit': 'Υποβολή αξιολόγησης', 'review.submitting': 'Αποστολή...', 'review.done': 'Η αξιολόγηση καταχωρήθηκε!', 'profile.reviews': 'Αξιολογήσεις', 'profile.no_reviews': 'Δεν υπάρχουν αξιολογήσεις ακόμα', 'profile.rating': 'Βαθμολογία', 'profile.skills.label': 'Δεξιότητες', 'profile.member_since': 'Μέλος από', 'task.offers': 'Προσφορές', 'task.offers.none': 'Δεν υπάρχουν ακόμα προσφορές', // Create task 'create.title': 'Δημοσίευση εργασίας', 'create.field.title': 'Τίτλος', 'create.field.description': 'Περιγραφή', 'create.field.category': 'Κατηγορία', 'create.field.category.select': 'Επιλέξτε...', 'create.field.location': 'Τοποθεσία', 'create.field.location.any': 'Οπουδήποτε', 'create.field.location.all': 'Ολόκληρη η πόλη', 'create.field.budget': 'Προϋπολογισμός (€)', 'create.field.deadline': 'Ημερομηνία έναρξης', 'create.field.budget_negotiable': 'Η τιμή είναι διαπραγματεύσιμη', 'create.field.time_slot': 'Χρόνος εκτέλεσης', 'create.field.time_slot.any': 'Οποιαδήποτε', 'create.field.time_slot.morning': 'Πρωινό (08:00–13:00)', 'create.field.time_slot.afternoon': 'Μεσημέρι (13:00–18:00)', 'create.field.time_slot.evening': 'Βράδυ (18:00–22:00)', 'create.field.time_slot.weekend': 'Σαββατοκύριακο', 'create.field.address': 'Διεύθυνση (προαιρετικά)', 'create.field.address.district': 'Συνοικία', 'create.field.address.street': 'Οδός', 'create.field.address.house': 'Αριθμός', 'create.field.confidential': 'Εμπιστευτική σημείωση', 'create.field.confidential.placeholder': 'Λεπτομέρειες που θα δει μόνο ο αναδοχόμενος...', 'create.field.confidential.hint': 'Δεν εμφανίζεται δημόσια', 'create.field.photos': 'Φωτογραφίες', 'create.field.photos.add': 'Προσθήκη φωτογραφίας', 'create.field.photos.uploading': 'Ανέβασμα...', 'task.budget_negotiable': 'Τιμή διαπραγματεύσιμη', 'task.time_slot': 'Χρόνος', 'task.confidential': 'Εμπιστευτική σημείωση', 'create.field.title.placeholder': 'π.χ. Καθαρισμός διαμερίσματος 80τμ', 'create.field.description.placeholder': 'Περίγραψε λεπτομερώς τι χρειάζεσαι...', 'create.field.location.placeholder': 'π.χ. Αθήνα, Κολωνάκι', 'create.field.budget.placeholder': 'π.χ. 100', 'create.submit': 'Δημοσίευση εργασίας', 'create.submitting': 'Δημοσίευση...', // Auth 'login.title': 'Καλωσόρισες', 'login.subtitle': 'Σύνδεση στο CanHelp', 'login.email': 'Email', 'login.password': 'Κωδικός', 'login.submit': 'Σύνδεση', 'login.submitting': 'Σύνδεση...', 'login.error': 'Λάθος email ή κωδικός', 'login.unverified.title': 'Επιβεβαιώστε το email σας', 'login.unverified.desc': 'Στείλαμε σύνδεσμο επαλήθευσης στο email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε το σύνδεσμο.', 'login.unverified.resend': 'Αποστολή νέου email επαλήθευσης', 'login.unverified.sending': 'Αποστολή...', 'login.unverified.sent': '✓ Εστάλη — ελέγξτε τα εισερχόμενα', 'profile.email.verified': 'Email επαληθεύτηκε', 'profile.email.not_verified': 'Email δεν επαληθεύτηκε', 'login.no_account': 'Δεν έχεις λογαριασμό;', 'login.register_link': 'Εγγραφή', 'login.forgot_password': 'Ξέχασα τον κωδικό', 'login.or_continue_with': 'ή συνεχίστε με', 'login.continue_google': 'Σύνδεση με Google', 'forgot.title': 'Ξέχασα τον κωδικό', 'forgot.subtitle': 'Εισάγετε το email σας για να λάβετε σύνδεσμο ανάκτησης', 'forgot.email': 'Email', 'forgot.submit': 'Αποστολή', 'forgot.submitting': 'Αποστολή...', 'forgot.sent.title': 'Ελέγξτε τα εισερχόμενά σας', 'forgot.sent.desc': 'Αν υπάρχει λογαριασμός με αυτό το email, θα σας στείλουμε σύνδεσμο ανάκτησης κωδικού.', 'forgot.back_to_login': 'Επιστροφή στη σύνδεση', 'forgot.error': 'Αποτυχία αποστολής. Ελέγξτε το email σας ή δοκιμάστε ξανά.', 'forgot.error.not_found': 'Δεν βρέθηκε λογαριασμός με αυτό το email.', 'forgot.error.send_failed': 'Αποτυχία αποστολής email. Δοκιμάστε ξανά αργότερα', 'reset.title': 'Νέος κωδικός', 'reset.subtitle': 'Εισάγετε τον νέο σας κωδικό', 'reset.password': 'Νέος κωδικός', 'reset.confirm': 'Επιβεβαίωση κωδικού', 'reset.submit': 'Αλλαγή κωδικού', 'reset.submitting': 'Αποθήκευση...', 'reset.success': 'Ο κωδικός άλλαξε επιτυχώς. Ανακατεύθυνση στη σύνδεση...', 'reset.back_to_login': 'Επιστροφή στη σύνδεση', 'reset.error.mismatch': 'Οι κωδικοί δεν ταιριάζουν', 'reset.error.invalid': 'Μη έγκυρος σύνδεσμος. Παρακαλώ ζητήστε νέο.', 'register.title': 'Εγγραφή', 'register.subtitle': 'Δημιουργία λογαριασμού στο CanHelp', 'register.first_name': 'Όνομα', 'register.last_name': 'Επώνυμο', 'register.email': 'Email', 'register.password': 'Κωδικός (min 8 χαρακτήρες)', 'register.role': 'Ρόλος', 'register.role.customer': 'Χρήστης', 'register.role.customer.desc': 'Δημοσιεύω εργασίες', 'register.role.specialist': 'Ειδικός', 'register.role.specialist.desc': 'Αναλαμβάνω εργασίες', 'register.submit': 'Δημιουργία λογαριασμού', 'register.submitting': 'Εγγραφή...', 'register.has_account': 'Έχεις ήδη λογαριασμό;', 'register.login_link': 'Σύνδεση', 'register.continue_google': 'Εγγραφή με Google', 'register.check_email.title': 'Ελέγξτε το email σας', 'register.check_email.desc': 'Στείλαμε σύνδεσμο επαλήθευσης στη διεύθυνση email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε τον σύνδεσμο.', 'register.check_email.login': 'Επιστροφή στη σύνδεση', // Dashboard 'dashboard.title': 'Πίνακας ελέγχου', 'dashboard.new_task': '+ Νέα εργασία', 'dashboard.my_tasks': 'Οι εργασίες μου', 'dashboard.my_offers': 'Οι προσφορές μου', 'dashboard.invitations': 'Προσκλήσεις για εργασία', 'dashboard.offers_count': 'προσφορές', 'dashboard.declined_count': 'απορρίφθηκαν', 'dashboard.completed_tasks': 'Ολοκληρωμένες εργασίες', 'dashboard.completed_offers': 'Ολοκληρωμένες προσφορές', 'dashboard.review_pending': 'Η αξιολόγηση δεν έχει υποβληθεί ακόμα', 'tasks.new.top_specialists': 'Κορυφαίοι ειδικοί', 'tasks.new.select_category': 'Επιλέξτε κατηγορία για να δείτε ειδικούς', 'tasks.new.invite': 'Πρόσκληση', 'tasks.new.invited': 'Επιλέχθηκε ✓', 'reviews.count': 'αξιολογήσεις', 'filter.location': 'Τοποθεσία', 'filter.language': 'Γλώσσες', 'filter.language.any': 'Οποιαδήποτε γλώσσα', 'filter.category.all': 'Όλες οι κατηγορίες', 'user.categories': 'Κατηγορίες', 'user.work_area': 'Περιοχή εργασίας', 'dashboard.tasks.empty': 'Δεν έχεις δημοσιεύσει εργασίες', 'dashboard.tasks.empty.cta': 'Δημοσίευσε την πρώτη σου', 'dashboard.tasks.add_new': 'Πρόσθεσε νέα εργασία', 'dashboard.offers.empty': 'Δεν έχεις υποβάλλει προσφορές', 'dashboard.offers.empty.cta': 'Βρες εργασίες', 'dashboard.customer.specialists_title': 'Ψάχνεις εκτελεστή;', 'dashboard.customer.specialists_hint': 'Δες προφίλ ειδικών, διάβασε αξιολογήσεις και κάλεσέ τους στις εργασίες σου', 'dashboard.customer.specialists_cta': 'Βρες ειδικό', 'dashboard.customer.how_title': 'Πώς λειτουργεί', 'dashboard.customer.step1': 'Δημιούργησε εργασία με περιγραφή και προϋπολογισμό', 'dashboard.customer.step2': 'Οι ειδικοί θα στείλουν προσφορές με τιμή και χρόνο', 'dashboard.customer.step3': 'Επίλεξε τον κατάλληλο και ξεκίνα τη συνεργασία', // Notifications 'notif.title': 'Ειδοποιήσεις', 'notif.mark_all': 'Σήμανση όλων ως αναγνωσμένα', 'notif.empty': 'Δεν υπάρχουν ειδοποιήσεις', 'notif.type.new_offer': 'Νέα προσφορά', 'notif.type.offer_accepted': 'Η προσφορά σας έγινε δεκτή', 'notif.type.offer_declined': 'Η προσφορά σας απορρίφθηκε', 'notif.type.task_completed': 'Η εργασία ολοκληρώθηκε', 'notif.type.task_cancelled': 'Η εργασία ακυρώθηκε', 'notif.type.new_message': 'Νέο μήνυμα', 'notif.type.new_review': 'Νέα αξιολόγηση', 'notif.type.task_invite': 'Πρόσκληση σε εργασία', 'notif.body.new_offer': 'Νέα προσφορά για «{title}»', 'notif.body.offer_accepted': 'Η προσφορά σας για «{title}» έγινε δεκτή', 'notif.body.offer_declined': 'Η προσφορά σας για «{title}» απορρίφθηκε', 'notif.body.task_invite': 'Σας προσκαλούν για «{title}»', 'notif.body.new_review': 'Λάβατε αξιολόγηση {rating}★', // Offer status 'offer.status.pending': 'Εκκρεμεί', 'offer.status.accepted': 'Αποδεκτή', 'offer.status.declined': 'Απορρίφθηκε', 'offer.status.withdrawn': 'Αποσύρθηκε', 'offer.status.other_accepted': 'Επιλέχθηκε άλλος ειδικός', // Common 'common.loading': 'Φόρτωση...', 'common.error': 'Σφάλμα', 'common.save': 'Αποθήκευση', 'common.saving': 'Αποθήκευση...', 'common.cancel': 'Ακύρωση', 'common.add': 'Προσθήκη', 'common.close': 'Κλείσιμο', 'common.edit': 'Επεξεργασία', 'common.delete': 'Διαγραφή', 'common.from': 'από', 'common.currency': '€', 'common.greece': 'Ελλάδα', // Chat 'chat.connected': 'Συνδεδεμένος', 'chat.disconnected': 'Αποσυνδεδεμένος', 'chat.no_rooms': 'Δεν υπάρχουν συνομιλίες ακόμα', 'chat.task_fallback': 'Εργασία', 'chat.select': 'Επίλεξε συνομιλία', 'chat.no_messages': 'Δεν υπάρχουν μηνύματα', 'chat.placeholder': 'Γράψε μήνυμα... (Enter για αποστολή)', 'chat.conversation_fallback': 'Συνομιλία', 'chat.direct_chat': 'Απευθείας συνομιλία', 'chat.linked_task': 'Συνδεδεμένη εργασία', 'chat.write_btn': 'Μήνυμα', 'chat.just_now': 'μόλις τώρα', 'chat.min_ago': 'λ', 'chat.write_specialist': 'Γράψε στον ειδικό', 'chat.write_customer': 'Γράψε στον πελάτη', 'chat.notif_settings': 'Ρυθμίσεις ειδοποιήσεων', 'chat.notif_messages': 'Ειδοποιήσεις για νέα μηνύματα', 'chat.toast_title': 'Νέο μήνυμα', 'chat.toast_open': 'Άνοιγμα συνομιλίας', // Offer form 'offer.price': 'Τιμή', 'offer.price.placeholder': 'π.χ. 80', 'offer.customer_budget': 'Προϋπολογισμός πελάτη', 'offer.message': 'Μήνυμα', 'offer.optional': 'προαιρετικό', 'offer.message.placeholder': 'Παρουσίασε τον εαυτό σου, την εμπειρία σου και γιατί είσαι η καλύτερη επιλογή...', 'offer.submitting': 'Αποστολή...', // Profile 'profile.photo': 'Φωτογραφία προφίλ', 'profile.photo.change': 'Αλλαγή φωτογραφίας', 'profile.photo.hint': 'JPEG, PNG, WebP · έως 5MB', 'profile.basic_info': 'Βασικά στοιχεία', 'profile.phone': 'Τηλέφωνο', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Σύντομη περιγραφή', 'profile.bio.placeholder': 'Πες μας λίγα λόγια για εσένα...', 'profile.language': 'Γλώσσα', 'profile.language.hint': 'Γλώσσα διεπαφής και email ειδοποιήσεων', 'profile.languages': 'Γλώσσες επικοινωνίας', 'profile.languages.hint': 'Επιλέξτε όλες τις γλώσσες που μιλάτε', 'profile.skills': 'Δεξιότητες', 'profile.skills.subtitle': 'Προσθέσε τις υπηρεσίες που προσφέρεις', 'profile.skills.placeholder': 'π.χ. Καθαρισμός, IT, Μαθήματα...', 'profile.role': 'Ρόλος λογαριασμού', 'profile.role.specialist': '🔧 Ειδικός', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 Χρήστης', 'profile.role.change': 'Για αλλαγή ρόλου επικοινωνήστε με την υποστήριξη.', 'profile.become_specialist': 'Γίνε Ειδικός', 'profile.become_specialist.desc': 'Αναβαθμίσου σε Ειδικό για να δέχεσαι εργασίες και να δημιουργήσεις το προφίλ σου.', 'become_specialist.hero.title': 'Κέρδισε χρήματα κάνοντας αυτό που ξέρεις', 'become_specialist.hero.subtitle': 'Δημιούργησε προφίλ ειδικού και λάβε παραγγελίες από πελάτες σε όλη την Ελλάδα', 'become_specialist.how.title': 'Πώς λειτουργεί', 'become_specialist.step1.title': 'Δημιούργησε κάρτα ειδικού', 'become_specialist.step1.desc': 'Δήλωσε κατηγορίες, δεξιότητες και περιοχές κάλυψης — το σύστημα θα βρει τις κατάλληλες εργασίες για σένα αυτόματα', 'become_specialist.step2.title': 'Βρες εργασίες', 'become_specialist.step2.desc': 'Ανακάλυψε εργασίες στις κατηγορίες σου στην ενότητα «Αναζήτηση εργασιών»', 'become_specialist.step3.title': 'Στείλε προσφορά & κέρδισε', 'become_specialist.step3.desc': 'Υποβάλε προσφορές με τιμή και χρόνο, επικοινωνήσε με πελάτες και ολοκλήρωσε εργασίες', 'become_specialist.benefits.title': 'Πλεονεκτήματα προφίλ ειδικού', 'become_specialist.benefit1': 'Αναζήτηση εργασιών ανά κατηγορία και τοποθεσία', 'become_specialist.benefit2': 'Δημόσιο προφίλ με αξιολογήσεις πελατών', 'become_specialist.benefit3': 'Πρόγραμμα διαθεσιμότητας ορατό στους πελάτες', 'become_specialist.benefit4': 'Προσθήκη σε αγαπημένα από πελάτες', 'become_specialist.cta': 'Γίνε Ειδικός — είναι δωρεάν', 'become_specialist.free_badge': 'Δωρεάν εγγραφή', 'profile.tab.notifications': 'Ειδοποιήσεις', 'profile.tab.reviews': 'Αξιολογήσεις', 'profile.tab.referral': 'Παραπομπές', 'profile.tab.auto_response': 'Αυτόματη απάντηση', 'profile.tab.site': 'Site', 'profile.site.title': 'Προσωπική σελίδα', 'profile.site.url_label': 'Προσωπικό site', 'profile.site.copy': 'Αντιγραφή', 'profile.site.copied': 'Αντιγράφηκε', 'profile.site.visible_title': 'Τι εμφανίζεται στη σελίδα σας', 'profile.site.visible.name': 'Όνομα και φωτογραφία', 'profile.site.visible.bio': 'Βιογραφικό', 'profile.site.visible.rating': 'Αξιολόγηση και κριτικές', 'profile.site.visible.portfolio': 'Χαρτοφυλάκιο / Κάρτες', 'profile.site.visible.contacts': 'Στοιχεία επικοινωνίας', 'profile.site.visible.full_last_name': 'Πλήρες επώνυμο', 'profile.site.visible.services': 'Κάρτες υπηρεσιών', 'profile.site.visible.reviews': 'Ενότητα κριτικών', 'profile.site.visible.status': 'Κατάσταση «Έτοιμος να βοηθήσω»', 'profile.site.theme': 'Θέμα εμφάνισης', 'profile.site.theme.dark': 'Σκοτεινό', 'profile.site.theme.light': 'Φωτεινό', 'profile.site.slug_taken': 'Αυτή η διεύθυνση είναι ήδη κατειλημμένη', 'profile.site.stats.title': 'Στατιστικά επισκεψιμότητας', 'profile.site.stats.days': 'τελευταίες 30 ημέρες', 'profile.site.stats.views': 'Προβολές', 'profile.site.stats.unique': 'Μοναδικοί επισκέπτες', 'profile.site.stats.messages': 'Μηνύματα', 'profile.site.stats.total_views': 'Συνολικές προβολές', 'profile.site.stats.total_unique': 'Μοναδικοί επισκέπτες', 'profile.site.stats.total_messages': 'Μηνύματα', 'profile.site.stats.empty': 'Δεν υπάρχουν δεδομένα ακόμη', 'profile.site.stats.loading': 'Φόρτωση στατιστικών...', 'profile.site.stats.no_slug': 'Ορίστε τη διεύθυνση του site για να δείτε στατιστικά', 'profile.site.edit_bio_hint': 'Το βιογραφικό και η φωτογραφία ρυθμίζονται στην καρτέλα «Βασικά».', 'status.can_help_now_hint': 'Η κάρτα σου εμφανίζεται ψηλότερα', 'status.need_help_hint': 'Οι ειδικοί μπορούν να σε βοηθήσουν', 'profile.referral.title': 'Πρόγραμμα παραπομπών', 'profile.referral.desc': 'Μοιράσου τον σύνδεσμο σου και κέρδισε ανταμοιβές για κάθε νέο χρήστη.', 'profile.referral.link_label': 'Ο σύνδεσμος παραπομπής σου', 'profile.referral.copy': 'Αντιγραφή', 'profile.referral.copied': 'Αντιγράφηκε!', 'profile.referral.invited_count': 'επιτυχείς παραπομπές', 'profile.referral.no_code': 'Ο κωδικός παραπομπής δεν είναι διαθέσιμος.', 'notifications.title': 'Ρυθμίσεις ειδοποιήσεων', 'notifications.email.new_tasks': 'Email για νέες εργασίες', 'notifications.email.new_tasks.desc': 'Λάβε email όταν δημοσιευτεί νέα εργασία στις κατηγορίες σου', 'notifications.messages.desc': 'Λαμβάνεις ειδοποίηση όταν έρθει νέο μήνυμα', 'notifications.saved': 'Ρυθμίσεις αποθηκεύτηκαν', 'notifications.plan_required': 'Συνδρομή απαιτείται για αυτή τη λειτουργία', 'profile.tab.info': 'Βασικά στοιχεία', 'profile.tab.finance': 'Οικονομικά', 'profile.tab.skills': 'Δεξιότητες', 'profile.tab.categories': 'Κατηγορίες', 'profile.tab.geography': 'Γεωγραφία', 'profile.specialist.categories': 'Κατηγορίες εργασιών', 'profile.specialist.categories.desc': 'Επίλεξε τις κατηγορίες στις οποίες εργάζεσαι', 'profile.specialist.geography': 'Περιοχές κάλυψης', 'profile.specialist.geography.desc': 'Επίλεξε τις πόλεις / περιοχές όπου δραστηριοποιείσαι', 'profile.saving': 'Αποθήκευση...', 'profile.upload.error': 'Σφάλμα κατά την αναφόρτωση', 'profile.saved': 'Αποθηκεύτηκε', 'profile.tab.cards': 'Χαρτοφυλάκιο', 'profile.cards.count': 'Χαρτοφυλάκια', 'profile.cards.add': 'Νέο χαρτοφυλάκιο', 'profile.cards.new_title': 'Τίτλος νέου χαρτοφυλακίου', 'profile.cards.placeholder': 'π.χ. Υδραυλικά', 'profile.cards.create': 'Δημιουργία', 'profile.cards.cancel': 'Ακύρωση', 'profile.cards.empty': 'Δεν έχετε χαρτοφυλάκιο', 'profile.cards.create_first': 'Δημιουργήστε το πρώτο σας χαρτοφυλάκιο', 'profile.cards.delete_confirm': 'Διαγραφή χαρτοφυλακίου;', 'profile.card.tab.main': 'Γενικά', 'profile.card.tab.skills': 'Δεξιότητες', 'profile.card.tab.categories': 'Κατηγορίες', 'profile.card.tab.geography': 'Γεωγραφία', 'profile.card.tab.portfolio': 'Γκαλερί', 'profile.card.active': 'Ενεργή', 'profile.card.save': 'Αποθήκευση', 'profile.card.saved': 'Αποθηκεύτηκε', 'profile.card.delete': 'Διαγραφή', 'profile.card.skill.add': 'Προσθήκη δεξιότητας', 'profile.card.photo.add': 'Προσθήκη φωτογραφίας', 'profile.card.photo.uploading': 'Μεταφόρτωση...', 'profile.card.photo.empty': 'Δεν υπάρχουν φωτογραφίες', 'profile.card.item.title': 'Τίτλος', 'profile.card.item.desc': 'Περιγραφή', 'profile.card.item.save': 'Αποθήκευση', 'profile.card.item.cancel': 'Ακύρωση', 'profile.card.item.edit': 'Επεξεργασία', 'profile.upgrade.cards_limit': 'Όριο χαρτοφυλακίων εξαντλήθηκε', 'profile.upgrade.plan': 'Τρέχον πλάνο:', 'profile.upgrade.contact': 'Επικοινωνήστε με τον διαχειριστή για αλλαγή πλάνου', 'profile.upgrade.ok': 'Εντάξει', 'profile.plan.title': 'Πλάνο συνδρομής', 'profile.balance': 'Υπόλοιπο', 'profile.balance.topup': 'Αναπλήρωση υπολοίπου', 'profile.balance.topup.title': 'Αναπλήρωση υπολοίπου', 'profile.balance.topup.amount': 'Ποσό (σε EUR)', 'profile.balance.topup.hint': 'Επιλέξτε ποσό ή εισαγάγετε μανούαλα', 'profile.balance.topup.submit': 'Πληρωμή', 'profile.balance.topup.loading': 'Ρεδιρεκτάρισμα...', 'profile.balance.topup.error': 'Σφάλμα μετάβασης στην πληρωμή. Προσπαθήστε ξανά.', 'payment.success.title': 'Πληρωμή επιτυχής!', 'payment.success.desc': 'Το υπόλοιπό σας ενημερώθηκε.', 'payment.cancelled.title': 'Ακύρωση πληρωμής', 'payment.cancelled.desc': 'Η πληρωμή ακυρώθηκε. Κανένα χρήμα δεν χρεώθηκε.', 'payment.pending.title': 'Σε εξέλιξη...', 'payment.pending.desc': 'Επεξεργαζόμαστε την πληρωμή σας.', 'payment.back_to_profile': 'Επιστροφή στο προφίλ', 'profile.plan.basic': 'Βασικό (δωρεάν)', 'profile.plan.contact_upgrade': 'Επικοινωνήστε με τον διαχειριστή για αναβάθμιση', 'profile.plan.cards_up_to': 'Χαρτοφυλάκια: έως', 'profile.plan.cards_unlimited': 'Χαρτοφυλάκια: απεριόριστα', 'profile.plan.tasks_up_to': 'Εργασίες: έως', 'profile.plan.offers_up_to': 'Προσφορές: έως', 'profile.plan.valid_until': 'Ισχύει έως', 'profile.plan.no_expiry': 'Δεν λήγει', // Create task 'create.error': 'Σφάλμα κατά τη δημοσίευση', // Tasks list extras 'tasks.category.general': 'Γενικά', 'tasks.budget.range': 'Εύρος:', 'tasks.budget.from': 'από', 'tasks.budget.to': 'έως', 'tasks.filter.reset': 'Εκκαθάριση φίλτρων', 'tasks.load_more': 'Φόρτωση ακόμα', 'tasks.showing': 'Αποτελέσματα:', 'tasks.field.budget': 'Προϋπολογισμός, €', // Admin 'admin.title': 'Πίνακας Διαχείρισης', 'admin.tab.stats': 'Στατιστικά', 'admin.tab.users': 'Χρήστες', 'admin.tab.tasks': 'Εργασίες', 'admin.tab.reports': 'Αναφορές', 'admin.stats.users': 'Χρήστες', 'admin.stats.tasks': 'Εργασίες', 'admin.stats.offers': 'Προσφορές', 'admin.stats.reviews': 'Αξιολογήσεις', 'admin.tasks.by_status': 'Εργασίες ανά κατάσταση', 'admin.col.user': 'Χρήστης', 'admin.col.email': 'Email', 'admin.col.role': 'Ρόλος', 'admin.col.registered': 'Εγγραφή', 'admin.col.status': 'Κατάσταση', 'admin.col.title': 'Τίτλος', 'admin.col.budget': 'Προϋπολογισμός', 'admin.col.created': 'Δημιουργία', 'admin.users.active': 'Ενεργός', 'admin.users.inactive': 'Ανενεργός', 'admin.users.deactivate': 'Απενεργοποίηση', 'admin.users.activate': 'Ενεργοποίηση', 'admin.tasks.cancel': 'Ακύρωση', 'admin.reports.none': 'Δεν υπάρχουν αναφορές', 'admin.reports.reviewed': 'Αναθεωρήθηκε', 'admin.reports.dismiss': 'Απόρριψη', 'admin.pagination.total': 'Σύνολο', 'admin.users.role.change': 'Αλλαγή ρόλου', 'admin.users.search.placeholder': 'Αναζήτηση ονόματος ή email...', 'admin.tasks.delete': 'Διαγραφή', 'admin.tasks.delete.confirm': 'Διαγραφή αυτής της εργασίας μόνιμα;', 'admin.tasks.search.placeholder': 'Αναζήτηση τίτλου...', 'admin.col.customer': 'Πελάτης', 'admin.col.reporter': 'Καταγγέλλων', 'admin.col.target': 'Στόχος', 'admin.filter.all_roles': 'Όλοι οι ρόλοι', 'admin.filter.all_statuses': 'Όλες οι καταστάσεις', 'admin.reports.target.task': 'Εργασία', 'admin.reports.target.user': 'Χρήστης', 'admin.tab.categories': 'Κατηγορίες', 'admin.tab.locations': 'Πόλεις & Περιοχές', 'admin.tab.logs': 'Αρχεία', 'admin.tab.plans': 'Πακέτα', 'admin.tab.settings': 'Ρυθμίσεις', 'admin.logs.subtab.ai': 'AI Logs', 'admin.logs.subtab.activity': 'Δραστηριότητα', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Ειδοποιήσεις', 'admin.notif_logs.type': 'Τύπος', 'admin.notif_logs.title': 'Τίτλος', 'admin.notif_logs.read': 'Διαβασμένο', 'admin.notif_logs.empty': 'Δεν υπάρχουν αρχεία ειδοποιήσεων', 'admin.stats.notif_chart_title': 'Ειδοποιήσεις ανά ημέρα', 'admin.stats.notif_label': 'Ειδοποιήσεις', 'admin.stats.mail_chart_title': 'Emails ανά ημέρα', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'Όλα', 'admin.stats.specialists': 'Ειδικοί', 'admin.col.plan': 'Πακέτο', 'admin.back_home': 'Αρχική', 'admin.plans.title': 'Πακέτα συνδρομής', 'admin.plans.add': '+ Νέο πακέτο', 'admin.plans.empty': 'Δεν υπάρχουν πακέτα', 'admin.plans.form.new': 'Νέο πακέτο', 'admin.plans.form.edit': 'Επεξεργασία πακέτου', 'admin.plans.form.name': 'Όνομα', 'admin.plans.form.price': 'Τιμή (EUR)', 'admin.plans.form.old_price': 'Παλιά τιμή (EUR, προαιρετικό)', 'admin.plans.form.max_offers': 'Μέγ. προσφορές (κενό = χωρίς όριο)', 'admin.plans.form.max_cards': 'Μέγ. χαρτοφυλάκιο (κενό = χωρίς όριο)', 'admin.plans.form.duration_days': 'Διάρκεια (ημέρες, κενό = χωρίς λήξη)', 'admin.plans.form.description': 'Περιγραφή', 'admin.plans.form.features': 'Δυνατότητες (μία ανά γραμμή)', 'admin.plans.form.notify': 'Ειδοποιήσεις νέων εργασιών', 'admin.plans.form.default': 'Προεπιλογή', 'admin.plans.form.active': 'Ενεργό', 'admin.plans.form.order': 'Σειρά', 'admin.plans.form.role': 'Ρόλος', 'admin.plans.form.tier': 'Επίπεδο', 'admin.plans.form.role.customer': 'Πελάτης', 'admin.plans.form.role.specialist': 'Ειδικός', 'admin.plans.form.tier.free': 'Δωρεάν', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Όρια (κενό = χωρίς όριο)', 'admin.plans.form.max_messages_day': 'Μέγ. μηνύματα/ημέρα', 'admin.plans.form.max_orders_day': 'Μέγ. παραγγελίες/ημέρα', 'admin.plans.form.max_skills': 'Μέγ. δεξιότητες', 'admin.plans.form.max_profiles': 'Μέγ. προφίλ', 'admin.plans.form.max_portfolio': 'Μέγ. στοιχεία χαρτοφυλακίου', 'admin.plans.form.section.boost': 'Πολλαπλασιαστές & Ενίσχυση', 'admin.plans.form.search_boost': 'Ενίσχυση αναζήτησης', 'admin.plans.form.offers_multiplier': 'Πολλαπλασιαστής προσφορών', 'admin.plans.form.section.contact': 'Δικαιώματα επικοινωνίας', 'admin.plans.form.can_contact_free': 'Επικοινωνία με δωρεάν χρήστες', 'admin.plans.form.can_contact_pro': 'Επικοινωνία με Pro χρήστες', 'admin.plans.form.can_contact_all': 'Επικοινωνία με όλους', 'admin.plans.form.can_show_contact': 'Εμφάνιση στοιχείων επικοινωνίας', 'admin.plans.form.can_view_phone': 'Προβολή τηλεφώνου', 'admin.plans.form.section.features': 'Λειτουργίες', 'admin.plans.form.upload_video': 'Μεταφόρτωση βίντεο', 'admin.plans.form.favorites': 'Αγαπημένα', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Σήμα επαλήθευσης', 'admin.plans.form.highlighted_reviews': 'Προβεβλημένες κριτικές', 'admin.plans.form.personal_site': 'Προσωπική σελίδα', 'admin.plans.form.can_help_now': 'Κατάσταση «Μπορώ να βοηθήσω»', 'admin.plans.form.need_help': 'Κατάσταση «Χρειάζομαι βοήθεια»', 'admin.plans.form.auto_response': 'Αυτόματη απάντηση', 'admin.plans.form.auto_match': 'Αυτόματη αντιστοίχιση', 'admin.plans.form.instant_dispatch_free': 'Άμεση αποστολή (δωρεάν)', 'admin.plans.form.instant_dispatch_pro': 'Άμεση αποστολή (Pro)', 'admin.plans.badge.default': 'Προεπιλογή', 'admin.plans.badge.inactive': 'Ανενεργό', 'admin.plans.make_default': 'Ορισμός ως προεπιλογή', 'admin.plans.tasks': 'Εργασίες', 'admin.plans.offers': 'Προσφορές', 'admin.plans.cards': 'Χαρτοφυλάκιο', 'admin.plans.notify_tasks': 'Ειδοποιήσεις εργασιών', 'admin.plans.delete.confirm': 'Διαγραφή πακέτου', 'admin.activity.title': 'Αρχείο δραστηριότητας', 'admin.activity.event': 'Γεγονός', 'admin.activity.all_events': 'Όλα τα γεγονότα', 'admin.activity.from': 'Από', 'admin.activity.to': 'Έως', 'admin.activity.reset': 'Επαναφορά', 'admin.activity.total': 'Σύνολο', 'admin.activity.empty': 'Δεν υπάρχουν εγγραφές', 'admin.mail.event': 'Συμβάν email', 'admin.mail.all_events': 'Όλα τα email συμβάντα', 'admin.mail.from': 'Από', 'admin.mail.to': 'Έως', 'admin.mail.reset': 'Επαναφορά', 'admin.mail.total': 'Σύνολο', 'admin.mail.empty': 'Δεν υπάρχουν email logs', 'admin.mail.recipient': 'Παραλήπτης', 'admin.mail.provider': 'Πάροχος', 'admin.mail.details': 'Λεπτομέρειες', 'admin.mail.status': 'Κατάσταση', 'admin.mail.success': 'Επιτυχία', 'admin.mail.failed': 'Σφάλμα', 'admin.event.email_sent': 'Email sent', 'admin.event.email_failed': 'Email failed', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Admin test email sent', 'admin.event.admin_email_test_failed': 'Admin test email failed', 'admin.logs.empty': 'Δεν υπάρχουν εγγραφές', 'admin.logs.date': 'Ημερομηνία', 'admin.logs.provider': 'Πάροχος', 'admin.logs.model': 'Μοντέλο', 'admin.logs.action': 'Ενέργεια', 'admin.logs.langs': 'Γλώσσες', 'admin.logs.in': 'Είσοδος', 'admin.logs.out': 'Έξοδος', 'admin.logs.total': 'Σύνολο', 'admin.logs.ms': 'ms', 'admin.logs.status': 'Κατάσταση', 'admin.stats.activity_30d': 'Δραστηριότητα 30 ημερών', 'admin.stats.tasks_label': 'Εργασίες', 'admin.stats.users_label': 'Χρήστες', 'admin.stats.specialists_label': 'Ειδικοί', 'admin.stats.tokens_title': 'Χρήση tokens (ανά μήνα)', 'admin.stats.tokens_out': 'Εξερχόμενα', 'admin.stats.tokens_in': 'Εισερχόμενα', 'admin.stats.tokens_out_label': 'Εξερχόμενα tokens', 'admin.stats.tokens_in_label': 'Εισερχόμενα tokens', 'admin.stats.cost_label': 'Κόστος (USD)', 'admin.stats.tasks_by_status': 'Εργασίες ανά κατάσταση', 'admin.task_status.open': 'Ανοιχτές', 'admin.task_status.in_progress': 'Σε εξέλιξη', 'admin.task_status.completed': 'Ολοκληρωμένες', 'admin.task_status.cancelled': 'Ακυρωμένες', 'admin.task_status.draft': 'Προσχέδια', 'admin.settings.tab.general': 'Γενικά', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Ειδοποιήσεις', 'admin.settings.tab.payment': 'Πληρωμή', 'admin.settings.tab.referral': 'Παραπομπές', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO & Συντήρηση', 'admin.settings.seo.maintenance_label': 'Λειτουργία συντήρησης', 'admin.settings.seo.maintenance_hint': 'Εμφάνιση σελίδας συντήρησης σε όλους τους επισκέπτες', 'admin.settings.seo.indexing_label': 'Ευρετηρίαση από μηχανές αναζήτησης', 'admin.settings.seo.indexing_hint': 'Επιτρέπει στις μηχανές αναζήτησης να ευρετηριάσουν τον ιστότοπο', 'admin.settings.seo.head_scripts_label': 'Scripts στο (JS)', 'admin.settings.seo.head_scripts_hint': 'Εκτελείται σε κάθε σελίδα (Google Tag Manager, analytics κ.λπ.)', 'admin.settings.seo.site_title_label': 'Τίτλος ιστότοπου', 'admin.settings.seo.site_description_label': 'Περιγραφή ιστότοπου (meta description)', 'admin.settings.referral.title': 'Πρόγραμμα παραπομπών', 'admin.settings.referral.hint': 'Επιβράβευσε χρήστες που φέρνουν νέους εγγεγραμμένους.', 'admin.settings.referral.enabled_label': 'Ενεργό', 'admin.settings.referral.enabled_hint': 'Ενεργοποίηση / απενεργοποίηση εφαρμογής ανταμοιβών', 'admin.settings.referral.customer_section': 'Για πελάτες', 'admin.settings.referral.specialist_section': 'Για ειδικούς', 'admin.settings.referral.plan_label': 'Πλάνο ανταμοιβής', 'admin.settings.referral.no_plan': '— χωρίς πλάνο —', 'admin.settings.referral.plan_hint': 'Αυτό το πλάνο θα ανατεθεί στον χρήστη που έφερε νέους. Εάν το τρέχον πλάνο του είναι υψηλότερο, θα προστεθούν μόνο οι μέρες.', 'admin.settings.referral.days_label': 'Ημέρες ανταμοιβής', 'admin.settings.referral.days_hint': 'Αριθμός ημερών που θα προστεθούν στη λήξη του πλάνου.', 'admin.settings.general.title': 'Γενικές ρυθμίσεις', 'admin.settings.general.site_name': 'Όνομα ιστότοπου', 'admin.settings.general.site_url': 'URL ιστότοπου', 'admin.settings.general.contact_email': 'Email επικοινωνίας', 'admin.settings.general.support_phone': 'Τηλέφωνο υποστήριξης', 'admin.settings.smtp.title': 'Ρυθμίσεις SMTP', 'admin.settings.smtp.hint': 'Χρησιμοποιείται για αποστολή ειδοποιήσεων email.', 'admin.settings.smtp.host': 'SMTP Host', 'admin.settings.smtp.port': 'Θύρα', 'admin.settings.smtp.encryption': 'Κρυπτογράφηση', 'admin.settings.smtp.enc.none': 'Χωρίς', 'admin.settings.smtp.enc.tls': 'STARTTLS (θύρα 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (θύρα 465)', 'admin.settings.smtp.username': 'Όνομα χρήστη', 'admin.settings.smtp.password': 'Κωδικός / App Password', 'admin.settings.smtp.from_name': 'Όνομα αποστολέα', 'admin.settings.smtp.from_email': 'Email αποστολέα', 'admin.settings.smtp.test': 'Αποστολή δοκιμαστικού email', 'admin.settings.smtp.sending': 'Αποστολή...', 'admin.settings.payment.hint': 'Τα στοιχεία για ePay Piraeus Bank.', 'admin.settings.env.test': 'Δοκιμαστικό (sandbox)', 'admin.settings.env.prod': 'Παραγωγή', 'admin.settings.env.label': 'Περιβάλλον', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Ενεργό', 'admin.settings.saving': 'Αποθήκευση...', 'admin.settings.saved': '✓ Αποθηκεύτηκε', 'admin.notif.vars_hint': 'Διαθέσιμες μεταβλητές στα πρότυπα', 'admin.notif.tmpl.not_set': 'Πρότυπο δεν έχει οριστεί', 'admin.notif.tmpl.subject_label': 'Θέμα email', 'admin.notif.tmpl.body_label': 'Κείμενο email (HTML)', 'admin.notif.tmpl.save': 'Αποθήκευση', 'admin.notif.tmpl.close': 'Κλείσιμο', 'admin.notif.tmpl.translate': 'Αυτόματη μετάφραση', 'admin.notif.tmpl.translating': 'Μετάφραση...', 'admin.notif.tmpl.saving': 'Αποθήκευση...', 'admin.notif.email_verification': 'Επαλήθευση email', 'admin.notif.registration_success': 'Επιτυχής εγγραφή', 'admin.notif.password_reset': 'Επαναφορά κωδικού', 'admin.notif.new_offer': 'Νέα προσφορά', 'admin.notif.new_task': 'Νέα εργασία', 'admin.notif.offer_accepted': 'Προσφορά αποδεκτή', 'admin.notif.new_message': 'Νέο μήνυμα', 'admin.notif.offer_declined': 'Απόρριψη προσφοράς', 'admin.notif.offer_other_accepted': 'Επιλέχθηκε άλλος ειδικός', 'admin.notif.task_updated': 'Ενημέρωση εργασίας', 'admin.notif.deadline_reminder': 'Υπενθύμιση προθεσμίας', 'admin.notif.task_archived': 'Αυτόματη απόσυρση εργασίας', 'admin.notif.referral_reward': 'Ανταμοιβή παραπομπής', // Plan lifecycle email templates 'admin.email_template.plan_activated': 'Τιμολόγιο — ενεργοποίηση πλάνου', 'admin.email_template.plan_upgraded': 'Τιμολόγιο — αναβάθμιση πλάνου', 'admin.email_template.plan_downgrade_scheduled': 'Τιμολόγιο — προγραμματισμένη υποβάθμιση', 'admin.email_template.plan_downgrade_applied': 'Τιμολόγιο — εφαρμογή υποβάθμισης', 'admin.email_template.plan_renewal_reminder': 'Τιμολόγιο — υπενθύμιση ανανέωσης', 'admin.email_template.plan_insufficient_funds': 'Τιμολόγιο — ανεπαρκές υπόλοιπο', // Pricing confirm modal 'pricing.confirm.title': 'Επιβεβαίωση επιλογής πλάνου', 'pricing.confirm.plan': 'Πλάνο', 'pricing.confirm.prorated': 'Αναλογική έκπτωση', 'pricing.confirm.effective_price': 'Προς πληρωμή', 'pricing.confirm.your_balance': 'Το υπόλοιπό σας', 'pricing.confirm.downgrade_info': 'Η μετάβαση στο νέο πλάνο θα γίνει αυτόματα μετά τη λήξη της τρέχουσας περιόδου.', 'pricing.confirm.insufficient': 'Ανεπαρκές υπόλοιπο.', 'pricing.confirm.top_up': 'Ανανέωση', 'pricing.confirm.schedule_downgrade': 'Προγραμματισμός μετάβασης', 'pricing.confirm.pay': 'Πληρωμή', 'admin.user_edit.title': 'Επεξεργασία χρήστη', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Εγγραφή', 'admin.user_edit.last_seen': 'Τελευταία σύνδεση', 'admin.user_edit.lang': 'Γλώσσα', 'admin.user_edit.first_name': 'Όνομα', 'admin.user_edit.last_name': 'Επώνυμο', 'admin.user_edit.phone': 'Τηλέφωνο', 'admin.user_edit.bio': 'Βιογραφικό', 'admin.user_edit.role': 'Ρόλος', 'admin.user_edit.plan': 'Πακέτο', 'admin.user_edit.no_plan': '— Χωρίς πακέτο —', 'admin.user_edit.active': 'Ενεργός λογαριασμός', 'admin.user_edit.balance': 'Υπόλοιπο (EUR)', 'admin.user_edit.skills': 'Δεξιότητες', 'admin.user_edit.tab.profile': 'Προφίλ', 'admin.user_edit.tab.account': 'Λογαριασμός', 'admin.user_edit.tab.balance': 'Υπόλοιπο', 'admin.user_edit.tab.settings': 'Ρυθμίσεις', 'admin.user_edit.tab.specialist': 'Χαρτοφυλάκιο', 'admin.user_edit.tab.site': 'Ιστοσελίδα', 'admin.user_edit.plan_expires': 'Λήξη πλάνου', 'admin.user_edit.interface_lang': 'Γλώσσα διεπαφής', 'admin.user_edit.comm_languages': 'Γλώσσες επικοινωνίας', 'admin.user_edit.personal_site_slug': 'Προσωπική σελίδα', 'admin.user_edit.show_contact_info': 'Εμφάνιση στοιχείων επικοινωνίας', 'admin.user_edit.show_contact_info.hint': 'Ορατό στους πελάτες', 'admin.user_edit.notify_new_tasks': 'Ειδοποίηση για νέες εργασίες', 'admin.user_edit.notify_new_tasks.hint': 'Push και email ειδοποιήσεις', 'admin.user_edit.notif_messages': 'Ειδοποιήσεις μηνυμάτων', 'admin.user_edit.notif_messages.hint': 'Νέα μηνύματα στη συνομιλία', 'admin.user_edit.site_settings': 'Ρυθμίσεις προσωπικής σελίδας', 'admin.user_edit.categories': 'Κατηγορίες υπηρεσιών', 'admin.user_edit.locations': 'Περιοχές εξυπηρέτησης', 'admin.user_edit.skill_placeholder': 'Νέα δεξιότητα...', 'admin.user_edit.add_category': '— Επιλέξτε κατηγορία —', 'admin.user_edit.add_location': '— Επιλέξτε περιοχή —', 'admin.user_edit.specialist_cards': 'Χαρτοφυλάκιο ειδικού', 'admin.user_edit.no_cards': 'Δεν βρέθηκαν στοιχεία χαρτοφυλακίου', 'admin.user_edit.card_title': 'Τίτλος χαρτοφυλακίου', 'admin.user_edit.card_description': 'Περιγραφή', 'admin.balance.topup.btn': 'Αναπλήρωση', 'admin.balance.withdraw.btn': 'Αφαίρεση', 'admin.balance.modal_hint': 'Οι αλλαγές ισχύουν άμεσα και καταγράφονται στο ιστορικό', 'admin.balance.topup.title': 'Αναπλήρωση υπολοίπου', 'admin.balance.topup.amount': 'Ποσό', 'admin.balance.topup.description': 'Σχόλιο', 'admin.balance.topup.description.placeholder': 'Για παράδειγμα: bonus ή χειροκίνητη αναπλήρωση', 'admin.balance.topup.submit': 'Αναπλήρωση υπολοίπου', 'admin.balance.withdraw.title': 'Αφαίρεση υπολοίπου', 'admin.balance.withdraw.amount': 'Ποσό', 'admin.balance.withdraw.description': 'Σχόλιο', 'admin.balance.withdraw.description.placeholder': 'Για παράδειγμα: επιστροφή ή χειροκίνητη χρέωση', 'admin.balance.withdraw.submit': 'Αφαίρεση από το υπόλοιπο', 'admin.user_edit.role.customer': 'Πελάτης', 'admin.user_edit.role.specialist': 'Ειδικός', 'admin.user_edit.role.admin': 'Διαχειριστής', 'common.refresh': 'Ανανέωση', 'common.back_home': 'Αρχική', 'admin.loc.hint': 'Διαχείριση πόλεων και συνοικιών', 'admin.loc.add_city': 'Νέα πόλη', 'admin.loc.add_district': 'Προσθήκη συνοικίας', 'admin.loc.new': 'Νέα τοποθεσία', 'admin.loc.edit': 'Επεξεργασία τοποθεσίας', 'admin.loc.district': 'συνοικία', 'admin.loc.empty': 'Δεν υπάρχουν τοποθεσίες', 'admin.loc.delete.confirm': 'Διαγραφή τοποθεσίας; Όλες οι συνοικίες θα διαγραφούν επίσης.', 'admin.cat.add_root': 'Νέα κατηγορία', 'admin.cat.add_sub': 'Υποκατηγορία', 'admin.cat.edit': 'Επεξεργασία', 'admin.cat.delete': 'Διαγραφή', 'admin.cat.delete.confirm': 'Διαγραφή κατηγορίας; Όλες οι υποκατηγορίες θα διαγραφούν επίσης.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Εικονίδιο', 'admin.cat.name_el': 'Ελληνικά', 'admin.cat.name_en': 'Αγγλικά', 'admin.cat.name_ru': 'Ρωσικά', 'admin.cat.order': 'Σειρά', 'admin.cat.active': 'Ενεργή', 'admin.cat.parent': 'Γονική κατηγορία', 'admin.cat.no_parent': 'Κορυφαίο επίπεδο', 'admin.cat.save': 'Αποθήκευση', 'admin.cat.cancel': 'Ακύρωση', 'admin.cat.empty': 'Δεν υπάρχουν κατηγορίες', 'admin.cat.hint': 'Διαχείριση κατηγοριών με πολυεπίπεδη ιεραρχία', 'admin.cat.new': 'Νέα κατηγορία', 'admin.cat.subcategory': 'υποκατηγορία', 'admin.cat.add_child': 'Προσθήκη υποκατηγορίας', 'admin.cat.inactive': 'Ανενεργή', 'admin.event.user_login': 'Σύνδεση', 'admin.event.user_register': 'Εγγραφή', 'admin.event.admin_user_deactivate': 'Αποκλεισμός χρήστη', 'admin.event.admin_user_activate': 'Ενεργοποίηση χρήστη', 'admin.event.admin_user_role_changed': 'Αλλαγή ρόλου', 'admin.event.admin_task_cancelled': 'Ακύρωση εργασίας', 'admin.event.admin_task_deleted': 'Διαγραφή εργασίας', 'admin.event.admin_report_reviewed': 'Αναφορά εξετάστηκε', 'admin.event.admin_report_dismissed': 'Αναφορά απορρίφθηκε', 'admin.event.task_created': 'Δημιουργία εργασίας', 'user.online': 'Σε σύνδεση', 'user.seen_minutes': 'ήταν εδώ πριν {n} λεπτά', 'user.seen_hours': 'ήταν εδώ πριν {n} ώρες', 'user.seen_yesterday': 'ήταν εδώ χθες', 'user.seen_days': 'ήταν εδώ πριν {n} μέρες', // Specialists 'specialists.title': 'Ειδικοί', 'specialists.search': 'Αναζήτηση ειδικού...', 'specialists.search.btn': 'Αναζήτηση', 'specialists.empty': 'Δεν βρέθηκαν ειδικοί', 'specialists.no_bio': 'Χωρίς περιγραφή', 'specialists.view': 'Προβολή προφίλ', 'specialists.reviews': 'αξιολογήσεις', 'specialist.favorite': 'Προσθήκη στα αγαπημένα', 'specialist.unfavorite': 'Αφαίρεση από αγαπημένα', 'specialist.site_link': 'Προσωπικό site', 'favorites.specialists.title': 'Αγαπημένοι ειδικοί', 'favorites.specialists.empty': 'Δεν έχετε αγαπημένους ειδικούς', 'nav.favorites': 'Αγαπημένα', 'nav.schedule': 'Πρόγραμμα', 'nav.find_tasks': 'Αναζήτηση εργασιών', 'schedule.title': 'Το πρόγραμμά μου', 'schedule.subtitle': 'Σημειώστε τις ημέρες που είστε ελεύθεροι ή απασχολημένοι — οι πελάτες θα δουν τη διαθεσιμότητά σας', 'schedule.available': 'Ελεύθερος', 'schedule.busy': 'Απασχολημένος', 'schedule.unset': 'Μη ορισμένο', 'schedule.click_hint': '← κλικ για εναλλαγή κατάστασης', 'schedule.range_mode': 'Επιλογή εύρους', 'schedule.range_from': 'Από {date} — επιλέξτε τελική ημερομηνία', 'schedule.click_to_set': 'Κλικ για ορισμό', 'schedule.free': 'ελεύθερα', 'schedule.busy_count': 'απασχολημένα', 'schedule.free_days': 'ελεύθερες ημέρες', 'schedule.googleCalendar': 'Google Calendar', 'schedule.connectGoogle': 'Σύνδεση με Google Calendar', 'schedule.disconnectGoogle': 'Αποσύνδεση', 'schedule.connectedAs': 'Συνδεδεμένο ως', 'schedule.importFromGoogle': 'Συγχρονισμός από Google', 'schedule.gcalConnected': '✓ Google Calendar συνδέθηκε', 'schedule.gcalError': 'Σφάλμα σύνδεσης Google Calendar', 'schedule.gcalImportDone': 'Εισήχθησαν {n} ημερ. από Google Calendar', 'schedule.gcalAutoSyncNote': 'Οι αλλαγές αποστέλλονται αυτόματα στο Google Calendar', 'schedule.gcalConnectDesc': 'Συνδέστε το Google Calendar για αυτόματο συγχρονισμό', 'schedule.gcalDisconnectConfirm': 'Αποσύνδεση Google Calendar;', 'find_tasks.title': 'Αναζήτηση εργασιών', 'find_tasks.for_me': 'Για μένα', 'find_tasks.all': 'Όλες οι εργασίες', 'find_tasks.by_category': 'Ανά κατηγορία', 'find_tasks.list': 'Λίστα', 'find_tasks.already_offered': 'Προσφορά υποβλήθηκε', 'find_tasks.offer_now': 'Υποβολή προσφοράς', 'find_tasks.empty_for_me': 'Δεν βρέθηκαν εργασίες στις κατηγορίες σας', 'find_tasks.banner_hint': 'Βρείτε εργασίες που ταιριάζουν με το χαρτοφυλάκιό σας', 'find_tasks.no_cards': 'Δημιουργήστε ένα χαρτοφυλάκιο ειδικού για να δείτε εργασίες για εσάς', 'find_tasks.add_card': 'Δημιουργία χαρτοφυλακίου', 'find_tasks.search': 'Αναζήτηση εργασιών...', 'find_tasks.tasks_count': 'εργασίες', // Footer 'footer.tagline': 'Η πλατφόρμα εργασιών για την Ελλάδα', 'footer.rights': 'Όλα τα δικαιώματα διατηρούνται.', // App download section 'app.download_title': 'Κατεβάστε την εφαρμογή CanHelp', 'app.download_desc': 'Όλο το CanHelp — πάντα μαζί σας. Διαθέσιμο για Android και iOS.', // Nav 'nav.pricing': 'Τιμές', // Pricing page 'pricing.title': 'Τιμολόγηση', 'pricing.subtitle': 'Επιλέξτε το κατάλληλο πρόγραμμα', 'pricing.role.customer': 'Πελάτης', 'pricing.role.specialist': 'Ειδικός', 'pricing.free': 'Δωρεάν', 'pricing.per_month': 'μήνα', 'pricing.duration': 'Διάρκεια', 'pricing.days': 'ημ.', 'pricing.current_plan': 'Το πρόγραμμά σας', 'pricing.popular': 'Δημοφιλές', 'pricing.choose': 'Επιλογή', 'pricing.your_plan': 'Ενεργό πρόγραμμα', 'pricing.free_default': 'Προεπιλογή', 'pricing.compare': 'Σύγκριση λειτουργιών', 'pricing.feature': 'Λειτουργία', 'pricing.faq_note': 'Η πληρωμή γίνεται από το υπόλοιπο CanHelp. Ανατροφοδότηση διαθέσιμη στην Πληρωμή.', 'pricing.feat.messages': 'Μηνύματα / ημέρα', 'pricing.feat.orders': 'Παραγγελίες / ημέρα', 'pricing.feat.contact_all': 'Επικοινωνία με όλους', 'pricing.feat.view_phone': 'Εμφάνιση τηλεφώνου', 'pricing.feat.show_contact': 'Εμφάνιση στοιχείων επαφής', 'pricing.feat.favorites': 'Αγαπημένα', 'pricing.feat.verified_badge': 'Επαληθευμένο badge', 'pricing.feat.google_calendar': 'Google Calendar', 'pricing.feat.personal_site': 'Προσωπικό site', 'pricing.feat.auto_response': 'Αυτόματη απάντηση', 'pricing.feat.auto_match': 'Αυτόματη αντιστοίχιση', 'pricing.feat.highlighted_reviews': 'Επισημασμένες αξιολογήσεις', 'pricing.feat.portfolio': 'Στοιχεία χαρτοφυλακίου', 'pricing.feat.cards': 'Κάρτες ειδικού', 'pricing.feat.notify_tasks': 'Ειδοποιήσεις νέων εργασιών', 'pricing.feat.video': 'Βίντεο στο χαρτοφυλάκιο', // Upgrade prompt 'upgrade.available_in': 'Διαθέσιμο στο', 'upgrade.cta': 'Αναβάθμιση', // Dashboard plan block 'dashboard.plan.title': 'Το πρόγραμμά μου', 'dashboard.plan.expires': 'Λήγει σε {n} ημέρες', 'dashboard.plan.upgrade': 'Αναβάθμιση προγράμματος', 'dashboard.plan.no_plan': 'Δωρεάν πρόγραμμα', 'dashboard.plan.messages': 'Μηνύματα σήμερα', 'dashboard.plan.orders': 'Παραγγελίες σήμερα', 'dashboard.plan.limits': 'Ημερήσια όρια', 'dashboard.plan.features': 'Λειτουργίες', 'dashboard.plan.stats': 'Στατιστικά', 'dashboard.stats.cards': 'Χαρτοφυλάκια', 'dashboard.stats.maxCards': 'Μέγ. χαρτοφυλάκια', 'dashboard.stats.portfolioItems': 'Στοιχεία portfolio', 'dashboard.stats.maxPortfolioItems': 'Μέγ. στοιχεία', 'dashboard.stats.activeOffers': 'Ενεργές προσφορές', 'dashboard.stats.reviewsReceived': 'Αξιολογήσεις', 'dashboard.stats.activeTasks': 'Ενεργές εργασίες', 'dashboard.stats.completedTasks': 'Ολοκληρωμένες', 'status.can_help_now': 'Είμαι διαθέσιμος τώρα', 'status.need_help': 'Χρειάζομαι βοήθεια', 'status.active': 'Ενεργό', 'status.toggle_on': 'Ενεργοποίηση', 'status.toggle_off': 'Απενεργοποίηση', // FOMO 'fomo.missed_orders': 'Χάσατε {n} παραγγελίες', 'fomo.missed_value': 'Αξία €{v}', 'fomo.upgrade_hint': 'Αναβαθμίστε για να λαμβάνετε περισσότερες παραγγελίες', 'fomo.conversion': 'Μετατροπές εργασιών', 'fomo.active': 'Ενεργές', 'fomo.with_offers': 'Με προσφορές', 'fomo.completed': 'Ολοκληρωμένες', 'fomo.already_offered': '{n} ειδικοί έχουν ήδη απαντήσει', 'fomo.specialist_missed': 'Χάσατε {n} παραγγελίες', 'fomo.top_categories': 'Κατηγορίες', 'fomo.offers_received': 'προσφορές ελήφθησαν', 'fomo.avg_offers': 'Μέσο {n}/εργασία', 'fomo.completion_rate': 'ολοκληρωμένες', // Task auto-match 'task.auto_match': 'Αυτόματη αντιστοίχιση', 'task.auto_match_results': 'Κορυφαίοι ειδικοί', 'task.no_offer_yet': 'Δεν έχετε στείλει προσφορά ακόμα', 'task.make_offer': 'Αποστολή προσφοράς', 'auto_response.title': 'Αυτόματη Απάντηση', 'auto_response.enabled': 'Ενεργοποίηση αυτόματης απάντησης', 'auto_response.min_budget': 'Ελάχ. προϋπολογισμός', 'auto_response.max_budget': 'Μέγ. προϋπολογισμός', 'auto_response.default_price': 'Προεπιλεγμένη τιμή', 'auto_response.default_message': 'Προεπιλεγμένο μήνυμα', 'auto_response.max_per_day': 'Μέγ. αυτόματες προσφορές/ημέρα', 'auto_response.save': 'Αποθήκευση', 'auto_response.saved': 'Αποθηκεύτηκε', 'auto_response.categories': 'Κατηγορίες', 'auto_response.locations': 'Τοποθεσίες', // Personal site 'profile.personal_site': 'Προσωπικό Site', 'profile.site_slug': 'Slug URL', 'profile.site_slug_hint': 'Μόνο λατινικοί χαρακτήρες, αριθμοί, - και _', 'profile.site_open': 'Άνοιγμα site', 'profile.site_preview': 'Το site σας', 'profile.show_contact': 'Εμφάνιση στοιχείων επαφής', 'profile.show_contact_hint': 'Πελάτες με Pro/Ultimate πρόγραμμα θα βλέπουν το τηλέφωνό σας', // Google Calendar plan gate 'gcal.upgrade_required': 'Το Google Calendar απαιτεί Pro ή Ultimate πρόγραμμα', // Chat limits 'chat.limit_warning': 'Απομένουν {n} μηνύματα σήμερα', 'chat.limit_reached': 'Εξαντλήθηκαν τα μηνύματα. Αναβαθμίστε το πρόγραμμά σας', 'chat.upgrade': 'Αναβάθμιση', // Site page 'site.member_since': 'Μαζί μας από', 'site.rating': 'Βαθμολογία', 'site.completed_tasks': 'Ολοκληρώθηκαν', 'site.languages': 'Γλώσσες', 'site.photos': 'φωτ.', 'site.contact_form': 'Επικοινωνία', 'site.contact_sent': 'Το μήνυμα στάλθηκε!', 'site.contact_sent_desc': 'Ο ειδικός θα επικοινωνήσει μαζί σας σύντομα', 'site.contact_name': 'Όνομα', 'site.contact_name_ph': 'Το όνομά σας', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Μήνυμα', 'site.contact_message_ph': 'Περιγράψτε την εργασία σας...', 'site.contact_send': 'Αποστολή', 'site.share': 'Κοινοποίηση', 'site.speaks_languages': 'Μιλάει', 'site.message_sent': 'Το μήνυμα εστάλη!', 'site.message_sent_desc': 'Ο ειδικός θα το λάβει στη συνομιλία', 'site.message_placeholder': 'Γράψτε το μήνυμά σας...', 'site.write_to_chat': 'Γράψτε στο chat', 'site.auth_required_title': 'Απαιτείται σύνδεση', 'site.auth_required_desc': 'Για να γράψετε στο chat, χρειάζεται να συνδεθείτε στο λογαριασμό σας.', 'site.auth_login_btn': 'Σύνδεση', 'site.auth_contact_form_btn': 'Επικοινωνία μέσω φόρμας', 'specialist.services': 'Υπηρεσίες', 'portfolio.title': 'Χαρτοφυλάκιο', 'common.not_found': 'Η σελίδα δεν βρέθηκε', 'common.anonymous': 'Ανώνυμα' }, en: { 'footer.slogan': 'Your task — our care! We solve any issue quickly and easily.', 'footer.links': 'Links', 'footer.socials': 'Socials', 'nav.home': 'Home', 'nav.tasks': 'Tasks', 'nav.post': '+ Post task', 'nav.dashboard': 'Dashboard', 'nav.chat': 'Messages', 'nav.notifications': 'Notifications', 'nav.profile': 'Profile', 'nav.admin': 'Admin Panel', 'nav.specialists': 'Specialists', 'nav.new_task': 'New task', 'nav.login': 'Login', 'nav.register': 'Register', 'nav.logout': 'Logout', 'hero.title': 'Find a specialist for any job', 'hero.subtitle': 'Post a task, receive offers and choose the best professional', 'hero.cta.post': 'Post a task', 'hero.cta.browse': 'Find work', 'hero.search.placeholder': 'What do you need? e.g. electrician, cleaning...', 'stats.specialists': 'specialists', 'stats.tasks': 'tasks', 'stats.categories': 'categories', 'stats.free': 'free sign-up', 'section.categories': 'Create a task in any category', 'section.how': 'How it works', 'section.recent': 'Recent tasks', 'section.all': 'See all →', 'section.more': 'more', 'section.cities': 'Cities & Districts', 'section.community': 'A community project for everyone', 'community.subtitle': 'CanHelp is not just a marketplace — it\'s a community of mutual help. Anyone with knowledge or a skill can find a client. Anyone with a problem can find a specialist.', 'community.point1.title': 'Are you good at something?', 'community.point1.desc': 'Repairs, tutoring, design, translation, care — every skill has value. Create a profile and find clients near you.', 'community.point2.title': 'Need help with something?', 'community.point2.desc': 'Post a task in under a minute and receive offers from verified specialists in your city.', 'community.point3.title': 'Help the project grow', 'community.point3.desc': 'CanHelp grows through communities. Share the link with friends and acquaintances — together we build something useful for everyone.', 'community.share': 'Share with friends', 'community.share.copied': 'Link copied!', // Referral section on home page 'section.referral': 'Referral Program', 'referral.home.subtitle': 'Share your link — every new user who signs up through it earns you a reward.', 'referral.home.step1.title': 'Sign up and get your link', 'referral.home.step1.desc': 'Create an account and find your unique referral link in your profile.', 'referral.home.step2.title': 'Share with friends', 'referral.home.step2.desc': 'Send the link to friends, acquaintances, or post it on social media.', 'referral.home.step3.title': 'Earn rewards', 'referral.home.step3.desc': 'Once your friend verifies their email, you automatically receive your reward.', 'referral.home.cta': 'Get your link', 'referral.home.badge': 'Referral Program', // FAQ section 'section.faq': 'Frequently Asked Questions', 'faq.q1': 'How does CanHelp work?', 'faq.a1': 'Post a task, receive offers from specialists, choose the best one and start working together. It\'s fast, simple and free for customers.', 'faq.q2': 'How much does it cost to use the platform?', 'faq.a2': 'Registration and task posting is completely free for customers. Specialists have access to a free plan as well as premium options.', 'faq.q3': 'How can I become a specialist?', 'faq.a3': 'Register, go to «Become a Specialist», fill in your profile with skills and categories, and start receiving tasks.', 'faq.q4': 'How do I choose the right specialist?', 'faq.a4': 'Check their reviews, experience, skills and portfolio. Chat with them through the platform and discuss the details before deciding.', 'faq.q5': 'What if I am not satisfied?', 'faq.a5': 'You can leave a review about the specialist and rate them from 1 to 5 stars. Reviews help other users find trusted professionals.', 'faq.q6': 'Can I contact a specialist before accepting their offer?', 'faq.a6': 'Yes. Once you receive an offer, you can open a chat with the specialist, ask questions and discuss all the details before making a decision.', 'faq.q7': 'How long does it take to receive offers?', 'faq.a7': 'Usually within a few hours. Specialists get notified about new tasks and can respond quickly.', 'faq.q8': 'Can I post a task in any city in Greece?', 'faq.a8': 'Yes! CanHelp covers all of Greece — Athens, Thessaloniki, Patras and more.', 'faq.q9': 'What types of tasks can I find on CanHelp?', 'faq.a9': 'Repairs, cleaning, electricians, tutoring, design, IT, moving, beauty and much more. Categories are constantly expanding.', 'faq.q10': 'Is there a mobile app?', 'faq.a10': 'Yes! CanHelp is available for Android and iOS. Download the app and manage everything from your phone.', 'how.step1.title': 'Post a task', 'how.step1.desc': 'Describe what you need and set your budget', 'how.step2.title': 'Receive offers', 'how.step2.desc': 'Specialists will send you offers with price and timeline', 'how.step3.title': 'Choose & start', 'how.step3.desc': 'Pick the best professional and start the collaboration', 'tasks.title': 'tasks', 'tasks.filters': 'Filters', 'tasks.search': 'Search', 'tasks.search.placeholder': 'Title or keyword...', 'tasks.search.btn': 'Search', 'tasks.publish': 'Post', 'tasks.category.all': 'All', 'tasks.category.all_in': 'All in', 'tasks.category.label': 'Category', 'tasks.location.label': 'City', 'tasks.location.placeholder': 'e.g. Athens', 'tasks.empty': 'No tasks found', 'tasks.empty.cta': 'Post the first one', 'task.status.open': 'Open', 'task.status.in_progress': 'In progress', 'task.status.completed': 'Completed', 'task.status.cancelled': 'Cancelled', 'task.status.draft': 'Draft', 'task.budget': 'Budget', 'task.location': 'Location', 'task.deadline': 'Start date', 'task.created_at': 'Created', 'task.customer': 'Customer', 'task.offer.btn': 'Submit offer', 'task.invite.banner_title': "You've been invited to this task", 'task.invite.banner_hint': 'The customer personally invited you', 'task.invite.accept': 'Send offer', 'task.invite.decline': 'Decline', 'offer.accept': 'Accept', 'offer.decline': 'Decline', 'task.complete': 'Complete task', 'task.complete.confirm': 'Mark this task as complete?', 'task.edit': 'Edit', 'task.status_label': 'Status', 'task.yours': 'Your task', 'task.offer.yours': 'Your offer', 'review.leave': 'Leave a review', 'review.rating': 'Rating', 'review.comment': 'Comment', 'review.comment.placeholder': 'Tell us about your experience...', 'review.submit': 'Submit review', 'review.submitting': 'Submitting...', 'review.done': 'Review submitted!', 'profile.reviews': 'Reviews', 'profile.no_reviews': 'No reviews yet', 'profile.rating': 'Rating', 'profile.skills.label': 'Skills', 'profile.member_since': 'Member since', 'task.offers': 'Offers', 'task.offers.none': 'No offers yet', 'create.title': 'Post a task', 'create.field.title': 'Title', 'create.field.description': 'Description', 'create.field.category': 'Category', 'create.field.category.select': 'Select...', 'create.field.location': 'Location', 'create.field.location.any': 'Anywhere', 'create.field.location.all': 'Entire city', 'create.field.budget': 'Budget (€)', 'create.field.deadline': 'Start date', 'create.field.budget_negotiable': 'Price is negotiable', 'create.field.time_slot': 'Time slot', 'create.field.time_slot.any': 'Anytime', 'create.field.time_slot.morning': 'Morning (08:00–13:00)', 'create.field.time_slot.afternoon': 'Afternoon (13:00–18:00)', 'create.field.time_slot.evening': 'Evening (18:00–22:00)', 'create.field.time_slot.weekend': 'Weekend', 'create.field.address': 'Address (optional)', 'create.field.address.district': 'District', 'create.field.address.street': 'Street', 'create.field.address.house': 'Number', 'create.field.confidential': 'Confidential note', 'create.field.confidential.placeholder': 'Details visible only to the assigned specialist...', 'create.field.confidential.hint': 'Not shown publicly', 'create.field.photos': 'Photos', 'create.field.photos.add': 'Add photo', 'create.field.photos.uploading': 'Uploading...', 'task.budget_negotiable': 'Price negotiable', 'task.time_slot': 'Time slot', 'task.confidential': 'Confidential note', 'create.field.title.placeholder': 'e.g. Clean 80sqm apartment', 'create.field.description.placeholder': 'Describe in detail what you need...', 'create.field.location.placeholder': 'e.g. Athens, Kolonaki', 'create.field.budget.placeholder': 'e.g. 100', 'create.submit': 'Post task', 'create.submitting': 'Posting...', 'login.title': 'Welcome back', 'login.subtitle': 'Sign in to CanHelp', 'login.email': 'Email', 'login.password': 'Password', 'login.submit': 'Sign in', 'login.submitting': 'Signing in...', 'login.error': 'Invalid email or password', 'login.unverified.title': 'Verify your email address', 'login.unverified.desc': 'We sent a verification link to your email. Check your inbox (or spam) and click the link.', 'login.unverified.resend': 'Resend verification email', 'login.unverified.sending': 'Sending...', 'login.unverified.sent': '✓ Sent — check your inbox', 'profile.email.verified': 'Email verified', 'profile.email.not_verified': 'Email not verified', 'login.no_account': "Don't have an account?", 'login.register_link': 'Register', 'login.forgot_password': 'Forgot password?', 'login.or_continue_with': 'or continue with', 'login.continue_google': 'Continue with Google', 'forgot.title': 'Forgot password', 'forgot.subtitle': 'Enter your email to receive a reset link', 'forgot.email': 'Email', 'forgot.submit': 'Send reset link', 'forgot.submitting': 'Sending...', 'forgot.sent.title': 'Check your inbox', 'forgot.sent.desc': 'If an account exists with that email, we\'ll send you a password reset link.', 'forgot.back_to_login': 'Back to sign in', 'forgot.error': 'Could not send reset link. Check the email address and try again.', 'forgot.error.not_found': 'No account found with this email address.', 'forgot.error.send_failed': 'Failed to send email. Please try again later.', 'reset.title': 'New password', 'reset.subtitle': 'Enter your new password', 'reset.password': 'New password', 'reset.confirm': 'Confirm password', 'reset.submit': 'Change password', 'reset.submitting': 'Saving...', 'reset.success': 'Password changed successfully. Redirecting to sign in...', 'reset.back_to_login': 'Back to sign in', 'reset.error.mismatch': 'Passwords do not match', 'reset.error.invalid': 'Invalid or expired link. Please request a new one.', 'register.title': 'Register', 'register.subtitle': 'Create a CanHelp account', 'register.first_name': 'First name', 'register.last_name': 'Last name', 'register.email': 'Email', 'register.password': 'Password (min 8 characters)', 'register.role': 'Role', 'register.role.customer': 'User', 'register.role.customer.desc': 'I post tasks', 'register.role.specialist': 'Specialist', 'register.role.specialist.desc': 'I take on tasks', 'register.submit': 'Create account', 'register.submitting': 'Registering...', 'register.has_account': 'Already have an account?', 'register.login_link': 'Sign in', 'register.continue_google': 'Continue with Google', 'register.check_email.title': 'Check your email', 'register.check_email.desc': 'We sent a verification link to your email address. Check your inbox (or spam) and click the link.', 'register.check_email.login': 'Back to sign in', 'dashboard.title': 'Dashboard', 'dashboard.new_task': '+ New task', 'dashboard.my_tasks': 'My tasks', 'dashboard.my_offers': 'My offers', 'dashboard.invitations': 'Job invitations', 'dashboard.offers_count': 'offers', 'dashboard.declined_count': 'declined', 'dashboard.completed_tasks': 'Completed tasks', 'dashboard.completed_offers': 'Completed offers', 'dashboard.review_pending': 'Review not yet submitted', 'tasks.new.top_specialists': 'Top specialists', 'tasks.new.select_category': 'Select a category to see matching specialists', 'tasks.new.invite': 'Offer work', 'tasks.new.invited': 'Selected ✓', 'reviews.count': 'reviews', 'filter.location': 'Location', 'filter.language': 'Languages', 'filter.language.any': 'Any language', 'filter.category.all': 'All categories', 'user.categories': 'Categories', 'user.work_area': 'Work area', 'dashboard.tasks.empty': "You haven't posted any tasks", 'dashboard.tasks.empty.cta': 'Post your first one', 'dashboard.tasks.add_new': 'Add a new task', 'dashboard.offers.empty': "You haven't submitted any offers", 'dashboard.offers.empty.cta': 'Find tasks', 'dashboard.customer.specialists_title': 'Looking for a specialist?', 'dashboard.customer.specialists_hint': 'Browse specialist profiles, read reviews and invite them to your tasks', 'dashboard.customer.specialists_cta': 'Find a specialist', 'dashboard.customer.how_title': 'How it works', 'dashboard.customer.step1': 'Create a task with a description and budget', 'dashboard.customer.step2': 'Specialists will send offers with price and timeline', 'dashboard.customer.step3': 'Choose the right one and start working', 'notif.title': 'Notifications', 'notif.mark_all': 'Mark all as read', 'notif.empty': 'No notifications', 'notif.type.new_offer': 'New offer', 'notif.type.offer_accepted': 'Your offer was accepted', 'notif.type.offer_declined': 'Your offer was declined', 'notif.type.task_completed': 'Task completed', 'notif.type.task_cancelled': 'Task cancelled', 'notif.type.new_message': 'New message', 'notif.type.new_review': 'New review', 'notif.type.task_invite': 'Job invitation', 'notif.body.new_offer': 'New offer for «{title}»', 'notif.body.offer_accepted': 'Your offer for «{title}» was accepted', 'notif.body.offer_declined': 'Your offer for «{title}» was declined', 'notif.body.task_invite': 'You\'ve been invited for «{title}»', 'notif.body.new_review': 'You received a {rating}★ review', 'offer.status.pending': 'Pending', 'offer.status.accepted': 'Accepted', 'offer.status.declined': 'Declined', 'offer.status.withdrawn': 'Withdrawn', 'offer.status.other_accepted': 'Another specialist was chosen', 'common.loading': 'Loading...', 'common.error': 'Error', 'common.save': 'Save', 'common.saving': 'Saving...', 'common.cancel': 'Cancel', 'common.add': 'Add', 'common.close': 'Close', 'common.edit': 'Edit', 'common.delete': 'Delete', 'common.from': 'by', 'common.currency': '€', 'common.greece': 'Greece', // Chat 'chat.connected': 'Connected', 'chat.disconnected': 'Disconnected', 'chat.no_rooms': 'No conversations yet', 'chat.task_fallback': 'Task', 'chat.select': 'Select a conversation', 'chat.no_messages': 'No messages yet', 'chat.placeholder': 'Write a message... (Enter to send)', 'chat.conversation_fallback': 'Conversation', 'chat.direct_chat': 'Direct chat', 'chat.linked_task': 'Linked task', 'chat.write_btn': 'Message', 'chat.just_now': 'just now', 'chat.min_ago': 'm', 'chat.write_specialist': 'Write to specialist', 'chat.write_customer': 'Write to customer', 'chat.notif_settings': 'Notification settings', 'chat.notif_messages': 'Notifications for new messages', 'chat.toast_title': 'New message', 'chat.toast_open': 'Open chat', // Offer form 'offer.price': 'Price', 'offer.price.placeholder': 'e.g. 80', 'offer.customer_budget': 'Client budget', 'offer.message': 'Message', 'offer.optional': 'optional', 'offer.message.placeholder': 'Introduce yourself, your experience and why you are the best choice...', 'offer.submitting': 'Sending...', // Profile 'profile.photo': 'Profile photo', 'profile.photo.change': 'Change photo', 'profile.photo.hint': 'JPEG, PNG, WebP · up to 5MB', 'profile.basic_info': 'Basic info', 'profile.phone': 'Phone', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Short bio', 'profile.bio.placeholder': 'Tell us a bit about yourself...', 'profile.language': 'Language', 'profile.language.hint': 'App interface and email notification language', 'profile.languages': 'Languages spoken', 'profile.languages.hint': 'Select all languages you speak', 'profile.skills': 'Skills', 'profile.skills.subtitle': 'Add the services you offer', 'profile.skills.placeholder': 'e.g. Cleaning, IT, Tutoring...', 'profile.role': 'Account role', 'profile.role.specialist': '🔧 Specialist', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 User', 'profile.role.change': 'To change your role please contact support.', 'profile.become_specialist': 'Become a Specialist', 'profile.become_specialist.desc': 'Upgrade to Specialist to take on tasks and build your profile.', 'become_specialist.hero.title': 'Earn money doing what you do best', 'become_specialist.hero.subtitle': 'Create a specialist profile and receive orders from clients across Greece', 'become_specialist.how.title': 'How it works', 'become_specialist.step1.title': 'Create a specialist portfolio', 'become_specialist.step1.desc': 'Set your categories, skills and coverage areas — the system will automatically match you with relevant tasks', 'become_specialist.step2.title': 'Find tasks', 'become_specialist.step2.desc': 'Discover tasks in your categories in the "Find Orders" section', 'become_specialist.step3.title': 'Send an offer & earn', 'become_specialist.step3.desc': 'Submit offers with price and timeline, chat with clients and complete tasks', 'become_specialist.benefits.title': 'Specialist profile advantages', 'become_specialist.benefit1': 'Task search filtered by your categories and location', 'become_specialist.benefit2': 'Public profile with client reviews', 'become_specialist.benefit3': 'Availability schedule visible to clients', 'become_specialist.benefit4': 'Saved to favourites by clients', 'become_specialist.cta': 'Become a Specialist — it\'s free', 'become_specialist.free_badge': 'Free registration', 'profile.tab.notifications': 'Notifications', 'profile.tab.reviews': 'Reviews', 'profile.tab.referral': 'Referrals', 'profile.tab.auto_response': 'Auto-response', 'profile.tab.site': 'Site', 'profile.site.title': 'Personal page', 'profile.site.url_label': 'Personal site', 'profile.site.copy': 'Copy', 'profile.site.copied': 'Copied', 'profile.site.visible_title': "What's on your page", 'profile.site.visible.name': 'Name and photo', 'profile.site.visible.bio': 'Bio', 'profile.site.visible.rating': 'Rating and reviews', 'profile.site.visible.portfolio': 'Portfolio / Cards', 'profile.site.visible.contacts': 'Contact info', 'profile.site.visible.full_last_name': 'Full last name', 'profile.site.visible.services': 'Service cards', 'profile.site.visible.reviews': 'Reviews section', 'profile.site.visible.status': '"Ready to help" status', 'profile.site.theme': 'Appearance theme', 'profile.site.theme.dark': 'Dark', 'profile.site.theme.light': 'Light', 'profile.site.slug_taken': 'This address is already taken', 'profile.site.stats.title': 'Site analytics', 'profile.site.stats.days': 'last 30 days', 'profile.site.stats.views': 'Views', 'profile.site.stats.unique': 'Unique visitors', 'profile.site.stats.messages': 'Messages', 'profile.site.stats.total_views': 'Total views', 'profile.site.stats.total_unique': 'Unique visitors', 'profile.site.stats.total_messages': 'Messages', 'profile.site.stats.empty': 'No data yet', 'profile.site.stats.loading': 'Loading analytics...', 'profile.site.stats.no_slug': 'Set your site URL to see analytics', 'profile.site.edit_bio_hint': 'Bio and photo are edited in the "Basic info" tab.', 'status.title': 'Status', 'status.can_help_now_hint': 'Your card is shown higher in search', 'status.need_help_hint': 'Specialists can offer you help', 'profile.referral.title': 'Referral program', 'profile.referral.desc': 'Share your link and earn rewards for every new user you invite.', 'profile.referral.link_label': 'Your referral link', 'profile.referral.copy': 'Copy', 'profile.referral.copied': 'Copied!', 'profile.referral.invited_count': 'successful referrals', 'profile.referral.no_code': 'Referral code is not available.', 'notifications.title': 'Notification settings', 'notifications.email.new_tasks': 'Email for new tasks', 'notifications.email.new_tasks.desc': 'Receive an email when a new task is posted in your categories', 'notifications.messages.desc': 'Receive a notification when a new message arrives', 'notifications.saved': 'Settings saved', 'notifications.plan_required': 'Not available in your plan', 'profile.tab.info': 'Basic info', 'profile.tab.finance': 'Finance', 'profile.tab.skills': 'Skills', 'profile.tab.categories': 'Categories', 'profile.tab.geography': 'Geography', 'profile.specialist.categories': 'Work categories', 'profile.specialist.categories.desc': 'Select the categories you work in', 'profile.specialist.geography': 'Coverage areas', 'profile.specialist.geography.desc': 'Select the cities / districts where you are active', 'profile.saving': 'Saving...', 'profile.upload.error': 'Error uploading photo', 'profile.saved': 'Saved', 'profile.tab.cards': 'Portfolio', 'profile.cards.count': 'Portfolio', 'profile.cards.add': 'Add portfolio', 'profile.cards.new_title': 'New portfolio title', 'profile.cards.placeholder': 'e.g. Plumbing', 'profile.cards.create': 'Create', 'profile.cards.cancel': 'Cancel', 'profile.cards.empty': 'No portfolio yet', 'profile.cards.create_first': 'Create your first portfolio', 'profile.cards.delete_confirm': 'Delete portfolio?', 'profile.card.tab.main': 'General', 'profile.card.tab.skills': 'Skills', 'profile.card.tab.categories': 'Categories', 'profile.card.tab.geography': 'Geography', 'profile.card.tab.portfolio': 'Portfolio', 'profile.card.active': 'Active', 'profile.card.save': 'Save', 'profile.card.saved': 'Saved', 'profile.card.delete': 'Delete', 'profile.card.skill.add': 'Add skill', 'profile.card.photo.add': 'Add photo', 'profile.card.photo.uploading': 'Uploading...', 'profile.card.photo.empty': 'No photos yet', 'profile.card.item.title': 'Title', 'profile.card.item.desc': 'Description', 'profile.card.item.save': 'Save', 'profile.card.item.cancel': 'Cancel', 'profile.card.item.edit': 'Edit', 'profile.upgrade.cards_limit': 'Portfolio limit reached', 'profile.upgrade.plan': 'Current plan:', 'profile.upgrade.contact': 'Contact the administrator to change your plan', 'profile.upgrade.ok': 'Got it', 'profile.plan.title': 'Subscription plan', 'profile.balance': 'Balance', 'profile.balance.topup': 'Top Up Balance', 'profile.balance.topup.title': 'Top Up Balance', 'profile.balance.topup.amount': 'Amount (EUR)', 'profile.balance.topup.hint': 'Choose a preset or enter a custom amount', 'profile.balance.topup.submit': 'Proceed to Payment', 'profile.balance.topup.loading': 'Redirecting...', 'profile.balance.topup.error': 'Payment initiation failed. Please try again.', 'payment.success.title': 'Payment Successful!', 'payment.success.desc': 'Your balance has been updated.', 'payment.cancelled.title': 'Payment Cancelled', 'payment.cancelled.desc': 'Payment was cancelled. No charges were made.', 'payment.pending.title': 'Processing...', 'payment.pending.desc': 'Your payment is being processed.', 'payment.back_to_profile': 'Back to Profile', 'profile.plan.basic': 'Basic (free)', 'profile.plan.contact_upgrade': 'Contact admin to upgrade your plan', 'profile.plan.cards_up_to': 'Portfolio: up to', 'profile.plan.cards_unlimited': 'Portfolio: unlimited', 'profile.plan.tasks_up_to': 'Tasks: up to', 'profile.plan.offers_up_to': 'Offers: up to', 'profile.plan.valid_until': 'Valid until', 'profile.plan.no_expiry': 'No expiry', // Create task 'create.error': 'Error posting task', // Tasks list extras 'tasks.category.general': 'General', 'tasks.budget.range': 'Range:', 'tasks.budget.from': 'from', 'tasks.budget.to': 'to', 'tasks.filter.reset': 'Reset filters', 'tasks.load_more': 'Load more', 'tasks.showing': 'Results:', 'tasks.field.budget': 'Budget, €', // Admin 'admin.title': 'Admin Panel', 'admin.tab.stats': 'Statistics', 'admin.tab.users': 'Users', 'admin.tab.tasks': 'Tasks', 'admin.tab.reports': 'Reports', 'admin.stats.users': 'Users', 'admin.stats.tasks': 'Tasks', 'admin.stats.offers': 'Offers', 'admin.stats.reviews': 'Reviews', 'admin.tasks.by_status': 'Tasks by status', 'admin.col.user': 'User', 'admin.col.email': 'Email', 'admin.col.role': 'Role', 'admin.col.registered': 'Registered', 'admin.col.status': 'Status', 'admin.col.title': 'Title', 'admin.col.budget': 'Budget', 'admin.col.created': 'Created', 'admin.users.active': 'Active', 'admin.users.inactive': 'Inactive', 'admin.users.deactivate': 'Deactivate', 'admin.users.activate': 'Activate', 'admin.tasks.cancel': 'Cancel', 'admin.reports.none': 'No reports', 'admin.reports.reviewed': 'Reviewed', 'admin.reports.dismiss': 'Dismiss', 'admin.pagination.total': 'Total', 'admin.users.role.change': 'Change role', 'admin.users.search.placeholder': 'Search name or email...', 'admin.tasks.delete': 'Delete', 'admin.tasks.delete.confirm': 'Permanently delete this task?', 'admin.tasks.search.placeholder': 'Search title...', 'admin.col.customer': 'Customer', 'admin.col.reporter': 'Reporter', 'admin.col.target': 'Target', 'admin.filter.all_roles': 'All roles', 'admin.filter.all_statuses': 'All statuses', 'admin.reports.target.task': 'Task', 'admin.reports.target.user': 'User', 'admin.tab.categories': 'Categories', 'admin.tab.locations': 'Cities & Districts', 'admin.tab.logs': 'Logs', 'admin.tab.plans': 'Plans', 'admin.tab.settings': 'Settings', 'admin.logs.subtab.ai': 'AI Logs', 'admin.logs.subtab.activity': 'Activity', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Notifications', 'admin.notif_logs.type': 'Type', 'admin.notif_logs.title': 'Title', 'admin.notif_logs.read': 'Read', 'admin.notif_logs.empty': 'No notification logs', 'admin.stats.notif_chart_title': 'Notifications per day', 'admin.stats.notif_label': 'Notifications', 'admin.stats.mail_chart_title': 'Emails per day', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'All', 'admin.stats.specialists': 'Specialists', 'admin.col.plan': 'Plan', 'admin.back_home': 'Home', 'admin.plans.title': 'Subscription plans', 'admin.plans.add': '+ New plan', 'admin.plans.empty': 'No plans created', 'admin.plans.form.new': 'New plan', 'admin.plans.form.edit': 'Edit plan', 'admin.plans.form.name': 'Name', 'admin.plans.form.price': 'Price (EUR)', 'admin.plans.form.old_price': 'Old price (EUR, optional)', 'admin.plans.form.max_offers': 'Max offers (empty = no limit)', 'admin.plans.form.max_cards': 'Max portfolio (empty = no limit)', 'admin.plans.form.duration_days': 'Duration (days, empty = no expiry)', 'admin.plans.form.description': 'Description', 'admin.plans.form.features': 'Features (one per line)', 'admin.plans.form.notify': 'Notify about new tasks', 'admin.plans.form.default': 'Default', 'admin.plans.form.active': 'Active', 'admin.plans.form.order': 'Order', 'admin.plans.form.role': 'Role', 'admin.plans.form.tier': 'Tier', 'admin.plans.form.role.customer': 'Customer', 'admin.plans.form.role.specialist': 'Specialist', 'admin.plans.form.tier.free': 'Free', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Limits (empty = unlimited)', 'admin.plans.form.max_messages_day': 'Max Messages/Day', 'admin.plans.form.max_orders_day': 'Max Orders/Day', 'admin.plans.form.max_skills': 'Max Skills', 'admin.plans.form.max_profiles': 'Max Profiles', 'admin.plans.form.max_portfolio': 'Max Portfolio Items', 'admin.plans.form.section.boost': 'Multipliers & Boost', 'admin.plans.form.search_boost': 'Search Boost', 'admin.plans.form.offers_multiplier': 'Offers Multiplier', 'admin.plans.form.section.contact': 'Contact Permissions', 'admin.plans.form.can_contact_free': 'Contact Free Plan users', 'admin.plans.form.can_contact_pro': 'Contact Pro Plan users', 'admin.plans.form.can_contact_all': 'Contact All users', 'admin.plans.form.can_show_contact': 'Show Contact Info', 'admin.plans.form.can_view_phone': 'View Phone', 'admin.plans.form.section.features': 'Feature Flags', 'admin.plans.form.upload_video': 'Upload Video', 'admin.plans.form.favorites': 'Favorites', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Verified Badge', 'admin.plans.form.highlighted_reviews': 'Highlighted Reviews', 'admin.plans.form.personal_site': 'Personal Site', 'admin.plans.form.can_help_now': 'Can Help Now Status', 'admin.plans.form.need_help': 'Need Help Status', 'admin.plans.form.auto_response': 'Auto Response', 'admin.plans.form.auto_match': 'Auto Match', 'admin.plans.form.instant_dispatch_free': 'Instant Dispatch (Free)', 'admin.plans.form.instant_dispatch_pro': 'Instant Dispatch (Pro)', 'admin.plans.badge.default': 'Default', 'admin.plans.badge.inactive': 'Inactive', 'admin.plans.make_default': 'Set as default', 'admin.plans.tasks': 'Tasks', 'admin.plans.offers': 'Offers', 'admin.plans.cards': 'Portfolio', 'admin.plans.notify_tasks': 'Task notifications', 'admin.plans.delete.confirm': 'Delete plan', 'admin.activity.title': 'Activity log', 'admin.activity.event': 'Event', 'admin.activity.all_events': 'All events', 'admin.activity.from': 'From', 'admin.activity.to': 'To', 'admin.activity.reset': 'Reset', 'admin.activity.total': 'Total', 'admin.activity.empty': 'No records', 'admin.mail.event': 'Email event', 'admin.mail.all_events': 'All email events', 'admin.mail.from': 'From', 'admin.mail.to': 'To', 'admin.mail.reset': 'Reset', 'admin.mail.total': 'Total', 'admin.mail.empty': 'No email logs', 'admin.mail.recipient': 'Recipient', 'admin.mail.provider': 'Provider', 'admin.mail.details': 'Details', 'admin.mail.status': 'Status', 'admin.mail.success': 'Success', 'admin.mail.failed': 'Failed', 'admin.event.email_sent': 'Email sent', 'admin.event.email_failed': 'Email failed', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Admin test email sent', 'admin.event.admin_email_test_failed': 'Admin test email failed', 'admin.logs.empty': 'No records', 'admin.logs.date': 'Date', 'admin.logs.provider': 'Provider', 'admin.logs.model': 'Model', 'admin.logs.action': 'Action', 'admin.logs.langs': 'Languages', 'admin.logs.in': 'In', 'admin.logs.out': 'Out', 'admin.logs.total': 'Total', 'admin.logs.ms': 'ms', 'admin.logs.status': 'Status', 'admin.stats.activity_30d': 'Activity over 30 days', 'admin.stats.tasks_label': 'Tasks', 'admin.stats.users_label': 'Users', 'admin.stats.specialists_label': 'Specialists', 'admin.stats.tokens_title': 'Token usage (by month)', 'admin.stats.tokens_out': 'Output', 'admin.stats.tokens_in': 'Input', 'admin.stats.tokens_out_label': 'Output tokens', 'admin.stats.tokens_in_label': 'Input tokens', 'admin.stats.cost_label': 'Cost (USD)', 'admin.stats.tasks_by_status': 'Tasks by status', 'admin.task_status.open': 'Open', 'admin.task_status.in_progress': 'In progress', 'admin.task_status.completed': 'Completed', 'admin.task_status.cancelled': 'Cancelled', 'admin.task_status.draft': 'Drafts', 'admin.settings.tab.general': 'General', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Notifications', 'admin.settings.tab.payment': 'Payment', 'admin.settings.tab.referral': 'Referrals', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO & Maintenance', 'admin.settings.seo.maintenance_label': 'Maintenance Mode', 'admin.settings.seo.maintenance_hint': 'Show a maintenance page to all visitors', 'admin.settings.seo.indexing_label': 'Search Engine Indexing', 'admin.settings.seo.indexing_hint': 'Allow search engines to index the site', 'admin.settings.seo.head_scripts_label': ' Scripts (JS)', 'admin.settings.seo.head_scripts_hint': 'Runs on every page (Google Tag Manager, analytics, etc.)', 'admin.settings.seo.site_title_label': 'Site Title', 'admin.settings.seo.site_description_label': 'Site Description (meta description)', 'admin.settings.referral.title': 'Referral program', 'admin.settings.referral.hint': 'Reward users who bring new registrations.', 'admin.settings.referral.enabled_label': 'Enabled', 'admin.settings.referral.enabled_hint': 'Enable / disable reward application', 'admin.settings.referral.customer_section': 'For customers', 'admin.settings.referral.specialist_section': 'For specialists', 'admin.settings.referral.plan_label': 'Reward plan', 'admin.settings.referral.no_plan': '— no plan —', 'admin.settings.referral.plan_hint': 'This plan will be assigned to the referrer. If their current plan is higher, only days will be added.', 'admin.settings.referral.days_label': 'Reward days', 'admin.settings.referral.days_hint': 'Number of days added to the plan expiry.', 'admin.settings.general.title': 'General settings', 'admin.settings.general.site_name': 'Site name', 'admin.settings.general.site_url': 'Site URL', 'admin.settings.general.contact_email': 'Contact email', 'admin.settings.general.support_phone': 'Support phone', 'admin.settings.smtp.title': 'SMTP settings', 'admin.settings.smtp.hint': 'Used to send email notifications.', 'admin.settings.smtp.host': 'SMTP Host', 'admin.settings.smtp.port': 'Port', 'admin.settings.smtp.encryption': 'Encryption', 'admin.settings.smtp.enc.none': 'None', 'admin.settings.smtp.enc.tls': 'STARTTLS (port 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (port 465)', 'admin.settings.smtp.username': 'Username', 'admin.settings.smtp.password': 'Password / App Password', 'admin.settings.smtp.from_name': 'Sender name', 'admin.settings.smtp.from_email': 'Sender email', 'admin.settings.smtp.test': 'Send test email', 'admin.settings.smtp.sending': 'Sending...', 'admin.settings.payment.hint': 'ePay Piraeus Bank credentials.', 'admin.settings.env.test': 'Test (sandbox)', 'admin.settings.env.prod': 'Production', 'admin.settings.env.label': 'Environment', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Active', 'admin.settings.saving': 'Saving...', 'admin.settings.saved': 'Saved', 'admin.notif.vars_hint': 'Available variables in templates', 'admin.notif.tmpl.not_set': 'Template not configured', 'admin.notif.tmpl.subject_label': 'Email subject', 'admin.notif.tmpl.body_label': 'Email body (HTML)', 'admin.notif.tmpl.save': 'Save', 'admin.notif.tmpl.close': 'Close', 'admin.notif.tmpl.translate': 'Auto-translate to other languages', 'admin.notif.tmpl.translating': 'Translating...', 'admin.notif.tmpl.saving': 'Saving...', 'admin.notif.email_verification': 'Email verification', 'admin.notif.registration_success': 'Successful registration', 'admin.notif.password_reset': 'Password reset', 'admin.notif.new_offer': 'New offer', 'admin.notif.new_task': 'New task', 'admin.notif.offer_accepted': 'Offer accepted', 'admin.notif.new_message': 'New message', 'admin.notif.offer_declined': 'Offer declined', 'admin.notif.offer_other_accepted': 'Another specialist chosen', 'admin.notif.task_updated': 'Task updated', 'admin.notif.deadline_reminder': 'Deadline reminder', 'admin.notif.task_archived': 'Task unpublished automatically', 'admin.notif.referral_reward': 'Referral reward', // Plan lifecycle email templates 'admin.email_template.plan_activated': 'Plan activated', 'admin.email_template.plan_upgraded': 'Plan upgraded', 'admin.email_template.plan_downgrade_scheduled': 'Downgrade scheduled', 'admin.email_template.plan_downgrade_applied': 'Downgrade applied', 'admin.email_template.plan_renewal_reminder': 'Renewal reminder', 'admin.email_template.plan_insufficient_funds': 'Insufficient funds warning', // Pricing confirm modal 'pricing.confirm.title': 'Confirm plan selection', 'pricing.confirm.plan': 'Plan', 'pricing.confirm.prorated': 'Prorated credit', 'pricing.confirm.effective_price': 'Amount due', 'pricing.confirm.your_balance': 'Your balance', 'pricing.confirm.downgrade_info': 'The switch to the new plan will happen automatically after the current period ends.', 'pricing.confirm.insufficient': 'Insufficient balance.', 'pricing.confirm.top_up': 'Top up', 'pricing.confirm.schedule_downgrade': 'Schedule downgrade', 'pricing.confirm.pay': 'Pay', 'admin.user_edit.title': 'Edit user', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Registered', 'admin.user_edit.last_seen': 'Last seen', 'admin.user_edit.lang': 'Language', 'admin.user_edit.first_name': 'First name', 'admin.user_edit.last_name': 'Last name', 'admin.user_edit.phone': 'Phone', 'admin.user_edit.bio': 'Bio', 'admin.user_edit.role': 'Role', 'admin.user_edit.plan': 'Plan', 'admin.user_edit.no_plan': '— No plan —', 'admin.user_edit.active': 'Active account', 'admin.user_edit.balance': 'Balance (EUR)', 'admin.user_edit.skills': 'Skills', 'admin.user_edit.tab.profile': 'Profile', 'admin.user_edit.tab.account': 'Account', 'admin.user_edit.tab.balance': 'Balance', 'admin.user_edit.tab.settings': 'Settings', 'admin.user_edit.tab.specialist': 'Portfolio', 'admin.user_edit.tab.site': 'Website', 'admin.user_edit.plan_expires': 'Plan expires', 'admin.user_edit.interface_lang': 'Interface language', 'admin.user_edit.comm_languages': 'Communication languages', 'admin.user_edit.personal_site_slug': 'Personal page', 'admin.user_edit.show_contact_info': 'Show contact info', 'admin.user_edit.show_contact_info.hint': 'Visible to customers', 'admin.user_edit.notify_new_tasks': 'Notify about new tasks', 'admin.user_edit.notify_new_tasks.hint': 'Push and email notifications', 'admin.user_edit.notif_messages': 'Message notifications', 'admin.user_edit.notif_messages.hint': 'New messages in chat', 'admin.user_edit.site_settings': 'Personal page settings', 'admin.user_edit.categories': 'Service categories', 'admin.user_edit.locations': 'Service areas', 'admin.user_edit.skill_placeholder': 'New skill...', 'admin.user_edit.add_category': '— Select category —', 'admin.user_edit.add_location': '— Select location —', 'admin.user_edit.specialist_cards': 'Portfolio', 'admin.user_edit.no_cards': 'No portfolio found', 'admin.user_edit.card_title': 'Portfolio title', 'admin.user_edit.card_description': 'Description', 'admin.balance.topup.btn': 'Top up', 'admin.balance.withdraw.btn': 'Withdraw', 'admin.balance.modal_hint': 'Changes take effect immediately and are recorded in history', 'admin.balance.topup.title': 'Top up balance', 'admin.balance.topup.amount': 'Amount', 'admin.balance.topup.description': 'Comment', 'admin.balance.topup.description.placeholder': 'For example: bonus or manual top-up', 'admin.balance.topup.submit': 'Top up balance', 'admin.balance.withdraw.title': 'Withdraw balance', 'admin.balance.withdraw.amount': 'Amount', 'admin.balance.withdraw.description': 'Comment', 'admin.balance.withdraw.description.placeholder': 'For example: refund or manual debit', 'admin.balance.withdraw.submit': 'Withdraw from balance', 'admin.user_edit.role.customer': 'Customer', 'admin.user_edit.role.specialist': 'Specialist', 'admin.user_edit.role.admin': 'Administrator', 'common.refresh': 'Refresh', 'common.back_home': 'Home', 'admin.loc.hint': 'Manage cities and districts', 'admin.loc.add_city': 'New city', 'admin.loc.add_district': 'Add district', 'admin.loc.new': 'New location', 'admin.loc.edit': 'Edit location', 'admin.loc.district': 'district', 'admin.loc.empty': 'No locations', 'admin.loc.delete.confirm': 'Delete location? All districts will also be deleted.', 'admin.cat.add_root': 'New category', 'admin.cat.add_sub': 'Subcategory', 'admin.cat.edit': 'Edit', 'admin.cat.delete': 'Delete', 'admin.cat.delete.confirm': 'Delete category? All subcategories will also be deleted.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Icon', 'admin.cat.name_el': 'Greek', 'admin.cat.name_en': 'English', 'admin.cat.name_ru': 'Russian', 'admin.cat.order': 'Order', 'admin.cat.active': 'Active', 'admin.cat.parent': 'Parent category', 'admin.cat.no_parent': 'Top level', 'admin.cat.save': 'Save', 'admin.cat.cancel': 'Cancel', 'admin.cat.empty': 'No categories', 'admin.cat.hint': 'Manage categories with multi-level hierarchy', 'admin.cat.new': 'New category', 'admin.cat.subcategory': 'subcategory', 'admin.cat.add_child': 'Add subcategory', 'admin.cat.inactive': 'Inactive', 'admin.event.user_login': 'Login', 'admin.event.user_register': 'Registration', 'admin.event.admin_user_deactivate': 'User blocked', 'admin.event.admin_user_activate': 'User activated', 'admin.event.admin_user_role_changed': 'Role changed', 'admin.event.admin_task_cancelled': 'Task cancelled', 'admin.event.admin_task_deleted': 'Task deleted', 'admin.event.admin_report_reviewed': 'Report reviewed', 'admin.event.admin_report_dismissed': 'Report dismissed', 'admin.event.task_created': 'Task created', // User status 'user.online': 'Online', 'user.seen_minutes': 'was here {n} min ago', 'user.seen_hours': 'was here {n} hr ago', 'user.seen_yesterday': 'was here yesterday', 'user.seen_days': 'was here {n} days ago', // Specialists 'specialists.title': 'Specialists', 'specialists.search': 'Search specialist...', 'specialists.search.btn': 'Search', 'specialists.empty': 'No specialists found', 'specialists.no_bio': 'No description', 'specialists.view': 'View profile', 'specialists.reviews': 'reviews', 'specialist.favorite': 'Add to favorites', 'specialist.unfavorite': 'Remove from favorites', 'specialist.site_link': 'Personal site', 'favorites.specialists.title': 'Favourite specialists', 'favorites.specialists.empty': 'No favourite specialists yet', 'nav.favorites': 'Favourites', 'nav.schedule': 'Schedule', 'nav.find_tasks': 'Find Orders', 'schedule.title': 'My Schedule', 'schedule.subtitle': 'Mark the days when you are free or busy — clients will see your availability', 'schedule.available': 'Available', 'schedule.busy': 'Busy', 'schedule.unset': 'Not set', 'schedule.click_hint': '← click to cycle status', 'schedule.range_mode': 'Select range', 'schedule.range_from': 'From {date} — select end date', 'schedule.click_to_set': 'Click to set', 'schedule.free': 'free', 'schedule.busy_count': 'busy', 'schedule.free_days': 'free days', 'schedule.googleCalendar': 'Google Calendar', 'schedule.connectGoogle': 'Connect Google Calendar', 'schedule.disconnectGoogle': 'Disconnect', 'schedule.connectedAs': 'Connected as', 'schedule.importFromGoogle': 'Sync from Google', 'schedule.gcalConnected': '\u2713 Google Calendar connected', 'schedule.gcalError': 'Google Calendar connection error', 'schedule.gcalImportDone': 'Imported {n} days from Google Calendar', 'schedule.gcalAutoSyncNote': 'Availability changes are automatically synced to Google Calendar', 'schedule.gcalConnectDesc': 'Connect Google Calendar to automatically sync your availability', 'schedule.gcalDisconnectConfirm': 'Disconnect Google Calendar?', 'find_tasks.title': 'Find Orders', 'find_tasks.for_me': 'For me', 'find_tasks.all': 'All orders', 'find_tasks.by_category': 'By category', 'find_tasks.list': 'List', 'find_tasks.already_offered': 'Offer sent', 'find_tasks.offer_now': 'Make an offer', 'find_tasks.empty_for_me': 'No tasks found in your categories', 'find_tasks.banner_hint': 'Find tasks matching your portfolio categories', 'find_tasks.no_cards': 'Create a specialist portfolio to see tasks matched to you', 'find_tasks.add_card': 'Create portfolio', 'find_tasks.search': 'Search tasks...', 'find_tasks.tasks_count': 'tasks', 'footer.tagline': 'The task platform for Greece', 'footer.rights': 'All rights reserved.', // App download section 'app.download_title': 'Download the CanHelp mobile app', 'app.download_desc': 'All of CanHelp — always at your fingertips. Available for Android and iOS.', // Nav 'nav.pricing': 'Pricing', // Pricing page 'pricing.title': 'Pricing', 'pricing.subtitle': 'Choose the right plan for you', 'pricing.role.customer': 'Customer', 'pricing.role.specialist': 'Specialist', 'pricing.free': 'Free', 'pricing.per_month': 'mo', 'pricing.duration': 'Duration', 'pricing.days': 'days', 'pricing.current_plan': 'Your plan', 'pricing.popular': 'Popular', 'pricing.choose': 'Choose', 'pricing.your_plan': 'Active plan', 'pricing.free_default': 'Default', 'pricing.compare': 'Compare features', 'pricing.feature': 'Feature', 'pricing.faq_note': 'Payment is deducted from your CanHelp balance. Top up available in Payments.', 'pricing.feat.messages': 'Messages / day', 'pricing.feat.orders': 'Orders / day', 'pricing.feat.contact_all': 'Contact everyone', 'pricing.feat.view_phone': 'View phone number', 'pricing.feat.show_contact': 'Show contact info', 'pricing.feat.favorites': 'Favorites', 'pricing.feat.verified_badge': 'Verified badge', 'pricing.feat.google_calendar': 'Google Calendar', 'pricing.feat.personal_site': 'Personal site', 'pricing.feat.auto_response': 'Auto-response', 'pricing.feat.auto_match': 'Auto-match', 'pricing.feat.highlighted_reviews': 'Highlighted reviews', 'pricing.feat.portfolio': 'Portfolio items', 'pricing.feat.cards': 'Specialist cards', 'pricing.feat.notify_tasks': 'New task notifications', 'pricing.feat.video': 'Video in portfolio', // Upgrade prompt 'upgrade.available_in': 'Available in', 'upgrade.cta': 'Upgrade', // Dashboard plan block 'dashboard.plan.title': 'My Plan', 'dashboard.plan.expires': 'Expires in {n} days', 'dashboard.plan.upgrade': 'Upgrade plan', 'dashboard.plan.no_plan': 'Free plan', 'dashboard.plan.messages': 'Messages today', 'dashboard.plan.orders': 'Orders today', 'dashboard.plan.limits': 'Daily limits', 'dashboard.plan.features': 'Features', 'dashboard.plan.stats': 'Stats', 'dashboard.stats.cards': 'Portfolios', 'dashboard.stats.maxCards': 'Max portfolios', 'dashboard.stats.portfolioItems': 'Portfolio items', 'dashboard.stats.maxPortfolioItems': 'Max items', 'dashboard.stats.activeOffers': 'Active offers', 'dashboard.stats.reviewsReceived': 'Reviews', 'dashboard.stats.activeTasks': 'Active tasks', 'dashboard.stats.completedTasks': 'Completed', 'status.need_help': 'I need help', 'status.active': 'Active', 'status.toggle_on': 'Enable', 'status.toggle_off': 'Disable', // FOMO 'fomo.missed_orders': 'Missed {n} orders', 'fomo.missed_value': 'Worth €{v}', 'fomo.upgrade_hint': 'Upgrade to receive more orders', 'fomo.conversion': 'Task conversion', 'fomo.active': 'Active', 'fomo.with_offers': 'With offers', 'fomo.completed': 'Completed', 'fomo.already_offered': '{n} specialists have already responded', 'fomo.specialist_missed': 'You missed {n} orders', 'fomo.top_categories': 'Categories', 'fomo.offers_received': 'offers received', 'fomo.avg_offers': 'Avg {n}/task', 'fomo.completion_rate': 'completed', // Task auto-match 'task.auto_match': 'Auto-match', 'task.auto_match_results': 'Top specialists', 'task.no_offer_yet': 'You haven\'t sent an offer yet', 'task.make_offer': 'Send offer', 'auto_response.title': 'Auto-Response', 'auto_response.enabled': 'Enable auto-response', 'auto_response.min_budget': 'Min budget', 'auto_response.max_budget': 'Max budget', 'auto_response.default_price': 'Default price', 'auto_response.default_message': 'Default message', 'auto_response.max_per_day': 'Max auto-offers per day', 'auto_response.save': 'Save', 'auto_response.saved': 'Saved', 'auto_response.categories': 'Categories', 'auto_response.locations': 'Locations', // Personal site 'profile.personal_site': 'Personal Site', 'profile.site_slug': 'URL slug', 'profile.site_slug_hint': 'Only latin letters, numbers, - and _', 'profile.site_open': 'Open site', 'profile.site_preview': 'Your site', 'profile.show_contact': 'Show contact info', 'profile.show_contact_hint': 'Customers with Pro/Ultimate plans will see your phone number', // Google Calendar plan gate 'gcal.upgrade_required': 'Google Calendar requires a Pro or Ultimate plan', // Chat limits 'chat.limit_warning': '{n} messages left today', 'chat.limit_reached': 'Message limit reached. Upgrade your plan', 'chat.upgrade': 'Upgrade', // Site page 'site.member_since': 'Member since', 'site.rating': 'Rating', 'site.completed_tasks': 'Completed', 'site.languages': 'Languages', 'site.photos': 'photos', 'site.contact_form': 'Get in touch', 'site.contact_sent': 'Message sent!', 'site.contact_sent_desc': 'The specialist will contact you soon', 'site.contact_name': 'Name', 'site.contact_name_ph': 'Your name', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Message', 'site.contact_message_ph': 'Describe your task...', 'site.contact_send': 'Send', 'site.share': 'Share', 'site.speaks_languages': 'Speaks', 'site.message_sent': 'Message sent!', 'site.message_sent_desc': 'The specialist will receive it in the chat', 'site.message_placeholder': 'Write your message...', 'site.write_to_chat': 'Write to chat', 'site.auth_required_title': 'Sign in required', 'site.auth_required_desc': 'To write in the chat, you need to sign in to your CanHelp account.', 'site.auth_login_btn': 'Sign in', 'site.auth_contact_form_btn': 'Contact via feedback form', 'specialist.services': 'Services', 'portfolio.title': 'Portfolio', 'status.can_help_now': 'Available now', 'common.not_found': 'Page not found', 'common.anonymous': 'Anonymous' }, ru: { 'footer.slogan': 'Ваша задача — наша забота! Решаем любые вопросы быстро и удобно.', 'footer.links': 'Ссылки', 'footer.socials': 'Мы в соцсетях', 'nav.home': 'Главная', 'nav.tasks': 'Задачи', 'nav.post': '+ Опубликовать', 'nav.dashboard': 'Панель управления', 'nav.chat': 'Сообщения', 'nav.notifications': 'Уведомления', 'nav.profile': 'Профиль', 'nav.admin': 'Админка', 'nav.specialists': 'Специалисты', 'nav.new_task': 'Новая задача', 'nav.login': 'Войти', 'nav.register': 'Регистрация', 'nav.logout': 'Выйти', 'hero.title': 'Найди специалиста для любой работы', 'hero.subtitle': 'Опубликуй задачу, получи предложения и выбери лучшего профессионала', 'hero.cta.post': 'Опубликовать задачу', 'hero.cta.browse': 'Найти работу', 'hero.search.placeholder': 'Что нужно? напр. электрик, уборка...', 'stats.specialists': 'специалистов', 'stats.tasks': 'задач', 'stats.categories': 'категорий', 'stats.free': 'бесплатная регистрация', 'section.categories': 'Создай задачу в любой категории', 'section.how': 'Как это работает', 'section.recent': 'Последние задачи', 'section.all': 'Смотреть все →', 'section.more': 'ещё', 'section.cities': 'Города и районы', 'section.community': 'Общественный проект для всех', 'community.subtitle': 'CanHelp — не просто маркетплейс, это сообщество взаимопомощи. Любой, у кого есть знания или навык, может найти клиента. Любой, у кого есть задача, может найти специалиста.', 'community.point1.title': 'Умеете что-то делать?', 'community.point1.desc': 'Ремонт, репетиторство, дизайн, переводы, уход — каждый навык имеет ценность. Создайте профиль и находите клиентов рядом с вами.', 'community.point2.title': 'Нужна помощь?', 'community.point2.desc': 'Опубликуйте задачу за минуту и получайте предложения от проверенных специалистов в вашем городе.', 'community.point3.title': 'Помогите проекту расти', 'community.point3.desc': 'CanHelp развивается благодаря сообществам. Поделитесь ссылкой с друзьями и знакомыми — вместе мы строим что-то полезное для всех.', 'community.share': 'Поделиться с друзьями', 'community.share.copied': 'Ссылка скопирована!', // Referral section on home page 'section.referral': 'Реферальная программа', 'referral.home.subtitle': 'Поделитесь ссылкой — каждый новый пользователь, зарегистрировавшийся по ней, принесёт вам награду.', 'referral.home.step1.title': 'Зарегистрируйтесь и получите ссылку', 'referral.home.step1.desc': 'Создайте аккаунт и найдите свою уникальную реферальную ссылку в профиле.', 'referral.home.step2.title': 'Поделитесь с друзьями', 'referral.home.step2.desc': 'Отправьте ссылку друзьям, знакомым или опубликуйте в социальных сетях.', 'referral.home.step3.title': 'Получайте награды', 'referral.home.step3.desc': 'Как только друг подтвердит email, вы автоматически получите свою награду.', 'referral.home.cta': 'Получить ссылку', 'referral.home.badge': 'Реферальная программа', // FAQ section 'section.faq': 'Частые вопросы', 'faq.q1': 'Как работает CanHelp?', 'faq.a1': 'Опубликуйте задачу, получите предложения от специалистов, выберите лучшего и начните сотрудничество. Это быстро, просто и бесплатно для клиентов.', 'faq.q2': 'Сколько стоит использование платформы?', 'faq.a2': 'Регистрация и публикация задач полностью бесплатны для клиентов. Специалисты имеют доступ к бесплатному плану, а также к премиум-опциям.', 'faq.q3': 'Как стать специалистом?', 'faq.a3': 'Зарегистрируйтесь, перейдите в «Стать специалистом», заполните профиль навыками и категориями и начните получать задачи.', 'faq.q4': 'Как выбрать подходящего специалиста?', 'faq.a4': 'Оцените отзывы, опыт, навыки и портфолио каждого специалиста. Общайтесь через чат платформы и уточняйте детали до принятия решения.', 'faq.q5': 'Что если я не доволен результатом?', 'faq.a5': 'Вы можете оставить отзыв о специалисте и поставить оценку от 1 до 5 звёзд. Отзывы помогают другим пользователям выбирать проверенных профессионалов.', 'faq.q6': 'Можно ли связаться со специалистом до принятия предложения?', 'faq.a6': 'Да. Как только вы получили предложение, можно открыть чат со специалистом, задать вопросы и уточнить все детали до принятия решения.', 'faq.q7': 'Сколько времени ждать предложений?', 'faq.a7': 'Как правило, в течение нескольких часов. Специалисты получают уведомление о новых задачах и могут быстро ответить.', 'faq.q8': 'Можно ли разместить задачу в любом городе Греции?', 'faq.a8': 'Да! CanHelp охватывает всю Грецию — Афины, Фессалоники, Патры и другие города.', 'faq.q9': 'Какие виды задач есть на CanHelp?', 'faq.a9': 'Ремонт, уборка, электрики, репетиторство, дизайн, IT, переезды, красота и многое другое. Категории постоянно расширяются.', 'faq.q10': 'Есть ли мобильное приложение?', 'faq.a10': 'Да! CanHelp доступно для Android и iOS. Скачайте приложение и управляйте всем со своего телефона.', 'how.step1.title': 'Опубликуй задачу', 'how.step1.desc': 'Опиши что нужно и установи бюджет', 'how.step2.title': 'Получи предложения', 'how.step2.desc': 'Специалисты пришлют предложения с ценой и сроками', 'how.step3.title': 'Выбери и начни', 'how.step3.desc': 'Выбери лучшего профессионала и начни сотрудничество', 'tasks.title': 'задач', 'tasks.filters': 'Фильтры', 'tasks.search': 'Поиск', 'tasks.search.placeholder': 'Название или ключевое слово...', 'tasks.search.btn': 'Поиск', 'tasks.publish': 'Опубликовать', 'tasks.category.all': 'Все', 'tasks.category.all_in': 'Все в', 'tasks.category.label': 'Категория', 'tasks.location.label': 'Город', 'tasks.location.placeholder': 'напр. Афины', 'tasks.empty': 'Задачи не найдены', 'tasks.empty.cta': 'Опубликуй первую', 'task.status.open': 'Открыта', 'task.status.in_progress': 'В работе', 'task.status.completed': 'Завершена', 'task.status.cancelled': 'Отменена', 'task.status.draft': 'Черновик', 'task.budget': 'Бюджет', 'task.location': 'Местоположение', 'task.deadline': 'Дата начала', 'task.created_at': 'Создано', 'task.customer': 'Заказчик', 'task.offer.btn': 'Отправить предложение', 'task.invite.banner_title': 'Вас пригласили на это задание', 'task.invite.banner_hint': 'Заказчик лично пригласил вас', 'task.invite.accept': 'Отправить предложение', 'task.invite.decline': 'Отказаться', 'offer.accept': 'Принять', 'offer.decline': 'Отклонить', 'task.complete': 'Завершить задачу', 'task.complete.confirm': 'Отметить задачу как выполненную?', 'task.edit': 'Редактировать', 'task.status_label': 'Статус', 'task.yours': 'Ваша задача', 'task.offer.yours': 'Ваше предложение', 'review.leave': 'Оставить отзыв', 'review.rating': 'Оценка', 'review.comment': 'Комментарий', 'review.comment.placeholder': 'Расскажите о своём опыте...', 'review.submit': 'Отправить отзыв', 'review.submitting': 'Отправка...', 'review.done': 'Отзыв отправлен!', 'profile.reviews': 'Отзывы', 'profile.no_reviews': 'Отзывов пока нет', 'profile.rating': 'Рейтинг', 'profile.skills.label': 'Навыки', 'profile.member_since': 'Участник с', 'task.offers': 'Предложения', 'task.offers.none': 'Предложений пока нет', 'create.title': 'Опубликовать задачу', 'create.field.title': 'Название', 'create.field.description': 'Описание', 'create.field.category': 'Категория', 'create.field.category.select': 'Выберите...', 'create.field.location': 'Местоположение', 'create.field.location.any': 'Где угодно', 'create.field.location.all': 'Весь город', 'create.field.budget': 'Бюджет (€)', 'create.field.deadline': 'Дата начала', 'create.field.budget_negotiable': 'Цена обсуждается', 'create.field.time_slot': 'Время выполнения', 'create.field.time_slot.any': 'В любое время', 'create.field.time_slot.morning': 'Утром (08:00–13:00)', 'create.field.time_slot.afternoon': 'Днём (13:00–18:00)', 'create.field.time_slot.evening': 'Вечером (18:00–22:00)', 'create.field.time_slot.weekend': 'Выходной', 'create.field.address': 'Адрес (необязательно)', 'create.field.address.district': 'Квартал', 'create.field.address.street': 'Улица', 'create.field.address.house': 'Дом', 'create.field.confidential': 'Конфиденциальная заметка', 'create.field.confidential.placeholder': 'Детали, видные только назначенному специалисту...', 'create.field.confidential.hint': 'Не отображается публично', 'create.field.photos': 'Фотографии', 'create.field.photos.add': 'Добавить фото', 'create.field.photos.uploading': 'Загрузка...', 'task.budget_negotiable': 'Цена обсуждается', 'task.time_slot': 'Время', 'task.confidential': 'Конфид. заметка', 'create.field.title.placeholder': 'напр. Уборка квартиры 80кв', 'create.field.description.placeholder': 'Подробно опишите что нужно...', 'create.field.location.placeholder': 'напр. Афины, Колонаки', 'create.field.budget.placeholder': 'напр. 100', 'create.submit': 'Опубликовать задачу', 'create.submitting': 'Публикация...', 'login.title': 'Добро пожаловать', 'login.subtitle': 'Вход в CanHelp', 'login.email': 'Email', 'login.password': 'Пароль', 'login.submit': 'Войти', 'login.submitting': 'Вход...', 'login.error': 'Неверный email или пароль', 'login.unverified.title': 'Подтвердите ваш email', 'login.unverified.desc': 'Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.', 'login.unverified.resend': 'Отправить письмо повторно', 'login.unverified.sending': 'Отправка...', 'login.unverified.sent': '✓ Отправлено — проверьте входящие', 'profile.email.verified': 'Email подтверждён', 'profile.email.not_verified': 'Email не подтверждён', 'login.no_account': 'Нет аккаунта?', 'login.register_link': 'Зарегистрироваться', 'login.forgot_password': 'Забыл пароль?', 'login.or_continue_with': 'или продолжите через', 'login.continue_google': 'Войти через Google', 'forgot.title': 'Забыл пароль', 'forgot.subtitle': 'Введите email для получения ссылки восстановления', 'forgot.email': 'Email', 'forgot.submit': 'Отправить ссылку', 'forgot.submitting': 'Отправка...', 'forgot.sent.title': 'Проверьте входящие', 'forgot.sent.desc': 'Если аккаунт с таким email существует, мы отправим ссылку для сброса пароля.', 'forgot.back_to_login': 'Вернуться ко входу', 'forgot.error': 'Не удалось отправить ссылку. Проверьте адрес и попробуйте снова.', 'forgot.error.not_found': 'Аккаунт с таким email не найден.', 'forgot.error.send_failed': 'Ошибка отправки письма. Попробуйте позже.', 'reset.title': 'Новый пароль', 'reset.subtitle': 'Введите новый пароль', 'reset.password': 'Новый пароль', 'reset.confirm': 'Подтвердите пароль', 'reset.submit': 'Изменить пароль', 'reset.submitting': 'Сохранение...', 'reset.success': 'Пароль успешно изменён. Перенаправление ко входу...', 'reset.back_to_login': 'Вернуться ко входу', 'reset.error.mismatch': 'Пароли не совпадают', 'reset.error.invalid': 'Недействительная или устаревшая ссылка. Запросите новую.', 'register.title': 'Регистрация', 'register.subtitle': 'Создать аккаунт в CanHelp', 'register.first_name': 'Имя', 'register.last_name': 'Фамилия', 'register.email': 'Email', 'register.password': 'Пароль (мин. 8 символов)', 'register.role': 'Роль', 'register.role.customer': 'Пользователь', 'register.role.customer.desc': 'Публикую задачи', 'register.role.specialist': 'Специалист', 'register.role.specialist.desc': 'Беру задачи', 'register.submit': 'Создать аккаунт', 'register.submitting': 'Регистрация...', 'register.has_account': 'Уже есть аккаунт?', 'register.login_link': 'Войти', 'register.continue_google': 'Зарегистрироваться через Google', 'register.check_email.title': 'Проверьте почту', 'register.check_email.desc': 'Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.', 'register.check_email.login': 'Вернуться к входу', 'dashboard.title': 'Панель управления', 'dashboard.new_task': '+ Новая задача', 'dashboard.my_tasks': 'Мои задачи', 'dashboard.my_offers': 'Мои предложения', 'dashboard.invitations': 'Приглашения на задания', 'dashboard.offers_count': 'предл.', 'dashboard.declined_count': 'откл.', 'dashboard.completed_tasks': 'Завершённые задачи', 'dashboard.completed_offers': 'Завершённые предложения', 'dashboard.review_pending': 'Оценка ещё не оставлена', 'tasks.new.top_specialists': 'Топ специалисты', 'tasks.new.select_category': 'Выберите категорию, чтобы увидеть специалистов', 'tasks.new.invite': 'Предложить работу', 'tasks.new.invited': 'Выбран ✓', 'reviews.count': 'отзывов', 'filter.location': 'Локация', 'filter.language': 'Языки', 'filter.language.any': 'Любой язык', 'filter.category.all': 'Все категории', 'user.categories': 'Категории', 'user.work_area': 'Район работы', 'dashboard.tasks.empty': 'Вы не публиковали задачи', 'dashboard.tasks.empty.cta': 'Опубликуйте первую', 'dashboard.tasks.add_new': 'Добавить новую задачу', 'dashboard.offers.empty': 'Вы не отправляли предложений', 'dashboard.offers.empty.cta': 'Найти задачи', 'dashboard.customer.specialists_title': 'Ищете исполнителя?', 'dashboard.customer.specialists_hint': 'Просматривайте профили специалистов, читайте отзывы и приглашайте их на свои задачи', 'dashboard.customer.specialists_cta': 'Найти исполнителя', 'dashboard.customer.how_title': 'Как это работает', 'dashboard.customer.step1': 'Создайте задачу с описанием и бюджетом', 'dashboard.customer.step2': 'Специалисты пришлют предложения с ценой и сроками', 'dashboard.customer.step3': 'Выберите подходящего и начните работу', 'notif.title': 'Уведомления', 'notif.mark_all': 'Отметить все как прочитанные', 'notif.empty': 'Нет уведомлений', 'notif.type.new_offer': 'Новое предложение', 'notif.type.offer_accepted': 'Ваше предложение принято', 'notif.type.offer_declined': 'Ваше предложение отклонено', 'notif.type.task_completed': 'Задание выполнено', 'notif.type.task_cancelled': 'Задание отменено', 'notif.type.new_message': 'Новое сообщение', 'notif.type.new_review': 'Новый отзыв', 'notif.type.task_invite': 'Приглашение на задание', 'notif.body.new_offer': 'Новое предложение на «{title}»', 'notif.body.offer_accepted': 'Ваше предложение на «{title}» принято', 'notif.body.offer_declined': 'Ваше предложение на «{title}» отклонено', 'notif.body.task_invite': 'Вас приглашают на «{title}»', 'notif.body.new_review': 'Вы получили оценку {rating}★', 'offer.status.pending': 'Ожидает', 'offer.status.accepted': 'Принято', 'offer.status.declined': 'Отклонено', 'offer.status.withdrawn': 'Отозвано', 'offer.status.other_accepted': 'Выбран другой исполнитель', 'common.loading': 'Загрузка...', 'common.error': 'Ошибка', 'common.save': 'Сохранить', 'common.saving': 'Сохранение...', 'common.cancel': 'Отмена', 'common.add': 'Добавить', 'common.close': 'Закрыть', 'common.edit': 'Редактировать', 'common.delete': 'Удалить', 'common.from': 'от', 'common.currency': '€', 'common.greece': 'Греция', // Chat 'chat.connected': 'Подключено', 'chat.disconnected': 'Отключено', 'chat.no_rooms': 'Переписок пока нет', 'chat.task_fallback': 'Задача', 'chat.select': 'Выберите переписку', 'chat.no_messages': 'Сообщений пока нет', 'chat.placeholder': 'Напишите сообщение... (Enter для отправки)', 'chat.conversation_fallback': 'Переписка', 'chat.direct_chat': 'Личный чат', 'chat.linked_task': 'Прикреплённый заказ', 'chat.write_btn': 'Написать', 'chat.just_now': 'только что', 'chat.min_ago': 'м', 'chat.write_specialist': 'Написать специалисту', 'chat.write_customer': 'Написать заказчику', 'chat.notif_settings': 'Настройки уведомлений', 'chat.notif_messages': 'Уведомления о новых сообщениях', 'chat.toast_title': 'Новое сообщение', 'chat.toast_open': 'Открыть чат', // Offer form 'offer.price': 'Цена', 'offer.price.placeholder': 'напр. 80', 'offer.customer_budget': 'Бюджет заказчика', 'offer.message': 'Сообщение', 'offer.optional': 'необязательно', 'offer.message.placeholder': 'Представьтесь, расскажите об опыте и почему вы лучший выбор...', 'offer.submitting': 'Отправка...', // Profile 'profile.photo': 'Фото профиля', 'profile.photo.change': 'Изменить фото', 'profile.photo.hint': 'JPEG, PNG, WebP · до 5MB', 'profile.basic_info': 'Основная информация', 'profile.phone': 'Телефон', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Краткое описание', 'profile.bio.placeholder': 'Расскажите немного о себе...', 'profile.language': 'Язык', 'profile.language.hint': 'Язык интерфейса и email-уведомлений', 'profile.languages': 'Языки общения', 'profile.languages.hint': 'Выберите все языки, на которых вы общаетесь', 'profile.skills': 'Навыки', 'profile.skills.subtitle': 'Добавьте услуги, которые вы предлагаете', 'profile.skills.placeholder': 'напр. Уборка, IT, Репетиторство...', 'profile.role': 'Роль аккаунта', 'profile.role.specialist': '🔧 Специалист', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 Пользователь', 'profile.role.change': 'Для смены роли обратитесь в службу поддержки.', 'profile.become_specialist': 'Стать специалистом', 'profile.become_specialist.desc': 'Перейдите в роль специалиста, чтобы брать задачи и наполнить профиль.', 'become_specialist.hero.title': 'Зарабатывай, делая то, что умеешь', 'become_specialist.hero.subtitle': 'Создай профиль специалиста и получай заказы от клиентов по всей Греции', 'become_specialist.how.title': 'Как это работает', 'become_specialist.step1.title': 'Создай портфолио специалиста', 'become_specialist.step1.desc': 'Укажи категории, навыки и зону покрытия — система автоматически подберёт подходящие заказы', 'become_specialist.step2.title': 'Ищи заказы', 'become_specialist.step2.desc': 'Просматривай задачи по своим категориям в разделе «Поиск заказов»', 'become_specialist.step3.title': 'Откликайся и зарабатывай', 'become_specialist.step3.desc': 'Отправляй предложения с ценой и сроками, общайся с клиентами и выполняй заказы', 'become_specialist.benefits.title': 'Преимущества профиля специалиста', 'become_specialist.benefit1': 'Поиск заказов по вашим категориям и локации', 'become_specialist.benefit2': 'Публичный профиль с отзывами клиентов', 'become_specialist.benefit3': 'Расписание доступности, видимое клиентам', 'become_specialist.benefit4': 'Добавление в избранное клиентами', 'become_specialist.cta': 'Стать специалистом — это бесплатно', 'become_specialist.free_badge': 'Бесплатная регистрация', 'profile.tab.notifications': 'Уведомления', 'profile.tab.reviews': 'Отзывы', 'profile.tab.referral': 'Рефералы', 'profile.tab.auto_response': 'Авто-ответ', 'profile.tab.site': 'Сайт', 'profile.site.title': 'Персональная страница', 'profile.site.url_label': 'Личный сайт', 'profile.site.copy': 'Копировать', 'profile.site.copied': 'Скопировано', 'profile.site.visible_title': 'Что отображается на вашей странице', 'profile.site.visible.name': 'Имя и фото', 'profile.site.visible.bio': 'Биография', 'profile.site.visible.rating': 'Рейтинг и отзывы', 'profile.site.visible.portfolio': 'Портфолио / Карточки', 'profile.site.visible.contacts': 'Контактные данные', 'profile.site.visible.full_last_name': 'Фамилия полностью', 'profile.site.visible.services': 'Карточки услуг', 'profile.site.visible.reviews': 'Раздел с отзывами', 'profile.site.visible.status': 'Статус «Готов помочь»', 'profile.site.theme': 'Тема оформления', 'profile.site.theme.dark': 'Тёмная', 'profile.site.theme.light': 'Светлая', 'profile.site.slug_taken': 'Этот адрес уже занят', 'profile.site.stats.title': 'Аналитика сайта', 'profile.site.stats.days': 'последние 30 дней', 'profile.site.stats.views': 'Просмотры', 'profile.site.stats.unique': 'Уникальные посетители', 'profile.site.stats.messages': 'Сообщения', 'profile.site.stats.total_views': 'Просмотры', 'profile.site.stats.total_unique': 'Уник. посетители', 'profile.site.stats.total_messages': 'Сообщения', 'profile.site.stats.empty': 'Данных пока нет', 'profile.site.stats.loading': 'Загрузка аналитики...', 'profile.site.stats.no_slug': 'Укажите адрес сайта, чтобы видеть статистику', 'profile.site.edit_bio_hint': 'Биография и фото настраиваются во вкладке «Основное».', 'status.title': 'Статус', 'status.can_help_now_hint': 'Ваша карточка показывается выше в поиске', 'status.need_help_hint': 'Специалисты могут предложить вам помощь', 'profile.referral.title': 'Партнёрская программа', 'profile.referral.desc': 'Поделитесь ссылкой и получайте награду за каждого привлечённого пользователя.', 'profile.referral.link_label': 'Ваша реферальная ссылка', 'profile.referral.copy': 'Копировать', 'profile.referral.copied': 'Скопировано!', 'profile.referral.invited_count': 'успешных приглашений', 'profile.referral.no_code': 'Реферальный код недоступен.', 'notifications.title': 'Настройки уведомлений', 'notifications.email.new_tasks': 'Email о новых заказах', 'notifications.email.new_tasks.desc': 'Получать email, когда в ваших категориях публикуется новый заказ', 'notifications.messages.desc': 'Получать уведомление при новом входящем сообщении', 'notifications.saved': 'Настройки сохранены', 'notifications.plan_required': 'Недоступно в вашем тарифе', 'profile.tab.info': 'Основное', 'profile.tab.finance': 'Финансы', 'profile.tab.skills': 'Навыки', 'profile.tab.categories': 'Категории', 'profile.tab.geography': 'География', 'profile.specialist.categories': 'Категории работ', 'profile.specialist.categories.desc': 'Выберите категории, в которых вы работаете', 'profile.specialist.geography': 'Города покрытия', 'profile.specialist.geography.desc': 'Выберите города / районы, где вы работаете', 'profile.saving': 'Сохранение...', 'profile.upload.error': 'Ошибка загрузки фото', 'profile.saved': 'Сохранено', 'profile.tab.cards': 'Портфолио', 'profile.cards.count': 'Портфолио', 'profile.cards.add': 'Добавить портфолио', 'profile.cards.new_title': 'Название нового портфолио', 'profile.cards.placeholder': 'Например: Сантехника', 'profile.cards.create': 'Создать', 'profile.cards.cancel': 'Отмена', 'profile.cards.empty': 'У вас нет портфолио', 'profile.cards.create_first': 'Создать первое портфолио', 'profile.cards.delete_confirm': 'Удалить портфолио?', 'profile.card.tab.main': 'Основное', 'profile.card.tab.skills': 'Навыки', 'profile.card.tab.categories': 'Категории', 'profile.card.tab.geography': 'География', 'profile.card.tab.portfolio': 'Галерея', 'profile.card.active': 'Активна', 'profile.card.save': 'Сохранить', 'profile.card.saved': 'Сохранено', 'profile.card.delete': 'Удалить', 'profile.card.skill.add': 'Добавить навык', 'profile.card.photo.add': 'Добавить фото', 'profile.card.photo.uploading': 'Загрузка...', 'profile.card.photo.empty': 'Нет фотографий', 'profile.card.item.title': 'Заголовок', 'profile.card.item.desc': 'Описание', 'profile.card.item.save': 'Сохранить', 'profile.card.item.cancel': 'Отмена', 'profile.card.item.edit': 'Описание работы', 'profile.upgrade.cards_limit': 'Лимит портфолио исчерпан', 'profile.upgrade.plan': 'Текущий тариф:', 'profile.upgrade.contact': 'Обратитесь к администратору для смены тарифа', 'profile.upgrade.ok': 'Понятно', 'profile.plan.title': 'Тарифный план', 'profile.balance': 'Баланс', 'profile.balance.topup': 'Пополнить баланс', 'profile.balance.topup.title': 'Пополнить баланс', 'profile.balance.topup.amount': 'Сумма (в EUR)', 'profile.balance.topup.hint': 'Выберите сумму или введите вручную', 'profile.balance.topup.submit': 'Перейти к оплате', 'profile.balance.topup.loading': 'Перенаправление...', 'profile.balance.topup.error': 'Ошибка инициализации платежа. Попробуйте снова.', 'payment.success.title': 'Оплата прошла успешно!', 'payment.success.desc': 'Ваш баланс обновлён.', 'payment.cancelled.title': 'Оплата отменена', 'payment.cancelled.desc': 'Оплата была отменена. Средства не списаны.', 'payment.pending.title': 'Обрабатывается...', 'payment.pending.desc': 'Ваш платёж в обработке.', 'payment.back_to_profile': 'Вернуться в профиль', 'profile.plan.basic': 'Базовый (бесплатный)', 'profile.plan.contact_upgrade': 'Обратитесь к администратору для подключения тарифа', 'profile.plan.cards_up_to': 'Портфолио: до', 'profile.plan.cards_unlimited': 'Портфолио: безлимитно', 'profile.plan.tasks_up_to': 'Задач: до', 'profile.plan.offers_up_to': 'Откликов: до', 'profile.plan.valid_until': 'Действителен до', 'profile.plan.no_expiry': 'Бессрочно', // Create task 'create.error': 'Ошибка при публикации', // Tasks list extras 'tasks.category.general': 'Общее', 'tasks.budget.range': 'Диапазон:', 'tasks.budget.from': 'от', 'tasks.budget.to': 'до', 'tasks.filter.reset': 'Сбросить фильтры', 'tasks.load_more': 'Загрузить ещё', 'tasks.showing': 'Результатов:', 'tasks.field.budget': 'Бюджет, €', // Admin 'admin.title': 'Панель администратора', 'admin.tab.stats': 'Статистика', 'admin.tab.users': 'Пользователи', 'admin.tab.tasks': 'Задачи', 'admin.tab.reports': 'Жалобы', 'admin.stats.users': 'Пользователи', 'admin.stats.tasks': 'Задачи', 'admin.stats.offers': 'Предложения', 'admin.stats.reviews': 'Отзывы', 'admin.tasks.by_status': 'Задачи по статусу', 'admin.col.user': 'Пользователь', 'admin.col.email': 'Email', 'admin.col.role': 'Роль', 'admin.col.registered': 'Регистрация', 'admin.col.status': 'Статус', 'admin.col.title': 'Название', 'admin.col.budget': 'Бюджет', 'admin.col.created': 'Создано', 'admin.users.active': 'Активен', 'admin.users.inactive': 'Неактивен', 'admin.users.deactivate': 'Деактивировать', 'admin.users.activate': 'Активировать', 'admin.tasks.cancel': 'Отменить', 'admin.reports.none': 'Жалоб нет', 'admin.reports.reviewed': 'Рассмотрено', 'admin.reports.dismiss': 'Отклонить', 'admin.pagination.total': 'Всего', 'admin.users.role.change': 'Изменить роль', 'admin.users.search.placeholder': 'Поиск по имени или email...', 'admin.tasks.delete': 'Удалить', 'admin.tasks.delete.confirm': 'Удалить эту задачу навсегда?', 'admin.tasks.search.placeholder': 'Поиск по названию...', 'admin.col.customer': 'Заказчик', 'admin.col.reporter': 'Жалобщик', 'admin.col.target': 'Цель', 'admin.filter.all_roles': 'Все роли', 'admin.filter.all_statuses': 'Все статусы', 'admin.reports.target.task': 'Задача', 'admin.reports.target.user': 'Пользователь', 'admin.tab.categories': 'Категории', 'admin.tab.locations': 'Города и районы', 'admin.tab.logs': 'Логи', 'admin.tab.plans': 'Тарифы', 'admin.tab.settings': 'Настройки', 'admin.logs.subtab.ai': 'AI логи', 'admin.logs.subtab.activity': 'Активность', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Уведомления', 'admin.notif_logs.type': 'Тип', 'admin.notif_logs.title': 'Заголовок', 'admin.notif_logs.read': 'Прочитано', 'admin.notif_logs.empty': 'Логи уведомлений пусты', 'admin.stats.notif_chart_title': 'Уведомления по дням', 'admin.stats.notif_label': 'Уведомления', 'admin.stats.mail_chart_title': 'Email по дням', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'Все', 'admin.stats.specialists': 'Исполнители', 'admin.col.plan': 'Тариф', 'admin.back_home': 'На главную', 'admin.plans.title': 'Тарифные пакеты', 'admin.plans.add': '+ Добавить тариф', 'admin.plans.empty': 'Тарифы не созданы', 'admin.plans.form.new': 'Новый тариф', 'admin.plans.form.edit': 'Редактировать тариф', 'admin.plans.form.name': 'Название', 'admin.plans.form.price': 'Цена (EUR)', 'admin.plans.form.old_price': 'Старая цена (EUR, необязательно)', 'admin.plans.form.max_offers': 'Макс. откликов (пусто = без лимита)', 'admin.plans.form.max_cards': 'Макс. портфолио (пусто = без лимита)', 'admin.plans.form.duration_days': 'Срок (дней, пусто = без истечения)', 'admin.plans.form.description': 'Описание', 'admin.plans.form.features': 'Возможности (по одной на строку)', 'admin.plans.form.notify': 'Уведомления о новых заказах', 'admin.plans.form.default': 'По умолчанию', 'admin.plans.form.active': 'Активен', 'admin.plans.form.order': 'Порядок', 'admin.plans.form.role': 'Роль', 'admin.plans.form.tier': 'Уровень', 'admin.plans.form.role.customer': 'Заказчик', 'admin.plans.form.role.specialist': 'Специалист', 'admin.plans.form.tier.free': 'Бесплатный', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Лимиты (пусто = без ограничений)', 'admin.plans.form.max_messages_day': 'Макс. сообщений/день', 'admin.plans.form.max_orders_day': 'Макс. заказов/день', 'admin.plans.form.max_skills': 'Макс. навыков', 'admin.plans.form.max_profiles': 'Макс. профилей', 'admin.plans.form.max_portfolio': 'Макс. элементов портфолио', 'admin.plans.form.section.boost': 'Множители & Буст', 'admin.plans.form.search_boost': 'Буст в поиске', 'admin.plans.form.offers_multiplier': 'Множитель откликов', 'admin.plans.form.section.contact': 'Права контактов', 'admin.plans.form.can_contact_free': 'Контакт с бесплатными пользователями', 'admin.plans.form.can_contact_pro': 'Контакт с Pro пользователями', 'admin.plans.form.can_contact_all': 'Контакт со всеми', 'admin.plans.form.can_show_contact': 'Показывать контакты', 'admin.plans.form.can_view_phone': 'Просмотр телефона', 'admin.plans.form.section.features': 'Возможности', 'admin.plans.form.upload_video': 'Загрузка видео', 'admin.plans.form.favorites': 'Избранное', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Знак верификации', 'admin.plans.form.highlighted_reviews': 'Выделенные отзывы', 'admin.plans.form.personal_site': 'Личный сайт', 'admin.plans.form.can_help_now': 'Статус «Могу помочь»', 'admin.plans.form.need_help': 'Статус «Нужна помощь»', 'admin.plans.form.auto_response': 'Автоответ', 'admin.plans.form.auto_match': 'Автоподбор', 'admin.plans.form.instant_dispatch_free': 'Мгновенная рассылка (бесплатно)', 'admin.plans.form.instant_dispatch_pro': 'Мгновенная рассылка (Pro)', 'admin.plans.badge.default': 'По умолчанию', 'admin.plans.badge.inactive': 'Неактивен', 'admin.plans.make_default': 'Сделать по умолчанию', 'admin.plans.tasks': 'Задач', 'admin.plans.offers': 'Откликов', 'admin.plans.cards': 'Портфолио', 'admin.plans.notify_tasks': 'Уведомления о заказах', 'admin.plans.delete.confirm': 'Удалить тариф', 'admin.activity.title': 'Журнал активности', 'admin.activity.event': 'Событие', 'admin.activity.all_events': 'Все события', 'admin.activity.from': 'От', 'admin.activity.to': 'До', 'admin.activity.reset': 'Сбросить', 'admin.activity.total': 'Всего', 'admin.activity.empty': 'Нет записей', 'admin.mail.event': 'Email событие', 'admin.mail.all_events': 'Все email события', 'admin.mail.from': 'От', 'admin.mail.to': 'До', 'admin.mail.reset': 'Сбросить', 'admin.mail.total': 'Всего', 'admin.mail.empty': 'Нет email логов', 'admin.mail.recipient': 'Получатель', 'admin.mail.provider': 'Провайдер', 'admin.mail.details': 'Детали', 'admin.mail.status': 'Статус', 'admin.mail.success': 'Успешно', 'admin.mail.failed': 'Ошибка', 'admin.event.email_sent': 'Email отправлен', 'admin.event.email_failed': 'Email не отправлен', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Тестовый email отправлен', 'admin.event.admin_email_test_failed': 'Тестовый email не отправлен', 'admin.logs.empty': 'Нет записей', 'admin.logs.date': 'Дата', 'admin.logs.provider': 'Провайдер', 'admin.logs.model': 'Модель', 'admin.logs.action': 'Действие', 'admin.logs.langs': 'Языки', 'admin.logs.in': 'Вход', 'admin.logs.out': 'Выход', 'admin.logs.total': 'Итого', 'admin.logs.ms': 'мс', 'admin.logs.status': 'Статус', 'admin.stats.activity_30d': 'Активность за 30 дней', 'admin.stats.tasks_label': 'Заявки', 'admin.stats.users_label': 'Пользователи', 'admin.stats.specialists_label': 'Исполнители', 'admin.stats.tokens_title': 'Расход токенов (по месяцам)', 'admin.stats.tokens_out': 'Исходящие', 'admin.stats.tokens_in': 'Входящие', 'admin.stats.tokens_out_label': 'Исходящие токены', 'admin.stats.tokens_in_label': 'Входящие токены', 'admin.stats.cost_label': 'Стоимость (USD)', 'admin.stats.tasks_by_status': 'Заявки по статусам', 'admin.task_status.open': 'Открытые', 'admin.task_status.in_progress': 'В работе', 'admin.task_status.completed': 'Завершённые', 'admin.task_status.cancelled': 'Отменённые', 'admin.task_status.draft': 'Черновики', 'admin.settings.tab.general': 'Общие', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Уведомления', 'admin.settings.tab.payment': 'Оплата', 'admin.settings.tab.referral': 'Реферальная', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO и обслуживание', 'admin.settings.seo.maintenance_label': 'Режим обслуживания', 'admin.settings.seo.maintenance_hint': 'Показывать страницу обслуживания всем посетителям', 'admin.settings.seo.indexing_label': 'Индексация поисковыми системами', 'admin.settings.seo.indexing_hint': 'Разрешить поисковым системам индексировать сайт', 'admin.settings.seo.head_scripts_label': 'Скрипты в (JS)', 'admin.settings.seo.head_scripts_hint': 'Выполняется на каждой странице (Google Tag Manager, аналитика и т.д.)', 'admin.settings.seo.site_title_label': 'Заголовок сайта', 'admin.settings.seo.site_description_label': 'Описание сайта (meta description)', 'admin.settings.referral.title': 'Партнёрская программа', 'admin.settings.referral.hint': 'Награждайте пользователей, приводящих новых участников.', 'admin.settings.referral.enabled_label': 'Включено', 'admin.settings.referral.enabled_hint': 'Включить / отключить выдачу наград', 'admin.settings.referral.customer_section': 'Для клиентов', 'admin.settings.referral.specialist_section': 'Для специалистов', 'admin.settings.referral.plan_label': 'Тарифный план за реферала', 'admin.settings.referral.no_plan': '— без плана —', 'admin.settings.referral.plan_hint': 'Этот план будет назначен пригласившему. Если его текущий план выше — добавятся только дни.', 'admin.settings.referral.days_label': 'Дней награды', 'admin.settings.referral.days_hint': 'Количество дней, добавляемых к сроку действия плана.', 'admin.settings.general.title': 'Общие настройки', 'admin.settings.general.site_name': 'Название сайта', 'admin.settings.general.site_url': 'URL сайта', 'admin.settings.general.contact_email': 'Email для связи', 'admin.settings.general.support_phone': 'Телефон поддержки', 'admin.settings.smtp.title': 'Настройки SMTP сервера', 'admin.settings.smtp.hint': 'Используется для отправки email-уведомлений.', 'admin.settings.smtp.host': 'SMTP Хост', 'admin.settings.smtp.port': 'Порт', 'admin.settings.smtp.encryption': 'Шифрование', 'admin.settings.smtp.enc.none': 'Нет', 'admin.settings.smtp.enc.tls': 'STARTTLS (порт 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (порт 465)', 'admin.settings.smtp.username': 'Имя пользователя', 'admin.settings.smtp.password': 'Пароль / App Password', 'admin.settings.smtp.from_name': 'Имя отправителя', 'admin.settings.smtp.from_email': 'Email отправителя', 'admin.settings.smtp.test': 'Отправить тестовый email', 'admin.settings.smtp.sending': 'Отправка...', 'admin.settings.payment.hint': 'Данные для подключения к ePay Piraeus Bank.', 'admin.settings.env.test': 'Тест (sandbox)', 'admin.settings.env.prod': 'Боевой режим', 'admin.settings.env.label': 'Среда', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Активен', 'admin.settings.saving': 'Сохранение...', 'admin.settings.saved': 'Сохранено', 'admin.notif.vars_hint': 'Доступные переменные в шаблонах', 'admin.notif.tmpl.not_set': 'Шаблон не настроен', 'admin.notif.tmpl.subject_label': 'Тема письма', 'admin.notif.tmpl.body_label': 'Текст письма (HTML)', 'admin.notif.tmpl.save': 'Сохранить', 'admin.notif.tmpl.close': 'Закрыть', 'admin.notif.tmpl.translate': 'Авто-перевод на другие языки', 'admin.notif.tmpl.translating': 'Перевод...', 'admin.notif.tmpl.saving': 'Сохранение...', 'admin.notif.email_verification': 'Подтверждение email адреса', 'admin.notif.registration_success': 'Успешная регистрация', 'admin.notif.password_reset': 'Восстановление пароля', 'admin.notif.new_offer': 'Новое предложение', 'admin.notif.new_task': 'Новая задача', 'admin.notif.offer_accepted': 'Предложение принято', 'admin.notif.new_message': 'Новое сообщение', 'admin.notif.offer_declined': 'Отклонение предложения', 'admin.notif.offer_other_accepted': 'Выбран другой исполнитель', 'admin.notif.task_updated': 'Изменение задания', 'admin.notif.deadline_reminder': 'Напоминание о дедлайне', 'admin.notif.task_archived': 'Автоснятие задания', 'admin.notif.referral_reward': 'Реферальная награда', // Шаблоны email для тарифов 'admin.email_template.plan_activated': 'Тарифы — активация тарифа', 'admin.email_template.plan_upgraded': 'Тарифы — повышение тарифа', 'admin.email_template.plan_downgrade_scheduled': 'Тарифы — запланированное понижение', 'admin.email_template.plan_downgrade_applied': 'Тарифы — применение понижения', 'admin.email_template.plan_renewal_reminder': 'Тарифы — напоминание о продлении', 'admin.email_template.plan_insufficient_funds': 'Тарифы — нехватка средств', // Модальное окно подтверждения тарифа 'pricing.confirm.title': 'Подтвердите выбор тарифа', 'pricing.confirm.plan': 'Тариф', 'pricing.confirm.prorated': 'Зачёт остатка', 'pricing.confirm.effective_price': 'К оплате', 'pricing.confirm.your_balance': 'Ваш баланс', 'pricing.confirm.downgrade_info': 'Переход на новый тариф произойдёт автоматически после окончания текущего периода.', 'pricing.confirm.insufficient': 'Недостаточно средств на балансе.', 'pricing.confirm.top_up': 'Пополнить', 'pricing.confirm.schedule_downgrade': 'Запланировать переход', 'pricing.confirm.pay': 'Оплатить', 'admin.user_edit.title': 'Редактирование пользователя', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Регистрация', 'admin.user_edit.last_seen': 'Последний визит', 'admin.user_edit.lang': 'Язык', 'admin.user_edit.first_name': 'Имя', 'admin.user_edit.last_name': 'Фамилия', 'admin.user_edit.phone': 'Телефон', 'admin.user_edit.bio': 'О себе', 'admin.user_edit.role': 'Роль', 'admin.user_edit.plan': 'Тариф', 'admin.user_edit.no_plan': '— Без тарифа —', 'admin.user_edit.active': 'Активный аккаунт', 'admin.user_edit.balance': 'Баланс (EUR)', 'admin.user_edit.skills': 'Навыки', 'admin.user_edit.tab.profile': 'Профиль', 'admin.user_edit.tab.account': 'Аккаунт', 'admin.user_edit.tab.balance': 'Баланс', 'admin.user_edit.tab.settings': 'Настройки', 'admin.user_edit.tab.specialist': 'Портфолио', 'admin.user_edit.tab.site': 'Сайт', 'admin.user_edit.plan_expires': 'Тариф истекает', 'admin.user_edit.interface_lang': 'Язык интерфейса', 'admin.user_edit.comm_languages': 'Языки общения', 'admin.user_edit.personal_site_slug': 'Персональная страница', 'admin.user_edit.show_contact_info': 'Показывать контакты', 'admin.user_edit.show_contact_info.hint': 'Видно заказчикам', 'admin.user_edit.notify_new_tasks': 'Уведомлять о новых задачах', 'admin.user_edit.notify_new_tasks.hint': 'Push и email уведомления', 'admin.user_edit.notif_messages': 'Уведомления о сообщениях', 'admin.user_edit.notif_messages.hint': 'Новые сообщения в чате', 'admin.user_edit.site_settings': 'Настройки персональной страницы', 'admin.user_edit.categories': 'Категории услуг', 'admin.user_edit.locations': 'Районы обслуживания', 'admin.user_edit.skill_placeholder': 'Новый навык...', 'admin.user_edit.add_category': '— Выберите категорию —', 'admin.user_edit.add_location': '— Выберите район —', 'admin.user_edit.specialist_cards': 'Портфолио специалиста', 'admin.user_edit.no_cards': 'Портфолио не найдено', 'admin.user_edit.card_title': 'Заголовок портфолио', 'admin.user_edit.card_description': 'Описание', 'admin.balance.topup.btn': 'Пополнить', 'admin.balance.withdraw.btn': 'Списать', 'admin.balance.modal_hint': 'Изменения применяются сразу и фиксируются в истории', 'admin.balance.topup.title': 'Пополнение баланса', 'admin.balance.topup.amount': 'Сумма', 'admin.balance.topup.description': 'Комментарий', 'admin.balance.topup.description.placeholder': 'Например: бонус или ручное пополнение', 'admin.balance.topup.submit': 'Пополнить баланс', 'admin.balance.withdraw.title': 'Снятие баланса', 'admin.balance.withdraw.amount': 'Сумма', 'admin.balance.withdraw.description': 'Комментарий', 'admin.balance.withdraw.description.placeholder': 'Например: возврат или ручное списание', 'admin.balance.withdraw.submit': 'Списать баланс', 'admin.user_edit.role.customer': 'Заказчик', 'admin.user_edit.role.specialist': 'Исполнитель', 'admin.user_edit.role.admin': 'Администратор', 'common.refresh': 'Обновить', 'common.back_home': 'На главную', 'admin.loc.hint': 'Управление городами и районами', 'admin.loc.add_city': 'Новый город', 'admin.loc.add_district': 'Добавить район', 'admin.loc.new': 'Новая локация', 'admin.loc.edit': 'Редактировать локацию', 'admin.loc.district': 'район', 'admin.loc.empty': 'Нет локаций', 'admin.loc.delete.confirm': 'Удалить локацию? Все районы также будут удалены.', 'admin.cat.add_root': 'Новая категория', 'admin.cat.add_sub': 'Подкатегория', 'admin.cat.edit': 'Редактировать', 'admin.cat.delete': 'Удалить', 'admin.cat.delete.confirm': 'Удалить категорию? Все подкатегории также будут удалены.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Иконка', 'admin.cat.name_el': 'Греческий', 'admin.cat.name_en': 'Английский', 'admin.cat.name_ru': 'Русский', 'admin.cat.order': 'Порядок', 'admin.cat.active': 'Активна', 'admin.cat.parent': 'Родительская категория', 'admin.cat.no_parent': 'Верхний уровень', 'admin.cat.save': 'Сохранить', 'admin.cat.cancel': 'Отмена', 'admin.cat.empty': 'Нет категорий', 'admin.cat.hint': 'Управление категориями с многоуровневой иерархией', 'admin.cat.new': 'Новая категория', 'admin.cat.subcategory': 'подкатегория', 'admin.cat.add_child': 'Добавить подкатегорию', 'admin.cat.inactive': 'Неактивна', 'admin.event.user_login': 'Вход', 'admin.event.user_register': 'Регистрация', 'admin.event.admin_user_deactivate': 'Блокировка юзера', 'admin.event.admin_user_activate': 'Разблокировка юзера', 'admin.event.admin_user_role_changed': 'Смена роли', 'admin.event.admin_task_cancelled': 'Отмена задачи', 'admin.event.admin_task_deleted': 'Удаление задачи', 'admin.event.admin_report_reviewed': 'Жалоба рассмотрена', 'admin.event.admin_report_dismissed': 'Жалоба отклонена', 'admin.event.task_created': 'Создана задача', // User status 'user.online': 'Онлайн', 'user.seen_minutes': 'был здесь {n} мин назад', 'user.seen_hours': 'был здесь {n} ч назад', 'user.seen_yesterday': 'был здесь вчера', 'user.seen_days': 'был здесь {n} дн назад', // Specialists 'specialists.title': 'Специалисты', 'specialists.search': 'Поиск специалиста...', 'specialists.search.btn': 'Поиск', 'specialists.empty': 'Специалисты не найдены', 'specialists.no_bio': 'Без описания', 'specialists.view': 'Смотреть профиль', 'specialists.reviews': 'отзывов', 'specialist.favorite': 'Добавить в избранное', 'specialist.unfavorite': 'Убрать из избранного', 'specialist.site_link': 'Личный сайт', 'favorites.specialists.title': 'Избранные специалисты', 'favorites.specialists.empty': 'Вы ещё не добавили специалистов в избранное', 'nav.favorites': 'Избранное', 'nav.schedule': 'Расписание', 'nav.find_tasks': 'Поиск заказов', 'schedule.title': 'Моё расписание', 'schedule.subtitle': 'Отмечайте дни когда вы свободны или заняты — заказчики увидят вашу доступность', 'schedule.available': 'Свободен', 'schedule.busy': 'Занят', 'schedule.unset': 'Не указано', 'schedule.click_hint': '← клик меняет статус по кругу', 'schedule.range_mode': 'Выделить диапазон', 'schedule.range_from': 'С {date} — выберите конечную дату', 'schedule.click_to_set': 'Нажмите чтобы отметить', 'schedule.free': 'свободно', 'schedule.busy_count': 'занято', 'schedule.free_days': 'свободных дней', 'schedule.googleCalendar': 'Google Календарь', 'schedule.connectGoogle': 'Подключить Google Календарь', 'schedule.disconnectGoogle': 'Отключить', 'schedule.connectedAs': 'Подключено как', 'schedule.importFromGoogle': 'Синхр. из Google', 'schedule.gcalConnected': '\u2713 Google Календарь подключён', 'schedule.gcalError': 'Ошибка подключения Google Календарь', 'schedule.gcalImportDone': 'Импортировано {n} дней из Google Календарь', 'schedule.gcalAutoSyncNote': 'Изменения доступности автоматически отправляются в Google Календарь', 'schedule.gcalConnectDesc': 'Подключите Google Календарь для автоматической синхронизации расписания', 'schedule.gcalDisconnectConfirm': 'Отключить Google Календарь?', 'find_tasks.title': 'Поиск заказов', 'find_tasks.for_me': 'Для меня', 'find_tasks.all': 'Все заказы', 'find_tasks.by_category': 'По категориям', 'find_tasks.list': 'Списком', 'find_tasks.already_offered': 'Предложение отправлено', 'find_tasks.offer_now': 'Откликнуться', 'find_tasks.empty_for_me': 'Нет заказов в ваших категориях', 'find_tasks.banner_hint': 'Найдите заказы по категориям вашего портфолио', 'find_tasks.no_cards': 'Создайте портфолио специалиста, чтобы видеть подходящие заказы', 'find_tasks.add_card': 'Создать портфолио', 'find_tasks.search': 'Поиск заказов...', 'find_tasks.tasks_count': 'заданий', 'footer.tagline': 'Платформа задач для Греции', 'footer.rights': 'Все права защищены.', // App download section 'app.download_title': 'Скачайте мобильное приложение CanHelp', 'app.download_desc': 'Всё CanHelp — всегда под рукой. Доступно для Android и iOS.', // Nav 'nav.pricing': 'Тарифы', // Pricing page 'pricing.title': 'Тарифы', 'pricing.subtitle': 'Выберите подходящий план', 'pricing.role.customer': 'Заказчик', 'pricing.role.specialist': 'Специалист', 'pricing.free': 'Бесплатно', 'pricing.per_month': 'мес', 'pricing.duration': 'Срок', 'pricing.days': 'дн.', 'pricing.current_plan': 'Ваш план', 'pricing.popular': 'Популярный', 'pricing.choose': 'Выбрать', 'pricing.your_plan': 'Активный план', 'pricing.free_default': 'По умолчанию', 'pricing.compare': 'Сравнение функций', 'pricing.feature': 'Функция', 'pricing.faq_note': 'Оплата списывается с баланса CanHelp. Пополнение доступно в разделе Оплата.', 'pricing.feat.messages': 'Сообщений / день', 'pricing.feat.orders': 'Заказов / день', 'pricing.feat.contact_all': 'Связь со всеми', 'pricing.feat.view_phone': 'Просмотр телефона', 'pricing.feat.show_contact': 'Показывать контакты', 'pricing.feat.favorites': 'Избранное', 'pricing.feat.verified_badge': 'Верифицированный бейдж', 'pricing.feat.google_calendar': 'Google Календарь', 'pricing.feat.personal_site': 'Персональный сайт', 'pricing.feat.auto_response': 'Авто-ответ', 'pricing.feat.auto_match': 'Авто-подбор', 'pricing.feat.highlighted_reviews': 'Выделенные отзывы', 'pricing.feat.portfolio': 'Элементов портфолио', 'pricing.feat.cards': 'Карточки специалиста', 'pricing.feat.notify_tasks': 'Уведомления о новых задачах', 'pricing.feat.video': 'Видео в портфолио', // Upgrade prompt 'upgrade.available_in': 'Доступно в', 'upgrade.cta': 'Улучшить', // Dashboard plan block 'dashboard.plan.title': 'Мой план', 'dashboard.plan.expires': 'Истекает через {n} дней', 'dashboard.plan.upgrade': 'Улучшить план', 'dashboard.plan.no_plan': 'Бесплатный план', 'dashboard.plan.messages': 'Сообщений сегодня', 'dashboard.plan.orders': 'Заказов сегодня', 'dashboard.plan.limits': 'Дневные лимиты', 'dashboard.plan.features': 'Функции', 'dashboard.plan.stats': 'Статистика', 'dashboard.stats.cards': 'Портфолио', 'dashboard.stats.maxCards': 'Макс. портфолио', 'dashboard.stats.portfolioItems': 'Элементы портфолио', 'dashboard.stats.maxPortfolioItems': 'Макс. элементы', 'dashboard.stats.activeOffers': 'Активные отклики', 'dashboard.stats.reviewsReceived': 'Отзывы', 'dashboard.stats.activeTasks': 'Активные задачи', 'dashboard.stats.completedTasks': 'Завершённые', 'status.need_help': 'Нужна помощь', 'status.active': 'Активен', 'status.toggle_on': 'Включить', 'status.toggle_off': 'Выключить', // FOMO 'fomo.missed_orders': 'Пропущено {n} заказов', 'fomo.missed_value': 'На сумму €{v}', 'fomo.upgrade_hint': 'Улучшите план — получайте больше заказов', 'fomo.conversion': 'Конверсия задач', 'fomo.active': 'Активные', 'fomo.with_offers': 'С офертами', 'fomo.completed': 'Завершённые', 'fomo.already_offered': '{n} специалистов уже откликнулись', 'fomo.specialist_missed': 'Вы пропустили {n} заказов', 'fomo.top_categories': 'Категории', 'fomo.offers_received': 'предложений получено', 'fomo.avg_offers': 'В среднем {n}/задача', 'fomo.completion_rate': 'завершено', // Task auto-match 'task.auto_match': 'Авто-матч', 'task.auto_match_results': 'Топ специалисты', 'task.no_offer_yet': 'Вы ещё не отправили предложение', 'task.make_offer': 'Отправить предложение', 'auto_response.title': 'Авто-ответ', 'auto_response.enabled': 'Включить авто-ответ', 'auto_response.min_budget': 'Мин. бюджет', 'auto_response.max_budget': 'Макс. бюджет', 'auto_response.default_price': 'Цена по умолчанию', 'auto_response.default_message': 'Сообщение по умолчанию', 'auto_response.max_per_day': 'Макс. авто-офертов в день', 'auto_response.save': 'Сохранить', 'auto_response.saved': 'Сохранено', 'auto_response.categories': 'Категории', 'auto_response.locations': 'Локации', // Personal site 'profile.personal_site': 'Персональный сайт', 'profile.site_slug': 'URL slug', 'profile.site_slug_hint': 'Только латинские буквы, цифры, - и _', 'profile.site_open': 'Открыть сайт', 'profile.site_preview': 'Ваш сайт', 'profile.show_contact': 'Показывать контакты', 'profile.show_contact_hint': 'Заказчики с Pro/Ultimate-планом увидят ваш телефон', // Google Calendar plan gate 'gcal.upgrade_required': 'Google Календарь требует план Pro или Ultimate', // Chat limits 'chat.limit_warning': 'Осталось {n} сообщений сегодня', 'chat.limit_reached': 'Лимит сообщений исчерпан. Улучшите план', 'chat.upgrade': 'Улучшить', // Site page 'site.member_since': 'С нами с', 'site.rating': 'Рейтинг', 'site.completed_tasks': 'Выполнено', 'site.languages': 'Языков', 'site.photos': 'фото', 'site.contact_form': 'Связаться', 'site.contact_sent': 'Сообщение отправлено!', 'site.contact_sent_desc': 'Специалист свяжется с вами в ближайшее время', 'site.contact_name': 'Имя', 'site.contact_name_ph': 'Ваше имя', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Сообщение', 'site.contact_message_ph': 'Опишите вашу задачу...', 'site.contact_send': 'Отправить', 'site.share': 'Поделиться', 'site.speaks_languages': 'Говорит на языках', 'site.message_sent': 'Сообщение отправлено!', 'site.message_sent_desc': 'Специалист получит его в чате', 'site.message_placeholder': 'Напишите сообщение...', 'site.write_to_chat': 'Написать в чат', 'site.auth_required_title': 'Нужна авторизация', 'site.auth_required_desc': 'Чтобы написать в чат, необходимо войти в аккаунт CanHelp.', 'site.auth_login_btn': 'Войти в аккаунт', 'site.auth_contact_form_btn': 'Написать через форму обратной связи', 'specialist.services': 'Услуги', 'portfolio.title': 'Портфолио', 'status.can_help_now': 'Готов помочь', 'common.not_found': 'Страница не найдена', 'common.anonymous': 'Анонимно' } }; function getTranslations(locale) { const t = translations[locale] ?? translations.el; return (key, fallback)=>t[key] ?? translations.el[key] ?? fallback ?? key; } /***/ }), /***/ 13260: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CI: () => (/* binding */ signOut), /* harmony export */ Hh: () => (/* binding */ signUp), /* harmony export */ Jv: () => (/* binding */ signIn), /* harmony export */ wV: () => (/* binding */ useSession), /* harmony export */ yK: () => (/* binding */ authClient) /* harmony export */ }); /* harmony import */ var better_auth_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(69183); const API_URL = "https://api.canhelp.gr" || 0; const authClient = (0,better_auth_react__WEBPACK_IMPORTED_MODULE_0__/* .createAuthClient */ .M)({ baseURL: API_URL }); const { signIn, signOut, signUp, useSession } = authClient; /***/ }), /***/ 14276: /***/ (() => { /***/ }), /***/ 15043: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; // EXPORTS __webpack_require__.d(__webpack_exports__, { Footer: () => (/* binding */ Footer) }); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js var react_jsx_runtime = __webpack_require__(78157); // EXTERNAL MODULE: ./src/context/locale.tsx var locale = __webpack_require__(96484); // EXTERNAL MODULE: ../../node_modules/next/dist/client/app-dir/link.js var app_dir_link = __webpack_require__(94496); var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); ;// ./src/components/SocialIcons.tsx function SocialIcons({ className = '' }) { return /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: `flex gap-4 ${className}`, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("a", { href: "https://t.me/canhelp", target: "_blank", rel: "noopener", "aria-label": "Telegram", className: "hover:text-blue-500 transition", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { d: "M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z" }) }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("a", { href: "https://instagram.com/canhelp", target: "_blank", rel: "noopener", "aria-label": "Instagram", className: "hover:text-pink-500 transition", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm6.406-11.845a1.44 1.44 0 1 0 0 2.881 1.44 1.44 0 0 0 0-2.881z" }) }) }) ] }); } ;// ./src/components/Footer.tsx /* __next_internal_client_entry_do_not_use__ Footer auto */ function Footer() { const { t } = (0,locale/* useLocale */.Y)(); const year = new Date().getFullYear(); return /*#__PURE__*/ (0,react_jsx_runtime.jsx)("footer", { className: "bg-white border-t border-gray-200 mt-16", children: /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex flex-col md:flex-row justify-between items-start gap-10", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-[200px] flex flex-col items-start", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "logo-text text-3xl text-blue-700 font-bold mb-2", children: "CanHelp" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("p", { className: "text-base text-gray-600 mb-4", children: t('footer.slogan') }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-[180px]", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("h3", { className: "text-lg font-semibold text-blue-900 mb-3", children: t('footer.links') }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("ul", { className: "space-y-2", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("li", { children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/", className: "hover:text-blue-600 transition", children: t('nav.home') }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("li", { children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/tasks", className: "hover:text-blue-600 transition", children: t('nav.tasks') }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("li", { children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/become-specialist", className: "hover:text-blue-600 transition", children: t('nav.specialists') }) }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-[180px]", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("h3", { className: "text-lg font-semibold text-blue-900 mb-3", children: t('footer.socials') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("p", { className: "text-gray-500 text-sm mb-2", children: "info@canhelp.gr" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)(SocialIcons, { className: "mt-2" }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "mt-10 border-t border-gray-100 pt-6 text-center text-gray-400 text-sm", children: [ "\xa9 ", year, " CanHelp. ", t('footer.rights') ] }) ] }) }); } /***/ }), /***/ 20138: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocaleProvider: () => (/* binding */ LocaleProvider) /* harmony export */ }); /* unused harmony export useLocale */ /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const LocaleProvider = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call LocaleProvider() from the server but LocaleProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/locale.tsx", "LocaleProvider", );const useLocale = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call useLocale() from the server but useLocale is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/locale.tsx", "useLocale", ); /***/ }), /***/ 21046: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScrollToTopButton: () => (/* binding */ ScrollToTopButton) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* __next_internal_client_entry_do_not_use__ ScrollToTopButton auto */ function ScrollToTopButton() { const [visible, setVisible] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{ const onScroll = ()=>{ setVisible(window.scrollY > 200); }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("button", { className: `scroll-to-top-btn${visible ? ' visible' : ''}`, "aria-label": "Наверх", onClick: ()=>window.scrollTo({ top: 0, behavior: 'smooth' }), children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path", { d: "M10 16V4M10 4L4 10M10 4L16 10", stroke: "white", strokeWidth: "2.8", strokeLinecap: "round", strokeLinejoin: "round" }) }) }); } /***/ }), /***/ 30460: /***/ (() => { /* (ignored) */ /***/ }), /***/ 32948: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScrollToTopButton: () => (/* binding */ ScrollToTopButton) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const ScrollToTopButton = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call ScrollToTopButton() from the server but ScrollToTopButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/ScrollToTopButton.tsx", "ScrollToTopButton", ); /***/ }), /***/ 33506: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ NotFound) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5939); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3498); /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_1__); function NotFound() { return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { className: "min-h-screen flex items-center justify-center text-center px-4", children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", { children: [ /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h1", { className: "text-8xl font-bold text-blue-600 mb-4", children: "404" }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", { className: "text-xl text-gray-700 mb-6", children: "Η σελίδα δεν βρέθηκε" }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)((next_link__WEBPACK_IMPORTED_MODULE_1___default()), { href: "/", className: "bg-blue-600 text-white px-6 py-3 rounded-xl font-semibold hover:bg-blue-700", children: "Επιστροφή στην Αρχική" }) ] }) }); } /***/ }), /***/ 39348: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Footer: () => (/* binding */ Footer) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const Footer = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call Footer() from the server but Footer is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/Footer.tsx", "Footer", ); /***/ }), /***/ 39805: /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 15043)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 58719)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 21046)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 96484)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 56003)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 24653, 23)); /***/ }), /***/ 47570: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ RootLayout), /* harmony export */ generateMetadata: () => (/* binding */ generateMetadata) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5939); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var next_headers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56057); /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(95692); /* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(14276); /* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_globals_css__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _components_Header__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(67674); /* harmony import */ var _components_Footer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(39348); /* harmony import */ var _context_locale__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(20138); /* harmony import */ var _context_location__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(1697); /* harmony import */ var _components_ScrollToTopButton__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(32948); async function fetchSeoSettings() { try { const apiBase = "https://api.canhelp.gr" || 0; const res = await fetch(`${apiBase}/api/admin/seo-public`, { next: { revalidate: 60 } }); if (!res.ok) return {}; return res.json(); } catch { return {}; } } async function generateMetadata() { const seo = await fetchSeoSettings(); return { title: seo['seo.siteTitle'] || 'CanHelp — Βρες ειδικό για κάθε δουλειά', description: seo['seo.siteDescription'] || 'Η ελληνική πλατφόρμα για online ανάθεση εργασιών. Βρες επαγγελματίες για καθαρισμό, υδραυλικά, μαθήματα και πολλά άλλα.', keywords: 'εργασίες, ειδικοί, Ελλάδα, freelance, καθαρισμός, υδραυλικά', robots: seo['seo.indexingEnabled'] === 'false' ? 'noindex, nofollow' : undefined }; } async function RootLayout({ children }) { const cookieStore = await (0,next_headers__WEBPACK_IMPORTED_MODULE_1__/* .cookies */ .UL)(); const headerStore = await (0,next_headers__WEBPACK_IMPORTED_MODULE_1__/* .headers */ .b3)(); const pathname = headerStore.get('x-pathname') ?? ''; const isStandalone = pathname.startsWith('/site/'); const rawLocale = cookieStore.get('canhelp_locale')?.value; const locales = [ 'el', 'en', 'ru' ]; const initialLocale = locales.includes(rawLocale) ? rawLocale : 'el'; const initialLocation = decodeURIComponent(cookieStore.get('canhelp_location')?.value ?? ''); const seo = await fetchSeoSettings(); const headScripts = seo['seo.headScripts'] ?? ''; return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("html", { lang: initialLocale, children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("body", { children: [ headScripts && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(next_script__WEBPACK_IMPORTED_MODULE_2__["default"], { id: "seo-head-scripts", strategy: "beforeInteractive", dangerouslySetInnerHTML: { __html: headScripts } }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_context_locale__WEBPACK_IMPORTED_MODULE_6__.LocaleProvider, { initialLocale: initialLocale, children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_context_location__WEBPACK_IMPORTED_MODULE_7__.LocationProvider, { initialSlug: initialLocation, children: [ !isStandalone && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_Header__WEBPACK_IMPORTED_MODULE_4__.Header, {}), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("main", { className: "min-h-screen", children: children }), !isStandalone && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ScrollToTopButton__WEBPACK_IMPORTED_MODULE_8__.ScrollToTopButton, {}), !isStandalone && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_Footer__WEBPACK_IMPORTED_MODULE_5__.Footer, {}) ] }) }) ] }) }); } /***/ }), /***/ 48178: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ E: () => (/* binding */ shortName), /* harmony export */ H: () => (/* binding */ formatShortName) /* harmony export */ }); /** * Shortens the last name to first letter + period. * "Иван Петров" → "Иван П." * Works with a pre-composed full name string. */ function shortName(fullName) { if (!fullName?.trim()) return '—'; const parts = fullName.trim().split(/\s+/); if (parts.length < 2 || !parts[1]) return parts[0]; return `${parts[0]} ${parts[1][0].toUpperCase()}.`; } /** * Formats separate firstName + lastName fields, shortening the last name. * Falls back to parsing fullName if firstName is not available. */ function formatShortName(firstName, lastName, fallbackName) { if (firstName?.trim()) { const l = lastName?.trim(); return l ? `${firstName.trim()} ${l[0].toUpperCase()}.` : firstName.trim(); } return shortName(fallbackName); } /***/ }), /***/ 49046: /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 94496, 23)); /***/ }), /***/ 56003: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocationProvider: () => (/* binding */ LocationProvider), /* harmony export */ z: () => (/* binding */ useLocation) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _lib_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(91864); /* __next_internal_client_entry_do_not_use__ LocationProvider,useLocation auto */ const LocationContext = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)({ locationSlug: '', locationTree: [], locationLoading: true, setLocation: ()=>{}, getLabel: ()=>'' }); function readCookieLocation() { if (typeof document === 'undefined') return ''; const match = document.cookie.match(/(?:^|;\s*)canhelp_location=([^;]+)/); return match?.[1] ? decodeURIComponent(match[1]) : ''; } function LocationProvider({ children, initialSlug = '' }) { const [locationSlug, setLocationSlug] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(initialSlug); const [locationTree, setLocationTree] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]); const [locationLoading, setLocationLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true); // Sync from cookie on client mount process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{ const cookieSlug = readCookieLocation(); setLocationSlug(cookieSlug); }, []); // Load location tree once process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{ (0,_lib_api__WEBPACK_IMPORTED_MODULE_2__/* .getLocations */ .Vs)().then((tree)=>setLocationTree(tree)).catch(()=>{}).finally(()=>setLocationLoading(false)); }, []); const setLocation = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((slug)=>{ setLocationSlug(slug); const encoded = encodeURIComponent(slug); document.cookie = `canhelp_location=${encoded}; path=/; max-age=31536000; SameSite=Lax`; }, []); const getLabel = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((locale)=>{ if (!locationSlug) return ''; for (const city of locationTree){ if (city.slug === locationSlug) return city.names[locale] ?? city.names.el; for (const d of city.children ?? []){ if (d.slug === locationSlug) return d.names[locale] ?? d.names.el; } } return locationSlug; }, [ locationSlug, locationTree ]); return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(LocationContext.Provider, { value: { locationSlug, locationTree, locationLoading, setLocation, getLabel }, children: children }); } function useLocation() { return (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(LocationContext); } /***/ }), /***/ 58719: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; // EXPORTS __webpack_require__.d(__webpack_exports__, { Header: () => (/* binding */ Header) }); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js var react_jsx_runtime = __webpack_require__(78157); // EXTERNAL MODULE: ../../node_modules/next/dist/client/app-dir/link.js var app_dir_link = __webpack_require__(94496); var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); // EXTERNAL MODULE: ../../node_modules/next/dist/api/navigation.js var navigation = __webpack_require__(71159); // EXTERNAL MODULE: ./src/lib/auth.ts var auth = __webpack_require__(13260); // EXTERNAL MODULE: ./src/context/locale.tsx var context_locale = __webpack_require__(96484); // EXTERNAL MODULE: ./src/lib/formatName.ts var formatName = __webpack_require__(48178); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react.js var react = __webpack_require__(31768); // EXTERNAL MODULE: ./src/lib/translations.ts var translations = __webpack_require__(12998); ;// ./src/components/LanguageSwitcher.tsx /* __next_internal_client_entry_do_not_use__ LanguageSwitcher auto */ function LanguageSwitcher() { const { locale, setLocale } = (0,context_locale/* useLocale */.Y)(); const [open, setOpen] = (0,react.useState)(false); const ref = (0,react.useRef)(null); const current = translations/* LOCALES */.YZ.find((l)=>l.code === locale) ?? translations/* LOCALES */.YZ[0]; // Close on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ function handleClick(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false); } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); return /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { ref: ref, className: "relative", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { onClick: ()=>setOpen(!open), className: "flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg border border-gray-200 hover:border-blue-400 hover:bg-blue-50 transition text-sm font-medium text-gray-700", "aria-label": "Change language", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { children: current.code.toUpperCase() }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-3.5 h-3.5 text-gray-400 transition-transform ${open ? 'rotate-180' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), open && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("div", { className: "absolute right-0 mt-1 w-40 bg-white border border-gray-200 rounded-xl shadow-lg z-50 overflow-hidden", children: translations/* LOCALES */.YZ.map((loc)=>/*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { onClick: ()=>{ setLocale(loc.code); setOpen(false); }, className: `w-full flex items-center gap-2.5 px-3.5 py-2.5 text-sm hover:bg-blue-50 transition ${locale === loc.code ? 'bg-blue-50 text-blue-700 font-medium' : 'text-gray-700'}`, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { children: loc.label }), locale === loc.code && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-3.5 h-3.5 ml-auto text-blue-600", fill: "currentColor", viewBox: "0 0 20 20", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { fillRule: "evenodd", d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", clipRule: "evenodd" }) }) ] }, loc.code)) }) ] }); } // EXTERNAL MODULE: ./src/lib/api.ts var api = __webpack_require__(91864); // EXTERNAL MODULE: ../../node_modules/socket.io-client/build/esm-debug/index.js + 30 modules var esm_debug = __webpack_require__(44826); ;// ./src/components/Header.tsx /* __next_internal_client_entry_do_not_use__ Header auto */ const API_URL = "https://api.canhelp.gr" || 0; function Header() { const router = (0,navigation.useRouter)(); const pathname = (0,navigation.usePathname)(); const { data: session } = (0,auth/* useSession */.wV)(); const { t, locale } = (0,context_locale/* useLocale */.Y)(); const [menuOpen, setMenuOpen] = (0,react.useState)(false); const [profileOpen, setProfileOpen] = (0,react.useState)(false); const [unreadNotif, setUnreadNotif] = (0,react.useState)(0); const [unreadChat, setUnreadChat] = (0,react.useState)(0); const [msgToast, setMsgToast] = (0,react.useState)(null); const [planTier, setPlanTier] = (0,react.useState)(null); const profileRef = (0,react.useRef)(null); const headerRef = (0,react.useRef)(null); const toastTimer = (0,react.useRef)(null); // Close dropdowns on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ function handleClick(e) { if (profileRef.current && !profileRef.current.contains(e.target)) { setProfileOpen(false); } } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); const isAdmin = session?.user?.role === 'admin'; const isSpecialist = session?.user?.role === 'specialist'; // Reset chat badge when entering chat process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ if (pathname === '/chat') setUnreadChat(0); }, [ pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ if (!session) return; const socket = (0,esm_debug.io)(API_URL, { withCredentials: true, transports: [ 'websocket', 'polling' ] }); socket.on('new_message', (msg)=>{ if (pathname === '/chat') return; setUnreadChat((c)=>c + 1); if (toastTimer.current) clearTimeout(toastTimer.current); setMsgToast(msg); toastTimer.current = setTimeout(()=>setMsgToast(null), 5000); }); return ()=>{ socket.disconnect(); if (toastTimer.current) clearTimeout(toastTimer.current); }; }, [ session, pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ if (!session) { setUnreadNotif(0); return; } const fetch = ()=>(0,api/* getUnreadCount */.$M)().then((r)=>setUnreadNotif(r.count)).catch(()=>{}); fetch(); const timer = setInterval(fetch, 30000); return ()=>clearInterval(timer); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ if (!session) { setPlanTier(null); return; } (0,api/* getMyDashboard */.H)().then((d)=>setPlanTier(d.plan?.tier ?? null)).catch(()=>{}); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react.useEffect)(()=>{ const onScroll = ()=>{ if (!headerRef.current) return; if (window.scrollY > 40) { headerRef.current.classList.add('header-shrink'); } else { headerRef.current.classList.remove('header-shrink'); } }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("header", { ref: headerRef, className: "header-base bg-white border-b border-gray-200 sticky top-0 z-50 transition-all duration-300", children: /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between h-16 header-content transition-all duration-300", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/", className: "flex items-center shrink-0", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "logo-text text-2xl font-bold text-blue-600 transition-all duration-300", children: "CanHelp" }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("nav", { className: "hidden md:flex items-center gap-5 ml-auto", children: [ isSpecialist ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/tasks", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.find_tasks') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/dashboard", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.dashboard') }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/tasks/new", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('dashboard.new_task') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/specialists", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.specialists') }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/pricing", className: `font-medium text-sm transition ${pathname === '/pricing' ? 'text-blue-600' : 'text-gray-600 hover:text-blue-600'}`, children: t('nav.pricing', 'Pricing') }), session ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/notifications", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-5 h-5 ${unreadNotif > 0 ? 'text-orange-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), unreadNotif > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/chat", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-5 h-5 ${unreadChat > 0 ? 'text-green-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), unreadChat > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "relative", ref: profileRef, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { onClick: ()=>setProfileOpen(!profileOpen), className: "flex items-center gap-1.5 text-sm font-medium text-gray-600 hover:text-blue-600", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "truncate max-w-[100px]", children: (0,formatName/* formatShortName */.H)(session.user.firstName, session.user.lastName, session.user.name) }), planTier === 'pro' && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-blue-100 text-blue-700 leading-none", children: "Pro" }), planTier === 'ultimate' && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-gradient-to-r from-amber-400 via-yellow-400 to-amber-400 text-gray-900 shadow-sm shadow-amber-300/50 leading-none", children: "★" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), profileOpen && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "absolute right-0 mt-2 w-52 bg-white border border-gray-200 rounded-xl shadow-lg py-1 z-50", children: [ isSpecialist ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks/new", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/specialists", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/notifications", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-4 h-4 shrink-0 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/chat", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-4 h-4 shrink-0 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("span", { className: "flex items-center gap-1.5", children: [ t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/dashboard", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), isAdmin && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/schedule", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/admin", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/profile", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/favorites", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("hr", { className: "my-1 border-gray-100" }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { className: "w-full flex items-center gap-2.5 px-4 py-2 text-sm text-red-500 hover:bg-red-50", onClick: ()=>{ setProfileOpen(false); (0,auth/* signOut */.CI)().then(()=>{ window.location.href = '/'; }); }, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/login", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.login') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/register", className: "bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 font-medium text-sm", children: t('nav.register') }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)(LanguageSwitcher, {}) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "md:hidden flex items-center gap-2", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)(LanguageSwitcher, {}), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("button", { className: "p-2", onClick: ()=>setMenuOpen(!menuOpen), "aria-label": "Toggle menu", children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-5 h-5 text-gray-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: menuOpen ? /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) : /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4 6h16M4 12h16M4 18h16" }) }) }) ] }) ] }), menuOpen && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "md:hidden py-4 border-t border-gray-100 flex flex-col gap-3", children: [ isSpecialist ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }), session ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/chat", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-4 h-4 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "ml-1 px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full", children: unreadChat }) ] }), isSpecialist ? /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/notifications", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: `w-4 h-4 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/favorites", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/schedule", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/admin", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)((link_default()), { href: "/profile", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("button", { onClick: ()=>{ setMenuOpen(false); (0,auth/* signOut */.CI)().then(()=>{ window.location.href = '/'; }); }, className: "flex items-center gap-2 text-left text-red-500 py-1 font-medium", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ (0,react_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) : /*#__PURE__*/ (0,react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/login", className: "text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.login') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: "/register", className: "text-blue-600 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.register') }) ] }) ] }) ] }) }), msgToast && /*#__PURE__*/ (0,react_jsx_runtime.jsx)("div", { className: "fixed bottom-5 right-5 z-[200] max-w-sm w-full", children: /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "bg-white border border-gray-200 rounded-xl shadow-xl p-4 flex items-start gap-3 animate-fade-in", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("span", { className: "text-2xl shrink-0", children: "\uD83D\uDCAC" }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-0", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("p", { className: "font-semibold text-gray-900 text-sm", children: t('chat.toast_title') }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)("p", { className: "text-xs text-gray-500 truncate mt-0.5", children: msgToast.body }) ] }), /*#__PURE__*/ (0,react_jsx_runtime.jsxs)("div", { className: "flex flex-col items-end gap-2 shrink-0", children: [ /*#__PURE__*/ (0,react_jsx_runtime.jsx)("button", { onClick: ()=>setMsgToast(null), className: "text-gray-400 hover:text-gray-600 text-lg leading-none", "aria-label": "close", children: "\xd7" }), /*#__PURE__*/ (0,react_jsx_runtime.jsx)((link_default()), { href: `/chat?room=${msgToast.roomId}`, onClick: ()=>setMsgToast(null), className: "text-xs text-blue-600 hover:underline font-medium", children: t('chat.toast_open') }) ] }) ] }) }) ] }); } /***/ }), /***/ 64271: /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 58671, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56542, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 88248, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 49743, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 96231, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 10959, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 72041, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 95094, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 67487, 23)); /***/ }), /***/ 67674: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Header: () => (/* binding */ Header) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. const Header = (0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)( function() { throw new Error("Attempted to call Header() from the server but Header is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/Header.tsx", "Header", ); /***/ }), /***/ 72088: /***/ (() => { /* (ignored) */ /***/ }), /***/ 72519: /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 48365, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 64596, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56186, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 67805, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 27561, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 47569, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 42747, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56676, 23)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 97225)); /***/ }), /***/ 85998: /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 3498, 23)); /***/ }), /***/ 91864: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $7: () => (/* binding */ updateCategory), /* harmony export */ $H: () => (/* binding */ acceptOffer), /* harmony export */ $M: () => (/* binding */ getUnreadCount), /* harmony export */ Bb: () => (/* binding */ getMySpecialistCards), /* harmony export */ Bm: () => (/* binding */ getUserRating), /* harmony export */ Bq: () => (/* binding */ getSpecialistCards), /* harmony export */ Br: () => (/* binding */ getAdminNotifLogs), /* harmony export */ CX: () => (/* binding */ updateAdminSettings), /* harmony export */ Cs: () => (/* binding */ previewPlanChange), /* harmony export */ D1: () => (/* binding */ setAvailabilityRange), /* harmony export */ Em: () => (/* binding */ request), /* harmony export */ F7: () => (/* binding */ getSpecialists), /* harmony export */ F9: () => (/* binding */ getTaskInvite), /* harmony export */ FI: () => (/* binding */ sendTestEmail), /* harmony export */ Fu: () => (/* binding */ getMyTasks), /* harmony export */ GB: () => (/* binding */ deleteTaskAdmin), /* harmony export */ Gp: () => (/* binding */ getAutoResponseSettings), /* harmony export */ H: () => (/* binding */ getMyDashboard), /* harmony export */ H6: () => (/* binding */ getTaskReviews), /* harmony export */ He: () => (/* binding */ activateUser), /* harmony export */ Ip: () => (/* binding */ markRead), /* harmony export */ Je: () => (/* binding */ purchasePlan), /* harmony export */ K7: () => (/* binding */ deleteCategory), /* harmony export */ KD: () => (/* binding */ getAdminCategories), /* harmony export */ Lb: () => (/* binding */ declineOffer), /* harmony export */ Lp: () => (/* binding */ getAdminEmailTemplates), /* harmony export */ ML: () => (/* binding */ getCustomerFomoDashboard), /* harmony export */ Mm: () => (/* binding */ changeUserRole), /* harmony export */ NL: () => (/* binding */ markAllRead), /* harmony export */ Nt: () => (/* binding */ updateLocation), /* harmony export */ OM: () => (/* binding */ setAvailability), /* harmony export */ OV: () => (/* binding */ runAutoMatch), /* harmony export */ OX: () => (/* binding */ getAdminPlans), /* harmony export */ On: () => (/* binding */ getCanMessage), /* harmony export */ P0: () => (/* binding */ adminTopUpUserBalance), /* harmony export */ QN: () => (/* binding */ getOrCreateDirectRoom), /* harmony export */ RN: () => (/* binding */ getSiteStats), /* harmony export */ RQ: () => (/* binding */ updateAutoResponseSettings), /* harmony export */ Rt: () => (/* binding */ completeTask), /* harmony export */ S$: () => (/* binding */ getPublicSiteProfile), /* harmony export */ Sw: () => (/* binding */ getOffers), /* harmony export */ T9: () => (/* binding */ getPlans), /* harmony export */ Tr: () => (/* binding */ getNotifications), /* harmony export */ UE: () => (/* binding */ trackSiteMessage), /* harmony export */ UT: () => (/* binding */ createTask), /* harmony export */ V: () => (/* binding */ addSpecialistFavorite), /* harmony export */ VL: () => (/* binding */ getMessages), /* harmony export */ VM: () => (/* binding */ getUserProfile), /* harmony export */ Vs: () => (/* binding */ getLocations), /* harmony export */ Wi: () => (/* binding */ deactivateUser), /* harmony export */ Xz: () => (/* binding */ getSpecialistAvailability), /* harmony export */ Yj: () => (/* binding */ getAdminTasks), /* harmony export */ Zp: () => (/* binding */ getChatRooms), /* harmony export */ _z: () => (/* binding */ sendMessage), /* harmony export */ aT: () => (/* binding */ getMyOffers), /* harmony export */ bR: () => (/* binding */ deletePlan), /* harmony export */ bW: () => (/* binding */ getCategories), /* harmony export */ bc: () => (/* binding */ toggleStatus), /* harmony export */ bi: () => (/* binding */ getAdminNotifStats), /* harmony export */ bx: () => (/* binding */ createReview), /* harmony export */ cS: () => (/* binding */ getAdminUsers), /* harmony export */ dE: () => (/* binding */ getAdminStats), /* harmony export */ eR: () => (/* binding */ createSpecialistCard), /* harmony export */ eU: () => (/* binding */ updateReportStatus), /* harmony export */ f5: () => (/* binding */ deleteSpecialistCard), /* harmony export */ fm: () => (/* binding */ getBalanceHistory), /* harmony export */ g0: () => (/* binding */ getAdminBalanceHistory), /* harmony export */ gg: () => (/* binding */ getTask), /* harmony export */ hD: () => (/* binding */ adminWithdrawUserBalance), /* harmony export */ hl: () => (/* binding */ updatePortfolioItem), /* harmony export */ iN: () => (/* binding */ getMyAvailability), /* harmony export */ j_: () => (/* binding */ getAdminAiLogs), /* harmony export */ jd: () => (/* binding */ getAdminUser), /* harmony export */ jg: () => (/* binding */ updateAdminEmailTemplate), /* harmony export */ k_: () => (/* binding */ getAdminLocations), /* harmony export */ lC: () => (/* binding */ updateTask), /* harmony export */ nf: () => (/* binding */ cancelTaskAdmin), /* harmony export */ oh: () => (/* binding */ initiateTopUp), /* harmony export */ oq: () => (/* binding */ adminUpdateSpecialistCard), /* harmony export */ pD: () => (/* binding */ getSpecialistFavorites), /* harmony export */ pK: () => (/* binding */ getPaymentHistory), /* harmony export */ q7: () => (/* binding */ getMyReviews), /* harmony export */ qT: () => (/* binding */ createPlan), /* harmony export */ qt: () => (/* binding */ getAdminMailLogs), /* harmony export */ rC: () => (/* binding */ getAdminSettings), /* harmony export */ rl: () => (/* binding */ getSkillSuggestions), /* harmony export */ sD: () => (/* binding */ removeSpecialistFavorite), /* harmony export */ st: () => (/* binding */ getMyReferralInfo), /* harmony export */ td: () => (/* binding */ updatePlan), /* harmony export */ ts: () => (/* binding */ createOffer), /* harmony export */ u4: () => (/* binding */ getAdminMailStats), /* harmony export */ v9: () => (/* binding */ getUserReviews), /* harmony export */ vh: () => (/* binding */ getTaskStats), /* harmony export */ vy: () => (/* binding */ getAdminUserSpecialistCards), /* harmony export */ wc: () => (/* binding */ translateAdminEmailTemplate), /* harmony export */ wl: () => (/* binding */ updateAdminUser), /* harmony export */ yJ: () => (/* binding */ createLocation), /* harmony export */ yO: () => (/* binding */ getAdminActivityLogs), /* harmony export */ yk: () => (/* binding */ dismissNotification), /* harmony export */ z4: () => (/* binding */ getDailyUsage), /* harmony export */ z5: () => (/* binding */ getAdminReports), /* harmony export */ z6: () => (/* binding */ getMyStatuses), /* harmony export */ zB: () => (/* binding */ deletePortfolioItem), /* harmony export */ zR: () => (/* binding */ deleteLocation), /* harmony export */ zZ: () => (/* binding */ createCategory), /* harmony export */ zc: () => (/* binding */ updateSpecialistCard), /* harmony export */ zk: () => (/* binding */ getSpecialistFomoDashboard) /* harmony export */ }); /* unused harmony exports getTasks, getTaskBudgetRange, searchTasks, getTasksForSpecialist, getTaskCountsByCategory, cancelTask, updateNotifSettings, getFavorites, addFavorite, removeFavorite, getMyPortfolio, addPortfolioItem, getSpecialistPortfolio, getFomoRecommendations, getAutoMatchResults, getGoogleCalendarStatus, disconnectGoogleCalendar, importFromGoogleCalendar, getGoogleCalendarConnectUrl */ const BASE = "https://api.canhelp.gr" || 0; async function request(path, init) { const res = await fetch(`${BASE}/api${path}`, { ...init, credentials: 'include', headers: { 'Content-Type': 'application/json', ...init?.headers } }); if (!res.ok) { const err = await res.json().catch(()=>({ error: res.statusText })); const msg = typeof err.error === 'string' ? err.error : typeof err.message === 'string' ? err.message : res.statusText || 'Request failed'; throw new Error(msg); } return res.json(); } // ─── Tasks ──────────────────────────────────────────────────────────────── const getTasks = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks${qs}`); }; const getTaskBudgetRange = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks/budget-range${qs}`); }; const searchTasks = (params)=>request(`/tasks/search?${new URLSearchParams(params)}`); const getMyTasks = ()=>request('/tasks/my'); const getTasksForSpecialist = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks/for-me${qs}`); }; const getTaskCountsByCategory = ()=>request('/tasks/counts-by-category'); const getTask = (id)=>request(`/tasks/${id}`); const createTask = (data)=>request('/tasks', { method: 'POST', body: JSON.stringify(data) }); const updateTask = (id, data)=>request(`/tasks/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const completeTask = (id)=>request(`/tasks/${id}/complete`, { method: 'PATCH' }); const cancelTask = (id)=>request(`/tasks/${id}/cancel`, { method: 'PATCH' }); // ─── Offers ──────────────────────────────────────────────────────────────── const getOffers = (taskId)=>request(`/offers?taskId=${taskId}`); const getMyOffers = ()=>request('/offers/my'); const createOffer = (data)=>request('/offers', { method: 'POST', body: JSON.stringify(data) }); const acceptOffer = (id)=>request(`/offers/${id}/accept`, { method: 'PATCH' }); const declineOffer = (id)=>request(`/offers/${id}/decline`, { method: 'PATCH' }); const getUserProfile = (id)=>request(`/users/${id}/profile`); const getSpecialists = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/users/specialists${qs}`); }; const createReview = (data)=>request('/reviews', { method: 'POST', body: JSON.stringify(data) }); const getTaskReviews = (taskId)=>request(`/reviews/task/${taskId}`); const getMyReviews = ()=>request('/reviews/my'); // ─── Chat ────────────────────────────────────────────────────────────────── const getChatRooms = ()=>request('/chat/rooms'); const getOrCreateDirectRoom = (userId)=>request(`/chat/direct/${userId}`); const getCanMessage = (userId)=>request(`/chat/can-message/${userId}`); const getMessages = (roomId)=>request(`/chat/rooms/${roomId}/messages`); const sendMessage = (roomId, body)=>request('/chat/messages', { method: 'POST', body: JSON.stringify({ roomId, body }) }); // ─── Notifications ──────────────────────────────────────────────────────── const updateNotifSettings = (data)=>request('/users/me', { method: 'PATCH', body: JSON.stringify(data) }); const getNotifications = ()=>request('/notifications'); const getUnreadCount = ()=>request('/notifications/count'); const markRead = (id)=>request(`/notifications/${id}/read`, { method: 'PATCH' }); const markAllRead = ()=>request('/notifications/read-all', { method: 'PATCH' }); const getTaskInvite = (taskId)=>request(`/notifications?type=task_invite&referenceId=${taskId}`); const dismissNotification = (id)=>request(`/notifications/${id}`, { method: 'DELETE' }); // ─── Referral ───────────────────────────────────────────────────────────── const getMyReferralInfo = ()=>request('/users/me/referral'); // ─── Reviews ────────────────────────────────────────────────────────────── const getUserReviews = (userId)=>request(`/reviews/user/${userId}`); const getUserRating = (userId)=>request(`/reviews/user/${userId}/rating`); // ─── Categories ─────────────────────────────────────────────────────────── const getCategories = ()=>request('/categories'); // ─── Locations ──────────────────────────────────────────────────────────── const getLocations = ()=>request('/locations'); // ─── Favorites ──────────────────────────────────────────────────────────── const getFavorites = ()=>request('/favorites'); const addFavorite = (taskId)=>request(`/favorites/${taskId}`, { method: 'POST' }); const removeFavorite = (taskId)=>request(`/favorites/${taskId}`, { method: 'DELETE' }); const getSpecialistFavorites = ()=>request('/favorites/specialists'); const addSpecialistFavorite = (specialistId)=>request(`/favorites/specialists/${specialistId}`, { method: 'POST' }); const removeSpecialistFavorite = (specialistId)=>request(`/favorites/specialists/${specialistId}`, { method: 'DELETE' }); // ─── Admin ───────────────────────────────────────────────────────────────── // ─── Admin Categories ────────────────────────────────────────────────────── const getAdminCategories = ()=>request('/admin/categories'); const createCategory = (data)=>request('/admin/categories', { method: 'POST', body: JSON.stringify(data) }); const updateCategory = (id, data)=>request(`/admin/categories/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deleteCategory = (id)=>request(`/admin/categories/${id}`, { method: 'DELETE' }); // ─── Admin ───────────────────────────────────────────────────────────────── const getAdminStats = ()=>request('/admin/stats'); const getAdminUsers = (page = 1, q, role)=>{ const p = new URLSearchParams({ page: String(page), limit: '20' }); if (q) p.set('q', q); if (role) p.set('role', role); return request(`/admin/users?${p}`); }; const deactivateUser = (id)=>request(`/admin/users/${id}/deactivate`, { method: 'PATCH' }); const activateUser = (id)=>request(`/admin/users/${id}/activate`, { method: 'PATCH' }); const changeUserRole = (id, role)=>request(`/admin/users/${id}/role`, { method: 'PATCH', body: JSON.stringify({ role }) }); const getAdminUser = (id)=>request(`/admin/users/${id}`); const getAdminUserSpecialistCards = (userId)=>request(`/admin/users/${userId}/specialist-cards`); const adminUpdateSpecialistCard = (id, data)=>request(`/admin/specialist-cards/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const updateAdminUser = (id, data)=>request(`/admin/users/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const getAdminTasks = (page = 1, q, status)=>{ const p = new URLSearchParams({ page: String(page), limit: '20' }); if (q) p.set('q', q); if (status) p.set('status', status); return request(`/admin/tasks?${p}`); }; const cancelTaskAdmin = (id)=>request(`/admin/tasks/${id}/cancel`, { method: 'PATCH' }); const deleteTaskAdmin = (id)=>request(`/admin/tasks/${id}`, { method: 'DELETE' }); const getAdminReports = (page = 1)=>request(`/admin/reports?page=${page}&limit=20`); const updateReportStatus = (id, status)=>request(`/admin/reports/${id}/status`, { method: 'PATCH', body: JSON.stringify({ status }) }); const getAdminAiLogs = (page = 1)=>request(`/admin/ai-logs?page=${page}&limit=50`); const getAdminActivityLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.event) p.set('event', params.event); if (params.userId) p.set('userId', params.userId); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/activity-logs?${p}`); }; const getAdminMailLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.event) p.set('event', params.event); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/mail-logs?${p}`); }; const getAdminNotifLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.type) p.set('type', params.type); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/notification-logs?${p}`); }; const getAdminNotifStats = ()=>request('/admin/notification-stats'); const getAdminMailStats = ()=>request('/admin/mail-stats'); // ─── Admin Locations ─────────────────────────────────────────────────────── const getAdminLocations = ()=>request('/admin/locations'); const createLocation = (data)=>request('/admin/locations', { method: 'POST', body: JSON.stringify(data) }); const updateLocation = (id, data)=>request(`/admin/locations/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deleteLocation = (id)=>request(`/admin/locations/${id}`, { method: 'DELETE' }); // ─── Admin Plans ─────────────────────────────────────────────────────────── const getAdminPlans = ()=>request('/admin/plans'); const createPlan = (data)=>request('/admin/plans', { method: 'POST', body: JSON.stringify(data) }); const updatePlan = (id, data)=>request(`/admin/plans/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deletePlan = (id)=>request(`/admin/plans/${id}`, { method: 'DELETE' }); // ─── Admin Settings ──────────────────────────────────────────────────────── const getAdminSettings = ()=>request('/admin/settings'); const updateAdminSettings = (data)=>request('/admin/settings', { method: 'PUT', body: JSON.stringify(data) }); const getAdminEmailTemplates = ()=>request('/admin/settings/templates'); const updateAdminEmailTemplate = (key, data)=>request(`/admin/settings/templates/${key}`, { method: 'PUT', body: JSON.stringify(data) }); const translateAdminEmailTemplate = (data)=>request('/admin/settings/templates/translate', { method: 'POST', body: JSON.stringify(data) }); const sendTestEmail = ()=>request('/admin/settings/test-email', { method: 'POST' }); // ─── Availability ────────────────────────────────────────────────────────── const getMyAvailability = (month)=>request(`/availability/my${month ? `?month=${month}` : ''}`); const setAvailability = (date, status, note)=>request('/availability/set', { method: 'POST', body: JSON.stringify({ date, status, note }) }); const setAvailabilityRange = (from, to, status)=>request('/availability/set-range', { method: 'POST', body: JSON.stringify({ from, to, status }) }); const getSpecialistAvailability = (userId, month)=>request(`/availability/user/${userId}${month ? `?month=${month}` : ''}`); const getMyPortfolio = ()=>request('/portfolio/my'); const addPortfolioItem = (formData)=>fetch(`${BASE}/api/portfolio`, { method: 'POST', credentials: 'include', body: formData }).then(async (res)=>{ if (!res.ok) { const err = await res.json().catch(()=>({ error: res.statusText })); throw new Error(err.error || 'Upload failed'); } return res.json(); }); const updatePortfolioItem = (id, data)=>request(`/portfolio/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deletePortfolioItem = (id)=>request(`/portfolio/${id}`, { method: 'DELETE' }); const getSpecialistPortfolio = (userId)=>request(`/portfolio/user/${userId}`); const getMySpecialistCards = ()=>request('/specialist-cards/my'); const createSpecialistCard = (data)=>request('/specialist-cards', { method: 'POST', body: JSON.stringify(data) }); const updateSpecialistCard = (id, data)=>request(`/specialist-cards/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); const deleteSpecialistCard = (id)=>request(`/specialist-cards/${id}`, { method: 'DELETE' }); const getSpecialistCards = (userId)=>request(`/specialist-cards/user/${userId}`); const getSkillSuggestions = (categorySlugs)=>{ const params = categorySlugs?.length ? '?' + categorySlugs.map((s)=>`category=${encodeURIComponent(s)}`).join('&') : ''; return request(`/skill-suggestions${params}`); }; const initiateTopUp = (amount)=>request('/payments/topup/init', { method: 'POST', body: JSON.stringify({ amount }) }); const getPaymentHistory = ()=>request('/payments/history'); const getBalanceHistory = (limit = 50)=>request(`/payments/balance-history?limit=${limit}`); const getAdminBalanceHistory = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.userId) p.set('userId', params.userId); if (params.kind) p.set('kind', params.kind); p.set('limit', '50'); return request(`/admin/balance-history?${p}`); }; const adminTopUpUserBalance = (id, data)=>request(`/admin/users/${id}/balance/topup`, { method: 'POST', body: JSON.stringify(data) }); const adminWithdrawUserBalance = (id, data)=>request(`/admin/users/${id}/balance/withdraw`, { method: 'POST', body: JSON.stringify(data) }); const previewPlanChange = (planId)=>request('/payments/plan/preview', { method: 'POST', body: JSON.stringify({ planId }) }); const getPlans = (role)=>{ const qs = role ? `?role=${role}` : ''; return request(`/plans${qs}`); }; const getMyDashboard = ()=>request('/dashboard/me'); const getDailyUsage = ()=>request('/plans/daily-usage'); const purchasePlan = (planId, payFromBalance = true)=>request('/payments/plan/purchase', { method: 'POST', body: JSON.stringify({ planId, payFromBalance }) }); // ─── Statuses ────────────────────────────────────────────────────────────── const getMyStatuses = ()=>request('/statuses/me'); const toggleStatus = (statusType, active)=>request('/statuses/toggle', { method: 'POST', body: JSON.stringify({ statusType, active }) }); const getAutoResponseSettings = ()=>request('/auto-response'); const updateAutoResponseSettings = (data)=>request('/auto-response', { method: 'PUT', body: JSON.stringify(data) }); // ─── FOMO ────────────────────────────────────────────────────────────────── const getSpecialistFomoDashboard = ()=>request('/fomo/specialist'); const getCustomerFomoDashboard = ()=>request('/fomo/customer'); const getFomoRecommendations = ()=>request('/fomo/recommendations'); // ─── Auto-match ──────────────────────────────────────────────────────────── const getAutoMatchResults = (taskId)=>request(`/auto-match/${taskId}`); const runAutoMatch = (taskId)=>request(`/auto-match/${taskId}`, { method: 'POST' }); // ─── Google Calendar ─────────────────────────────────────────────────────── const getGoogleCalendarStatus = ()=>request('/google/calendar/status'); const disconnectGoogleCalendar = ()=>request('/google/calendar/disconnect', { method: 'DELETE' }); const importFromGoogleCalendar = ()=>request('/google/calendar/import', { method: 'POST' }); const getGoogleCalendarConnectUrl = ()=>`${BASE}/api/google/calendar/connect`; // ─── Personal site ───────────────────────────────────────────────────────── const getPublicSiteProfile = (slug)=>request(`/users/site/${slug}`); const getSiteStats = ()=>request('/users/me/site-stats'); const trackSiteMessage = (slug)=>request(`/users/site/${slug}/track-message`, { method: 'POST' }).catch(()=>{}); // ─── Task stats (FOMO) ───────────────────────────────────────────────────── const getTaskStats = (taskId)=>request(`/tasks/${taskId}/stats`); /***/ }), /***/ 91946: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43560); /* harmony import */ var next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (async (props) => { const imageData = {"type":"image/svg+xml","sizes":"any"} const imageUrl = (0,next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__.fillMetadataSegment)(".", await props.params, "icon.svg") return [{ ...imageData, url: imageUrl + "?71a523b2dd824001", }] }); /***/ }), /***/ 95837: /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 39348)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 67674)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 32948)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 20138)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 1697)); ; Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 33219, 23)); /***/ }), /***/ 96484: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocaleProvider: () => (/* binding */ LocaleProvider), /* harmony export */ Y: () => (/* binding */ useLocale) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71159); /* harmony import */ var _lib_translations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12998); /* __next_internal_client_entry_do_not_use__ LocaleProvider,useLocale auto */ const COOKIE_KEY = 'canhelp_locale'; const DEFAULT_LOCALE = 'el'; const LocaleContext = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)({ locale: DEFAULT_LOCALE, setLocale: ()=>{}, t: (key)=>key }); function readCookieLocale() { if (typeof document === 'undefined') return DEFAULT_LOCALE; const match = document.cookie.match(/canhelp_locale=([^;]+)/); const val = match?.[1]; return val && [ 'el', 'en', 'ru' ].includes(val) ? val : DEFAULT_LOCALE; } function LocaleProvider({ children, initialLocale }) { const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_2__.useRouter)(); const [locale, setLocaleState] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(initialLocale ?? DEFAULT_LOCALE); // Sync from cookie on mount (client-side) process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{ const cookieLocale = readCookieLocale(); if (cookieLocale !== locale) setLocaleState(cookieLocale); // Sync cookie locale to DB on first load (in case DB is out of sync) const apiBase = "https://api.canhelp.gr" || 0; fetch(`${apiBase}/api/users/me`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ locale: cookieLocale }) }).catch(()=>{}); }, []); const setLocale = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((next)=>{ setLocaleState(next); document.cookie = `${COOKIE_KEY}=${next}; path=/; max-age=31536000; SameSite=Lax`; document.documentElement.lang = next; // Persist locale to user profile in DB (best-effort, non-blocking) const apiBase = "https://api.canhelp.gr" || 0; fetch(`${apiBase}/api/users/me`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ locale: next }) }).catch(()=>{}); // Re-render server components with new cookie router.refresh(); }, [ router ]); const t = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((key, fallback)=>(0,_lib_translations__WEBPACK_IMPORTED_MODULE_3__/* .getTranslations */ .$)(locale)(key, fallback), [ locale ]); return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(LocaleContext.Provider, { value: { locale, setLocale, t }, children: children }); } function useLocale() { return (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(LocaleContext); } /***/ }) }; ; {}mapbufferedMap @$ConcatSourceRawSourceHexports.id = 244; exports.ids = [244]; exports.modules = { /***/ 1241: /***/ (() => {  RawSource/* (ignored) */ /***/ }), /***/ 1697: _/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict";  /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocationProvider: () => (/* binding */ LocationProvider) /* harmony export */ }); /* unused harmony export useLocation */ /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); ReplaceSourceRawSource// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const LocationProvider = registerClientReference( function() { throw new Error("Attempted to call LocationProvider() from the server but LocationProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/location.tsx", "LocationProvider", );export const useLocation = registerClientReference( function() { throw new Error("Attempted to call useLocation() from the server but useLocation is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/location.tsx", "useLocation", );61134undefined136142undefined168190(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined537543undefined564586(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined, /***/ 12998: /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $: () => (/* binding */ getTranslations), /* harmony export */ YZ: () => (/* binding */ LOCALES) /* harmony export */ }); /* unused harmony export translations */ :export const LOCALES = [ { code: 'el', label: 'Ελληνικά', flag: '🇬🇷' }, { code: 'en', label: 'English', flag: '🇬🇧' }, { code: 'ru', label: 'Русский', flag: '🇷🇺' } ]; export const translations = { el: { 'footer.slogan': 'Η εργασία σου — η φροντίδα μας! Λύνουμε κάθε ζήτημα γρήγορα και εύκολα.', 'footer.links': 'Σύνδεσμοι', 'footer.socials': 'Στα κοινωνικά δίκτυα', // Nav 'nav.home': 'Αρχική', 'nav.tasks': 'Εργασίες', 'nav.post': '+ Δημοσίευση', 'nav.dashboard': 'Πίνακας', 'nav.chat': 'Μηνύματα', 'nav.notifications': 'Ειδοποιήσεις', 'nav.profile': 'Προφίλ', 'nav.admin': 'Διαχείριση', 'nav.specialists': 'Ειδικοί', 'nav.new_task': 'Νέα εργασία', 'nav.login': 'Σύνδεση', 'nav.register': 'Εγγραφή', 'nav.logout': 'Έξοδος', // Hero 'hero.title': 'Βρες ειδικό για κάθε δουλειά', 'hero.subtitle': 'Δημοσίευσε εργασία, λάβε προσφορές και επίλεξε τον καλύτερο επαγγελματία', 'hero.cta.post': 'Δημοσίευσε εργασία', 'hero.cta.browse': 'Βρες εργασία', 'hero.search.placeholder': 'Τι χρειάζεσαι; π.χ. ηλεκτρολόγος, καθαρισμός...', 'stats.specialists': 'ειδικοί', 'stats.tasks': 'εργασίες', 'stats.categories': 'κατηγορίες', 'stats.free': 'δωρεάν εγγραφή', // Sections 'section.categories': 'Δημιούργησε εργασία σε οποιαδήποτε κατηγορία', 'section.how': 'Πώς λειτουργεί', 'section.recent': 'Πρόσφατες εργασίες', 'section.all': 'Δες όλες →', 'section.more': 'ακόμα', 'section.cities': 'Πόλεις & Περιοχές', 'section.community': 'Ένα κοινοτικό έργο για όλους', 'community.subtitle': 'Το CanHelp δεν είναι απλώς μια αγορά — είναι μια κοινότητα αμοιβαίας βοήθειας. Οποιοσδήποτε έχει γνώση ή δεξιότητα μπορεί να βρει έναν πελάτη. Οποιοσδήποτε έχει ένα πρόβλημα μπορεί να βρει έναν ειδικό.', 'community.point1.title': 'Είσαι ειδικός σε κάτι;', 'community.point1.desc': 'Επισκευές, μαθήματα, σχεδιασμός, μεταφράσεις, φροντίδα — κάθε δεξιότητα αξίζει. Δημιούργησε προφίλ και βρες πελάτες κοντά σου.', 'community.point2.title': 'Χρειάζεσαι βοήθεια;', 'community.point2.desc': 'Δημοσίευσε εργασία σε λιγότερο από ένα λεπτό και λάβε προσφορές από επαληθευμένους ειδικούς στην πόλη σου.', 'community.point3.title': 'Βοήθησε το έργο να αναπτυχθεί', 'community.point3.desc': 'Το CanHelp αναπτύσσεται χάρη στις κοινότητες. Μοιράσου το σύνδεσμο με φίλους και γνωστούς — μαζί χτίζουμε κάτι χρήσιμο για όλους.', 'community.share': 'Μοιράσου με φίλους', 'community.share.copied': 'Σύνδεσμος αντιγράφηκε!', // Referral section on home page 'section.referral': 'Πρόγραμμα παραπομπών', 'referral.home.subtitle': 'Μοιράσου τον σύνδεσμό σου — κάθε νέος χρήστης που εγγράφεται μέσα από αυτόν σου αποφέρει ανταμοιβή.', 'referral.home.step1.title': 'Εγγραφείσε και λάβε σύνδεσμο', 'referral.home.step1.desc': 'Δημιούργησε λογαριασμό και βρες τον μοναδικό σου σύνδεσμο παραπομπής στο προφίλ σου.', 'referral.home.step2.title': 'Μοιράσου με φίλους', 'referral.home.step2.desc': 'Στείλε τον σύνδεσμο σε φίλους, γνωστούς ή δημοσίευσέ τον στα social media.', 'referral.home.step3.title': 'Κέρδισε ανταμοιβές', 'referral.home.step3.desc': 'Μόλις ο φίλος σου επαληθεύσει το email του, λαμβάνεις αυτόματα την ανταμοιβή σου.', 'referral.home.cta': 'Πάρε τον σύνδεσμό σου', 'referral.home.badge': 'Πρόγραμμα παραπομπών', // FAQ section 'section.faq': 'Συχνές Ερωτήσεις', 'faq.q1': 'Πώς λειτουργεί το CanHelp;', 'faq.a1': 'Δημοσίευσε μια εργασία, λάβε προσφορές από ειδικούς, επέλεξε τον καλύτερο και ξεκίνα τη συνεργασία. Είναι γρήγορο, απλό και δωρεάν για πελάτες.', 'faq.q2': 'Πόσο κοστίζει η χρήση της πλατφόρμας;', 'faq.a2': 'Η εγγραφή και η δημοσίευση εργασιών είναι εντελώς δωρεάν για πελάτες. Οι ειδικοί έχουν στη διάθεσή τους δωρεάν πλάνο καθώς και premium επιλογές.', 'faq.q3': 'Πώς μπορώ να γίνω ειδικός;', 'faq.a3': 'Κάνε εγγραφή, πήγαινε στο «Γίνε Ειδικός», συμπλήρωσε το προφίλ σου με δεξιότητες και κατηγορίες και αρχίνισε να λαμβάνεις εργασίες.', 'faq.q4': 'Πώς επιλέγω τον κατάλληλο ειδικό;', 'faq.a4': 'Δες τις αξιολογήσεις, την εμπειρία, τις δεξιότητες και το χαρτοφυλάκιο κάθε ειδικού. Επικοινώνησε μαζί του μέσω chat και συζήτα τις λεπτομέρειες πριν αποφασίσεις.', 'faq.q5': 'Τι γίνεται αν δεν είμαι ικανοποιημένος;', 'faq.a5': 'Μπορείς να αφήσεις αξιολόγηση για τον ειδικό και να τον βαθμολογήσεις από 1 έως 5 αστέρια. Οι αξιολογήσεις βοηθούν άλλους χρήστες να επιλέξουν έμπιστους επαγγελματίες.', 'faq.q6': 'Μπορώ να επικοινωνήσω με τον ειδικό πριν την αποδοχή;', 'faq.a6': 'Ναι. Μόλις λάβεις μια προσφορά, μπορείς να ανοίξεις chat με τον ειδικό, να κάνεις ερωτήσεις και να συντονίσεις τις λεπτομέρειες πριν αποφασίσεις.', 'faq.q7': 'Πόσος χρόνος χρειάζεται για να λάβω προσφορές;', 'faq.a7': 'Συνήθως μέσα σε λίγες ώρες. Οι ειδικοί λαμβάνουν ειδοποίηση για νέες εργασίες και μπορούν να απαντήσουν γρήγορα.', 'faq.q8': 'Μπορώ να δημοσιεύσω εργασία σε οποιαδήποτε πόλη της Ελλάδας;', 'faq.a8': 'Ναι! Το CanHelp καλύπτει όλη την Ελλάδα. Μπορείς να βρεις ειδικούς στην Αθήνα, στη Θεσσαλονίκη, στην Πάτρα και αλλού.', 'faq.q9': 'Τι είδη εργασιών μπορώ να βρω στο CanHelp;', 'faq.a9': 'Επισκευές, καθαρισμό, ηλεκτρολόγους, μαθήματα, σχεδιασμό, IT, μετακομίσεις, ομορφιά και πολλά άλλα. Οι κατηγορίες αυξάνονται συνεχώς.', 'faq.q10': 'Υπάρχει εφαρμογή για κινητό;', 'faq.a10': 'Ναι! Το CanHelp διατίθεται για Android και iOS. Κατέβασε την εφαρμογή και διαχειρίσου τα πάντα από το τηλέφωνό σου.', // How it works 'how.step1.title': 'Δημοσίευσε εργασία', 'how.step1.desc': 'Περίγραψε τι χρειάζεσαι και ορίζε τον προϋπολογισμό σου', 'how.step2.title': 'Λάβε προσφορές', 'how.step2.desc': 'Ειδικοί θα σου στείλουν προσφορές με τιμή και χρόνο', 'how.step3.title': 'Επίλεξε & ξεκίνα', 'how.step3.desc': 'Επέλεξε τον καλύτερο επαγγελματία και ξεκίνα τη συνεργασία', // Tasks page 'tasks.title': 'εργασίες', 'tasks.filters': 'Φίλτρα', 'tasks.search': 'Αναζήτηση', 'tasks.search.placeholder': 'Τίτλος ή λέξη κλειδί...', 'tasks.search.btn': 'Αναζήτηση', 'tasks.publish': 'Δημοσίευση', 'tasks.category.all': 'Όλες', 'tasks.category.all_in': 'Όλα στην', 'tasks.category.label': 'Κατηγορία', 'tasks.location.label': 'Πόλη', 'tasks.location.placeholder': 'π.χ. Αθήνα', 'tasks.empty': 'Δεν βρέθηκαν εργασίες', 'tasks.empty.cta': 'Δημοσίευσε την πρώτη', // Task detail 'task.status.open': 'Ανοιχτή', 'task.status.in_progress': 'Σε εξέλιξη', 'task.status.completed': 'Ολοκληρωμένη', 'task.status.cancelled': 'Ακυρωμένη', 'task.status.draft': 'Πρόχειρο', 'task.budget': 'Προϋπολογισμός', 'task.location': 'Τοποθεσία', 'task.deadline': 'Ημερομηνία έναρξης', 'task.created_at': 'Δημιουργήθηκε', 'task.customer': 'Πελάτης', 'task.offer.btn': 'Υποβολή προσφοράς', 'task.invite.banner_title': 'Σας προσκαλούν σε αυτήν την εργασία', 'task.invite.banner_hint': 'Ο πελάτης σας πρόσκαλεσε προσωπικά', 'task.invite.accept': 'Αποστολή προσφοράς', 'task.invite.decline': 'Άρνηση', 'offer.accept': 'Αποδοχή', 'offer.decline': 'Απόρριψη', 'task.complete': 'Ολοκλήρωση εργασίας', 'task.complete.confirm': 'Να ολοκληρωθεί η εργασία;', 'task.edit': 'Επεξεργασία', 'task.status_label': 'Κατάσταση', 'task.yours': 'Η εργασία σου', 'task.offer.yours': 'Η προσφορά σου', 'review.leave': 'Άφησε αξιολόγηση', 'review.rating': 'Βαθμολογία', 'review.comment': 'Σχόλιο', 'review.comment.placeholder': 'Πες μας για την εμπειρία σου...', 'review.submit': 'Υποβολή αξιολόγησης', 'review.submitting': 'Αποστολή...', 'review.done': 'Η αξιολόγηση καταχωρήθηκε!', 'profile.reviews': 'Αξιολογήσεις', 'profile.no_reviews': 'Δεν υπάρχουν αξιολογήσεις ακόμα', 'profile.rating': 'Βαθμολογία', 'profile.skills.label': 'Δεξιότητες', 'profile.member_since': 'Μέλος από', 'task.offers': 'Προσφορές', 'task.offers.none': 'Δεν υπάρχουν ακόμα προσφορές', // Create task 'create.title': 'Δημοσίευση εργασίας', 'create.field.title': 'Τίτλος', 'create.field.description': 'Περιγραφή', 'create.field.category': 'Κατηγορία', 'create.field.category.select': 'Επιλέξτε...', 'create.field.location': 'Τοποθεσία', 'create.field.location.any': 'Οπουδήποτε', 'create.field.location.all': 'Ολόκληρη η πόλη', 'create.field.budget': 'Προϋπολογισμός (€)', 'create.field.deadline': 'Ημερομηνία έναρξης', 'create.field.budget_negotiable': 'Η τιμή είναι διαπραγματεύσιμη', 'create.field.time_slot': 'Χρόνος εκτέλεσης', 'create.field.time_slot.any': 'Οποιαδήποτε', 'create.field.time_slot.morning': 'Πρωινό (08:00–13:00)', 'create.field.time_slot.afternoon': 'Μεσημέρι (13:00–18:00)', 'create.field.time_slot.evening': 'Βράδυ (18:00–22:00)', 'create.field.time_slot.weekend': 'Σαββατοκύριακο', 'create.field.address': 'Διεύθυνση (προαιρετικά)', 'create.field.address.district': 'Συνοικία', 'create.field.address.street': 'Οδός', 'create.field.address.house': 'Αριθμός', 'create.field.confidential': 'Εμπιστευτική σημείωση', 'create.field.confidential.placeholder': 'Λεπτομέρειες που θα δει μόνο ο αναδοχόμενος...', 'create.field.confidential.hint': 'Δεν εμφανίζεται δημόσια', 'create.field.photos': 'Φωτογραφίες', 'create.field.photos.add': 'Προσθήκη φωτογραφίας', 'create.field.photos.uploading': 'Ανέβασμα...', 'task.budget_negotiable': 'Τιμή διαπραγματεύσιμη', 'task.time_slot': 'Χρόνος', 'task.confidential': 'Εμπιστευτική σημείωση', 'create.field.title.placeholder': 'π.χ. Καθαρισμός διαμερίσματος 80τμ', 'create.field.description.placeholder': 'Περίγραψε λεπτομερώς τι χρειάζεσαι...', 'create.field.location.placeholder': 'π.χ. Αθήνα, Κολωνάκι', 'create.field.budget.placeholder': 'π.χ. 100', 'create.submit': 'Δημοσίευση εργασίας', 'create.submitting': 'Δημοσίευση...', // Auth 'login.title': 'Καλωσόρισες', 'login.subtitle': 'Σύνδεση στο CanHelp', 'login.email': 'Email', 'login.password': 'Κωδικός', 'login.submit': 'Σύνδεση', 'login.submitting': 'Σύνδεση...', 'login.error': 'Λάθος email ή κωδικός', 'login.unverified.title': 'Επιβεβαιώστε το email σας', 'login.unverified.desc': 'Στείλαμε σύνδεσμο επαλήθευσης στο email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε το σύνδεσμο.', 'login.unverified.resend': 'Αποστολή νέου email επαλήθευσης', 'login.unverified.sending': 'Αποστολή...', 'login.unverified.sent': '✓ Εστάλη — ελέγξτε τα εισερχόμενα', 'profile.email.verified': 'Email επαληθεύτηκε', 'profile.email.not_verified': 'Email δεν επαληθεύτηκε', 'login.no_account': 'Δεν έχεις λογαριασμό;', 'login.register_link': 'Εγγραφή', 'login.forgot_password': 'Ξέχασα τον κωδικό', 'login.or_continue_with': 'ή συνεχίστε με', 'login.continue_google': 'Σύνδεση με Google', 'forgot.title': 'Ξέχασα τον κωδικό', 'forgot.subtitle': 'Εισάγετε το email σας για να λάβετε σύνδεσμο ανάκτησης', 'forgot.email': 'Email', 'forgot.submit': 'Αποστολή', 'forgot.submitting': 'Αποστολή...', 'forgot.sent.title': 'Ελέγξτε τα εισερχόμενά σας', 'forgot.sent.desc': 'Αν υπάρχει λογαριασμός με αυτό το email, θα σας στείλουμε σύνδεσμο ανάκτησης κωδικού.', 'forgot.back_to_login': 'Επιστροφή στη σύνδεση', 'forgot.error': 'Αποτυχία αποστολής. Ελέγξτε το email σας ή δοκιμάστε ξανά.', 'forgot.error.not_found': 'Δεν βρέθηκε λογαριασμός με αυτό το email.', 'forgot.error.send_failed': 'Αποτυχία αποστολής email. Δοκιμάστε ξανά αργότερα', 'reset.title': 'Νέος κωδικός', 'reset.subtitle': 'Εισάγετε τον νέο σας κωδικό', 'reset.password': 'Νέος κωδικός', 'reset.confirm': 'Επιβεβαίωση κωδικού', 'reset.submit': 'Αλλαγή κωδικού', 'reset.submitting': 'Αποθήκευση...', 'reset.success': 'Ο κωδικός άλλαξε επιτυχώς. Ανακατεύθυνση στη σύνδεση...', 'reset.back_to_login': 'Επιστροφή στη σύνδεση', 'reset.error.mismatch': 'Οι κωδικοί δεν ταιριάζουν', 'reset.error.invalid': 'Μη έγκυρος σύνδεσμος. Παρακαλώ ζητήστε νέο.', 'register.title': 'Εγγραφή', 'register.subtitle': 'Δημιουργία λογαριασμού στο CanHelp', 'register.first_name': 'Όνομα', 'register.last_name': 'Επώνυμο', 'register.email': 'Email', 'register.password': 'Κωδικός (min 8 χαρακτήρες)', 'register.role': 'Ρόλος', 'register.role.customer': 'Χρήστης', 'register.role.customer.desc': 'Δημοσιεύω εργασίες', 'register.role.specialist': 'Ειδικός', 'register.role.specialist.desc': 'Αναλαμβάνω εργασίες', 'register.submit': 'Δημιουργία λογαριασμού', 'register.submitting': 'Εγγραφή...', 'register.has_account': 'Έχεις ήδη λογαριασμό;', 'register.login_link': 'Σύνδεση', 'register.continue_google': 'Εγγραφή με Google', 'register.check_email.title': 'Ελέγξτε το email σας', 'register.check_email.desc': 'Στείλαμε σύνδεσμο επαλήθευσης στη διεύθυνση email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε τον σύνδεσμο.', 'register.check_email.login': 'Επιστροφή στη σύνδεση', // Dashboard 'dashboard.title': 'Πίνακας ελέγχου', 'dashboard.new_task': '+ Νέα εργασία', 'dashboard.my_tasks': 'Οι εργασίες μου', 'dashboard.my_offers': 'Οι προσφορές μου', 'dashboard.invitations': 'Προσκλήσεις για εργασία', 'dashboard.offers_count': 'προσφορές', 'dashboard.declined_count': 'απορρίφθηκαν', 'dashboard.completed_tasks': 'Ολοκληρωμένες εργασίες', 'dashboard.completed_offers': 'Ολοκληρωμένες προσφορές', 'dashboard.review_pending': 'Η αξιολόγηση δεν έχει υποβληθεί ακόμα', 'tasks.new.top_specialists': 'Κορυφαίοι ειδικοί', 'tasks.new.select_category': 'Επιλέξτε κατηγορία για να δείτε ειδικούς', 'tasks.new.invite': 'Πρόσκληση', 'tasks.new.invited': 'Επιλέχθηκε ✓', 'reviews.count': 'αξιολογήσεις', 'filter.location': 'Τοποθεσία', 'filter.language': 'Γλώσσες', 'filter.language.any': 'Οποιαδήποτε γλώσσα', 'filter.category.all': 'Όλες οι κατηγορίες', 'user.categories': 'Κατηγορίες', 'user.work_area': 'Περιοχή εργασίας', 'dashboard.tasks.empty': 'Δεν έχεις δημοσιεύσει εργασίες', 'dashboard.tasks.empty.cta': 'Δημοσίευσε την πρώτη σου', 'dashboard.tasks.add_new': 'Πρόσθεσε νέα εργασία', 'dashboard.offers.empty': 'Δεν έχεις υποβάλλει προσφορές', 'dashboard.offers.empty.cta': 'Βρες εργασίες', 'dashboard.customer.specialists_title': 'Ψάχνεις εκτελεστή;', 'dashboard.customer.specialists_hint': 'Δες προφίλ ειδικών, διάβασε αξιολογήσεις και κάλεσέ τους στις εργασίες σου', 'dashboard.customer.specialists_cta': 'Βρες ειδικό', 'dashboard.customer.how_title': 'Πώς λειτουργεί', 'dashboard.customer.step1': 'Δημιούργησε εργασία με περιγραφή και προϋπολογισμό', 'dashboard.customer.step2': 'Οι ειδικοί θα στείλουν προσφορές με τιμή και χρόνο', 'dashboard.customer.step3': 'Επίλεξε τον κατάλληλο και ξεκίνα τη συνεργασία', // Notifications 'notif.title': 'Ειδοποιήσεις', 'notif.mark_all': 'Σήμανση όλων ως αναγνωσμένα', 'notif.empty': 'Δεν υπάρχουν ειδοποιήσεις', 'notif.type.new_offer': 'Νέα προσφορά', 'notif.type.offer_accepted': 'Η προσφορά σας έγινε δεκτή', 'notif.type.offer_declined': 'Η προσφορά σας απορρίφθηκε', 'notif.type.task_completed': 'Η εργασία ολοκληρώθηκε', 'notif.type.task_cancelled': 'Η εργασία ακυρώθηκε', 'notif.type.new_message': 'Νέο μήνυμα', 'notif.type.new_review': 'Νέα αξιολόγηση', 'notif.type.task_invite': 'Πρόσκληση σε εργασία', 'notif.body.new_offer': 'Νέα προσφορά για «{title}»', 'notif.body.offer_accepted': 'Η προσφορά σας για «{title}» έγινε δεκτή', 'notif.body.offer_declined': 'Η προσφορά σας για «{title}» απορρίφθηκε', 'notif.body.task_invite': 'Σας προσκαλούν για «{title}»', 'notif.body.new_review': 'Λάβατε αξιολόγηση {rating}★', // Offer status 'offer.status.pending': 'Εκκρεμεί', 'offer.status.accepted': 'Αποδεκτή', 'offer.status.declined': 'Απορρίφθηκε', 'offer.status.withdrawn': 'Αποσύρθηκε', 'offer.status.other_accepted': 'Επιλέχθηκε άλλος ειδικός', // Common 'common.loading': 'Φόρτωση...', 'common.error': 'Σφάλμα', 'common.save': 'Αποθήκευση', 'common.saving': 'Αποθήκευση...', 'common.cancel': 'Ακύρωση', 'common.add': 'Προσθήκη', 'common.close': 'Κλείσιμο', 'common.edit': 'Επεξεργασία', 'common.delete': 'Διαγραφή', 'common.from': 'από', 'common.currency': '€', 'common.greece': 'Ελλάδα', // Chat 'chat.connected': 'Συνδεδεμένος', 'chat.disconnected': 'Αποσυνδεδεμένος', 'chat.no_rooms': 'Δεν υπάρχουν συνομιλίες ακόμα', 'chat.task_fallback': 'Εργασία', 'chat.select': 'Επίλεξε συνομιλία', 'chat.no_messages': 'Δεν υπάρχουν μηνύματα', 'chat.placeholder': 'Γράψε μήνυμα... (Enter για αποστολή)', 'chat.conversation_fallback': 'Συνομιλία', 'chat.direct_chat': 'Απευθείας συνομιλία', 'chat.linked_task': 'Συνδεδεμένη εργασία', 'chat.write_btn': 'Μήνυμα', 'chat.just_now': 'μόλις τώρα', 'chat.min_ago': 'λ', 'chat.write_specialist': 'Γράψε στον ειδικό', 'chat.write_customer': 'Γράψε στον πελάτη', 'chat.notif_settings': 'Ρυθμίσεις ειδοποιήσεων', 'chat.notif_messages': 'Ειδοποιήσεις για νέα μηνύματα', 'chat.toast_title': 'Νέο μήνυμα', 'chat.toast_open': 'Άνοιγμα συνομιλίας', // Offer form 'offer.price': 'Τιμή', 'offer.price.placeholder': 'π.χ. 80', 'offer.customer_budget': 'Προϋπολογισμός πελάτη', 'offer.message': 'Μήνυμα', 'offer.optional': 'προαιρετικό', 'offer.message.placeholder': 'Παρουσίασε τον εαυτό σου, την εμπειρία σου και γιατί είσαι η καλύτερη επιλογή...', 'offer.submitting': 'Αποστολή...', // Profile 'profile.photo': 'Φωτογραφία προφίλ', 'profile.photo.change': 'Αλλαγή φωτογραφίας', 'profile.photo.hint': 'JPEG, PNG, WebP · έως 5MB', 'profile.basic_info': 'Βασικά στοιχεία', 'profile.phone': 'Τηλέφωνο', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Σύντομη περιγραφή', 'profile.bio.placeholder': 'Πες μας λίγα λόγια για εσένα...', 'profile.language': 'Γλώσσα', 'profile.language.hint': 'Γλώσσα διεπαφής και email ειδοποιήσεων', 'profile.languages': 'Γλώσσες επικοινωνίας', 'profile.languages.hint': 'Επιλέξτε όλες τις γλώσσες που μιλάτε', 'profile.skills': 'Δεξιότητες', 'profile.skills.subtitle': 'Προσθέσε τις υπηρεσίες που προσφέρεις', 'profile.skills.placeholder': 'π.χ. Καθαρισμός, IT, Μαθήματα...', 'profile.role': 'Ρόλος λογαριασμού', 'profile.role.specialist': '🔧 Ειδικός', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 Χρήστης', 'profile.role.change': 'Για αλλαγή ρόλου επικοινωνήστε με την υποστήριξη.', 'profile.become_specialist': 'Γίνε Ειδικός', 'profile.become_specialist.desc': 'Αναβαθμίσου σε Ειδικό για να δέχεσαι εργασίες και να δημιουργήσεις το προφίλ σου.', 'become_specialist.hero.title': 'Κέρδισε χρήματα κάνοντας αυτό που ξέρεις', 'become_specialist.hero.subtitle': 'Δημιούργησε προφίλ ειδικού και λάβε παραγγελίες από πελάτες σε όλη την Ελλάδα', 'become_specialist.how.title': 'Πώς λειτουργεί', 'become_specialist.step1.title': 'Δημιούργησε κάρτα ειδικού', 'become_specialist.step1.desc': 'Δήλωσε κατηγορίες, δεξιότητες και περιοχές κάλυψης — το σύστημα θα βρει τις κατάλληλες εργασίες για σένα αυτόματα', 'become_specialist.step2.title': 'Βρες εργασίες', 'become_specialist.step2.desc': 'Ανακάλυψε εργασίες στις κατηγορίες σου στην ενότητα «Αναζήτηση εργασιών»', 'become_specialist.step3.title': 'Στείλε προσφορά & κέρδισε', 'become_specialist.step3.desc': 'Υποβάλε προσφορές με τιμή και χρόνο, επικοινωνήσε με πελάτες και ολοκλήρωσε εργασίες', 'become_specialist.benefits.title': 'Πλεονεκτήματα προφίλ ειδικού', 'become_specialist.benefit1': 'Αναζήτηση εργασιών ανά κατηγορία και τοποθεσία', 'become_specialist.benefit2': 'Δημόσιο προφίλ με αξιολογήσεις πελατών', 'become_specialist.benefit3': 'Πρόγραμμα διαθεσιμότητας ορατό στους πελάτες', 'become_specialist.benefit4': 'Προσθήκη σε αγαπημένα από πελάτες', 'become_specialist.cta': 'Γίνε Ειδικός — είναι δωρεάν', 'become_specialist.free_badge': 'Δωρεάν εγγραφή', 'profile.tab.notifications': 'Ειδοποιήσεις', 'profile.tab.reviews': 'Αξιολογήσεις', 'profile.tab.referral': 'Παραπομπές', 'profile.tab.auto_response': 'Αυτόματη απάντηση', 'profile.tab.site': 'Site', 'profile.site.title': 'Προσωπική σελίδα', 'profile.site.url_label': 'Προσωπικό site', 'profile.site.copy': 'Αντιγραφή', 'profile.site.copied': 'Αντιγράφηκε', 'profile.site.visible_title': 'Τι εμφανίζεται στη σελίδα σας', 'profile.site.visible.name': 'Όνομα και φωτογραφία', 'profile.site.visible.bio': 'Βιογραφικό', 'profile.site.visible.rating': 'Αξιολόγηση και κριτικές', 'profile.site.visible.portfolio': 'Χαρτοφυλάκιο / Κάρτες', 'profile.site.visible.contacts': 'Στοιχεία επικοινωνίας', 'profile.site.visible.full_last_name': 'Πλήρες επώνυμο', 'profile.site.visible.services': 'Κάρτες υπηρεσιών', 'profile.site.visible.reviews': 'Ενότητα κριτικών', 'profile.site.visible.status': 'Κατάσταση «Έτοιμος να βοηθήσω»', 'profile.site.theme': 'Θέμα εμφάνισης', 'profile.site.theme.dark': 'Σκοτεινό', 'profile.site.theme.light': 'Φωτεινό', 'profile.site.slug_taken': 'Αυτή η διεύθυνση είναι ήδη κατειλημμένη', 'profile.site.stats.title': 'Στατιστικά επισκεψιμότητας', 'profile.site.stats.days': 'τελευταίες 30 ημέρες', 'profile.site.stats.views': 'Προβολές', 'profile.site.stats.unique': 'Μοναδικοί επισκέπτες', 'profile.site.stats.messages': 'Μηνύματα', 'profile.site.stats.total_views': 'Συνολικές προβολές', 'profile.site.stats.total_unique': 'Μοναδικοί επισκέπτες', 'profile.site.stats.total_messages': 'Μηνύματα', 'profile.site.stats.empty': 'Δεν υπάρχουν δεδομένα ακόμη', 'profile.site.stats.loading': 'Φόρτωση στατιστικών...', 'profile.site.stats.no_slug': 'Ορίστε τη διεύθυνση του site για να δείτε στατιστικά', 'profile.site.edit_bio_hint': 'Το βιογραφικό και η φωτογραφία ρυθμίζονται στην καρτέλα «Βασικά».', 'status.can_help_now_hint': 'Η κάρτα σου εμφανίζεται ψηλότερα', 'status.need_help_hint': 'Οι ειδικοί μπορούν να σε βοηθήσουν', 'profile.referral.title': 'Πρόγραμμα παραπομπών', 'profile.referral.desc': 'Μοιράσου τον σύνδεσμο σου και κέρδισε ανταμοιβές για κάθε νέο χρήστη.', 'profile.referral.link_label': 'Ο σύνδεσμος παραπομπής σου', 'profile.referral.copy': 'Αντιγραφή', 'profile.referral.copied': 'Αντιγράφηκε!', 'profile.referral.invited_count': 'επιτυχείς παραπομπές', 'profile.referral.no_code': 'Ο κωδικός παραπομπής δεν είναι διαθέσιμος.', 'notifications.title': 'Ρυθμίσεις ειδοποιήσεων', 'notifications.email.new_tasks': 'Email για νέες εργασίες', 'notifications.email.new_tasks.desc': 'Λάβε email όταν δημοσιευτεί νέα εργασία στις κατηγορίες σου', 'notifications.messages.desc': 'Λαμβάνεις ειδοποίηση όταν έρθει νέο μήνυμα', 'notifications.saved': 'Ρυθμίσεις αποθηκεύτηκαν', 'notifications.plan_required': 'Συνδρομή απαιτείται για αυτή τη λειτουργία', 'profile.tab.info': 'Βασικά στοιχεία', 'profile.tab.finance': 'Οικονομικά', 'profile.tab.skills': 'Δεξιότητες', 'profile.tab.categories': 'Κατηγορίες', 'profile.tab.geography': 'Γεωγραφία', 'profile.specialist.categories': 'Κατηγορίες εργασιών', 'profile.specialist.categories.desc': 'Επίλεξε τις κατηγορίες στις οποίες εργάζεσαι', 'profile.specialist.geography': 'Περιοχές κάλυψης', 'profile.specialist.geography.desc': 'Επίλεξε τις πόλεις / περιοχές όπου δραστηριοποιείσαι', 'profile.saving': 'Αποθήκευση...', 'profile.upload.error': 'Σφάλμα κατά την αναφόρτωση', 'profile.saved': 'Αποθηκεύτηκε', 'profile.tab.cards': 'Χαρτοφυλάκιο', 'profile.cards.count': 'Χαρτοφυλάκια', 'profile.cards.add': 'Νέο χαρτοφυλάκιο', 'profile.cards.new_title': 'Τίτλος νέου χαρτοφυλακίου', 'profile.cards.placeholder': 'π.χ. Υδραυλικά', 'profile.cards.create': 'Δημιουργία', 'profile.cards.cancel': 'Ακύρωση', 'profile.cards.empty': 'Δεν έχετε χαρτοφυλάκιο', 'profile.cards.create_first': 'Δημιουργήστε το πρώτο σας χαρτοφυλάκιο', 'profile.cards.delete_confirm': 'Διαγραφή χαρτοφυλακίου;', 'profile.card.tab.main': 'Γενικά', 'profile.card.tab.skills': 'Δεξιότητες', 'profile.card.tab.categories': 'Κατηγορίες', 'profile.card.tab.geography': 'Γεωγραφία', 'profile.card.tab.portfolio': 'Γκαλερί', 'profile.card.active': 'Ενεργή', 'profile.card.save': 'Αποθήκευση', 'profile.card.saved': 'Αποθηκεύτηκε', 'profile.card.delete': 'Διαγραφή', 'profile.card.skill.add': 'Προσθήκη δεξιότητας', 'profile.card.photo.add': 'Προσθήκη φωτογραφίας', 'profile.card.photo.uploading': 'Μεταφόρτωση...', 'profile.card.photo.empty': 'Δεν υπάρχουν φωτογραφίες', 'profile.card.item.title': 'Τίτλος', 'profile.card.item.desc': 'Περιγραφή', 'profile.card.item.save': 'Αποθήκευση', 'profile.card.item.cancel': 'Ακύρωση', 'profile.card.item.edit': 'Επεξεργασία', 'profile.upgrade.cards_limit': 'Όριο χαρτοφυλακίων εξαντλήθηκε', 'profile.upgrade.plan': 'Τρέχον πλάνο:', 'profile.upgrade.contact': 'Επικοινωνήστε με τον διαχειριστή για αλλαγή πλάνου', 'profile.upgrade.ok': 'Εντάξει', 'profile.plan.title': 'Πλάνο συνδρομής', 'profile.balance': 'Υπόλοιπο', 'profile.balance.topup': 'Αναπλήρωση υπολοίπου', 'profile.balance.topup.title': 'Αναπλήρωση υπολοίπου', 'profile.balance.topup.amount': 'Ποσό (σε EUR)', 'profile.balance.topup.hint': 'Επιλέξτε ποσό ή εισαγάγετε μανούαλα', 'profile.balance.topup.submit': 'Πληρωμή', 'profile.balance.topup.loading': 'Ρεδιρεκτάρισμα...', 'profile.balance.topup.error': 'Σφάλμα μετάβασης στην πληρωμή. Προσπαθήστε ξανά.', 'payment.success.title': 'Πληρωμή επιτυχής!', 'payment.success.desc': 'Το υπόλοιπό σας ενημερώθηκε.', 'payment.cancelled.title': 'Ακύρωση πληρωμής', 'payment.cancelled.desc': 'Η πληρωμή ακυρώθηκε. Κανένα χρήμα δεν χρεώθηκε.', 'payment.pending.title': 'Σε εξέλιξη...', 'payment.pending.desc': 'Επεξεργαζόμαστε την πληρωμή σας.', 'payment.back_to_profile': 'Επιστροφή στο προφίλ', 'profile.plan.basic': 'Βασικό (δωρεάν)', 'profile.plan.contact_upgrade': 'Επικοινωνήστε με τον διαχειριστή για αναβάθμιση', 'profile.plan.cards_up_to': 'Χαρτοφυλάκια: έως', 'profile.plan.cards_unlimited': 'Χαρτοφυλάκια: απεριόριστα', 'profile.plan.tasks_up_to': 'Εργασίες: έως', 'profile.plan.offers_up_to': 'Προσφορές: έως', 'profile.plan.valid_until': 'Ισχύει έως', 'profile.plan.no_expiry': 'Δεν λήγει', // Create task 'create.error': 'Σφάλμα κατά τη δημοσίευση', // Tasks list extras 'tasks.category.general': 'Γενικά', 'tasks.budget.range': 'Εύρος:', 'tasks.budget.from': 'από', 'tasks.budget.to': 'έως', 'tasks.filter.reset': 'Εκκαθάριση φίλτρων', 'tasks.load_more': 'Φόρτωση ακόμα', 'tasks.showing': 'Αποτελέσματα:', 'tasks.field.budget': 'Προϋπολογισμός, €', // Admin 'admin.title': 'Πίνακας Διαχείρισης', 'admin.tab.stats': 'Στατιστικά', 'admin.tab.users': 'Χρήστες', 'admin.tab.tasks': 'Εργασίες', 'admin.tab.reports': 'Αναφορές', 'admin.stats.users': 'Χρήστες', 'admin.stats.tasks': 'Εργασίες', 'admin.stats.offers': 'Προσφορές', 'admin.stats.reviews': 'Αξιολογήσεις', 'admin.tasks.by_status': 'Εργασίες ανά κατάσταση', 'admin.col.user': 'Χρήστης', 'admin.col.email': 'Email', 'admin.col.role': 'Ρόλος', 'admin.col.registered': 'Εγγραφή', 'admin.col.status': 'Κατάσταση', 'admin.col.title': 'Τίτλος', 'admin.col.budget': 'Προϋπολογισμός', 'admin.col.created': 'Δημιουργία', 'admin.users.active': 'Ενεργός', 'admin.users.inactive': 'Ανενεργός', 'admin.users.deactivate': 'Απενεργοποίηση', 'admin.users.activate': 'Ενεργοποίηση', 'admin.tasks.cancel': 'Ακύρωση', 'admin.reports.none': 'Δεν υπάρχουν αναφορές', 'admin.reports.reviewed': 'Αναθεωρήθηκε', 'admin.reports.dismiss': 'Απόρριψη', 'admin.pagination.total': 'Σύνολο', 'admin.users.role.change': 'Αλλαγή ρόλου', 'admin.users.search.placeholder': 'Αναζήτηση ονόματος ή email...', 'admin.tasks.delete': 'Διαγραφή', 'admin.tasks.delete.confirm': 'Διαγραφή αυτής της εργασίας μόνιμα;', 'admin.tasks.search.placeholder': 'Αναζήτηση τίτλου...', 'admin.col.customer': 'Πελάτης', 'admin.col.reporter': 'Καταγγέλλων', 'admin.col.target': 'Στόχος', 'admin.filter.all_roles': 'Όλοι οι ρόλοι', 'admin.filter.all_statuses': 'Όλες οι καταστάσεις', 'admin.reports.target.task': 'Εργασία', 'admin.reports.target.user': 'Χρήστης', 'admin.tab.categories': 'Κατηγορίες', 'admin.tab.locations': 'Πόλεις & Περιοχές', 'admin.tab.logs': 'Αρχεία', 'admin.tab.plans': 'Πακέτα', 'admin.tab.settings': 'Ρυθμίσεις', 'admin.logs.subtab.ai': 'AI Logs', 'admin.logs.subtab.activity': 'Δραστηριότητα', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Ειδοποιήσεις', 'admin.notif_logs.type': 'Τύπος', 'admin.notif_logs.title': 'Τίτλος', 'admin.notif_logs.read': 'Διαβασμένο', 'admin.notif_logs.empty': 'Δεν υπάρχουν αρχεία ειδοποιήσεων', 'admin.stats.notif_chart_title': 'Ειδοποιήσεις ανά ημέρα', 'admin.stats.notif_label': 'Ειδοποιήσεις', 'admin.stats.mail_chart_title': 'Emails ανά ημέρα', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'Όλα', 'admin.stats.specialists': 'Ειδικοί', 'admin.col.plan': 'Πακέτο', 'admin.back_home': 'Αρχική', 'admin.plans.title': 'Πακέτα συνδρομής', 'admin.plans.add': '+ Νέο πακέτο', 'admin.plans.empty': 'Δεν υπάρχουν πακέτα', 'admin.plans.form.new': 'Νέο πακέτο', 'admin.plans.form.edit': 'Επεξεργασία πακέτου', 'admin.plans.form.name': 'Όνομα', 'admin.plans.form.price': 'Τιμή (EUR)', 'admin.plans.form.old_price': 'Παλιά τιμή (EUR, προαιρετικό)', 'admin.plans.form.max_offers': 'Μέγ. προσφορές (κενό = χωρίς όριο)', 'admin.plans.form.max_cards': 'Μέγ. χαρτοφυλάκιο (κενό = χωρίς όριο)', 'admin.plans.form.duration_days': 'Διάρκεια (ημέρες, κενό = χωρίς λήξη)', 'admin.plans.form.description': 'Περιγραφή', 'admin.plans.form.features': 'Δυνατότητες (μία ανά γραμμή)', 'admin.plans.form.notify': 'Ειδοποιήσεις νέων εργασιών', 'admin.plans.form.default': 'Προεπιλογή', 'admin.plans.form.active': 'Ενεργό', 'admin.plans.form.order': 'Σειρά', 'admin.plans.form.role': 'Ρόλος', 'admin.plans.form.tier': 'Επίπεδο', 'admin.plans.form.role.customer': 'Πελάτης', 'admin.plans.form.role.specialist': 'Ειδικός', 'admin.plans.form.tier.free': 'Δωρεάν', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Όρια (κενό = χωρίς όριο)', 'admin.plans.form.max_messages_day': 'Μέγ. μηνύματα/ημέρα', 'admin.plans.form.max_orders_day': 'Μέγ. παραγγελίες/ημέρα', 'admin.plans.form.max_skills': 'Μέγ. δεξιότητες', 'admin.plans.form.max_profiles': 'Μέγ. προφίλ', 'admin.plans.form.max_portfolio': 'Μέγ. στοιχεία χαρτοφυλακίου', 'admin.plans.form.section.boost': 'Πολλαπλασιαστές & Ενίσχυση', 'admin.plans.form.search_boost': 'Ενίσχυση αναζήτησης', 'admin.plans.form.offers_multiplier': 'Πολλαπλασιαστής προσφορών', 'admin.plans.form.section.contact': 'Δικαιώματα επικοινωνίας', 'admin.plans.form.can_contact_free': 'Επικοινωνία με δωρεάν χρήστες', 'admin.plans.form.can_contact_pro': 'Επικοινωνία με Pro χρήστες', 'admin.plans.form.can_contact_all': 'Επικοινωνία με όλους', 'admin.plans.form.can_show_contact': 'Εμφάνιση στοιχείων επικοινωνίας', 'admin.plans.form.can_view_phone': 'Προβολή τηλεφώνου', 'admin.plans.form.section.features': 'Λειτουργίες', 'admin.plans.form.upload_video': 'Μεταφόρτωση βίντεο', 'admin.plans.form.favorites': 'Αγαπημένα', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Σήμα επαλήθευσης', 'admin.plans.form.highlighted_reviews': 'Προβεβλημένες κριτικές', 'admin.plans.form.personal_site': 'Προσωπική σελίδα', 'admin.plans.form.can_help_now': 'Κατάσταση «Μπορώ να βοηθήσω»', 'admin.plans.form.need_help': 'Κατάσταση «Χρειάζομαι βοήθεια»', 'admin.plans.form.auto_response': 'Αυτόματη απάντηση', 'admin.plans.form.auto_match': 'Αυτόματη αντιστοίχιση', 'admin.plans.form.instant_dispatch_free': 'Άμεση αποστολή (δωρεάν)', 'admin.plans.form.instant_dispatch_pro': 'Άμεση αποστολή (Pro)', 'admin.plans.badge.default': 'Προεπιλογή', 'admin.plans.badge.inactive': 'Ανενεργό', 'admin.plans.make_default': 'Ορισμός ως προεπιλογή', 'admin.plans.tasks': 'Εργασίες', 'admin.plans.offers': 'Προσφορές', 'admin.plans.cards': 'Χαρτοφυλάκιο', 'admin.plans.notify_tasks': 'Ειδοποιήσεις εργασιών', 'admin.plans.delete.confirm': 'Διαγραφή πακέτου', 'admin.activity.title': 'Αρχείο δραστηριότητας', 'admin.activity.event': 'Γεγονός', 'admin.activity.all_events': 'Όλα τα γεγονότα', 'admin.activity.from': 'Από', 'admin.activity.to': 'Έως', 'admin.activity.reset': 'Επαναφορά', 'admin.activity.total': 'Σύνολο', 'admin.activity.empty': 'Δεν υπάρχουν εγγραφές', 'admin.mail.event': 'Συμβάν email', 'admin.mail.all_events': 'Όλα τα email συμβάντα', 'admin.mail.from': 'Από', 'admin.mail.to': 'Έως', 'admin.mail.reset': 'Επαναφορά', 'admin.mail.total': 'Σύνολο', 'admin.mail.empty': 'Δεν υπάρχουν email logs', 'admin.mail.recipient': 'Παραλήπτης', 'admin.mail.provider': 'Πάροχος', 'admin.mail.details': 'Λεπτομέρειες', 'admin.mail.status': 'Κατάσταση', 'admin.mail.success': 'Επιτυχία', 'admin.mail.failed': 'Σφάλμα', 'admin.event.email_sent': 'Email sent', 'admin.event.email_failed': 'Email failed', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Admin test email sent', 'admin.event.admin_email_test_failed': 'Admin test email failed', 'admin.logs.empty': 'Δεν υπάρχουν εγγραφές', 'admin.logs.date': 'Ημερομηνία', 'admin.logs.provider': 'Πάροχος', 'admin.logs.model': 'Μοντέλο', 'admin.logs.action': 'Ενέργεια', 'admin.logs.langs': 'Γλώσσες', 'admin.logs.in': 'Είσοδος', 'admin.logs.out': 'Έξοδος', 'admin.logs.total': 'Σύνολο', 'admin.logs.ms': 'ms', 'admin.logs.status': 'Κατάσταση', 'admin.stats.activity_30d': 'Δραστηριότητα 30 ημερών', 'admin.stats.tasks_label': 'Εργασίες', 'admin.stats.users_label': 'Χρήστες', 'admin.stats.specialists_label': 'Ειδικοί', 'admin.stats.tokens_title': 'Χρήση tokens (ανά μήνα)', 'admin.stats.tokens_out': 'Εξερχόμενα', 'admin.stats.tokens_in': 'Εισερχόμενα', 'admin.stats.tokens_out_label': 'Εξερχόμενα tokens', 'admin.stats.tokens_in_label': 'Εισερχόμενα tokens', 'admin.stats.cost_label': 'Κόστος (USD)', 'admin.stats.tasks_by_status': 'Εργασίες ανά κατάσταση', 'admin.task_status.open': 'Ανοιχτές', 'admin.task_status.in_progress': 'Σε εξέλιξη', 'admin.task_status.completed': 'Ολοκληρωμένες', 'admin.task_status.cancelled': 'Ακυρωμένες', 'admin.task_status.draft': 'Προσχέδια', 'admin.settings.tab.general': 'Γενικά', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Ειδοποιήσεις', 'admin.settings.tab.payment': 'Πληρωμή', 'admin.settings.tab.referral': 'Παραπομπές', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO & Συντήρηση', 'admin.settings.seo.maintenance_label': 'Λειτουργία συντήρησης', 'admin.settings.seo.maintenance_hint': 'Εμφάνιση σελίδας συντήρησης σε όλους τους επισκέπτες', 'admin.settings.seo.indexing_label': 'Ευρετηρίαση από μηχανές αναζήτησης', 'admin.settings.seo.indexing_hint': 'Επιτρέπει στις μηχανές αναζήτησης να ευρετηριάσουν τον ιστότοπο', 'admin.settings.seo.head_scripts_label': 'Scripts στο (JS)', 'admin.settings.seo.head_scripts_hint': 'Εκτελείται σε κάθε σελίδα (Google Tag Manager, analytics κ.λπ.)', 'admin.settings.seo.site_title_label': 'Τίτλος ιστότοπου', 'admin.settings.seo.site_description_label': 'Περιγραφή ιστότοπου (meta description)', 'admin.settings.referral.title': 'Πρόγραμμα παραπομπών', 'admin.settings.referral.hint': 'Επιβράβευσε χρήστες που φέρνουν νέους εγγεγραμμένους.', 'admin.settings.referral.enabled_label': 'Ενεργό', 'admin.settings.referral.enabled_hint': 'Ενεργοποίηση / απενεργοποίηση εφαρμογής ανταμοιβών', 'admin.settings.referral.customer_section': 'Για πελάτες', 'admin.settings.referral.specialist_section': 'Για ειδικούς', 'admin.settings.referral.plan_label': 'Πλάνο ανταμοιβής', 'admin.settings.referral.no_plan': '— χωρίς πλάνο —', 'admin.settings.referral.plan_hint': 'Αυτό το πλάνο θα ανατεθεί στον χρήστη που έφερε νέους. Εάν το τρέχον πλάνο του είναι υψηλότερο, θα προστεθούν μόνο οι μέρες.', 'admin.settings.referral.days_label': 'Ημέρες ανταμοιβής', 'admin.settings.referral.days_hint': 'Αριθμός ημερών που θα προστεθούν στη λήξη του πλάνου.', 'admin.settings.general.title': 'Γενικές ρυθμίσεις', 'admin.settings.general.site_name': 'Όνομα ιστότοπου', 'admin.settings.general.site_url': 'URL ιστότοπου', 'admin.settings.general.contact_email': 'Email επικοινωνίας', 'admin.settings.general.support_phone': 'Τηλέφωνο υποστήριξης', 'admin.settings.smtp.title': 'Ρυθμίσεις SMTP', 'admin.settings.smtp.hint': 'Χρησιμοποιείται για αποστολή ειδοποιήσεων email.', 'admin.settings.smtp.host': 'SMTP Host', 'admin.settings.smtp.port': 'Θύρα', 'admin.settings.smtp.encryption': 'Κρυπτογράφηση', 'admin.settings.smtp.enc.none': 'Χωρίς', 'admin.settings.smtp.enc.tls': 'STARTTLS (θύρα 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (θύρα 465)', 'admin.settings.smtp.username': 'Όνομα χρήστη', 'admin.settings.smtp.password': 'Κωδικός / App Password', 'admin.settings.smtp.from_name': 'Όνομα αποστολέα', 'admin.settings.smtp.from_email': 'Email αποστολέα', 'admin.settings.smtp.test': 'Αποστολή δοκιμαστικού email', 'admin.settings.smtp.sending': 'Αποστολή...', 'admin.settings.payment.hint': 'Τα στοιχεία για ePay Piraeus Bank.', 'admin.settings.env.test': 'Δοκιμαστικό (sandbox)', 'admin.settings.env.prod': 'Παραγωγή', 'admin.settings.env.label': 'Περιβάλλον', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Ενεργό', 'admin.settings.saving': 'Αποθήκευση...', 'admin.settings.saved': '✓ Αποθηκεύτηκε', 'admin.notif.vars_hint': 'Διαθέσιμες μεταβλητές στα πρότυπα', 'admin.notif.tmpl.not_set': 'Πρότυπο δεν έχει οριστεί', 'admin.notif.tmpl.subject_label': 'Θέμα email', 'admin.notif.tmpl.body_label': 'Κείμενο email (HTML)', 'admin.notif.tmpl.save': 'Αποθήκευση', 'admin.notif.tmpl.close': 'Κλείσιμο', 'admin.notif.tmpl.translate': 'Αυτόματη μετάφραση', 'admin.notif.tmpl.translating': 'Μετάφραση...', 'admin.notif.tmpl.saving': 'Αποθήκευση...', 'admin.notif.email_verification': 'Επαλήθευση email', 'admin.notif.registration_success': 'Επιτυχής εγγραφή', 'admin.notif.password_reset': 'Επαναφορά κωδικού', 'admin.notif.new_offer': 'Νέα προσφορά', 'admin.notif.new_task': 'Νέα εργασία', 'admin.notif.offer_accepted': 'Προσφορά αποδεκτή', 'admin.notif.new_message': 'Νέο μήνυμα', 'admin.notif.offer_declined': 'Απόρριψη προσφοράς', 'admin.notif.offer_other_accepted': 'Επιλέχθηκε άλλος ειδικός', 'admin.notif.task_updated': 'Ενημέρωση εργασίας', 'admin.notif.deadline_reminder': 'Υπενθύμιση προθεσμίας', 'admin.notif.task_archived': 'Αυτόματη απόσυρση εργασίας', 'admin.notif.referral_reward': 'Ανταμοιβή παραπομπής', // Plan lifecycle email templates 'admin.email_template.plan_activated': 'Τιμολόγιο — ενεργοποίηση πλάνου', 'admin.email_template.plan_upgraded': 'Τιμολόγιο — αναβάθμιση πλάνου', 'admin.email_template.plan_downgrade_scheduled': 'Τιμολόγιο — προγραμματισμένη υποβάθμιση', 'admin.email_template.plan_downgrade_applied': 'Τιμολόγιο — εφαρμογή υποβάθμισης', 'admin.email_template.plan_renewal_reminder': 'Τιμολόγιο — υπενθύμιση ανανέωσης', 'admin.email_template.plan_insufficient_funds': 'Τιμολόγιο — ανεπαρκές υπόλοιπο', // Pricing confirm modal 'pricing.confirm.title': 'Επιβεβαίωση επιλογής πλάνου', 'pricing.confirm.plan': 'Πλάνο', 'pricing.confirm.prorated': 'Αναλογική έκπτωση', 'pricing.confirm.effective_price': 'Προς πληρωμή', 'pricing.confirm.your_balance': 'Το υπόλοιπό σας', 'pricing.confirm.downgrade_info': 'Η μετάβαση στο νέο πλάνο θα γίνει αυτόματα μετά τη λήξη της τρέχουσας περιόδου.', 'pricing.confirm.insufficient': 'Ανεπαρκές υπόλοιπο.', 'pricing.confirm.top_up': 'Ανανέωση', 'pricing.confirm.schedule_downgrade': 'Προγραμματισμός μετάβασης', 'pricing.confirm.pay': 'Πληρωμή', 'admin.user_edit.title': 'Επεξεργασία χρήστη', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Εγγραφή', 'admin.user_edit.last_seen': 'Τελευταία σύνδεση', 'admin.user_edit.lang': 'Γλώσσα', 'admin.user_edit.first_name': 'Όνομα', 'admin.user_edit.last_name': 'Επώνυμο', 'admin.user_edit.phone': 'Τηλέφωνο', 'admin.user_edit.bio': 'Βιογραφικό', 'admin.user_edit.role': 'Ρόλος', 'admin.user_edit.plan': 'Πακέτο', 'admin.user_edit.no_plan': '— Χωρίς πακέτο —', 'admin.user_edit.active': 'Ενεργός λογαριασμός', 'admin.user_edit.balance': 'Υπόλοιπο (EUR)', 'admin.user_edit.skills': 'Δεξιότητες', 'admin.user_edit.tab.profile': 'Προφίλ', 'admin.user_edit.tab.account': 'Λογαριασμός', 'admin.user_edit.tab.balance': 'Υπόλοιπο', 'admin.user_edit.tab.settings': 'Ρυθμίσεις', 'admin.user_edit.tab.specialist': 'Χαρτοφυλάκιο', 'admin.user_edit.tab.site': 'Ιστοσελίδα', 'admin.user_edit.plan_expires': 'Λήξη πλάνου', 'admin.user_edit.interface_lang': 'Γλώσσα διεπαφής', 'admin.user_edit.comm_languages': 'Γλώσσες επικοινωνίας', 'admin.user_edit.personal_site_slug': 'Προσωπική σελίδα', 'admin.user_edit.show_contact_info': 'Εμφάνιση στοιχείων επικοινωνίας', 'admin.user_edit.show_contact_info.hint': 'Ορατό στους πελάτες', 'admin.user_edit.notify_new_tasks': 'Ειδοποίηση για νέες εργασίες', 'admin.user_edit.notify_new_tasks.hint': 'Push και email ειδοποιήσεις', 'admin.user_edit.notif_messages': 'Ειδοποιήσεις μηνυμάτων', 'admin.user_edit.notif_messages.hint': 'Νέα μηνύματα στη συνομιλία', 'admin.user_edit.site_settings': 'Ρυθμίσεις προσωπικής σελίδας', 'admin.user_edit.categories': 'Κατηγορίες υπηρεσιών', 'admin.user_edit.locations': 'Περιοχές εξυπηρέτησης', 'admin.user_edit.skill_placeholder': 'Νέα δεξιότητα...', 'admin.user_edit.add_category': '— Επιλέξτε κατηγορία —', 'admin.user_edit.add_location': '— Επιλέξτε περιοχή —', 'admin.user_edit.specialist_cards': 'Χαρτοφυλάκιο ειδικού', 'admin.user_edit.no_cards': 'Δεν βρέθηκαν στοιχεία χαρτοφυλακίου', 'admin.user_edit.card_title': 'Τίτλος χαρτοφυλακίου', 'admin.user_edit.card_description': 'Περιγραφή', 'admin.balance.topup.btn': 'Αναπλήρωση', 'admin.balance.withdraw.btn': 'Αφαίρεση', 'admin.balance.modal_hint': 'Οι αλλαγές ισχύουν άμεσα και καταγράφονται στο ιστορικό', 'admin.balance.topup.title': 'Αναπλήρωση υπολοίπου', 'admin.balance.topup.amount': 'Ποσό', 'admin.balance.topup.description': 'Σχόλιο', 'admin.balance.topup.description.placeholder': 'Για παράδειγμα: bonus ή χειροκίνητη αναπλήρωση', 'admin.balance.topup.submit': 'Αναπλήρωση υπολοίπου', 'admin.balance.withdraw.title': 'Αφαίρεση υπολοίπου', 'admin.balance.withdraw.amount': 'Ποσό', 'admin.balance.withdraw.description': 'Σχόλιο', 'admin.balance.withdraw.description.placeholder': 'Για παράδειγμα: επιστροφή ή χειροκίνητη χρέωση', 'admin.balance.withdraw.submit': 'Αφαίρεση από το υπόλοιπο', 'admin.user_edit.role.customer': 'Πελάτης', 'admin.user_edit.role.specialist': 'Ειδικός', 'admin.user_edit.role.admin': 'Διαχειριστής', 'common.refresh': 'Ανανέωση', 'common.back_home': 'Αρχική', 'admin.loc.hint': 'Διαχείριση πόλεων και συνοικιών', 'admin.loc.add_city': 'Νέα πόλη', 'admin.loc.add_district': 'Προσθήκη συνοικίας', 'admin.loc.new': 'Νέα τοποθεσία', 'admin.loc.edit': 'Επεξεργασία τοποθεσίας', 'admin.loc.district': 'συνοικία', 'admin.loc.empty': 'Δεν υπάρχουν τοποθεσίες', 'admin.loc.delete.confirm': 'Διαγραφή τοποθεσίας; Όλες οι συνοικίες θα διαγραφούν επίσης.', 'admin.cat.add_root': 'Νέα κατηγορία', 'admin.cat.add_sub': 'Υποκατηγορία', 'admin.cat.edit': 'Επεξεργασία', 'admin.cat.delete': 'Διαγραφή', 'admin.cat.delete.confirm': 'Διαγραφή κατηγορίας; Όλες οι υποκατηγορίες θα διαγραφούν επίσης.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Εικονίδιο', 'admin.cat.name_el': 'Ελληνικά', 'admin.cat.name_en': 'Αγγλικά', 'admin.cat.name_ru': 'Ρωσικά', 'admin.cat.order': 'Σειρά', 'admin.cat.active': 'Ενεργή', 'admin.cat.parent': 'Γονική κατηγορία', 'admin.cat.no_parent': 'Κορυφαίο επίπεδο', 'admin.cat.save': 'Αποθήκευση', 'admin.cat.cancel': 'Ακύρωση', 'admin.cat.empty': 'Δεν υπάρχουν κατηγορίες', 'admin.cat.hint': 'Διαχείριση κατηγοριών με πολυεπίπεδη ιεραρχία', 'admin.cat.new': 'Νέα κατηγορία', 'admin.cat.subcategory': 'υποκατηγορία', 'admin.cat.add_child': 'Προσθήκη υποκατηγορίας', 'admin.cat.inactive': 'Ανενεργή', 'admin.event.user_login': 'Σύνδεση', 'admin.event.user_register': 'Εγγραφή', 'admin.event.admin_user_deactivate': 'Αποκλεισμός χρήστη', 'admin.event.admin_user_activate': 'Ενεργοποίηση χρήστη', 'admin.event.admin_user_role_changed': 'Αλλαγή ρόλου', 'admin.event.admin_task_cancelled': 'Ακύρωση εργασίας', 'admin.event.admin_task_deleted': 'Διαγραφή εργασίας', 'admin.event.admin_report_reviewed': 'Αναφορά εξετάστηκε', 'admin.event.admin_report_dismissed': 'Αναφορά απορρίφθηκε', 'admin.event.task_created': 'Δημιουργία εργασίας', 'user.online': 'Σε σύνδεση', 'user.seen_minutes': 'ήταν εδώ πριν {n} λεπτά', 'user.seen_hours': 'ήταν εδώ πριν {n} ώρες', 'user.seen_yesterday': 'ήταν εδώ χθες', 'user.seen_days': 'ήταν εδώ πριν {n} μέρες', // Specialists 'specialists.title': 'Ειδικοί', 'specialists.search': 'Αναζήτηση ειδικού...', 'specialists.search.btn': 'Αναζήτηση', 'specialists.empty': 'Δεν βρέθηκαν ειδικοί', 'specialists.no_bio': 'Χωρίς περιγραφή', 'specialists.view': 'Προβολή προφίλ', 'specialists.reviews': 'αξιολογήσεις', 'specialist.favorite': 'Προσθήκη στα αγαπημένα', 'specialist.unfavorite': 'Αφαίρεση από αγαπημένα', 'specialist.site_link': 'Προσωπικό site', 'favorites.specialists.title': 'Αγαπημένοι ειδικοί', 'favorites.specialists.empty': 'Δεν έχετε αγαπημένους ειδικούς', 'nav.favorites': 'Αγαπημένα', 'nav.schedule': 'Πρόγραμμα', 'nav.find_tasks': 'Αναζήτηση εργασιών', 'schedule.title': 'Το πρόγραμμά μου', 'schedule.subtitle': 'Σημειώστε τις ημέρες που είστε ελεύθεροι ή απασχολημένοι — οι πελάτες θα δουν τη διαθεσιμότητά σας', 'schedule.available': 'Ελεύθερος', 'schedule.busy': 'Απασχολημένος', 'schedule.unset': 'Μη ορισμένο', 'schedule.click_hint': '← κλικ για εναλλαγή κατάστασης', 'schedule.range_mode': 'Επιλογή εύρους', 'schedule.range_from': 'Από {date} — επιλέξτε τελική ημερομηνία', 'schedule.click_to_set': 'Κλικ για ορισμό', 'schedule.free': 'ελεύθερα', 'schedule.busy_count': 'απασχολημένα', 'schedule.free_days': 'ελεύθερες ημέρες', 'schedule.googleCalendar': 'Google Calendar', 'schedule.connectGoogle': 'Σύνδεση με Google Calendar', 'schedule.disconnectGoogle': 'Αποσύνδεση', 'schedule.connectedAs': 'Συνδεδεμένο ως', 'schedule.importFromGoogle': 'Συγχρονισμός από Google', 'schedule.gcalConnected': '✓ Google Calendar συνδέθηκε', 'schedule.gcalError': 'Σφάλμα σύνδεσης Google Calendar', 'schedule.gcalImportDone': 'Εισήχθησαν {n} ημερ. από Google Calendar', 'schedule.gcalAutoSyncNote': 'Οι αλλαγές αποστέλλονται αυτόματα στο Google Calendar', 'schedule.gcalConnectDesc': 'Συνδέστε το Google Calendar για αυτόματο συγχρονισμό', 'schedule.gcalDisconnectConfirm': 'Αποσύνδεση Google Calendar;', 'find_tasks.title': 'Αναζήτηση εργασιών', 'find_tasks.for_me': 'Για μένα', 'find_tasks.all': 'Όλες οι εργασίες', 'find_tasks.by_category': 'Ανά κατηγορία', 'find_tasks.list': 'Λίστα', 'find_tasks.already_offered': 'Προσφορά υποβλήθηκε', 'find_tasks.offer_now': 'Υποβολή προσφοράς', 'find_tasks.empty_for_me': 'Δεν βρέθηκαν εργασίες στις κατηγορίες σας', 'find_tasks.banner_hint': 'Βρείτε εργασίες που ταιριάζουν με το χαρτοφυλάκιό σας', 'find_tasks.no_cards': 'Δημιουργήστε ένα χαρτοφυλάκιο ειδικού για να δείτε εργασίες για εσάς', 'find_tasks.add_card': 'Δημιουργία χαρτοφυλακίου', 'find_tasks.search': 'Αναζήτηση εργασιών...', 'find_tasks.tasks_count': 'εργασίες', // Footer 'footer.tagline': 'Η πλατφόρμα εργασιών για την Ελλάδα', 'footer.rights': 'Όλα τα δικαιώματα διατηρούνται.', // App download section 'app.download_title': 'Κατεβάστε την εφαρμογή CanHelp', 'app.download_desc': 'Όλο το CanHelp — πάντα μαζί σας. Διαθέσιμο για Android και iOS.', // Nav 'nav.pricing': 'Τιμές', // Pricing page 'pricing.title': 'Τιμολόγηση', 'pricing.subtitle': 'Επιλέξτε το κατάλληλο πρόγραμμα', 'pricing.role.customer': 'Πελάτης', 'pricing.role.specialist': 'Ειδικός', 'pricing.free': 'Δωρεάν', 'pricing.per_month': 'μήνα', 'pricing.duration': 'Διάρκεια', 'pricing.days': 'ημ.', 'pricing.current_plan': 'Το πρόγραμμά σας', 'pricing.popular': 'Δημοφιλές', 'pricing.choose': 'Επιλογή', 'pricing.your_plan': 'Ενεργό πρόγραμμα', 'pricing.free_default': 'Προεπιλογή', 'pricing.compare': 'Σύγκριση λειτουργιών', 'pricing.feature': 'Λειτουργία', 'pricing.faq_note': 'Η πληρωμή γίνεται από το υπόλοιπο CanHelp. Ανατροφοδότηση διαθέσιμη στην Πληρωμή.', 'pricing.feat.messages': 'Μηνύματα / ημέρα', 'pricing.feat.orders': 'Παραγγελίες / ημέρα', 'pricing.feat.contact_all': 'Επικοινωνία με όλους', 'pricing.feat.view_phone': 'Εμφάνιση τηλεφώνου', 'pricing.feat.show_contact': 'Εμφάνιση στοιχείων επαφής', 'pricing.feat.favorites': 'Αγαπημένα', 'pricing.feat.verified_badge': 'Επαληθευμένο badge', 'pricing.feat.google_calendar': 'Google Calendar', 'pricing.feat.personal_site': 'Προσωπικό site', 'pricing.feat.auto_response': 'Αυτόματη απάντηση', 'pricing.feat.auto_match': 'Αυτόματη αντιστοίχιση', 'pricing.feat.highlighted_reviews': 'Επισημασμένες αξιολογήσεις', 'pricing.feat.portfolio': 'Στοιχεία χαρτοφυλακίου', 'pricing.feat.cards': 'Κάρτες ειδικού', 'pricing.feat.notify_tasks': 'Ειδοποιήσεις νέων εργασιών', 'pricing.feat.video': 'Βίντεο στο χαρτοφυλάκιο', // Upgrade prompt 'upgrade.available_in': 'Διαθέσιμο στο', 'upgrade.cta': 'Αναβάθμιση', // Dashboard plan block 'dashboard.plan.title': 'Το πρόγραμμά μου', 'dashboard.plan.expires': 'Λήγει σε {n} ημέρες', 'dashboard.plan.upgrade': 'Αναβάθμιση προγράμματος', 'dashboard.plan.no_plan': 'Δωρεάν πρόγραμμα', 'dashboard.plan.messages': 'Μηνύματα σήμερα', 'dashboard.plan.orders': 'Παραγγελίες σήμερα', 'dashboard.plan.limits': 'Ημερήσια όρια', 'dashboard.plan.features': 'Λειτουργίες', 'dashboard.plan.stats': 'Στατιστικά', 'dashboard.stats.cards': 'Χαρτοφυλάκια', 'dashboard.stats.maxCards': 'Μέγ. χαρτοφυλάκια', 'dashboard.stats.portfolioItems': 'Στοιχεία portfolio', 'dashboard.stats.maxPortfolioItems': 'Μέγ. στοιχεία', 'dashboard.stats.activeOffers': 'Ενεργές προσφορές', 'dashboard.stats.reviewsReceived': 'Αξιολογήσεις', 'dashboard.stats.activeTasks': 'Ενεργές εργασίες', 'dashboard.stats.completedTasks': 'Ολοκληρωμένες', 'status.can_help_now': 'Είμαι διαθέσιμος τώρα', 'status.need_help': 'Χρειάζομαι βοήθεια', 'status.active': 'Ενεργό', 'status.toggle_on': 'Ενεργοποίηση', 'status.toggle_off': 'Απενεργοποίηση', // FOMO 'fomo.missed_orders': 'Χάσατε {n} παραγγελίες', 'fomo.missed_value': 'Αξία €{v}', 'fomo.upgrade_hint': 'Αναβαθμίστε για να λαμβάνετε περισσότερες παραγγελίες', 'fomo.conversion': 'Μετατροπές εργασιών', 'fomo.active': 'Ενεργές', 'fomo.with_offers': 'Με προσφορές', 'fomo.completed': 'Ολοκληρωμένες', 'fomo.already_offered': '{n} ειδικοί έχουν ήδη απαντήσει', 'fomo.specialist_missed': 'Χάσατε {n} παραγγελίες', 'fomo.top_categories': 'Κατηγορίες', 'fomo.offers_received': 'προσφορές ελήφθησαν', 'fomo.avg_offers': 'Μέσο {n}/εργασία', 'fomo.completion_rate': 'ολοκληρωμένες', // Task auto-match 'task.auto_match': 'Αυτόματη αντιστοίχιση', 'task.auto_match_results': 'Κορυφαίοι ειδικοί', 'task.no_offer_yet': 'Δεν έχετε στείλει προσφορά ακόμα', 'task.make_offer': 'Αποστολή προσφοράς', 'auto_response.title': 'Αυτόματη Απάντηση', 'auto_response.enabled': 'Ενεργοποίηση αυτόματης απάντησης', 'auto_response.min_budget': 'Ελάχ. προϋπολογισμός', 'auto_response.max_budget': 'Μέγ. προϋπολογισμός', 'auto_response.default_price': 'Προεπιλεγμένη τιμή', 'auto_response.default_message': 'Προεπιλεγμένο μήνυμα', 'auto_response.max_per_day': 'Μέγ. αυτόματες προσφορές/ημέρα', 'auto_response.save': 'Αποθήκευση', 'auto_response.saved': 'Αποθηκεύτηκε', 'auto_response.categories': 'Κατηγορίες', 'auto_response.locations': 'Τοποθεσίες', // Personal site 'profile.personal_site': 'Προσωπικό Site', 'profile.site_slug': 'Slug URL', 'profile.site_slug_hint': 'Μόνο λατινικοί χαρακτήρες, αριθμοί, - και _', 'profile.site_open': 'Άνοιγμα site', 'profile.site_preview': 'Το site σας', 'profile.show_contact': 'Εμφάνιση στοιχείων επαφής', 'profile.show_contact_hint': 'Πελάτες με Pro/Ultimate πρόγραμμα θα βλέπουν το τηλέφωνό σας', // Google Calendar plan gate 'gcal.upgrade_required': 'Το Google Calendar απαιτεί Pro ή Ultimate πρόγραμμα', // Chat limits 'chat.limit_warning': 'Απομένουν {n} μηνύματα σήμερα', 'chat.limit_reached': 'Εξαντλήθηκαν τα μηνύματα. Αναβαθμίστε το πρόγραμμά σας', 'chat.upgrade': 'Αναβάθμιση', // Site page 'site.member_since': 'Μαζί μας από', 'site.rating': 'Βαθμολογία', 'site.completed_tasks': 'Ολοκληρώθηκαν', 'site.languages': 'Γλώσσες', 'site.photos': 'φωτ.', 'site.contact_form': 'Επικοινωνία', 'site.contact_sent': 'Το μήνυμα στάλθηκε!', 'site.contact_sent_desc': 'Ο ειδικός θα επικοινωνήσει μαζί σας σύντομα', 'site.contact_name': 'Όνομα', 'site.contact_name_ph': 'Το όνομά σας', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Μήνυμα', 'site.contact_message_ph': 'Περιγράψτε την εργασία σας...', 'site.contact_send': 'Αποστολή', 'site.share': 'Κοινοποίηση', 'site.speaks_languages': 'Μιλάει', 'site.message_sent': 'Το μήνυμα εστάλη!', 'site.message_sent_desc': 'Ο ειδικός θα το λάβει στη συνομιλία', 'site.message_placeholder': 'Γράψτε το μήνυμά σας...', 'site.write_to_chat': 'Γράψτε στο chat', 'site.auth_required_title': 'Απαιτείται σύνδεση', 'site.auth_required_desc': 'Για να γράψετε στο chat, χρειάζεται να συνδεθείτε στο λογαριασμό σας.', 'site.auth_login_btn': 'Σύνδεση', 'site.auth_contact_form_btn': 'Επικοινωνία μέσω φόρμας', 'specialist.services': 'Υπηρεσίες', 'portfolio.title': 'Χαρτοφυλάκιο', 'common.not_found': 'Η σελίδα δεν βρέθηκε', 'common.anonymous': 'Ανώνυμα' }, en: { 'footer.slogan': 'Your task — our care! We solve any issue quickly and easily.', 'footer.links': 'Links', 'footer.socials': 'Socials', 'nav.home': 'Home', 'nav.tasks': 'Tasks', 'nav.post': '+ Post task', 'nav.dashboard': 'Dashboard', 'nav.chat': 'Messages', 'nav.notifications': 'Notifications', 'nav.profile': 'Profile', 'nav.admin': 'Admin Panel', 'nav.specialists': 'Specialists', 'nav.new_task': 'New task', 'nav.login': 'Login', 'nav.register': 'Register', 'nav.logout': 'Logout', 'hero.title': 'Find a specialist for any job', 'hero.subtitle': 'Post a task, receive offers and choose the best professional', 'hero.cta.post': 'Post a task', 'hero.cta.browse': 'Find work', 'hero.search.placeholder': 'What do you need? e.g. electrician, cleaning...', 'stats.specialists': 'specialists', 'stats.tasks': 'tasks', 'stats.categories': 'categories', 'stats.free': 'free sign-up', 'section.categories': 'Create a task in any category', 'section.how': 'How it works', 'section.recent': 'Recent tasks', 'section.all': 'See all →', 'section.more': 'more', 'section.cities': 'Cities & Districts', 'section.community': 'A community project for everyone', 'community.subtitle': 'CanHelp is not just a marketplace — it\'s a community of mutual help. Anyone with knowledge or a skill can find a client. Anyone with a problem can find a specialist.', 'community.point1.title': 'Are you good at something?', 'community.point1.desc': 'Repairs, tutoring, design, translation, care — every skill has value. Create a profile and find clients near you.', 'community.point2.title': 'Need help with something?', 'community.point2.desc': 'Post a task in under a minute and receive offers from verified specialists in your city.', 'community.point3.title': 'Help the project grow', 'community.point3.desc': 'CanHelp grows through communities. Share the link with friends and acquaintances — together we build something useful for everyone.', 'community.share': 'Share with friends', 'community.share.copied': 'Link copied!', // Referral section on home page 'section.referral': 'Referral Program', 'referral.home.subtitle': 'Share your link — every new user who signs up through it earns you a reward.', 'referral.home.step1.title': 'Sign up and get your link', 'referral.home.step1.desc': 'Create an account and find your unique referral link in your profile.', 'referral.home.step2.title': 'Share with friends', 'referral.home.step2.desc': 'Send the link to friends, acquaintances, or post it on social media.', 'referral.home.step3.title': 'Earn rewards', 'referral.home.step3.desc': 'Once your friend verifies their email, you automatically receive your reward.', 'referral.home.cta': 'Get your link', 'referral.home.badge': 'Referral Program', // FAQ section 'section.faq': 'Frequently Asked Questions', 'faq.q1': 'How does CanHelp work?', 'faq.a1': 'Post a task, receive offers from specialists, choose the best one and start working together. It\'s fast, simple and free for customers.', 'faq.q2': 'How much does it cost to use the platform?', 'faq.a2': 'Registration and task posting is completely free for customers. Specialists have access to a free plan as well as premium options.', 'faq.q3': 'How can I become a specialist?', 'faq.a3': 'Register, go to «Become a Specialist», fill in your profile with skills and categories, and start receiving tasks.', 'faq.q4': 'How do I choose the right specialist?', 'faq.a4': 'Check their reviews, experience, skills and portfolio. Chat with them through the platform and discuss the details before deciding.', 'faq.q5': 'What if I am not satisfied?', 'faq.a5': 'You can leave a review about the specialist and rate them from 1 to 5 stars. Reviews help other users find trusted professionals.', 'faq.q6': 'Can I contact a specialist before accepting their offer?', 'faq.a6': 'Yes. Once you receive an offer, you can open a chat with the specialist, ask questions and discuss all the details before making a decision.', 'faq.q7': 'How long does it take to receive offers?', 'faq.a7': 'Usually within a few hours. Specialists get notified about new tasks and can respond quickly.', 'faq.q8': 'Can I post a task in any city in Greece?', 'faq.a8': 'Yes! CanHelp covers all of Greece — Athens, Thessaloniki, Patras and more.', 'faq.q9': 'What types of tasks can I find on CanHelp?', 'faq.a9': 'Repairs, cleaning, electricians, tutoring, design, IT, moving, beauty and much more. Categories are constantly expanding.', 'faq.q10': 'Is there a mobile app?', 'faq.a10': 'Yes! CanHelp is available for Android and iOS. Download the app and manage everything from your phone.', 'how.step1.title': 'Post a task', 'how.step1.desc': 'Describe what you need and set your budget', 'how.step2.title': 'Receive offers', 'how.step2.desc': 'Specialists will send you offers with price and timeline', 'how.step3.title': 'Choose & start', 'how.step3.desc': 'Pick the best professional and start the collaboration', 'tasks.title': 'tasks', 'tasks.filters': 'Filters', 'tasks.search': 'Search', 'tasks.search.placeholder': 'Title or keyword...', 'tasks.search.btn': 'Search', 'tasks.publish': 'Post', 'tasks.category.all': 'All', 'tasks.category.all_in': 'All in', 'tasks.category.label': 'Category', 'tasks.location.label': 'City', 'tasks.location.placeholder': 'e.g. Athens', 'tasks.empty': 'No tasks found', 'tasks.empty.cta': 'Post the first one', 'task.status.open': 'Open', 'task.status.in_progress': 'In progress', 'task.status.completed': 'Completed', 'task.status.cancelled': 'Cancelled', 'task.status.draft': 'Draft', 'task.budget': 'Budget', 'task.location': 'Location', 'task.deadline': 'Start date', 'task.created_at': 'Created', 'task.customer': 'Customer', 'task.offer.btn': 'Submit offer', 'task.invite.banner_title': "You've been invited to this task", 'task.invite.banner_hint': 'The customer personally invited you', 'task.invite.accept': 'Send offer', 'task.invite.decline': 'Decline', 'offer.accept': 'Accept', 'offer.decline': 'Decline', 'task.complete': 'Complete task', 'task.complete.confirm': 'Mark this task as complete?', 'task.edit': 'Edit', 'task.status_label': 'Status', 'task.yours': 'Your task', 'task.offer.yours': 'Your offer', 'review.leave': 'Leave a review', 'review.rating': 'Rating', 'review.comment': 'Comment', 'review.comment.placeholder': 'Tell us about your experience...', 'review.submit': 'Submit review', 'review.submitting': 'Submitting...', 'review.done': 'Review submitted!', 'profile.reviews': 'Reviews', 'profile.no_reviews': 'No reviews yet', 'profile.rating': 'Rating', 'profile.skills.label': 'Skills', 'profile.member_since': 'Member since', 'task.offers': 'Offers', 'task.offers.none': 'No offers yet', 'create.title': 'Post a task', 'create.field.title': 'Title', 'create.field.description': 'Description', 'create.field.category': 'Category', 'create.field.category.select': 'Select...', 'create.field.location': 'Location', 'create.field.location.any': 'Anywhere', 'create.field.location.all': 'Entire city', 'create.field.budget': 'Budget (€)', 'create.field.deadline': 'Start date', 'create.field.budget_negotiable': 'Price is negotiable', 'create.field.time_slot': 'Time slot', 'create.field.time_slot.any': 'Anytime', 'create.field.time_slot.morning': 'Morning (08:00–13:00)', 'create.field.time_slot.afternoon': 'Afternoon (13:00–18:00)', 'create.field.time_slot.evening': 'Evening (18:00–22:00)', 'create.field.time_slot.weekend': 'Weekend', 'create.field.address': 'Address (optional)', 'create.field.address.district': 'District', 'create.field.address.street': 'Street', 'create.field.address.house': 'Number', 'create.field.confidential': 'Confidential note', 'create.field.confidential.placeholder': 'Details visible only to the assigned specialist...', 'create.field.confidential.hint': 'Not shown publicly', 'create.field.photos': 'Photos', 'create.field.photos.add': 'Add photo', 'create.field.photos.uploading': 'Uploading...', 'task.budget_negotiable': 'Price negotiable', 'task.time_slot': 'Time slot', 'task.confidential': 'Confidential note', 'create.field.title.placeholder': 'e.g. Clean 80sqm apartment', 'create.field.description.placeholder': 'Describe in detail what you need...', 'create.field.location.placeholder': 'e.g. Athens, Kolonaki', 'create.field.budget.placeholder': 'e.g. 100', 'create.submit': 'Post task', 'create.submitting': 'Posting...', 'login.title': 'Welcome back', 'login.subtitle': 'Sign in to CanHelp', 'login.email': 'Email', 'login.password': 'Password', 'login.submit': 'Sign in', 'login.submitting': 'Signing in...', 'login.error': 'Invalid email or password', 'login.unverified.title': 'Verify your email address', 'login.unverified.desc': 'We sent a verification link to your email. Check your inbox (or spam) and click the link.', 'login.unverified.resend': 'Resend verification email', 'login.unverified.sending': 'Sending...', 'login.unverified.sent': '✓ Sent — check your inbox', 'profile.email.verified': 'Email verified', 'profile.email.not_verified': 'Email not verified', 'login.no_account': "Don't have an account?", 'login.register_link': 'Register', 'login.forgot_password': 'Forgot password?', 'login.or_continue_with': 'or continue with', 'login.continue_google': 'Continue with Google', 'forgot.title': 'Forgot password', 'forgot.subtitle': 'Enter your email to receive a reset link', 'forgot.email': 'Email', 'forgot.submit': 'Send reset link', 'forgot.submitting': 'Sending...', 'forgot.sent.title': 'Check your inbox', 'forgot.sent.desc': 'If an account exists with that email, we\'ll send you a password reset link.', 'forgot.back_to_login': 'Back to sign in', 'forgot.error': 'Could not send reset link. Check the email address and try again.', 'forgot.error.not_found': 'No account found with this email address.', 'forgot.error.send_failed': 'Failed to send email. Please try again later.', 'reset.title': 'New password', 'reset.subtitle': 'Enter your new password', 'reset.password': 'New password', 'reset.confirm': 'Confirm password', 'reset.submit': 'Change password', 'reset.submitting': 'Saving...', 'reset.success': 'Password changed successfully. Redirecting to sign in...', 'reset.back_to_login': 'Back to sign in', 'reset.error.mismatch': 'Passwords do not match', 'reset.error.invalid': 'Invalid or expired link. Please request a new one.', 'register.title': 'Register', 'register.subtitle': 'Create a CanHelp account', 'register.first_name': 'First name', 'register.last_name': 'Last name', 'register.email': 'Email', 'register.password': 'Password (min 8 characters)', 'register.role': 'Role', 'register.role.customer': 'User', 'register.role.customer.desc': 'I post tasks', 'register.role.specialist': 'Specialist', 'register.role.specialist.desc': 'I take on tasks', 'register.submit': 'Create account', 'register.submitting': 'Registering...', 'register.has_account': 'Already have an account?', 'register.login_link': 'Sign in', 'register.continue_google': 'Continue with Google', 'register.check_email.title': 'Check your email', 'register.check_email.desc': 'We sent a verification link to your email address. Check your inbox (or spam) and click the link.', 'register.check_email.login': 'Back to sign in', 'dashboard.title': 'Dashboard', 'dashboard.new_task': '+ New task', 'dashboard.my_tasks': 'My tasks', 'dashboard.my_offers': 'My offers', 'dashboard.invitations': 'Job invitations', 'dashboard.offers_count': 'offers', 'dashboard.declined_count': 'declined', 'dashboard.completed_tasks': 'Completed tasks', 'dashboard.completed_offers': 'Completed offers', 'dashboard.review_pending': 'Review not yet submitted', 'tasks.new.top_specialists': 'Top specialists', 'tasks.new.select_category': 'Select a category to see matching specialists', 'tasks.new.invite': 'Offer work', 'tasks.new.invited': 'Selected ✓', 'reviews.count': 'reviews', 'filter.location': 'Location', 'filter.language': 'Languages', 'filter.language.any': 'Any language', 'filter.category.all': 'All categories', 'user.categories': 'Categories', 'user.work_area': 'Work area', 'dashboard.tasks.empty': "You haven't posted any tasks", 'dashboard.tasks.empty.cta': 'Post your first one', 'dashboard.tasks.add_new': 'Add a new task', 'dashboard.offers.empty': "You haven't submitted any offers", 'dashboard.offers.empty.cta': 'Find tasks', 'dashboard.customer.specialists_title': 'Looking for a specialist?', 'dashboard.customer.specialists_hint': 'Browse specialist profiles, read reviews and invite them to your tasks', 'dashboard.customer.specialists_cta': 'Find a specialist', 'dashboard.customer.how_title': 'How it works', 'dashboard.customer.step1': 'Create a task with a description and budget', 'dashboard.customer.step2': 'Specialists will send offers with price and timeline', 'dashboard.customer.step3': 'Choose the right one and start working', 'notif.title': 'Notifications', 'notif.mark_all': 'Mark all as read', 'notif.empty': 'No notifications', 'notif.type.new_offer': 'New offer', 'notif.type.offer_accepted': 'Your offer was accepted', 'notif.type.offer_declined': 'Your offer was declined', 'notif.type.task_completed': 'Task completed', 'notif.type.task_cancelled': 'Task cancelled', 'notif.type.new_message': 'New message', 'notif.type.new_review': 'New review', 'notif.type.task_invite': 'Job invitation', 'notif.body.new_offer': 'New offer for «{title}»', 'notif.body.offer_accepted': 'Your offer for «{title}» was accepted', 'notif.body.offer_declined': 'Your offer for «{title}» was declined', 'notif.body.task_invite': 'You\'ve been invited for «{title}»', 'notif.body.new_review': 'You received a {rating}★ review', 'offer.status.pending': 'Pending', 'offer.status.accepted': 'Accepted', 'offer.status.declined': 'Declined', 'offer.status.withdrawn': 'Withdrawn', 'offer.status.other_accepted': 'Another specialist was chosen', 'common.loading': 'Loading...', 'common.error': 'Error', 'common.save': 'Save', 'common.saving': 'Saving...', 'common.cancel': 'Cancel', 'common.add': 'Add', 'common.close': 'Close', 'common.edit': 'Edit', 'common.delete': 'Delete', 'common.from': 'by', 'common.currency': '€', 'common.greece': 'Greece', // Chat 'chat.connected': 'Connected', 'chat.disconnected': 'Disconnected', 'chat.no_rooms': 'No conversations yet', 'chat.task_fallback': 'Task', 'chat.select': 'Select a conversation', 'chat.no_messages': 'No messages yet', 'chat.placeholder': 'Write a message... (Enter to send)', 'chat.conversation_fallback': 'Conversation', 'chat.direct_chat': 'Direct chat', 'chat.linked_task': 'Linked task', 'chat.write_btn': 'Message', 'chat.just_now': 'just now', 'chat.min_ago': 'm', 'chat.write_specialist': 'Write to specialist', 'chat.write_customer': 'Write to customer', 'chat.notif_settings': 'Notification settings', 'chat.notif_messages': 'Notifications for new messages', 'chat.toast_title': 'New message', 'chat.toast_open': 'Open chat', // Offer form 'offer.price': 'Price', 'offer.price.placeholder': 'e.g. 80', 'offer.customer_budget': 'Client budget', 'offer.message': 'Message', 'offer.optional': 'optional', 'offer.message.placeholder': 'Introduce yourself, your experience and why you are the best choice...', 'offer.submitting': 'Sending...', // Profile 'profile.photo': 'Profile photo', 'profile.photo.change': 'Change photo', 'profile.photo.hint': 'JPEG, PNG, WebP · up to 5MB', 'profile.basic_info': 'Basic info', 'profile.phone': 'Phone', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Short bio', 'profile.bio.placeholder': 'Tell us a bit about yourself...', 'profile.language': 'Language', 'profile.language.hint': 'App interface and email notification language', 'profile.languages': 'Languages spoken', 'profile.languages.hint': 'Select all languages you speak', 'profile.skills': 'Skills', 'profile.skills.subtitle': 'Add the services you offer', 'profile.skills.placeholder': 'e.g. Cleaning, IT, Tutoring...', 'profile.role': 'Account role', 'profile.role.specialist': '🔧 Specialist', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 User', 'profile.role.change': 'To change your role please contact support.', 'profile.become_specialist': 'Become a Specialist', 'profile.become_specialist.desc': 'Upgrade to Specialist to take on tasks and build your profile.', 'become_specialist.hero.title': 'Earn money doing what you do best', 'become_specialist.hero.subtitle': 'Create a specialist profile and receive orders from clients across Greece', 'become_specialist.how.title': 'How it works', 'become_specialist.step1.title': 'Create a specialist portfolio', 'become_specialist.step1.desc': 'Set your categories, skills and coverage areas — the system will automatically match you with relevant tasks', 'become_specialist.step2.title': 'Find tasks', 'become_specialist.step2.desc': 'Discover tasks in your categories in the "Find Orders" section', 'become_specialist.step3.title': 'Send an offer & earn', 'become_specialist.step3.desc': 'Submit offers with price and timeline, chat with clients and complete tasks', 'become_specialist.benefits.title': 'Specialist profile advantages', 'become_specialist.benefit1': 'Task search filtered by your categories and location', 'become_specialist.benefit2': 'Public profile with client reviews', 'become_specialist.benefit3': 'Availability schedule visible to clients', 'become_specialist.benefit4': 'Saved to favourites by clients', 'become_specialist.cta': 'Become a Specialist — it\'s free', 'become_specialist.free_badge': 'Free registration', 'profile.tab.notifications': 'Notifications', 'profile.tab.reviews': 'Reviews', 'profile.tab.referral': 'Referrals', 'profile.tab.auto_response': 'Auto-response', 'profile.tab.site': 'Site', 'profile.site.title': 'Personal page', 'profile.site.url_label': 'Personal site', 'profile.site.copy': 'Copy', 'profile.site.copied': 'Copied', 'profile.site.visible_title': "What's on your page", 'profile.site.visible.name': 'Name and photo', 'profile.site.visible.bio': 'Bio', 'profile.site.visible.rating': 'Rating and reviews', 'profile.site.visible.portfolio': 'Portfolio / Cards', 'profile.site.visible.contacts': 'Contact info', 'profile.site.visible.full_last_name': 'Full last name', 'profile.site.visible.services': 'Service cards', 'profile.site.visible.reviews': 'Reviews section', 'profile.site.visible.status': '"Ready to help" status', 'profile.site.theme': 'Appearance theme', 'profile.site.theme.dark': 'Dark', 'profile.site.theme.light': 'Light', 'profile.site.slug_taken': 'This address is already taken', 'profile.site.stats.title': 'Site analytics', 'profile.site.stats.days': 'last 30 days', 'profile.site.stats.views': 'Views', 'profile.site.stats.unique': 'Unique visitors', 'profile.site.stats.messages': 'Messages', 'profile.site.stats.total_views': 'Total views', 'profile.site.stats.total_unique': 'Unique visitors', 'profile.site.stats.total_messages': 'Messages', 'profile.site.stats.empty': 'No data yet', 'profile.site.stats.loading': 'Loading analytics...', 'profile.site.stats.no_slug': 'Set your site URL to see analytics', 'profile.site.edit_bio_hint': 'Bio and photo are edited in the "Basic info" tab.', 'status.title': 'Status', 'status.can_help_now_hint': 'Your card is shown higher in search', 'status.need_help_hint': 'Specialists can offer you help', 'profile.referral.title': 'Referral program', 'profile.referral.desc': 'Share your link and earn rewards for every new user you invite.', 'profile.referral.link_label': 'Your referral link', 'profile.referral.copy': 'Copy', 'profile.referral.copied': 'Copied!', 'profile.referral.invited_count': 'successful referrals', 'profile.referral.no_code': 'Referral code is not available.', 'notifications.title': 'Notification settings', 'notifications.email.new_tasks': 'Email for new tasks', 'notifications.email.new_tasks.desc': 'Receive an email when a new task is posted in your categories', 'notifications.messages.desc': 'Receive a notification when a new message arrives', 'notifications.saved': 'Settings saved', 'notifications.plan_required': 'Not available in your plan', 'profile.tab.info': 'Basic info', 'profile.tab.finance': 'Finance', 'profile.tab.skills': 'Skills', 'profile.tab.categories': 'Categories', 'profile.tab.geography': 'Geography', 'profile.specialist.categories': 'Work categories', 'profile.specialist.categories.desc': 'Select the categories you work in', 'profile.specialist.geography': 'Coverage areas', 'profile.specialist.geography.desc': 'Select the cities / districts where you are active', 'profile.saving': 'Saving...', 'profile.upload.error': 'Error uploading photo', 'profile.saved': 'Saved', 'profile.tab.cards': 'Portfolio', 'profile.cards.count': 'Portfolio', 'profile.cards.add': 'Add portfolio', 'profile.cards.new_title': 'New portfolio title', 'profile.cards.placeholder': 'e.g. Plumbing', 'profile.cards.create': 'Create', 'profile.cards.cancel': 'Cancel', 'profile.cards.empty': 'No portfolio yet', 'profile.cards.create_first': 'Create your first portfolio', 'profile.cards.delete_confirm': 'Delete portfolio?', 'profile.card.tab.main': 'General', 'profile.card.tab.skills': 'Skills', 'profile.card.tab.categories': 'Categories', 'profile.card.tab.geography': 'Geography', 'profile.card.tab.portfolio': 'Portfolio', 'profile.card.active': 'Active', 'profile.card.save': 'Save', 'profile.card.saved': 'Saved', 'profile.card.delete': 'Delete', 'profile.card.skill.add': 'Add skill', 'profile.card.photo.add': 'Add photo', 'profile.card.photo.uploading': 'Uploading...', 'profile.card.photo.empty': 'No photos yet', 'profile.card.item.title': 'Title', 'profile.card.item.desc': 'Description', 'profile.card.item.save': 'Save', 'profile.card.item.cancel': 'Cancel', 'profile.card.item.edit': 'Edit', 'profile.upgrade.cards_limit': 'Portfolio limit reached', 'profile.upgrade.plan': 'Current plan:', 'profile.upgrade.contact': 'Contact the administrator to change your plan', 'profile.upgrade.ok': 'Got it', 'profile.plan.title': 'Subscription plan', 'profile.balance': 'Balance', 'profile.balance.topup': 'Top Up Balance', 'profile.balance.topup.title': 'Top Up Balance', 'profile.balance.topup.amount': 'Amount (EUR)', 'profile.balance.topup.hint': 'Choose a preset or enter a custom amount', 'profile.balance.topup.submit': 'Proceed to Payment', 'profile.balance.topup.loading': 'Redirecting...', 'profile.balance.topup.error': 'Payment initiation failed. Please try again.', 'payment.success.title': 'Payment Successful!', 'payment.success.desc': 'Your balance has been updated.', 'payment.cancelled.title': 'Payment Cancelled', 'payment.cancelled.desc': 'Payment was cancelled. No charges were made.', 'payment.pending.title': 'Processing...', 'payment.pending.desc': 'Your payment is being processed.', 'payment.back_to_profile': 'Back to Profile', 'profile.plan.basic': 'Basic (free)', 'profile.plan.contact_upgrade': 'Contact admin to upgrade your plan', 'profile.plan.cards_up_to': 'Portfolio: up to', 'profile.plan.cards_unlimited': 'Portfolio: unlimited', 'profile.plan.tasks_up_to': 'Tasks: up to', 'profile.plan.offers_up_to': 'Offers: up to', 'profile.plan.valid_until': 'Valid until', 'profile.plan.no_expiry': 'No expiry', // Create task 'create.error': 'Error posting task', // Tasks list extras 'tasks.category.general': 'General', 'tasks.budget.range': 'Range:', 'tasks.budget.from': 'from', 'tasks.budget.to': 'to', 'tasks.filter.reset': 'Reset filters', 'tasks.load_more': 'Load more', 'tasks.showing': 'Results:', 'tasks.field.budget': 'Budget, €', // Admin 'admin.title': 'Admin Panel', 'admin.tab.stats': 'Statistics', 'admin.tab.users': 'Users', 'admin.tab.tasks': 'Tasks', 'admin.tab.reports': 'Reports', 'admin.stats.users': 'Users', 'admin.stats.tasks': 'Tasks', 'admin.stats.offers': 'Offers', 'admin.stats.reviews': 'Reviews', 'admin.tasks.by_status': 'Tasks by status', 'admin.col.user': 'User', 'admin.col.email': 'Email', 'admin.col.role': 'Role', 'admin.col.registered': 'Registered', 'admin.col.status': 'Status', 'admin.col.title': 'Title', 'admin.col.budget': 'Budget', 'admin.col.created': 'Created', 'admin.users.active': 'Active', 'admin.users.inactive': 'Inactive', 'admin.users.deactivate': 'Deactivate', 'admin.users.activate': 'Activate', 'admin.tasks.cancel': 'Cancel', 'admin.reports.none': 'No reports', 'admin.reports.reviewed': 'Reviewed', 'admin.reports.dismiss': 'Dismiss', 'admin.pagination.total': 'Total', 'admin.users.role.change': 'Change role', 'admin.users.search.placeholder': 'Search name or email...', 'admin.tasks.delete': 'Delete', 'admin.tasks.delete.confirm': 'Permanently delete this task?', 'admin.tasks.search.placeholder': 'Search title...', 'admin.col.customer': 'Customer', 'admin.col.reporter': 'Reporter', 'admin.col.target': 'Target', 'admin.filter.all_roles': 'All roles', 'admin.filter.all_statuses': 'All statuses', 'admin.reports.target.task': 'Task', 'admin.reports.target.user': 'User', 'admin.tab.categories': 'Categories', 'admin.tab.locations': 'Cities & Districts', 'admin.tab.logs': 'Logs', 'admin.tab.plans': 'Plans', 'admin.tab.settings': 'Settings', 'admin.logs.subtab.ai': 'AI Logs', 'admin.logs.subtab.activity': 'Activity', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Notifications', 'admin.notif_logs.type': 'Type', 'admin.notif_logs.title': 'Title', 'admin.notif_logs.read': 'Read', 'admin.notif_logs.empty': 'No notification logs', 'admin.stats.notif_chart_title': 'Notifications per day', 'admin.stats.notif_label': 'Notifications', 'admin.stats.mail_chart_title': 'Emails per day', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'All', 'admin.stats.specialists': 'Specialists', 'admin.col.plan': 'Plan', 'admin.back_home': 'Home', 'admin.plans.title': 'Subscription plans', 'admin.plans.add': '+ New plan', 'admin.plans.empty': 'No plans created', 'admin.plans.form.new': 'New plan', 'admin.plans.form.edit': 'Edit plan', 'admin.plans.form.name': 'Name', 'admin.plans.form.price': 'Price (EUR)', 'admin.plans.form.old_price': 'Old price (EUR, optional)', 'admin.plans.form.max_offers': 'Max offers (empty = no limit)', 'admin.plans.form.max_cards': 'Max portfolio (empty = no limit)', 'admin.plans.form.duration_days': 'Duration (days, empty = no expiry)', 'admin.plans.form.description': 'Description', 'admin.plans.form.features': 'Features (one per line)', 'admin.plans.form.notify': 'Notify about new tasks', 'admin.plans.form.default': 'Default', 'admin.plans.form.active': 'Active', 'admin.plans.form.order': 'Order', 'admin.plans.form.role': 'Role', 'admin.plans.form.tier': 'Tier', 'admin.plans.form.role.customer': 'Customer', 'admin.plans.form.role.specialist': 'Specialist', 'admin.plans.form.tier.free': 'Free', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Limits (empty = unlimited)', 'admin.plans.form.max_messages_day': 'Max Messages/Day', 'admin.plans.form.max_orders_day': 'Max Orders/Day', 'admin.plans.form.max_skills': 'Max Skills', 'admin.plans.form.max_profiles': 'Max Profiles', 'admin.plans.form.max_portfolio': 'Max Portfolio Items', 'admin.plans.form.section.boost': 'Multipliers & Boost', 'admin.plans.form.search_boost': 'Search Boost', 'admin.plans.form.offers_multiplier': 'Offers Multiplier', 'admin.plans.form.section.contact': 'Contact Permissions', 'admin.plans.form.can_contact_free': 'Contact Free Plan users', 'admin.plans.form.can_contact_pro': 'Contact Pro Plan users', 'admin.plans.form.can_contact_all': 'Contact All users', 'admin.plans.form.can_show_contact': 'Show Contact Info', 'admin.plans.form.can_view_phone': 'View Phone', 'admin.plans.form.section.features': 'Feature Flags', 'admin.plans.form.upload_video': 'Upload Video', 'admin.plans.form.favorites': 'Favorites', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Verified Badge', 'admin.plans.form.highlighted_reviews': 'Highlighted Reviews', 'admin.plans.form.personal_site': 'Personal Site', 'admin.plans.form.can_help_now': 'Can Help Now Status', 'admin.plans.form.need_help': 'Need Help Status', 'admin.plans.form.auto_response': 'Auto Response', 'admin.plans.form.auto_match': 'Auto Match', 'admin.plans.form.instant_dispatch_free': 'Instant Dispatch (Free)', 'admin.plans.form.instant_dispatch_pro': 'Instant Dispatch (Pro)', 'admin.plans.badge.default': 'Default', 'admin.plans.badge.inactive': 'Inactive', 'admin.plans.make_default': 'Set as default', 'admin.plans.tasks': 'Tasks', 'admin.plans.offers': 'Offers', 'admin.plans.cards': 'Portfolio', 'admin.plans.notify_tasks': 'Task notifications', 'admin.plans.delete.confirm': 'Delete plan', 'admin.activity.title': 'Activity log', 'admin.activity.event': 'Event', 'admin.activity.all_events': 'All events', 'admin.activity.from': 'From', 'admin.activity.to': 'To', 'admin.activity.reset': 'Reset', 'admin.activity.total': 'Total', 'admin.activity.empty': 'No records', 'admin.mail.event': 'Email event', 'admin.mail.all_events': 'All email events', 'admin.mail.from': 'From', 'admin.mail.to': 'To', 'admin.mail.reset': 'Reset', 'admin.mail.total': 'Total', 'admin.mail.empty': 'No email logs', 'admin.mail.recipient': 'Recipient', 'admin.mail.provider': 'Provider', 'admin.mail.details': 'Details', 'admin.mail.status': 'Status', 'admin.mail.success': 'Success', 'admin.mail.failed': 'Failed', 'admin.event.email_sent': 'Email sent', 'admin.event.email_failed': 'Email failed', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Admin test email sent', 'admin.event.admin_email_test_failed': 'Admin test email failed', 'admin.logs.empty': 'No records', 'admin.logs.date': 'Date', 'admin.logs.provider': 'Provider', 'admin.logs.model': 'Model', 'admin.logs.action': 'Action', 'admin.logs.langs': 'Languages', 'admin.logs.in': 'In', 'admin.logs.out': 'Out', 'admin.logs.total': 'Total', 'admin.logs.ms': 'ms', 'admin.logs.status': 'Status', 'admin.stats.activity_30d': 'Activity over 30 days', 'admin.stats.tasks_label': 'Tasks', 'admin.stats.users_label': 'Users', 'admin.stats.specialists_label': 'Specialists', 'admin.stats.tokens_title': 'Token usage (by month)', 'admin.stats.tokens_out': 'Output', 'admin.stats.tokens_in': 'Input', 'admin.stats.tokens_out_label': 'Output tokens', 'admin.stats.tokens_in_label': 'Input tokens', 'admin.stats.cost_label': 'Cost (USD)', 'admin.stats.tasks_by_status': 'Tasks by status', 'admin.task_status.open': 'Open', 'admin.task_status.in_progress': 'In progress', 'admin.task_status.completed': 'Completed', 'admin.task_status.cancelled': 'Cancelled', 'admin.task_status.draft': 'Drafts', 'admin.settings.tab.general': 'General', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Notifications', 'admin.settings.tab.payment': 'Payment', 'admin.settings.tab.referral': 'Referrals', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO & Maintenance', 'admin.settings.seo.maintenance_label': 'Maintenance Mode', 'admin.settings.seo.maintenance_hint': 'Show a maintenance page to all visitors', 'admin.settings.seo.indexing_label': 'Search Engine Indexing', 'admin.settings.seo.indexing_hint': 'Allow search engines to index the site', 'admin.settings.seo.head_scripts_label': ' Scripts (JS)', 'admin.settings.seo.head_scripts_hint': 'Runs on every page (Google Tag Manager, analytics, etc.)', 'admin.settings.seo.site_title_label': 'Site Title', 'admin.settings.seo.site_description_label': 'Site Description (meta description)', 'admin.settings.referral.title': 'Referral program', 'admin.settings.referral.hint': 'Reward users who bring new registrations.', 'admin.settings.referral.enabled_label': 'Enabled', 'admin.settings.referral.enabled_hint': 'Enable / disable reward application', 'admin.settings.referral.customer_section': 'For customers', 'admin.settings.referral.specialist_section': 'For specialists', 'admin.settings.referral.plan_label': 'Reward plan', 'admin.settings.referral.no_plan': '— no plan —', 'admin.settings.referral.plan_hint': 'This plan will be assigned to the referrer. If their current plan is higher, only days will be added.', 'admin.settings.referral.days_label': 'Reward days', 'admin.settings.referral.days_hint': 'Number of days added to the plan expiry.', 'admin.settings.general.title': 'General settings', 'admin.settings.general.site_name': 'Site name', 'admin.settings.general.site_url': 'Site URL', 'admin.settings.general.contact_email': 'Contact email', 'admin.settings.general.support_phone': 'Support phone', 'admin.settings.smtp.title': 'SMTP settings', 'admin.settings.smtp.hint': 'Used to send email notifications.', 'admin.settings.smtp.host': 'SMTP Host', 'admin.settings.smtp.port': 'Port', 'admin.settings.smtp.encryption': 'Encryption', 'admin.settings.smtp.enc.none': 'None', 'admin.settings.smtp.enc.tls': 'STARTTLS (port 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (port 465)', 'admin.settings.smtp.username': 'Username', 'admin.settings.smtp.password': 'Password / App Password', 'admin.settings.smtp.from_name': 'Sender name', 'admin.settings.smtp.from_email': 'Sender email', 'admin.settings.smtp.test': 'Send test email', 'admin.settings.smtp.sending': 'Sending...', 'admin.settings.payment.hint': 'ePay Piraeus Bank credentials.', 'admin.settings.env.test': 'Test (sandbox)', 'admin.settings.env.prod': 'Production', 'admin.settings.env.label': 'Environment', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Active', 'admin.settings.saving': 'Saving...', 'admin.settings.saved': 'Saved', 'admin.notif.vars_hint': 'Available variables in templates', 'admin.notif.tmpl.not_set': 'Template not configured', 'admin.notif.tmpl.subject_label': 'Email subject', 'admin.notif.tmpl.body_label': 'Email body (HTML)', 'admin.notif.tmpl.save': 'Save', 'admin.notif.tmpl.close': 'Close', 'admin.notif.tmpl.translate': 'Auto-translate to other languages', 'admin.notif.tmpl.translating': 'Translating...', 'admin.notif.tmpl.saving': 'Saving...', 'admin.notif.email_verification': 'Email verification', 'admin.notif.registration_success': 'Successful registration', 'admin.notif.password_reset': 'Password reset', 'admin.notif.new_offer': 'New offer', 'admin.notif.new_task': 'New task', 'admin.notif.offer_accepted': 'Offer accepted', 'admin.notif.new_message': 'New message', 'admin.notif.offer_declined': 'Offer declined', 'admin.notif.offer_other_accepted': 'Another specialist chosen', 'admin.notif.task_updated': 'Task updated', 'admin.notif.deadline_reminder': 'Deadline reminder', 'admin.notif.task_archived': 'Task unpublished automatically', 'admin.notif.referral_reward': 'Referral reward', // Plan lifecycle email templates 'admin.email_template.plan_activated': 'Plan activated', 'admin.email_template.plan_upgraded': 'Plan upgraded', 'admin.email_template.plan_downgrade_scheduled': 'Downgrade scheduled', 'admin.email_template.plan_downgrade_applied': 'Downgrade applied', 'admin.email_template.plan_renewal_reminder': 'Renewal reminder', 'admin.email_template.plan_insufficient_funds': 'Insufficient funds warning', // Pricing confirm modal 'pricing.confirm.title': 'Confirm plan selection', 'pricing.confirm.plan': 'Plan', 'pricing.confirm.prorated': 'Prorated credit', 'pricing.confirm.effective_price': 'Amount due', 'pricing.confirm.your_balance': 'Your balance', 'pricing.confirm.downgrade_info': 'The switch to the new plan will happen automatically after the current period ends.', 'pricing.confirm.insufficient': 'Insufficient balance.', 'pricing.confirm.top_up': 'Top up', 'pricing.confirm.schedule_downgrade': 'Schedule downgrade', 'pricing.confirm.pay': 'Pay', 'admin.user_edit.title': 'Edit user', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Registered', 'admin.user_edit.last_seen': 'Last seen', 'admin.user_edit.lang': 'Language', 'admin.user_edit.first_name': 'First name', 'admin.user_edit.last_name': 'Last name', 'admin.user_edit.phone': 'Phone', 'admin.user_edit.bio': 'Bio', 'admin.user_edit.role': 'Role', 'admin.user_edit.plan': 'Plan', 'admin.user_edit.no_plan': '— No plan —', 'admin.user_edit.active': 'Active account', 'admin.user_edit.balance': 'Balance (EUR)', 'admin.user_edit.skills': 'Skills', 'admin.user_edit.tab.profile': 'Profile', 'admin.user_edit.tab.account': 'Account', 'admin.user_edit.tab.balance': 'Balance', 'admin.user_edit.tab.settings': 'Settings', 'admin.user_edit.tab.specialist': 'Portfolio', 'admin.user_edit.tab.site': 'Website', 'admin.user_edit.plan_expires': 'Plan expires', 'admin.user_edit.interface_lang': 'Interface language', 'admin.user_edit.comm_languages': 'Communication languages', 'admin.user_edit.personal_site_slug': 'Personal page', 'admin.user_edit.show_contact_info': 'Show contact info', 'admin.user_edit.show_contact_info.hint': 'Visible to customers', 'admin.user_edit.notify_new_tasks': 'Notify about new tasks', 'admin.user_edit.notify_new_tasks.hint': 'Push and email notifications', 'admin.user_edit.notif_messages': 'Message notifications', 'admin.user_edit.notif_messages.hint': 'New messages in chat', 'admin.user_edit.site_settings': 'Personal page settings', 'admin.user_edit.categories': 'Service categories', 'admin.user_edit.locations': 'Service areas', 'admin.user_edit.skill_placeholder': 'New skill...', 'admin.user_edit.add_category': '— Select category —', 'admin.user_edit.add_location': '— Select location —', 'admin.user_edit.specialist_cards': 'Portfolio', 'admin.user_edit.no_cards': 'No portfolio found', 'admin.user_edit.card_title': 'Portfolio title', 'admin.user_edit.card_description': 'Description', 'admin.balance.topup.btn': 'Top up', 'admin.balance.withdraw.btn': 'Withdraw', 'admin.balance.modal_hint': 'Changes take effect immediately and are recorded in history', 'admin.balance.topup.title': 'Top up balance', 'admin.balance.topup.amount': 'Amount', 'admin.balance.topup.description': 'Comment', 'admin.balance.topup.description.placeholder': 'For example: bonus or manual top-up', 'admin.balance.topup.submit': 'Top up balance', 'admin.balance.withdraw.title': 'Withdraw balance', 'admin.balance.withdraw.amount': 'Amount', 'admin.balance.withdraw.description': 'Comment', 'admin.balance.withdraw.description.placeholder': 'For example: refund or manual debit', 'admin.balance.withdraw.submit': 'Withdraw from balance', 'admin.user_edit.role.customer': 'Customer', 'admin.user_edit.role.specialist': 'Specialist', 'admin.user_edit.role.admin': 'Administrator', 'common.refresh': 'Refresh', 'common.back_home': 'Home', 'admin.loc.hint': 'Manage cities and districts', 'admin.loc.add_city': 'New city', 'admin.loc.add_district': 'Add district', 'admin.loc.new': 'New location', 'admin.loc.edit': 'Edit location', 'admin.loc.district': 'district', 'admin.loc.empty': 'No locations', 'admin.loc.delete.confirm': 'Delete location? All districts will also be deleted.', 'admin.cat.add_root': 'New category', 'admin.cat.add_sub': 'Subcategory', 'admin.cat.edit': 'Edit', 'admin.cat.delete': 'Delete', 'admin.cat.delete.confirm': 'Delete category? All subcategories will also be deleted.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Icon', 'admin.cat.name_el': 'Greek', 'admin.cat.name_en': 'English', 'admin.cat.name_ru': 'Russian', 'admin.cat.order': 'Order', 'admin.cat.active': 'Active', 'admin.cat.parent': 'Parent category', 'admin.cat.no_parent': 'Top level', 'admin.cat.save': 'Save', 'admin.cat.cancel': 'Cancel', 'admin.cat.empty': 'No categories', 'admin.cat.hint': 'Manage categories with multi-level hierarchy', 'admin.cat.new': 'New category', 'admin.cat.subcategory': 'subcategory', 'admin.cat.add_child': 'Add subcategory', 'admin.cat.inactive': 'Inactive', 'admin.event.user_login': 'Login', 'admin.event.user_register': 'Registration', 'admin.event.admin_user_deactivate': 'User blocked', 'admin.event.admin_user_activate': 'User activated', 'admin.event.admin_user_role_changed': 'Role changed', 'admin.event.admin_task_cancelled': 'Task cancelled', 'admin.event.admin_task_deleted': 'Task deleted', 'admin.event.admin_report_reviewed': 'Report reviewed', 'admin.event.admin_report_dismissed': 'Report dismissed', 'admin.event.task_created': 'Task created', // User status 'user.online': 'Online', 'user.seen_minutes': 'was here {n} min ago', 'user.seen_hours': 'was here {n} hr ago', 'user.seen_yesterday': 'was here yesterday', 'user.seen_days': 'was here {n} days ago', // Specialists 'specialists.title': 'Specialists', 'specialists.search': 'Search specialist...', 'specialists.search.btn': 'Search', 'specialists.empty': 'No specialists found', 'specialists.no_bio': 'No description', 'specialists.view': 'View profile', 'specialists.reviews': 'reviews', 'specialist.favorite': 'Add to favorites', 'specialist.unfavorite': 'Remove from favorites', 'specialist.site_link': 'Personal site', 'favorites.specialists.title': 'Favourite specialists', 'favorites.specialists.empty': 'No favourite specialists yet', 'nav.favorites': 'Favourites', 'nav.schedule': 'Schedule', 'nav.find_tasks': 'Find Orders', 'schedule.title': 'My Schedule', 'schedule.subtitle': 'Mark the days when you are free or busy — clients will see your availability', 'schedule.available': 'Available', 'schedule.busy': 'Busy', 'schedule.unset': 'Not set', 'schedule.click_hint': '← click to cycle status', 'schedule.range_mode': 'Select range', 'schedule.range_from': 'From {date} — select end date', 'schedule.click_to_set': 'Click to set', 'schedule.free': 'free', 'schedule.busy_count': 'busy', 'schedule.free_days': 'free days', 'schedule.googleCalendar': 'Google Calendar', 'schedule.connectGoogle': 'Connect Google Calendar', 'schedule.disconnectGoogle': 'Disconnect', 'schedule.connectedAs': 'Connected as', 'schedule.importFromGoogle': 'Sync from Google', 'schedule.gcalConnected': '\u2713 Google Calendar connected', 'schedule.gcalError': 'Google Calendar connection error', 'schedule.gcalImportDone': 'Imported {n} days from Google Calendar', 'schedule.gcalAutoSyncNote': 'Availability changes are automatically synced to Google Calendar', 'schedule.gcalConnectDesc': 'Connect Google Calendar to automatically sync your availability', 'schedule.gcalDisconnectConfirm': 'Disconnect Google Calendar?', 'find_tasks.title': 'Find Orders', 'find_tasks.for_me': 'For me', 'find_tasks.all': 'All orders', 'find_tasks.by_category': 'By category', 'find_tasks.list': 'List', 'find_tasks.already_offered': 'Offer sent', 'find_tasks.offer_now': 'Make an offer', 'find_tasks.empty_for_me': 'No tasks found in your categories', 'find_tasks.banner_hint': 'Find tasks matching your portfolio categories', 'find_tasks.no_cards': 'Create a specialist portfolio to see tasks matched to you', 'find_tasks.add_card': 'Create portfolio', 'find_tasks.search': 'Search tasks...', 'find_tasks.tasks_count': 'tasks', 'footer.tagline': 'The task platform for Greece', 'footer.rights': 'All rights reserved.', // App download section 'app.download_title': 'Download the CanHelp mobile app', 'app.download_desc': 'All of CanHelp — always at your fingertips. Available for Android and iOS.', // Nav 'nav.pricing': 'Pricing', // Pricing page 'pricing.title': 'Pricing', 'pricing.subtitle': 'Choose the right plan for you', 'pricing.role.customer': 'Customer', 'pricing.role.specialist': 'Specialist', 'pricing.free': 'Free', 'pricing.per_month': 'mo', 'pricing.duration': 'Duration', 'pricing.days': 'days', 'pricing.current_plan': 'Your plan', 'pricing.popular': 'Popular', 'pricing.choose': 'Choose', 'pricing.your_plan': 'Active plan', 'pricing.free_default': 'Default', 'pricing.compare': 'Compare features', 'pricing.feature': 'Feature', 'pricing.faq_note': 'Payment is deducted from your CanHelp balance. Top up available in Payments.', 'pricing.feat.messages': 'Messages / day', 'pricing.feat.orders': 'Orders / day', 'pricing.feat.contact_all': 'Contact everyone', 'pricing.feat.view_phone': 'View phone number', 'pricing.feat.show_contact': 'Show contact info', 'pricing.feat.favorites': 'Favorites', 'pricing.feat.verified_badge': 'Verified badge', 'pricing.feat.google_calendar': 'Google Calendar', 'pricing.feat.personal_site': 'Personal site', 'pricing.feat.auto_response': 'Auto-response', 'pricing.feat.auto_match': 'Auto-match', 'pricing.feat.highlighted_reviews': 'Highlighted reviews', 'pricing.feat.portfolio': 'Portfolio items', 'pricing.feat.cards': 'Specialist cards', 'pricing.feat.notify_tasks': 'New task notifications', 'pricing.feat.video': 'Video in portfolio', // Upgrade prompt 'upgrade.available_in': 'Available in', 'upgrade.cta': 'Upgrade', // Dashboard plan block 'dashboard.plan.title': 'My Plan', 'dashboard.plan.expires': 'Expires in {n} days', 'dashboard.plan.upgrade': 'Upgrade plan', 'dashboard.plan.no_plan': 'Free plan', 'dashboard.plan.messages': 'Messages today', 'dashboard.plan.orders': 'Orders today', 'dashboard.plan.limits': 'Daily limits', 'dashboard.plan.features': 'Features', 'dashboard.plan.stats': 'Stats', 'dashboard.stats.cards': 'Portfolios', 'dashboard.stats.maxCards': 'Max portfolios', 'dashboard.stats.portfolioItems': 'Portfolio items', 'dashboard.stats.maxPortfolioItems': 'Max items', 'dashboard.stats.activeOffers': 'Active offers', 'dashboard.stats.reviewsReceived': 'Reviews', 'dashboard.stats.activeTasks': 'Active tasks', 'dashboard.stats.completedTasks': 'Completed', 'status.need_help': 'I need help', 'status.active': 'Active', 'status.toggle_on': 'Enable', 'status.toggle_off': 'Disable', // FOMO 'fomo.missed_orders': 'Missed {n} orders', 'fomo.missed_value': 'Worth €{v}', 'fomo.upgrade_hint': 'Upgrade to receive more orders', 'fomo.conversion': 'Task conversion', 'fomo.active': 'Active', 'fomo.with_offers': 'With offers', 'fomo.completed': 'Completed', 'fomo.already_offered': '{n} specialists have already responded', 'fomo.specialist_missed': 'You missed {n} orders', 'fomo.top_categories': 'Categories', 'fomo.offers_received': 'offers received', 'fomo.avg_offers': 'Avg {n}/task', 'fomo.completion_rate': 'completed', // Task auto-match 'task.auto_match': 'Auto-match', 'task.auto_match_results': 'Top specialists', 'task.no_offer_yet': 'You haven\'t sent an offer yet', 'task.make_offer': 'Send offer', 'auto_response.title': 'Auto-Response', 'auto_response.enabled': 'Enable auto-response', 'auto_response.min_budget': 'Min budget', 'auto_response.max_budget': 'Max budget', 'auto_response.default_price': 'Default price', 'auto_response.default_message': 'Default message', 'auto_response.max_per_day': 'Max auto-offers per day', 'auto_response.save': 'Save', 'auto_response.saved': 'Saved', 'auto_response.categories': 'Categories', 'auto_response.locations': 'Locations', // Personal site 'profile.personal_site': 'Personal Site', 'profile.site_slug': 'URL slug', 'profile.site_slug_hint': 'Only latin letters, numbers, - and _', 'profile.site_open': 'Open site', 'profile.site_preview': 'Your site', 'profile.show_contact': 'Show contact info', 'profile.show_contact_hint': 'Customers with Pro/Ultimate plans will see your phone number', // Google Calendar plan gate 'gcal.upgrade_required': 'Google Calendar requires a Pro or Ultimate plan', // Chat limits 'chat.limit_warning': '{n} messages left today', 'chat.limit_reached': 'Message limit reached. Upgrade your plan', 'chat.upgrade': 'Upgrade', // Site page 'site.member_since': 'Member since', 'site.rating': 'Rating', 'site.completed_tasks': 'Completed', 'site.languages': 'Languages', 'site.photos': 'photos', 'site.contact_form': 'Get in touch', 'site.contact_sent': 'Message sent!', 'site.contact_sent_desc': 'The specialist will contact you soon', 'site.contact_name': 'Name', 'site.contact_name_ph': 'Your name', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Message', 'site.contact_message_ph': 'Describe your task...', 'site.contact_send': 'Send', 'site.share': 'Share', 'site.speaks_languages': 'Speaks', 'site.message_sent': 'Message sent!', 'site.message_sent_desc': 'The specialist will receive it in the chat', 'site.message_placeholder': 'Write your message...', 'site.write_to_chat': 'Write to chat', 'site.auth_required_title': 'Sign in required', 'site.auth_required_desc': 'To write in the chat, you need to sign in to your CanHelp account.', 'site.auth_login_btn': 'Sign in', 'site.auth_contact_form_btn': 'Contact via feedback form', 'specialist.services': 'Services', 'portfolio.title': 'Portfolio', 'status.can_help_now': 'Available now', 'common.not_found': 'Page not found', 'common.anonymous': 'Anonymous' }, ru: { 'footer.slogan': 'Ваша задача — наша забота! Решаем любые вопросы быстро и удобно.', 'footer.links': 'Ссылки', 'footer.socials': 'Мы в соцсетях', 'nav.home': 'Главная', 'nav.tasks': 'Задачи', 'nav.post': '+ Опубликовать', 'nav.dashboard': 'Панель управления', 'nav.chat': 'Сообщения', 'nav.notifications': 'Уведомления', 'nav.profile': 'Профиль', 'nav.admin': 'Админка', 'nav.specialists': 'Специалисты', 'nav.new_task': 'Новая задача', 'nav.login': 'Войти', 'nav.register': 'Регистрация', 'nav.logout': 'Выйти', 'hero.title': 'Найди специалиста для любой работы', 'hero.subtitle': 'Опубликуй задачу, получи предложения и выбери лучшего профессионала', 'hero.cta.post': 'Опубликовать задачу', 'hero.cta.browse': 'Найти работу', 'hero.search.placeholder': 'Что нужно? напр. электрик, уборка...', 'stats.specialists': 'специалистов', 'stats.tasks': 'задач', 'stats.categories': 'категорий', 'stats.free': 'бесплатная регистрация', 'section.categories': 'Создай задачу в любой категории', 'section.how': 'Как это работает', 'section.recent': 'Последние задачи', 'section.all': 'Смотреть все →', 'section.more': 'ещё', 'section.cities': 'Города и районы', 'section.community': 'Общественный проект для всех', 'community.subtitle': 'CanHelp — не просто маркетплейс, это сообщество взаимопомощи. Любой, у кого есть знания или навык, может найти клиента. Любой, у кого есть задача, может найти специалиста.', 'community.point1.title': 'Умеете что-то делать?', 'community.point1.desc': 'Ремонт, репетиторство, дизайн, переводы, уход — каждый навык имеет ценность. Создайте профиль и находите клиентов рядом с вами.', 'community.point2.title': 'Нужна помощь?', 'community.point2.desc': 'Опубликуйте задачу за минуту и получайте предложения от проверенных специалистов в вашем городе.', 'community.point3.title': 'Помогите проекту расти', 'community.point3.desc': 'CanHelp развивается благодаря сообществам. Поделитесь ссылкой с друзьями и знакомыми — вместе мы строим что-то полезное для всех.', 'community.share': 'Поделиться с друзьями', 'community.share.copied': 'Ссылка скопирована!', // Referral section on home page 'section.referral': 'Реферальная программа', 'referral.home.subtitle': 'Поделитесь ссылкой — каждый новый пользователь, зарегистрировавшийся по ней, принесёт вам награду.', 'referral.home.step1.title': 'Зарегистрируйтесь и получите ссылку', 'referral.home.step1.desc': 'Создайте аккаунт и найдите свою уникальную реферальную ссылку в профиле.', 'referral.home.step2.title': 'Поделитесь с друзьями', 'referral.home.step2.desc': 'Отправьте ссылку друзьям, знакомым или опубликуйте в социальных сетях.', 'referral.home.step3.title': 'Получайте награды', 'referral.home.step3.desc': 'Как только друг подтвердит email, вы автоматически получите свою награду.', 'referral.home.cta': 'Получить ссылку', 'referral.home.badge': 'Реферальная программа', // FAQ section 'section.faq': 'Частые вопросы', 'faq.q1': 'Как работает CanHelp?', 'faq.a1': 'Опубликуйте задачу, получите предложения от специалистов, выберите лучшего и начните сотрудничество. Это быстро, просто и бесплатно для клиентов.', 'faq.q2': 'Сколько стоит использование платформы?', 'faq.a2': 'Регистрация и публикация задач полностью бесплатны для клиентов. Специалисты имеют доступ к бесплатному плану, а также к премиум-опциям.', 'faq.q3': 'Как стать специалистом?', 'faq.a3': 'Зарегистрируйтесь, перейдите в «Стать специалистом», заполните профиль навыками и категориями и начните получать задачи.', 'faq.q4': 'Как выбрать подходящего специалиста?', 'faq.a4': 'Оцените отзывы, опыт, навыки и портфолио каждого специалиста. Общайтесь через чат платформы и уточняйте детали до принятия решения.', 'faq.q5': 'Что если я не доволен результатом?', 'faq.a5': 'Вы можете оставить отзыв о специалисте и поставить оценку от 1 до 5 звёзд. Отзывы помогают другим пользователям выбирать проверенных профессионалов.', 'faq.q6': 'Можно ли связаться со специалистом до принятия предложения?', 'faq.a6': 'Да. Как только вы получили предложение, можно открыть чат со специалистом, задать вопросы и уточнить все детали до принятия решения.', 'faq.q7': 'Сколько времени ждать предложений?', 'faq.a7': 'Как правило, в течение нескольких часов. Специалисты получают уведомление о новых задачах и могут быстро ответить.', 'faq.q8': 'Можно ли разместить задачу в любом городе Греции?', 'faq.a8': 'Да! CanHelp охватывает всю Грецию — Афины, Фессалоники, Патры и другие города.', 'faq.q9': 'Какие виды задач есть на CanHelp?', 'faq.a9': 'Ремонт, уборка, электрики, репетиторство, дизайн, IT, переезды, красота и многое другое. Категории постоянно расширяются.', 'faq.q10': 'Есть ли мобильное приложение?', 'faq.a10': 'Да! CanHelp доступно для Android и iOS. Скачайте приложение и управляйте всем со своего телефона.', 'how.step1.title': 'Опубликуй задачу', 'how.step1.desc': 'Опиши что нужно и установи бюджет', 'how.step2.title': 'Получи предложения', 'how.step2.desc': 'Специалисты пришлют предложения с ценой и сроками', 'how.step3.title': 'Выбери и начни', 'how.step3.desc': 'Выбери лучшего профессионала и начни сотрудничество', 'tasks.title': 'задач', 'tasks.filters': 'Фильтры', 'tasks.search': 'Поиск', 'tasks.search.placeholder': 'Название или ключевое слово...', 'tasks.search.btn': 'Поиск', 'tasks.publish': 'Опубликовать', 'tasks.category.all': 'Все', 'tasks.category.all_in': 'Все в', 'tasks.category.label': 'Категория', 'tasks.location.label': 'Город', 'tasks.location.placeholder': 'напр. Афины', 'tasks.empty': 'Задачи не найдены', 'tasks.empty.cta': 'Опубликуй первую', 'task.status.open': 'Открыта', 'task.status.in_progress': 'В работе', 'task.status.completed': 'Завершена', 'task.status.cancelled': 'Отменена', 'task.status.draft': 'Черновик', 'task.budget': 'Бюджет', 'task.location': 'Местоположение', 'task.deadline': 'Дата начала', 'task.created_at': 'Создано', 'task.customer': 'Заказчик', 'task.offer.btn': 'Отправить предложение', 'task.invite.banner_title': 'Вас пригласили на это задание', 'task.invite.banner_hint': 'Заказчик лично пригласил вас', 'task.invite.accept': 'Отправить предложение', 'task.invite.decline': 'Отказаться', 'offer.accept': 'Принять', 'offer.decline': 'Отклонить', 'task.complete': 'Завершить задачу', 'task.complete.confirm': 'Отметить задачу как выполненную?', 'task.edit': 'Редактировать', 'task.status_label': 'Статус', 'task.yours': 'Ваша задача', 'task.offer.yours': 'Ваше предложение', 'review.leave': 'Оставить отзыв', 'review.rating': 'Оценка', 'review.comment': 'Комментарий', 'review.comment.placeholder': 'Расскажите о своём опыте...', 'review.submit': 'Отправить отзыв', 'review.submitting': 'Отправка...', 'review.done': 'Отзыв отправлен!', 'profile.reviews': 'Отзывы', 'profile.no_reviews': 'Отзывов пока нет', 'profile.rating': 'Рейтинг', 'profile.skills.label': 'Навыки', 'profile.member_since': 'Участник с', 'task.offers': 'Предложения', 'task.offers.none': 'Предложений пока нет', 'create.title': 'Опубликовать задачу', 'create.field.title': 'Название', 'create.field.description': 'Описание', 'create.field.category': 'Категория', 'create.field.category.select': 'Выберите...', 'create.field.location': 'Местоположение', 'create.field.location.any': 'Где угодно', 'create.field.location.all': 'Весь город', 'create.field.budget': 'Бюджет (€)', 'create.field.deadline': 'Дата начала', 'create.field.budget_negotiable': 'Цена обсуждается', 'create.field.time_slot': 'Время выполнения', 'create.field.time_slot.any': 'В любое время', 'create.field.time_slot.morning': 'Утром (08:00–13:00)', 'create.field.time_slot.afternoon': 'Днём (13:00–18:00)', 'create.field.time_slot.evening': 'Вечером (18:00–22:00)', 'create.field.time_slot.weekend': 'Выходной', 'create.field.address': 'Адрес (необязательно)', 'create.field.address.district': 'Квартал', 'create.field.address.street': 'Улица', 'create.field.address.house': 'Дом', 'create.field.confidential': 'Конфиденциальная заметка', 'create.field.confidential.placeholder': 'Детали, видные только назначенному специалисту...', 'create.field.confidential.hint': 'Не отображается публично', 'create.field.photos': 'Фотографии', 'create.field.photos.add': 'Добавить фото', 'create.field.photos.uploading': 'Загрузка...', 'task.budget_negotiable': 'Цена обсуждается', 'task.time_slot': 'Время', 'task.confidential': 'Конфид. заметка', 'create.field.title.placeholder': 'напр. Уборка квартиры 80кв', 'create.field.description.placeholder': 'Подробно опишите что нужно...', 'create.field.location.placeholder': 'напр. Афины, Колонаки', 'create.field.budget.placeholder': 'напр. 100', 'create.submit': 'Опубликовать задачу', 'create.submitting': 'Публикация...', 'login.title': 'Добро пожаловать', 'login.subtitle': 'Вход в CanHelp', 'login.email': 'Email', 'login.password': 'Пароль', 'login.submit': 'Войти', 'login.submitting': 'Вход...', 'login.error': 'Неверный email или пароль', 'login.unverified.title': 'Подтвердите ваш email', 'login.unverified.desc': 'Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.', 'login.unverified.resend': 'Отправить письмо повторно', 'login.unverified.sending': 'Отправка...', 'login.unverified.sent': '✓ Отправлено — проверьте входящие', 'profile.email.verified': 'Email подтверждён', 'profile.email.not_verified': 'Email не подтверждён', 'login.no_account': 'Нет аккаунта?', 'login.register_link': 'Зарегистрироваться', 'login.forgot_password': 'Забыл пароль?', 'login.or_continue_with': 'или продолжите через', 'login.continue_google': 'Войти через Google', 'forgot.title': 'Забыл пароль', 'forgot.subtitle': 'Введите email для получения ссылки восстановления', 'forgot.email': 'Email', 'forgot.submit': 'Отправить ссылку', 'forgot.submitting': 'Отправка...', 'forgot.sent.title': 'Проверьте входящие', 'forgot.sent.desc': 'Если аккаунт с таким email существует, мы отправим ссылку для сброса пароля.', 'forgot.back_to_login': 'Вернуться ко входу', 'forgot.error': 'Не удалось отправить ссылку. Проверьте адрес и попробуйте снова.', 'forgot.error.not_found': 'Аккаунт с таким email не найден.', 'forgot.error.send_failed': 'Ошибка отправки письма. Попробуйте позже.', 'reset.title': 'Новый пароль', 'reset.subtitle': 'Введите новый пароль', 'reset.password': 'Новый пароль', 'reset.confirm': 'Подтвердите пароль', 'reset.submit': 'Изменить пароль', 'reset.submitting': 'Сохранение...', 'reset.success': 'Пароль успешно изменён. Перенаправление ко входу...', 'reset.back_to_login': 'Вернуться ко входу', 'reset.error.mismatch': 'Пароли не совпадают', 'reset.error.invalid': 'Недействительная или устаревшая ссылка. Запросите новую.', 'register.title': 'Регистрация', 'register.subtitle': 'Создать аккаунт в CanHelp', 'register.first_name': 'Имя', 'register.last_name': 'Фамилия', 'register.email': 'Email', 'register.password': 'Пароль (мин. 8 символов)', 'register.role': 'Роль', 'register.role.customer': 'Пользователь', 'register.role.customer.desc': 'Публикую задачи', 'register.role.specialist': 'Специалист', 'register.role.specialist.desc': 'Беру задачи', 'register.submit': 'Создать аккаунт', 'register.submitting': 'Регистрация...', 'register.has_account': 'Уже есть аккаунт?', 'register.login_link': 'Войти', 'register.continue_google': 'Зарегистрироваться через Google', 'register.check_email.title': 'Проверьте почту', 'register.check_email.desc': 'Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.', 'register.check_email.login': 'Вернуться к входу', 'dashboard.title': 'Панель управления', 'dashboard.new_task': '+ Новая задача', 'dashboard.my_tasks': 'Мои задачи', 'dashboard.my_offers': 'Мои предложения', 'dashboard.invitations': 'Приглашения на задания', 'dashboard.offers_count': 'предл.', 'dashboard.declined_count': 'откл.', 'dashboard.completed_tasks': 'Завершённые задачи', 'dashboard.completed_offers': 'Завершённые предложения', 'dashboard.review_pending': 'Оценка ещё не оставлена', 'tasks.new.top_specialists': 'Топ специалисты', 'tasks.new.select_category': 'Выберите категорию, чтобы увидеть специалистов', 'tasks.new.invite': 'Предложить работу', 'tasks.new.invited': 'Выбран ✓', 'reviews.count': 'отзывов', 'filter.location': 'Локация', 'filter.language': 'Языки', 'filter.language.any': 'Любой язык', 'filter.category.all': 'Все категории', 'user.categories': 'Категории', 'user.work_area': 'Район работы', 'dashboard.tasks.empty': 'Вы не публиковали задачи', 'dashboard.tasks.empty.cta': 'Опубликуйте первую', 'dashboard.tasks.add_new': 'Добавить новую задачу', 'dashboard.offers.empty': 'Вы не отправляли предложений', 'dashboard.offers.empty.cta': 'Найти задачи', 'dashboard.customer.specialists_title': 'Ищете исполнителя?', 'dashboard.customer.specialists_hint': 'Просматривайте профили специалистов, читайте отзывы и приглашайте их на свои задачи', 'dashboard.customer.specialists_cta': 'Найти исполнителя', 'dashboard.customer.how_title': 'Как это работает', 'dashboard.customer.step1': 'Создайте задачу с описанием и бюджетом', 'dashboard.customer.step2': 'Специалисты пришлют предложения с ценой и сроками', 'dashboard.customer.step3': 'Выберите подходящего и начните работу', 'notif.title': 'Уведомления', 'notif.mark_all': 'Отметить все как прочитанные', 'notif.empty': 'Нет уведомлений', 'notif.type.new_offer': 'Новое предложение', 'notif.type.offer_accepted': 'Ваше предложение принято', 'notif.type.offer_declined': 'Ваше предложение отклонено', 'notif.type.task_completed': 'Задание выполнено', 'notif.type.task_cancelled': 'Задание отменено', 'notif.type.new_message': 'Новое сообщение', 'notif.type.new_review': 'Новый отзыв', 'notif.type.task_invite': 'Приглашение на задание', 'notif.body.new_offer': 'Новое предложение на «{title}»', 'notif.body.offer_accepted': 'Ваше предложение на «{title}» принято', 'notif.body.offer_declined': 'Ваше предложение на «{title}» отклонено', 'notif.body.task_invite': 'Вас приглашают на «{title}»', 'notif.body.new_review': 'Вы получили оценку {rating}★', 'offer.status.pending': 'Ожидает', 'offer.status.accepted': 'Принято', 'offer.status.declined': 'Отклонено', 'offer.status.withdrawn': 'Отозвано', 'offer.status.other_accepted': 'Выбран другой исполнитель', 'common.loading': 'Загрузка...', 'common.error': 'Ошибка', 'common.save': 'Сохранить', 'common.saving': 'Сохранение...', 'common.cancel': 'Отмена', 'common.add': 'Добавить', 'common.close': 'Закрыть', 'common.edit': 'Редактировать', 'common.delete': 'Удалить', 'common.from': 'от', 'common.currency': '€', 'common.greece': 'Греция', // Chat 'chat.connected': 'Подключено', 'chat.disconnected': 'Отключено', 'chat.no_rooms': 'Переписок пока нет', 'chat.task_fallback': 'Задача', 'chat.select': 'Выберите переписку', 'chat.no_messages': 'Сообщений пока нет', 'chat.placeholder': 'Напишите сообщение... (Enter для отправки)', 'chat.conversation_fallback': 'Переписка', 'chat.direct_chat': 'Личный чат', 'chat.linked_task': 'Прикреплённый заказ', 'chat.write_btn': 'Написать', 'chat.just_now': 'только что', 'chat.min_ago': 'м', 'chat.write_specialist': 'Написать специалисту', 'chat.write_customer': 'Написать заказчику', 'chat.notif_settings': 'Настройки уведомлений', 'chat.notif_messages': 'Уведомления о новых сообщениях', 'chat.toast_title': 'Новое сообщение', 'chat.toast_open': 'Открыть чат', // Offer form 'offer.price': 'Цена', 'offer.price.placeholder': 'напр. 80', 'offer.customer_budget': 'Бюджет заказчика', 'offer.message': 'Сообщение', 'offer.optional': 'необязательно', 'offer.message.placeholder': 'Представьтесь, расскажите об опыте и почему вы лучший выбор...', 'offer.submitting': 'Отправка...', // Profile 'profile.photo': 'Фото профиля', 'profile.photo.change': 'Изменить фото', 'profile.photo.hint': 'JPEG, PNG, WebP · до 5MB', 'profile.basic_info': 'Основная информация', 'profile.phone': 'Телефон', 'profile.phone.placeholder': '+30 6901234567', 'profile.bio': 'Краткое описание', 'profile.bio.placeholder': 'Расскажите немного о себе...', 'profile.language': 'Язык', 'profile.language.hint': 'Язык интерфейса и email-уведомлений', 'profile.languages': 'Языки общения', 'profile.languages.hint': 'Выберите все языки, на которых вы общаетесь', 'profile.skills': 'Навыки', 'profile.skills.subtitle': 'Добавьте услуги, которые вы предлагаете', 'profile.skills.placeholder': 'напр. Уборка, IT, Репетиторство...', 'profile.role': 'Роль аккаунта', 'profile.role.specialist': '🔧 Специалист', 'profile.role.admin': '👑 Admin', 'profile.role.customer': '👤 Пользователь', 'profile.role.change': 'Для смены роли обратитесь в службу поддержки.', 'profile.become_specialist': 'Стать специалистом', 'profile.become_specialist.desc': 'Перейдите в роль специалиста, чтобы брать задачи и наполнить профиль.', 'become_specialist.hero.title': 'Зарабатывай, делая то, что умеешь', 'become_specialist.hero.subtitle': 'Создай профиль специалиста и получай заказы от клиентов по всей Греции', 'become_specialist.how.title': 'Как это работает', 'become_specialist.step1.title': 'Создай портфолио специалиста', 'become_specialist.step1.desc': 'Укажи категории, навыки и зону покрытия — система автоматически подберёт подходящие заказы', 'become_specialist.step2.title': 'Ищи заказы', 'become_specialist.step2.desc': 'Просматривай задачи по своим категориям в разделе «Поиск заказов»', 'become_specialist.step3.title': 'Откликайся и зарабатывай', 'become_specialist.step3.desc': 'Отправляй предложения с ценой и сроками, общайся с клиентами и выполняй заказы', 'become_specialist.benefits.title': 'Преимущества профиля специалиста', 'become_specialist.benefit1': 'Поиск заказов по вашим категориям и локации', 'become_specialist.benefit2': 'Публичный профиль с отзывами клиентов', 'become_specialist.benefit3': 'Расписание доступности, видимое клиентам', 'become_specialist.benefit4': 'Добавление в избранное клиентами', 'become_specialist.cta': 'Стать специалистом — это бесплатно', 'become_specialist.free_badge': 'Бесплатная регистрация', 'profile.tab.notifications': 'Уведомления', 'profile.tab.reviews': 'Отзывы', 'profile.tab.referral': 'Рефералы', 'profile.tab.auto_response': 'Авто-ответ', 'profile.tab.site': 'Сайт', 'profile.site.title': 'Персональная страница', 'profile.site.url_label': 'Личный сайт', 'profile.site.copy': 'Копировать', 'profile.site.copied': 'Скопировано', 'profile.site.visible_title': 'Что отображается на вашей странице', 'profile.site.visible.name': 'Имя и фото', 'profile.site.visible.bio': 'Биография', 'profile.site.visible.rating': 'Рейтинг и отзывы', 'profile.site.visible.portfolio': 'Портфолио / Карточки', 'profile.site.visible.contacts': 'Контактные данные', 'profile.site.visible.full_last_name': 'Фамилия полностью', 'profile.site.visible.services': 'Карточки услуг', 'profile.site.visible.reviews': 'Раздел с отзывами', 'profile.site.visible.status': 'Статус «Готов помочь»', 'profile.site.theme': 'Тема оформления', 'profile.site.theme.dark': 'Тёмная', 'profile.site.theme.light': 'Светлая', 'profile.site.slug_taken': 'Этот адрес уже занят', 'profile.site.stats.title': 'Аналитика сайта', 'profile.site.stats.days': 'последние 30 дней', 'profile.site.stats.views': 'Просмотры', 'profile.site.stats.unique': 'Уникальные посетители', 'profile.site.stats.messages': 'Сообщения', 'profile.site.stats.total_views': 'Просмотры', 'profile.site.stats.total_unique': 'Уник. посетители', 'profile.site.stats.total_messages': 'Сообщения', 'profile.site.stats.empty': 'Данных пока нет', 'profile.site.stats.loading': 'Загрузка аналитики...', 'profile.site.stats.no_slug': 'Укажите адрес сайта, чтобы видеть статистику', 'profile.site.edit_bio_hint': 'Биография и фото настраиваются во вкладке «Основное».', 'status.title': 'Статус', 'status.can_help_now_hint': 'Ваша карточка показывается выше в поиске', 'status.need_help_hint': 'Специалисты могут предложить вам помощь', 'profile.referral.title': 'Партнёрская программа', 'profile.referral.desc': 'Поделитесь ссылкой и получайте награду за каждого привлечённого пользователя.', 'profile.referral.link_label': 'Ваша реферальная ссылка', 'profile.referral.copy': 'Копировать', 'profile.referral.copied': 'Скопировано!', 'profile.referral.invited_count': 'успешных приглашений', 'profile.referral.no_code': 'Реферальный код недоступен.', 'notifications.title': 'Настройки уведомлений', 'notifications.email.new_tasks': 'Email о новых заказах', 'notifications.email.new_tasks.desc': 'Получать email, когда в ваших категориях публикуется новый заказ', 'notifications.messages.desc': 'Получать уведомление при новом входящем сообщении', 'notifications.saved': 'Настройки сохранены', 'notifications.plan_required': 'Недоступно в вашем тарифе', 'profile.tab.info': 'Основное', 'profile.tab.finance': 'Финансы', 'profile.tab.skills': 'Навыки', 'profile.tab.categories': 'Категории', 'profile.tab.geography': 'География', 'profile.specialist.categories': 'Категории работ', 'profile.specialist.categories.desc': 'Выберите категории, в которых вы работаете', 'profile.specialist.geography': 'Города покрытия', 'profile.specialist.geography.desc': 'Выберите города / районы, где вы работаете', 'profile.saving': 'Сохранение...', 'profile.upload.error': 'Ошибка загрузки фото', 'profile.saved': 'Сохранено', 'profile.tab.cards': 'Портфолио', 'profile.cards.count': 'Портфолио', 'profile.cards.add': 'Добавить портфолио', 'profile.cards.new_title': 'Название нового портфолио', 'profile.cards.placeholder': 'Например: Сантехника', 'profile.cards.create': 'Создать', 'profile.cards.cancel': 'Отмена', 'profile.cards.empty': 'У вас нет портфолио', 'profile.cards.create_first': 'Создать первое портфолио', 'profile.cards.delete_confirm': 'Удалить портфолио?', 'profile.card.tab.main': 'Основное', 'profile.card.tab.skills': 'Навыки', 'profile.card.tab.categories': 'Категории', 'profile.card.tab.geography': 'География', 'profile.card.tab.portfolio': 'Галерея', 'profile.card.active': 'Активна', 'profile.card.save': 'Сохранить', 'profile.card.saved': 'Сохранено', 'profile.card.delete': 'Удалить', 'profile.card.skill.add': 'Добавить навык', 'profile.card.photo.add': 'Добавить фото', 'profile.card.photo.uploading': 'Загрузка...', 'profile.card.photo.empty': 'Нет фотографий', 'profile.card.item.title': 'Заголовок', 'profile.card.item.desc': 'Описание', 'profile.card.item.save': 'Сохранить', 'profile.card.item.cancel': 'Отмена', 'profile.card.item.edit': 'Описание работы', 'profile.upgrade.cards_limit': 'Лимит портфолио исчерпан', 'profile.upgrade.plan': 'Текущий тариф:', 'profile.upgrade.contact': 'Обратитесь к администратору для смены тарифа', 'profile.upgrade.ok': 'Понятно', 'profile.plan.title': 'Тарифный план', 'profile.balance': 'Баланс', 'profile.balance.topup': 'Пополнить баланс', 'profile.balance.topup.title': 'Пополнить баланс', 'profile.balance.topup.amount': 'Сумма (в EUR)', 'profile.balance.topup.hint': 'Выберите сумму или введите вручную', 'profile.balance.topup.submit': 'Перейти к оплате', 'profile.balance.topup.loading': 'Перенаправление...', 'profile.balance.topup.error': 'Ошибка инициализации платежа. Попробуйте снова.', 'payment.success.title': 'Оплата прошла успешно!', 'payment.success.desc': 'Ваш баланс обновлён.', 'payment.cancelled.title': 'Оплата отменена', 'payment.cancelled.desc': 'Оплата была отменена. Средства не списаны.', 'payment.pending.title': 'Обрабатывается...', 'payment.pending.desc': 'Ваш платёж в обработке.', 'payment.back_to_profile': 'Вернуться в профиль', 'profile.plan.basic': 'Базовый (бесплатный)', 'profile.plan.contact_upgrade': 'Обратитесь к администратору для подключения тарифа', 'profile.plan.cards_up_to': 'Портфолио: до', 'profile.plan.cards_unlimited': 'Портфолио: безлимитно', 'profile.plan.tasks_up_to': 'Задач: до', 'profile.plan.offers_up_to': 'Откликов: до', 'profile.plan.valid_until': 'Действителен до', 'profile.plan.no_expiry': 'Бессрочно', // Create task 'create.error': 'Ошибка при публикации', // Tasks list extras 'tasks.category.general': 'Общее', 'tasks.budget.range': 'Диапазон:', 'tasks.budget.from': 'от', 'tasks.budget.to': 'до', 'tasks.filter.reset': 'Сбросить фильтры', 'tasks.load_more': 'Загрузить ещё', 'tasks.showing': 'Результатов:', 'tasks.field.budget': 'Бюджет, €', // Admin 'admin.title': 'Панель администратора', 'admin.tab.stats': 'Статистика', 'admin.tab.users': 'Пользователи', 'admin.tab.tasks': 'Задачи', 'admin.tab.reports': 'Жалобы', 'admin.stats.users': 'Пользователи', 'admin.stats.tasks': 'Задачи', 'admin.stats.offers': 'Предложения', 'admin.stats.reviews': 'Отзывы', 'admin.tasks.by_status': 'Задачи по статусу', 'admin.col.user': 'Пользователь', 'admin.col.email': 'Email', 'admin.col.role': 'Роль', 'admin.col.registered': 'Регистрация', 'admin.col.status': 'Статус', 'admin.col.title': 'Название', 'admin.col.budget': 'Бюджет', 'admin.col.created': 'Создано', 'admin.users.active': 'Активен', 'admin.users.inactive': 'Неактивен', 'admin.users.deactivate': 'Деактивировать', 'admin.users.activate': 'Активировать', 'admin.tasks.cancel': 'Отменить', 'admin.reports.none': 'Жалоб нет', 'admin.reports.reviewed': 'Рассмотрено', 'admin.reports.dismiss': 'Отклонить', 'admin.pagination.total': 'Всего', 'admin.users.role.change': 'Изменить роль', 'admin.users.search.placeholder': 'Поиск по имени или email...', 'admin.tasks.delete': 'Удалить', 'admin.tasks.delete.confirm': 'Удалить эту задачу навсегда?', 'admin.tasks.search.placeholder': 'Поиск по названию...', 'admin.col.customer': 'Заказчик', 'admin.col.reporter': 'Жалобщик', 'admin.col.target': 'Цель', 'admin.filter.all_roles': 'Все роли', 'admin.filter.all_statuses': 'Все статусы', 'admin.reports.target.task': 'Задача', 'admin.reports.target.user': 'Пользователь', 'admin.tab.categories': 'Категории', 'admin.tab.locations': 'Города и районы', 'admin.tab.logs': 'Логи', 'admin.tab.plans': 'Тарифы', 'admin.tab.settings': 'Настройки', 'admin.logs.subtab.ai': 'AI логи', 'admin.logs.subtab.activity': 'Активность', 'admin.logs.subtab.mail': 'Mail', 'admin.logs.subtab.notifications': 'Уведомления', 'admin.notif_logs.type': 'Тип', 'admin.notif_logs.title': 'Заголовок', 'admin.notif_logs.read': 'Прочитано', 'admin.notif_logs.empty': 'Логи уведомлений пусты', 'admin.stats.notif_chart_title': 'Уведомления по дням', 'admin.stats.notif_label': 'Уведомления', 'admin.stats.mail_chart_title': 'Email по дням', 'admin.stats.mail_label': 'Emails', 'admin.filter.all': 'Все', 'admin.stats.specialists': 'Исполнители', 'admin.col.plan': 'Тариф', 'admin.back_home': 'На главную', 'admin.plans.title': 'Тарифные пакеты', 'admin.plans.add': '+ Добавить тариф', 'admin.plans.empty': 'Тарифы не созданы', 'admin.plans.form.new': 'Новый тариф', 'admin.plans.form.edit': 'Редактировать тариф', 'admin.plans.form.name': 'Название', 'admin.plans.form.price': 'Цена (EUR)', 'admin.plans.form.old_price': 'Старая цена (EUR, необязательно)', 'admin.plans.form.max_offers': 'Макс. откликов (пусто = без лимита)', 'admin.plans.form.max_cards': 'Макс. портфолио (пусто = без лимита)', 'admin.plans.form.duration_days': 'Срок (дней, пусто = без истечения)', 'admin.plans.form.description': 'Описание', 'admin.plans.form.features': 'Возможности (по одной на строку)', 'admin.plans.form.notify': 'Уведомления о новых заказах', 'admin.plans.form.default': 'По умолчанию', 'admin.plans.form.active': 'Активен', 'admin.plans.form.order': 'Порядок', 'admin.plans.form.role': 'Роль', 'admin.plans.form.tier': 'Уровень', 'admin.plans.form.role.customer': 'Заказчик', 'admin.plans.form.role.specialist': 'Специалист', 'admin.plans.form.tier.free': 'Бесплатный', 'admin.plans.form.tier.pro': 'Pro', 'admin.plans.form.tier.ultimate': 'Ultimate', 'admin.plans.form.section.limits': 'Лимиты (пусто = без ограничений)', 'admin.plans.form.max_messages_day': 'Макс. сообщений/день', 'admin.plans.form.max_orders_day': 'Макс. заказов/день', 'admin.plans.form.max_skills': 'Макс. навыков', 'admin.plans.form.max_profiles': 'Макс. профилей', 'admin.plans.form.max_portfolio': 'Макс. элементов портфолио', 'admin.plans.form.section.boost': 'Множители & Буст', 'admin.plans.form.search_boost': 'Буст в поиске', 'admin.plans.form.offers_multiplier': 'Множитель откликов', 'admin.plans.form.section.contact': 'Права контактов', 'admin.plans.form.can_contact_free': 'Контакт с бесплатными пользователями', 'admin.plans.form.can_contact_pro': 'Контакт с Pro пользователями', 'admin.plans.form.can_contact_all': 'Контакт со всеми', 'admin.plans.form.can_show_contact': 'Показывать контакты', 'admin.plans.form.can_view_phone': 'Просмотр телефона', 'admin.plans.form.section.features': 'Возможности', 'admin.plans.form.upload_video': 'Загрузка видео', 'admin.plans.form.favorites': 'Избранное', 'admin.plans.form.google_calendar': 'Google Calendar', 'admin.plans.form.verified_badge': 'Знак верификации', 'admin.plans.form.highlighted_reviews': 'Выделенные отзывы', 'admin.plans.form.personal_site': 'Личный сайт', 'admin.plans.form.can_help_now': 'Статус «Могу помочь»', 'admin.plans.form.need_help': 'Статус «Нужна помощь»', 'admin.plans.form.auto_response': 'Автоответ', 'admin.plans.form.auto_match': 'Автоподбор', 'admin.plans.form.instant_dispatch_free': 'Мгновенная рассылка (бесплатно)', 'admin.plans.form.instant_dispatch_pro': 'Мгновенная рассылка (Pro)', 'admin.plans.badge.default': 'По умолчанию', 'admin.plans.badge.inactive': 'Неактивен', 'admin.plans.make_default': 'Сделать по умолчанию', 'admin.plans.tasks': 'Задач', 'admin.plans.offers': 'Откликов', 'admin.plans.cards': 'Портфолио', 'admin.plans.notify_tasks': 'Уведомления о заказах', 'admin.plans.delete.confirm': 'Удалить тариф', 'admin.activity.title': 'Журнал активности', 'admin.activity.event': 'Событие', 'admin.activity.all_events': 'Все события', 'admin.activity.from': 'От', 'admin.activity.to': 'До', 'admin.activity.reset': 'Сбросить', 'admin.activity.total': 'Всего', 'admin.activity.empty': 'Нет записей', 'admin.mail.event': 'Email событие', 'admin.mail.all_events': 'Все email события', 'admin.mail.from': 'От', 'admin.mail.to': 'До', 'admin.mail.reset': 'Сбросить', 'admin.mail.total': 'Всего', 'admin.mail.empty': 'Нет email логов', 'admin.mail.recipient': 'Получатель', 'admin.mail.provider': 'Провайдер', 'admin.mail.details': 'Детали', 'admin.mail.status': 'Статус', 'admin.mail.success': 'Успешно', 'admin.mail.failed': 'Ошибка', 'admin.event.email_sent': 'Email отправлен', 'admin.event.email_failed': 'Email не отправлен', 'admin.event.email_dev': 'Email DEV fallback', 'admin.event.admin_email_test_sent': 'Тестовый email отправлен', 'admin.event.admin_email_test_failed': 'Тестовый email не отправлен', 'admin.logs.empty': 'Нет записей', 'admin.logs.date': 'Дата', 'admin.logs.provider': 'Провайдер', 'admin.logs.model': 'Модель', 'admin.logs.action': 'Действие', 'admin.logs.langs': 'Языки', 'admin.logs.in': 'Вход', 'admin.logs.out': 'Выход', 'admin.logs.total': 'Итого', 'admin.logs.ms': 'мс', 'admin.logs.status': 'Статус', 'admin.stats.activity_30d': 'Активность за 30 дней', 'admin.stats.tasks_label': 'Заявки', 'admin.stats.users_label': 'Пользователи', 'admin.stats.specialists_label': 'Исполнители', 'admin.stats.tokens_title': 'Расход токенов (по месяцам)', 'admin.stats.tokens_out': 'Исходящие', 'admin.stats.tokens_in': 'Входящие', 'admin.stats.tokens_out_label': 'Исходящие токены', 'admin.stats.tokens_in_label': 'Входящие токены', 'admin.stats.cost_label': 'Стоимость (USD)', 'admin.stats.tasks_by_status': 'Заявки по статусам', 'admin.task_status.open': 'Открытые', 'admin.task_status.in_progress': 'В работе', 'admin.task_status.completed': 'Завершённые', 'admin.task_status.cancelled': 'Отменённые', 'admin.task_status.draft': 'Черновики', 'admin.settings.tab.general': 'Общие', 'admin.settings.tab.smtp': 'E-Mail', 'admin.settings.tab.notifications': 'Уведомления', 'admin.settings.tab.payment': 'Оплата', 'admin.settings.tab.referral': 'Реферальная', 'admin.settings.tab.seo': 'SEO', 'admin.settings.seo.title': 'SEO и обслуживание', 'admin.settings.seo.maintenance_label': 'Режим обслуживания', 'admin.settings.seo.maintenance_hint': 'Показывать страницу обслуживания всем посетителям', 'admin.settings.seo.indexing_label': 'Индексация поисковыми системами', 'admin.settings.seo.indexing_hint': 'Разрешить поисковым системам индексировать сайт', 'admin.settings.seo.head_scripts_label': 'Скрипты в (JS)', 'admin.settings.seo.head_scripts_hint': 'Выполняется на каждой странице (Google Tag Manager, аналитика и т.д.)', 'admin.settings.seo.site_title_label': 'Заголовок сайта', 'admin.settings.seo.site_description_label': 'Описание сайта (meta description)', 'admin.settings.referral.title': 'Партнёрская программа', 'admin.settings.referral.hint': 'Награждайте пользователей, приводящих новых участников.', 'admin.settings.referral.enabled_label': 'Включено', 'admin.settings.referral.enabled_hint': 'Включить / отключить выдачу наград', 'admin.settings.referral.customer_section': 'Для клиентов', 'admin.settings.referral.specialist_section': 'Для специалистов', 'admin.settings.referral.plan_label': 'Тарифный план за реферала', 'admin.settings.referral.no_plan': '— без плана —', 'admin.settings.referral.plan_hint': 'Этот план будет назначен пригласившему. Если его текущий план выше — добавятся только дни.', 'admin.settings.referral.days_label': 'Дней награды', 'admin.settings.referral.days_hint': 'Количество дней, добавляемых к сроку действия плана.', 'admin.settings.general.title': 'Общие настройки', 'admin.settings.general.site_name': 'Название сайта', 'admin.settings.general.site_url': 'URL сайта', 'admin.settings.general.contact_email': 'Email для связи', 'admin.settings.general.support_phone': 'Телефон поддержки', 'admin.settings.smtp.title': 'Настройки SMTP сервера', 'admin.settings.smtp.hint': 'Используется для отправки email-уведомлений.', 'admin.settings.smtp.host': 'SMTP Хост', 'admin.settings.smtp.port': 'Порт', 'admin.settings.smtp.encryption': 'Шифрование', 'admin.settings.smtp.enc.none': 'Нет', 'admin.settings.smtp.enc.tls': 'STARTTLS (порт 587)', 'admin.settings.smtp.enc.ssl': 'SSL/TLS (порт 465)', 'admin.settings.smtp.username': 'Имя пользователя', 'admin.settings.smtp.password': 'Пароль / App Password', 'admin.settings.smtp.from_name': 'Имя отправителя', 'admin.settings.smtp.from_email': 'Email отправителя', 'admin.settings.smtp.test': 'Отправить тестовый email', 'admin.settings.smtp.sending': 'Отправка...', 'admin.settings.payment.hint': 'Данные для подключения к ePay Piraeus Bank.', 'admin.settings.env.test': 'Тест (sandbox)', 'admin.settings.env.prod': 'Боевой режим', 'admin.settings.env.label': 'Среда', 'admin.settings.merchant_id': 'Merchant ID', 'admin.settings.api_user': 'API User', 'admin.settings.api_password': 'API Password', 'admin.settings.confirm_url': 'Confirmation URL (webhook)', 'admin.settings.cancel_url': 'Cancel URL', 'admin.settings.active': 'Активен', 'admin.settings.saving': 'Сохранение...', 'admin.settings.saved': 'Сохранено', 'admin.notif.vars_hint': 'Доступные переменные в шаблонах', 'admin.notif.tmpl.not_set': 'Шаблон не настроен', 'admin.notif.tmpl.subject_label': 'Тема письма', 'admin.notif.tmpl.body_label': 'Текст письма (HTML)', 'admin.notif.tmpl.save': 'Сохранить', 'admin.notif.tmpl.close': 'Закрыть', 'admin.notif.tmpl.translate': 'Авто-перевод на другие языки', 'admin.notif.tmpl.translating': 'Перевод...', 'admin.notif.tmpl.saving': 'Сохранение...', 'admin.notif.email_verification': 'Подтверждение email адреса', 'admin.notif.registration_success': 'Успешная регистрация', 'admin.notif.password_reset': 'Восстановление пароля', 'admin.notif.new_offer': 'Новое предложение', 'admin.notif.new_task': 'Новая задача', 'admin.notif.offer_accepted': 'Предложение принято', 'admin.notif.new_message': 'Новое сообщение', 'admin.notif.offer_declined': 'Отклонение предложения', 'admin.notif.offer_other_accepted': 'Выбран другой исполнитель', 'admin.notif.task_updated': 'Изменение задания', 'admin.notif.deadline_reminder': 'Напоминание о дедлайне', 'admin.notif.task_archived': 'Автоснятие задания', 'admin.notif.referral_reward': 'Реферальная награда', // Шаблоны email для тарифов 'admin.email_template.plan_activated': 'Тарифы — активация тарифа', 'admin.email_template.plan_upgraded': 'Тарифы — повышение тарифа', 'admin.email_template.plan_downgrade_scheduled': 'Тарифы — запланированное понижение', 'admin.email_template.plan_downgrade_applied': 'Тарифы — применение понижения', 'admin.email_template.plan_renewal_reminder': 'Тарифы — напоминание о продлении', 'admin.email_template.plan_insufficient_funds': 'Тарифы — нехватка средств', // Модальное окно подтверждения тарифа 'pricing.confirm.title': 'Подтвердите выбор тарифа', 'pricing.confirm.plan': 'Тариф', 'pricing.confirm.prorated': 'Зачёт остатка', 'pricing.confirm.effective_price': 'К оплате', 'pricing.confirm.your_balance': 'Ваш баланс', 'pricing.confirm.downgrade_info': 'Переход на новый тариф произойдёт автоматически после окончания текущего периода.', 'pricing.confirm.insufficient': 'Недостаточно средств на балансе.', 'pricing.confirm.top_up': 'Пополнить', 'pricing.confirm.schedule_downgrade': 'Запланировать переход', 'pricing.confirm.pay': 'Оплатить', 'admin.user_edit.title': 'Редактирование пользователя', 'admin.user_edit.email': 'Email', 'admin.user_edit.id': 'ID', 'admin.user_edit.registered': 'Регистрация', 'admin.user_edit.last_seen': 'Последний визит', 'admin.user_edit.lang': 'Язык', 'admin.user_edit.first_name': 'Имя', 'admin.user_edit.last_name': 'Фамилия', 'admin.user_edit.phone': 'Телефон', 'admin.user_edit.bio': 'О себе', 'admin.user_edit.role': 'Роль', 'admin.user_edit.plan': 'Тариф', 'admin.user_edit.no_plan': '— Без тарифа —', 'admin.user_edit.active': 'Активный аккаунт', 'admin.user_edit.balance': 'Баланс (EUR)', 'admin.user_edit.skills': 'Навыки', 'admin.user_edit.tab.profile': 'Профиль', 'admin.user_edit.tab.account': 'Аккаунт', 'admin.user_edit.tab.balance': 'Баланс', 'admin.user_edit.tab.settings': 'Настройки', 'admin.user_edit.tab.specialist': 'Портфолио', 'admin.user_edit.tab.site': 'Сайт', 'admin.user_edit.plan_expires': 'Тариф истекает', 'admin.user_edit.interface_lang': 'Язык интерфейса', 'admin.user_edit.comm_languages': 'Языки общения', 'admin.user_edit.personal_site_slug': 'Персональная страница', 'admin.user_edit.show_contact_info': 'Показывать контакты', 'admin.user_edit.show_contact_info.hint': 'Видно заказчикам', 'admin.user_edit.notify_new_tasks': 'Уведомлять о новых задачах', 'admin.user_edit.notify_new_tasks.hint': 'Push и email уведомления', 'admin.user_edit.notif_messages': 'Уведомления о сообщениях', 'admin.user_edit.notif_messages.hint': 'Новые сообщения в чате', 'admin.user_edit.site_settings': 'Настройки персональной страницы', 'admin.user_edit.categories': 'Категории услуг', 'admin.user_edit.locations': 'Районы обслуживания', 'admin.user_edit.skill_placeholder': 'Новый навык...', 'admin.user_edit.add_category': '— Выберите категорию —', 'admin.user_edit.add_location': '— Выберите район —', 'admin.user_edit.specialist_cards': 'Портфолио специалиста', 'admin.user_edit.no_cards': 'Портфолио не найдено', 'admin.user_edit.card_title': 'Заголовок портфолио', 'admin.user_edit.card_description': 'Описание', 'admin.balance.topup.btn': 'Пополнить', 'admin.balance.withdraw.btn': 'Списать', 'admin.balance.modal_hint': 'Изменения применяются сразу и фиксируются в истории', 'admin.balance.topup.title': 'Пополнение баланса', 'admin.balance.topup.amount': 'Сумма', 'admin.balance.topup.description': 'Комментарий', 'admin.balance.topup.description.placeholder': 'Например: бонус или ручное пополнение', 'admin.balance.topup.submit': 'Пополнить баланс', 'admin.balance.withdraw.title': 'Снятие баланса', 'admin.balance.withdraw.amount': 'Сумма', 'admin.balance.withdraw.description': 'Комментарий', 'admin.balance.withdraw.description.placeholder': 'Например: возврат или ручное списание', 'admin.balance.withdraw.submit': 'Списать баланс', 'admin.user_edit.role.customer': 'Заказчик', 'admin.user_edit.role.specialist': 'Исполнитель', 'admin.user_edit.role.admin': 'Администратор', 'common.refresh': 'Обновить', 'common.back_home': 'На главную', 'admin.loc.hint': 'Управление городами и районами', 'admin.loc.add_city': 'Новый город', 'admin.loc.add_district': 'Добавить район', 'admin.loc.new': 'Новая локация', 'admin.loc.edit': 'Редактировать локацию', 'admin.loc.district': 'район', 'admin.loc.empty': 'Нет локаций', 'admin.loc.delete.confirm': 'Удалить локацию? Все районы также будут удалены.', 'admin.cat.add_root': 'Новая категория', 'admin.cat.add_sub': 'Подкатегория', 'admin.cat.edit': 'Редактировать', 'admin.cat.delete': 'Удалить', 'admin.cat.delete.confirm': 'Удалить категорию? Все подкатегории также будут удалены.', 'admin.cat.slug': 'Slug', 'admin.cat.icon': 'Иконка', 'admin.cat.name_el': 'Греческий', 'admin.cat.name_en': 'Английский', 'admin.cat.name_ru': 'Русский', 'admin.cat.order': 'Порядок', 'admin.cat.active': 'Активна', 'admin.cat.parent': 'Родительская категория', 'admin.cat.no_parent': 'Верхний уровень', 'admin.cat.save': 'Сохранить', 'admin.cat.cancel': 'Отмена', 'admin.cat.empty': 'Нет категорий', 'admin.cat.hint': 'Управление категориями с многоуровневой иерархией', 'admin.cat.new': 'Новая категория', 'admin.cat.subcategory': 'подкатегория', 'admin.cat.add_child': 'Добавить подкатегорию', 'admin.cat.inactive': 'Неактивна', 'admin.event.user_login': 'Вход', 'admin.event.user_register': 'Регистрация', 'admin.event.admin_user_deactivate': 'Блокировка юзера', 'admin.event.admin_user_activate': 'Разблокировка юзера', 'admin.event.admin_user_role_changed': 'Смена роли', 'admin.event.admin_task_cancelled': 'Отмена задачи', 'admin.event.admin_task_deleted': 'Удаление задачи', 'admin.event.admin_report_reviewed': 'Жалоба рассмотрена', 'admin.event.admin_report_dismissed': 'Жалоба отклонена', 'admin.event.task_created': 'Создана задача', // User status 'user.online': 'Онлайн', 'user.seen_minutes': 'был здесь {n} мин назад', 'user.seen_hours': 'был здесь {n} ч назад', 'user.seen_yesterday': 'был здесь вчера', 'user.seen_days': 'был здесь {n} дн назад', // Specialists 'specialists.title': 'Специалисты', 'specialists.search': 'Поиск специалиста...', 'specialists.search.btn': 'Поиск', 'specialists.empty': 'Специалисты не найдены', 'specialists.no_bio': 'Без описания', 'specialists.view': 'Смотреть профиль', 'specialists.reviews': 'отзывов', 'specialist.favorite': 'Добавить в избранное', 'specialist.unfavorite': 'Убрать из избранного', 'specialist.site_link': 'Личный сайт', 'favorites.specialists.title': 'Избранные специалисты', 'favorites.specialists.empty': 'Вы ещё не добавили специалистов в избранное', 'nav.favorites': 'Избранное', 'nav.schedule': 'Расписание', 'nav.find_tasks': 'Поиск заказов', 'schedule.title': 'Моё расписание', 'schedule.subtitle': 'Отмечайте дни когда вы свободны или заняты — заказчики увидят вашу доступность', 'schedule.available': 'Свободен', 'schedule.busy': 'Занят', 'schedule.unset': 'Не указано', 'schedule.click_hint': '← клик меняет статус по кругу', 'schedule.range_mode': 'Выделить диапазон', 'schedule.range_from': 'С {date} — выберите конечную дату', 'schedule.click_to_set': 'Нажмите чтобы отметить', 'schedule.free': 'свободно', 'schedule.busy_count': 'занято', 'schedule.free_days': 'свободных дней', 'schedule.googleCalendar': 'Google Календарь', 'schedule.connectGoogle': 'Подключить Google Календарь', 'schedule.disconnectGoogle': 'Отключить', 'schedule.connectedAs': 'Подключено как', 'schedule.importFromGoogle': 'Синхр. из Google', 'schedule.gcalConnected': '\u2713 Google Календарь подключён', 'schedule.gcalError': 'Ошибка подключения Google Календарь', 'schedule.gcalImportDone': 'Импортировано {n} дней из Google Календарь', 'schedule.gcalAutoSyncNote': 'Изменения доступности автоматически отправляются в Google Календарь', 'schedule.gcalConnectDesc': 'Подключите Google Календарь для автоматической синхронизации расписания', 'schedule.gcalDisconnectConfirm': 'Отключить Google Календарь?', 'find_tasks.title': 'Поиск заказов', 'find_tasks.for_me': 'Для меня', 'find_tasks.all': 'Все заказы', 'find_tasks.by_category': 'По категориям', 'find_tasks.list': 'Списком', 'find_tasks.already_offered': 'Предложение отправлено', 'find_tasks.offer_now': 'Откликнуться', 'find_tasks.empty_for_me': 'Нет заказов в ваших категориях', 'find_tasks.banner_hint': 'Найдите заказы по категориям вашего портфолио', 'find_tasks.no_cards': 'Создайте портфолио специалиста, чтобы видеть подходящие заказы', 'find_tasks.add_card': 'Создать портфолио', 'find_tasks.search': 'Поиск заказов...', 'find_tasks.tasks_count': 'заданий', 'footer.tagline': 'Платформа задач для Греции', 'footer.rights': 'Все права защищены.', // App download section 'app.download_title': 'Скачайте мобильное приложение CanHelp', 'app.download_desc': 'Всё CanHelp — всегда под рукой. Доступно для Android и iOS.', // Nav 'nav.pricing': 'Тарифы', // Pricing page 'pricing.title': 'Тарифы', 'pricing.subtitle': 'Выберите подходящий план', 'pricing.role.customer': 'Заказчик', 'pricing.role.specialist': 'Специалист', 'pricing.free': 'Бесплатно', 'pricing.per_month': 'мес', 'pricing.duration': 'Срок', 'pricing.days': 'дн.', 'pricing.current_plan': 'Ваш план', 'pricing.popular': 'Популярный', 'pricing.choose': 'Выбрать', 'pricing.your_plan': 'Активный план', 'pricing.free_default': 'По умолчанию', 'pricing.compare': 'Сравнение функций', 'pricing.feature': 'Функция', 'pricing.faq_note': 'Оплата списывается с баланса CanHelp. Пополнение доступно в разделе Оплата.', 'pricing.feat.messages': 'Сообщений / день', 'pricing.feat.orders': 'Заказов / день', 'pricing.feat.contact_all': 'Связь со всеми', 'pricing.feat.view_phone': 'Просмотр телефона', 'pricing.feat.show_contact': 'Показывать контакты', 'pricing.feat.favorites': 'Избранное', 'pricing.feat.verified_badge': 'Верифицированный бейдж', 'pricing.feat.google_calendar': 'Google Календарь', 'pricing.feat.personal_site': 'Персональный сайт', 'pricing.feat.auto_response': 'Авто-ответ', 'pricing.feat.auto_match': 'Авто-подбор', 'pricing.feat.highlighted_reviews': 'Выделенные отзывы', 'pricing.feat.portfolio': 'Элементов портфолио', 'pricing.feat.cards': 'Карточки специалиста', 'pricing.feat.notify_tasks': 'Уведомления о новых задачах', 'pricing.feat.video': 'Видео в портфолио', // Upgrade prompt 'upgrade.available_in': 'Доступно в', 'upgrade.cta': 'Улучшить', // Dashboard plan block 'dashboard.plan.title': 'Мой план', 'dashboard.plan.expires': 'Истекает через {n} дней', 'dashboard.plan.upgrade': 'Улучшить план', 'dashboard.plan.no_plan': 'Бесплатный план', 'dashboard.plan.messages': 'Сообщений сегодня', 'dashboard.plan.orders': 'Заказов сегодня', 'dashboard.plan.limits': 'Дневные лимиты', 'dashboard.plan.features': 'Функции', 'dashboard.plan.stats': 'Статистика', 'dashboard.stats.cards': 'Портфолио', 'dashboard.stats.maxCards': 'Макс. портфолио', 'dashboard.stats.portfolioItems': 'Элементы портфолио', 'dashboard.stats.maxPortfolioItems': 'Макс. элементы', 'dashboard.stats.activeOffers': 'Активные отклики', 'dashboard.stats.reviewsReceived': 'Отзывы', 'dashboard.stats.activeTasks': 'Активные задачи', 'dashboard.stats.completedTasks': 'Завершённые', 'status.need_help': 'Нужна помощь', 'status.active': 'Активен', 'status.toggle_on': 'Включить', 'status.toggle_off': 'Выключить', // FOMO 'fomo.missed_orders': 'Пропущено {n} заказов', 'fomo.missed_value': 'На сумму €{v}', 'fomo.upgrade_hint': 'Улучшите план — получайте больше заказов', 'fomo.conversion': 'Конверсия задач', 'fomo.active': 'Активные', 'fomo.with_offers': 'С офертами', 'fomo.completed': 'Завершённые', 'fomo.already_offered': '{n} специалистов уже откликнулись', 'fomo.specialist_missed': 'Вы пропустили {n} заказов', 'fomo.top_categories': 'Категории', 'fomo.offers_received': 'предложений получено', 'fomo.avg_offers': 'В среднем {n}/задача', 'fomo.completion_rate': 'завершено', // Task auto-match 'task.auto_match': 'Авто-матч', 'task.auto_match_results': 'Топ специалисты', 'task.no_offer_yet': 'Вы ещё не отправили предложение', 'task.make_offer': 'Отправить предложение', 'auto_response.title': 'Авто-ответ', 'auto_response.enabled': 'Включить авто-ответ', 'auto_response.min_budget': 'Мин. бюджет', 'auto_response.max_budget': 'Макс. бюджет', 'auto_response.default_price': 'Цена по умолчанию', 'auto_response.default_message': 'Сообщение по умолчанию', 'auto_response.max_per_day': 'Макс. авто-офертов в день', 'auto_response.save': 'Сохранить', 'auto_response.saved': 'Сохранено', 'auto_response.categories': 'Категории', 'auto_response.locations': 'Локации', // Personal site 'profile.personal_site': 'Персональный сайт', 'profile.site_slug': 'URL slug', 'profile.site_slug_hint': 'Только латинские буквы, цифры, - и _', 'profile.site_open': 'Открыть сайт', 'profile.site_preview': 'Ваш сайт', 'profile.show_contact': 'Показывать контакты', 'profile.show_contact_hint': 'Заказчики с Pro/Ultimate-планом увидят ваш телефон', // Google Calendar plan gate 'gcal.upgrade_required': 'Google Календарь требует план Pro или Ultimate', // Chat limits 'chat.limit_warning': 'Осталось {n} сообщений сегодня', 'chat.limit_reached': 'Лимит сообщений исчерпан. Улучшите план', 'chat.upgrade': 'Улучшить', // Site page 'site.member_since': 'С нами с', 'site.rating': 'Рейтинг', 'site.completed_tasks': 'Выполнено', 'site.languages': 'Языков', 'site.photos': 'фото', 'site.contact_form': 'Связаться', 'site.contact_sent': 'Сообщение отправлено!', 'site.contact_sent_desc': 'Специалист свяжется с вами в ближайшее время', 'site.contact_name': 'Имя', 'site.contact_name_ph': 'Ваше имя', 'site.contact_email_ph': 'your@email.com', 'site.contact_message': 'Сообщение', 'site.contact_message_ph': 'Опишите вашу задачу...', 'site.contact_send': 'Отправить', 'site.share': 'Поделиться', 'site.speaks_languages': 'Говорит на языках', 'site.message_sent': 'Сообщение отправлено!', 'site.message_sent_desc': 'Специалист получит его в чате', 'site.message_placeholder': 'Напишите сообщение...', 'site.write_to_chat': 'Написать в чат', 'site.auth_required_title': 'Нужна авторизация', 'site.auth_required_desc': 'Чтобы написать в чат, необходимо войти в аккаунт CanHelp.', 'site.auth_login_btn': 'Войти в аккаунт', 'site.auth_contact_form_btn': 'Написать через форму обратной связи', 'specialist.services': 'Услуги', 'portfolio.title': 'Портфолио', 'status.can_help_now': 'Готов помочь', 'common.not_found': 'Страница не найдена', 'common.anonymous': 'Анонимно' } }; export function getTranslations(locale) { const t = translations[locale] ?? translations.el; return (key, fallback)=>t[key] ?? translations.el[key] ?? fallback ?? key; } /06undefined268274undefined176723176729undefined, /***/ 13260: /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CI: () => (/* binding */ signOut), /* harmony export */ Hh: () => (/* binding */ signUp), /* harmony export */ Jv: () => (/* binding */ signIn), /* harmony export */ wV: () => (/* binding */ useSession), /* harmony export */ yK: () => (/* binding */ authClient) /* harmony export */ }); /* harmony import */ var better_auth_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(69183);  import { createAuthClient } from 'better-auth/react'; const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; export const authClient = createAuthClient({ baseURL: API_URL }); export const { signIn, signOut, signUp, useSession } = authClient; 052undefined70100"https://api.canhelp.gr"undefined1051270undefined130136undefined156171(0,better_auth_react__WEBPACK_IMPORTED_MODULE_0__/* .createAuthClient */ .M)undefined200206undefined, /***/ 14276: , /***/ 15043: A // EXPORTS __webpack_require__.d(__webpack_exports__, { Footer: () => (/* binding */ Footer) }); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js var react_jsx_runtime = __webpack_require__(78157); // EXTERNAL MODULE: ./src/context/locale.tsx var locale = __webpack_require__(96484); // EXTERNAL MODULE: ../../node_modules/next/dist/client/app-dir/link.js var app_dir_link = __webpack_require__(94496); var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); ;// ./src/components/SocialIcons.tsx  ReplaceSource- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; export function SocialIcons({ className = '' }) { return /*#__PURE__*/ _jsxs("div", { className: `flex gap-4 ${className}`, children: [ /*#__PURE__*/ _jsx("a", { href: "https://t.me/canhelp", target: "_blank", rel: "noopener", "aria-label": "Telegram", className: "hover:text-blue-500 transition", children: /*#__PURE__*/ _jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ _jsx("path", { d: "M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z" }) }) }), /*#__PURE__*/ _jsx("a", { href: "https://instagram.com/canhelp", target: "_blank", rel: "noopener", "aria-label": "Instagram", className: "hover:text-pink-500 transition", children: /*#__PURE__*/ _jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ _jsx("path", { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm6.406-11.845a1.44 1.44 0 1 0 0 2.881 1.44 1.44 0 0 0 0-2.881z" }) }) }) ] }); } 062undefined6470undefined139143__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined246249__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined514517__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined780783__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined15391542__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined18171820__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined20832086__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined'69145(0,react_jsx_runtime.jsxs)undefined248322(0,react_jsx_runtime.jsx)undefined587661(0,react_jsx_runtime.jsx)undefined924998(0,react_jsx_runtime.jsx)undefined17541828(0,react_jsx_runtime.jsx)undefined21032177(0,react_jsx_runtime.jsx)undefined24402514(0,react_jsx_runtime.jsx)undefinedRawSource! ;// ./src/components/Footer.tsx 1/* __next_internal_client_entry_do_not_use__ Footer auto */ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useLocale } from '@/context/locale'; import Link from 'next/link'; import { SocialIcons } from './SocialIcons'; export function Footer() { const { t } = useLocale(); const year = new Date().getFullYear(); return /*#__PURE__*/ _jsx("footer", { className: "bg-white border-t border-gray-200 mt-16", children: /*#__PURE__*/ _jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12", children: [ /*#__PURE__*/ _jsxs("div", { className: "flex flex-col md:flex-row justify-between items-start gap-10", children: [ /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-[200px] flex flex-col items-start", children: [ /*#__PURE__*/ _jsx("span", { className: "logo-text text-3xl text-blue-700 font-bold mb-2", children: "CanHelp" }), /*#__PURE__*/ _jsx("p", { className: "text-base text-gray-600 mb-4", children: t('footer.slogan') }) ] }), /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-[180px]", children: [ /*#__PURE__*/ _jsx("h3", { className: "text-lg font-semibold text-blue-900 mb-3", children: t('footer.links') }), /*#__PURE__*/ _jsxs("ul", { className: "space-y-2", children: [ /*#__PURE__*/ _jsx("li", { children: /*#__PURE__*/ _jsx(Link, { href: "/", className: "hover:text-blue-600 transition", children: t('nav.home') }) }), /*#__PURE__*/ _jsx("li", { children: /*#__PURE__*/ _jsx(Link, { href: "/tasks", className: "hover:text-blue-600 transition", children: t('nav.tasks') }) }), /*#__PURE__*/ _jsx("li", { children: /*#__PURE__*/ _jsx(Link, { href: "/become-specialist", className: "hover:text-blue-600 transition", children: t('nav.specialists') }) }) ] }) ] }), /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-[180px]", children: [ /*#__PURE__*/ _jsx("h3", { className: "text-lg font-semibold text-blue-900 mb-3", children: t('footer.socials') }), /*#__PURE__*/ _jsx("p", { className: "text-gray-500 text-sm mb-2", children: "info@canhelp.gr" }), /*#__PURE__*/ _jsx(SocialIcons, { className: "mt-2" }) ] }) ] }), /*#__PURE__*/ _jsxs("div", { className: "mt-10 border-t border-gray-100 pt-6 text-center text-gray-400 text-sm", children: [ "\xa9 ", year, " CanHelp. ", t('footer.rights') ] }) ] }) }); } h 60122undefined124168undefined170198undefined200243undefined245251undefined290298__WEBPACK_MODULE_REFERENCE__1_5b227573654c6f63616c65225d_call_directImport_asiSafe1__._undefined371374__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined482486__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined622626__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined802806__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined992995__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined12431246__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined15301534__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined16941697__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined19441948__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined21202123__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined22012204__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined22062209__WEBPACK_MODULE_REFERENCE__2_5b2264656661756c74225d_directImport_asiSafe1__._undefined25832586__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined26642667__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined26692672__WEBPACK_MODULE_REFERENCE__2_5b2264656661756c74225d_directImport_asiSafe1__._undefined30523055__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined31333136__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined31383141__WEBPACK_MODULE_REFERENCE__2_5b2264656661756c74225d_directImport_asiSafe1__._undefined36533657__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined38173820__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined40694072__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined43044307__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined43094319__WEBPACK_MODULE_REFERENCE__3_5b22536f6369616c49636f6e73225d_directImport_asiSafe1__._undefined45424546__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined102188(0,locale/* useLocale */.Y)undefined261335(0,react_jsx_runtime.jsx)undefined443519(0,react_jsx_runtime.jsxs)undefined655731(0,react_jsx_runtime.jsxs)undefined907983(0,react_jsx_runtime.jsxs)undefined11691243(0,react_jsx_runtime.jsx)undefined14911565(0,react_jsx_runtime.jsx)undefined18491925(0,react_jsx_runtime.jsxs)undefined20852159(0,react_jsx_runtime.jsx)undefined24062482(0,react_jsx_runtime.jsxs)undefined26542728(0,react_jsx_runtime.jsx)undefined28062880(0,react_jsx_runtime.jsx)undefined28822959(link_default())undefined33333407(0,react_jsx_runtime.jsx)undefined34853559(0,react_jsx_runtime.jsx)undefined35613638(link_default())undefined40184092(0,react_jsx_runtime.jsx)undefined41704244(0,react_jsx_runtime.jsx)undefined42464323(link_default())undefined48354911(0,react_jsx_runtime.jsxs)undefined50715145(0,react_jsx_runtime.jsx)undefined53945468(0,react_jsx_runtime.jsx)undefined57005774(0,react_jsx_runtime.jsx)undefined57765861SocialIconsundefined60846160(0,react_jsx_runtime.jsxs)undefined, /***/ 20138: /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocaleProvider: () => (/* binding */ LocaleProvider) /* harmony export */ }); /* unused harmony export useLocale */ /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const LocaleProvider = registerClientReference( function() { throw new Error("Attempted to call LocaleProvider() from the server but LocaleProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/locale.tsx", "LocaleProvider", );export const useLocale = registerClientReference( function() { throw new Error("Attempted to call useLocale() from the server but useLocale is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/context/locale.tsx", "useLocale", );61134undefined136142undefined166188(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined527533undefined552574(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined, /***/ 21046: /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScrollToTopButton: () => (/* binding */ ScrollToTopButton) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* __next_internal_client_entry_do_not_use__ ScrollToTopButton auto */ import { jsx as _jsx } from "react/jsx-runtime"; import { useEffect, useState } from 'react'; export function ScrollToTopButton() { const [visible, setVisible] = useState(false); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const onScroll = ()=>{ setVisible(window.scrollY > 200); }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ _jsx("button", { className: `scroll-to-top-btn${visible ? ' visible' : ''}`, "aria-label": "Наверх", onClick: ()=>window.scrollTo({ top: 0, behavior: 'smooth' }), children: /*#__PURE__*/ _jsx("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/ _jsx("path", { d: "M10 16V4M10 4L4 10M10 4L16 10", stroke: "white", strokeWidth: "2.8", strokeLinecap: "round", strokeLinejoin: "round" }) }) }); } z71118undefined120163undefined165171undefined237244(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined309317(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)undefined570573(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined833836(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined10431046(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined, /***/ 30460: , /***/ 32948: /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScrollToTopButton: () => (/* binding */ ScrollToTopButton) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); )// This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const ScrollToTopButton = registerClientReference( function() { throw new Error("Attempted to call ScrollToTopButton() from the server but ScrollToTopButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/ScrollToTopButton.tsx", "ScrollToTopButton", );61134undefined136142undefined169191(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined, /***/ 33506: __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ NotFound) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5939); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3498); /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_1__); import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import Link from 'next/link'; export default function NotFound() { return /*#__PURE__*/ _jsx("div", { className: "min-h-screen flex items-center justify-center text-center px-4", children: /*#__PURE__*/ _jsxs("div", { children: [ /*#__PURE__*/ _jsx("h1", { className: "text-8xl font-bold text-blue-600 mb-4", children: "404" }), /*#__PURE__*/ _jsx("p", { className: "text-xl text-gray-700 mb-6", children: "Η σελίδα δεν βρέθηκε" }), /*#__PURE__*/ _jsx(Link, { href: "/", className: "bg-blue-600 text-white px-6 py-3 rounded-xl font-semibold hover:bg-blue-700", children: "Επιστροφή στην Αρχική" }) ] }) }); } 062undefined6492undefined94108undefined156159(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined287291(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)undefined356359(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined527530(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined703706(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined708711(next_link__WEBPACK_IMPORTED_MODULE_1___default())undefined, /***/ 39348: /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Footer: () => (/* binding */ Footer) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const Footer = registerClientReference( function() { throw new Error("Attempted to call Footer() from the server but Footer is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/Footer.tsx", "Footer", );61134undefined136142undefined158180(0,react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__.registerClientReference)undefined, /***/ 39805: V/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { import(/* webpackMode: "eager", webpackExports: ["Footer"] */ "/opt/canhelp/apps/web/src/components/Footer.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["Header"] */ "/opt/canhelp/apps/web/src/components/Header.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["ScrollToTopButton"] */ "/opt/canhelp/apps/web/src/components/ScrollToTopButton.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["LocaleProvider"] */ "/opt/canhelp/apps/web/src/context/locale.tsx"); ; import(/* webpackMode: "eager", webpackExports: ["LocationProvider"] */ "/opt/canhelp/apps/web/src/context/location.tsx"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/script.js"); 0111Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 15043))undefined116227Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 58719))undefined232365Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 21046))undefined370486Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 96484))undefined491611Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 56003))undefined616704Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 24653, 23))undefined, /***/ 47570: __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ RootLayout), /* harmony export */ generateMetadata: () => (/* binding */ generateMetadata) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5939); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var next_headers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56057); /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(95692); /* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(14276); /* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_globals_css__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _components_Header__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(67674); /* harmony import */ var _components_Footer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(39348); /* harmony import */ var _context_locale__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(20138); /* harmony import */ var _context_location__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(1697); /* harmony import */ var _components_ScrollToTopButton__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(32948); D import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { cookies, headers } from 'next/headers'; import Script from 'next/script'; import './globals.css'; import { Header } from '@/components/Header'; import { Footer } from '@/components/Footer'; import { LocaleProvider } from '@/context/locale'; import { LocationProvider } from '@/context/location'; import { ScrollToTopButton } from '@/components/ScrollToTopButton'; async function fetchSeoSettings() { try { const apiBase = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; const res = await fetch(`${apiBase}/api/admin/seo-public`, { next: { revalidate: 60 } }); if (!res.ok) return {}; return res.json(); } catch { return {}; } } export async function generateMetadata() { const seo = await fetchSeoSettings(); return { title: seo['seo.siteTitle'] || 'CanHelp — Βρες ειδικό για κάθε δουλειά', description: seo['seo.siteDescription'] || 'Η ελληνική πλατφόρμα για online ανάθεση εργασιών. Βρες επαγγελματίες για καθαρισμό, υδραυλικά, μαθήματα και πολλά άλλα.', keywords: 'εργασίες, ειδικοί, Ελλάδα, freelance, καθαρισμός, υδραυλικά', robots: seo['seo.indexingEnabled'] === 'false' ? 'noindex, nofollow' : undefined }; } export default async function RootLayout({ children }) { const cookieStore = await cookies(); const headerStore = await headers(); const pathname = headerStore.get('x-pathname') ?? ''; const isStandalone = pathname.startsWith('/site/'); const rawLocale = cookieStore.get('canhelp_locale')?.value; const locales = [ 'el', 'en', 'ru' ]; const initialLocale = locales.includes(rawLocale) ? rawLocale : 'el'; const initialLocation = decodeURIComponent(cookieStore.get('canhelp_location')?.value ?? ''); const seo = await fetchSeoSettings(); const headScripts = seo['seo.headScripts'] ?? ''; return /*#__PURE__*/ _jsx("html", { lang: initialLocale, children: /*#__PURE__*/ _jsxs("body", { children: [ headScripts && /*#__PURE__*/ _jsx(Script, { id: "seo-head-scripts", strategy: "beforeInteractive", dangerouslySetInnerHTML: { __html: headScripts } }), /*#__PURE__*/ _jsx(LocaleProvider, { initialLocale: initialLocale, children: /*#__PURE__*/ _jsxs(LocationProvider, { initialSlug: initialLocation, children: [ !isStandalone && /*#__PURE__*/ _jsx(Header, {}), /*#__PURE__*/ _jsx("main", { className: "min-h-screen", children: children }), !isStandalone && /*#__PURE__*/ _jsx(ScrollToTopButton, {}), !isStandalone && /*#__PURE__*/ _jsx(Footer, {}) ] }) }) ] }) }); } 062undefined64111undefined113145undefined147169undefined171215undefined217261undefined263312undefined314367undefined369435undefined507537"https://api.canhelp.gr"undefined5425640undefined814820undefined13461360undefined14331439(0,next_headers__WEBPACK_IMPORTED_MODULE_1__/* .cookies */ .UL)undefined14741480(0,next_headers__WEBPACK_IMPORTED_MODULE_1__/* .headers */ .b3)undefined20262029(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined21022106(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)undefined21872190(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined21922197next_script__WEBPACK_IMPORTED_MODULE_2__["default"]undefined24602463(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined24652478_context_locale__WEBPACK_IMPORTED_MODULE_6__.LocaleProviderundefined25772581(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)undefined25832598_context_location__WEBPACK_IMPORTED_MODULE_7__.LocationProviderundefined27522755(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined27572762_components_Header__WEBPACK_IMPORTED_MODULE_4__.Headerundefined28122815(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined30283031(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined30333049_components_ScrollToTopButton__WEBPACK_IMPORTED_MODULE_8__.ScrollToTopButtonundefined31163119(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined31213126_components_Footer__WEBPACK_IMPORTED_MODULE_5__.Footerundefined, /***/ 48178: /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ E: () => (/* binding */ shortName), /* harmony export */ H: () => (/* binding */ formatShortName) /* harmony export */ }); $/** * Shortens the last name to first letter + period. * "Иван Петров" → "Иван П." * Works with a pre-composed full name string. */ export function shortName(fullName) { if (!fullName?.trim()) return '—'; const parts = fullName.trim().split(/\s+/); if (parts.length < 2 || !parts[1]) return parts[0]; return `${parts[0]} ${parts[1][0].toUpperCase()}.`; } /** * Formats separate firstName + lastName fields, shortening the last name. * Falls back to parsing fullName if firstName is not available. */ export function formatShortName(firstName, lastName, fallbackName) { if (firstName?.trim()) { const l = lastName?.trim(); return l ? `${firstName.trim()} ${l[0].toUpperCase()}.` : firstName.trim(); } return shortName(fallbackName); } 136142undefined523529undefined, /***/ 49046: import(/* webpackMode: "eager", webpackExports: ["__esModule","default"] */ "/opt/canhelp/node_modules/next/dist/client/app-dir/link.js"); s0136Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 94496, 23))undefined, /***/ 56003: 9/* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocationProvider: () => (/* binding */ LocationProvider), /* harmony export */ z: () => (/* binding */ useLocation) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _lib_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(91864); B /* __next_internal_client_entry_do_not_use__ LocationProvider,useLocation auto */ import { jsx as _jsx } from "react/jsx-runtime"; import { createContext, useContext, useState, useEffect, useCallback } from 'react'; import { getLocations } from '@/lib/api'; const LocationContext = /*#__PURE__*/ createContext({ locationSlug: '', locationTree: [], locationLoading: true, setLocation: ()=>{}, getLabel: ()=>'' }); function readCookieLocation() { if (typeof document === 'undefined') return ''; const match = document.cookie.match(/(?:^|;\s*)canhelp_location=([^;]+)/); return match?.[1] ? decodeURIComponent(match[1]) : ''; } export function LocationProvider({ children, initialSlug = '' }) { const [locationSlug, setLocationSlug] = useState(initialSlug); const [locationTree, setLocationTree] = useState([]); const [locationLoading, setLocationLoading] = useState(true); // Sync from cookie on client mount process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const cookieSlug = readCookieLocation(); setLocationSlug(cookieSlug); }, []); // Load location tree once process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ getLocations().then((tree)=>setLocationTree(tree)).catch(()=>{}).finally(()=>setLocationLoading(false)); }, []); const setLocation = useCallback((slug)=>{ setLocationSlug(slug); const encoded = encodeURIComponent(slug); document.cookie = `canhelp_location=${encoded}; path=/; max-age=31536000; SameSite=Lax`; }, []); const getLabel = useCallback((locale)=>{ if (!locationSlug) return ''; for (const city of locationTree){ if (city.slug === locationSlug) return city.names[locale] ?? city.names.el; for (const d of city.children ?? []){ if (d.slug === locationSlug) return d.names[locale] ?? d.names.el; } } return locationSlug; }, [ locationSlug, locationTree ]); return /*#__PURE__*/ _jsx(LocationContext.Provider, { value: { locationSlug, locationTree, locationLoading, setLocation, getLabel }, children: children }); } export function useLocation() { return useContext(LocationContext); } +82129undefined131214undefined216256undefined296308(0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)undefined657663undefined768775(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined835842(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined899906(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined10101018(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)undefined12101218(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)undefined12341245(0,_lib_api__WEBPACK_IMPORTED_MODULE_2__/* .getLocations */ .Vs)undefined13751385(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)undefined16081618(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)undefined20712074(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined22962302undefined23392348(0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)undefined, /***/ 58719: N // EXPORTS __webpack_require__.d(__webpack_exports__, { Header: () => (/* binding */ Header) }); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js var react_jsx_runtime = __webpack_require__(78157); // EXTERNAL MODULE: ../../node_modules/next/dist/client/app-dir/link.js var app_dir_link = __webpack_require__(94496); var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); // EXTERNAL MODULE: ../../node_modules/next/dist/api/navigation.js var navigation = __webpack_require__(71159); // EXTERNAL MODULE: ./src/lib/auth.ts var auth = __webpack_require__(13260); // EXTERNAL MODULE: ./src/context/locale.tsx var context_locale = __webpack_require__(96484); // EXTERNAL MODULE: ./src/lib/formatName.ts var formatName = __webpack_require__(48178); // EXTERNAL MODULE: ../../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react.js var react = __webpack_require__(31768); // EXTERNAL MODULE: ./src/lib/translations.ts var translations = __webpack_require__(12998); ;// ./src/components/LanguageSwitcher.tsx ]/* __next_internal_client_entry_do_not_use__ LanguageSwitcher auto */ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useState, useRef, useEffect } from 'react'; import { useLocale } from '@/context/locale'; import { LOCALES } from '@/lib/translations'; export function LanguageSwitcher() { const { locale, setLocale } = useLocale(); const [open, setOpen] = useState(false); const ref = useRef(null); const current = LOCALES.find((l)=>l.code === locale) ?? LOCALES[0]; // Close on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ function handleClick(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false); } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); return /*#__PURE__*/ _jsxs("div", { ref: ref, className: "relative", children: [ /*#__PURE__*/ _jsxs("button", { onClick: ()=>setOpen(!open), className: "flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg border border-gray-200 hover:border-blue-400 hover:bg-blue-50 transition text-sm font-medium text-gray-700", "aria-label": "Change language", children: [ /*#__PURE__*/ _jsx("span", { children: current.code.toUpperCase() }), /*#__PURE__*/ _jsx("svg", { className: `w-3.5 h-3.5 text-gray-400 transition-transform ${open ? 'rotate-180' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), open && /*#__PURE__*/ _jsx("div", { className: "absolute right-0 mt-1 w-40 bg-white border border-gray-200 rounded-xl shadow-lg z-50 overflow-hidden", children: LOCALES.map((loc)=>/*#__PURE__*/ _jsxs("button", { onClick: ()=>{ setLocale(loc.code); setOpen(false); }, className: `w-full flex items-center gap-2.5 px-3.5 py-2.5 text-sm hover:bg-blue-50 transition ${locale === loc.code ? 'bg-blue-50 text-blue-700 font-medium' : 'text-gray-700'}`, children: [ /*#__PURE__*/ _jsx("span", { children: loc.label }), locale === loc.code && /*#__PURE__*/ _jsx("svg", { className: "w-3.5 h-3.5 ml-auto text-blue-600", fill: "currentColor", viewBox: "0 0 20 20", children: /*#__PURE__*/ _jsx("path", { fillRule: "evenodd", d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", clipRule: "evenodd" }) }) ] }, loc.code)) }) ] }); } r70132undefined134185undefined187231undefined233277undefined279285undefined350358__WEBPACK_MODULE_REFERENCE__4_5b227573654c6f63616c65225d_call_directImport_asiSafe1__._undefined391398__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined424429__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined458464__WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_call_asiSafe1__._undefined498504__WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_asiSafe1__._undefined595603__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined908912__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined10181022__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined13801383__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined15141517__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined18611864__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined21472150__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined23182324__WEBPACK_MODULE_REFERENCE__7_5b224c4f43414c4553225d_call_asiSafe1__._undefined23512355__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined28092812__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined29732976__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined32313234__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined138224(0,context_locale/* useLocale */.Y)undefined257341(0,react.useState)undefined367447(0,react.useRef)undefined476545translations/* LOCALES */.YZundefined579643translations/* LOCALES */.YZundefined734820(0,react.useEffect)undefined11251201(0,react_jsx_runtime.jsxs)undefined13071383(0,react_jsx_runtime.jsxs)undefined17411815(0,react_jsx_runtime.jsx)undefined19462020(0,react_jsx_runtime.jsx)undefined23642438(0,react_jsx_runtime.jsx)undefined27212795(0,react_jsx_runtime.jsx)undefined29633032translations/* LOCALES */.YZundefined30593135(0,react_jsx_runtime.jsxs)undefined35893663(0,react_jsx_runtime.jsx)undefined38243898(0,react_jsx_runtime.jsx)undefined41534227(0,react_jsx_runtime.jsx)undefinedRawSource // EXTERNAL MODULE: ./src/lib/api.ts var api = __webpack_require__(91864); // EXTERNAL MODULE: ../../node_modules/socket.io-client/build/esm-debug/index.js + 30 modules var esm_debug = __webpack_require__(44826); ;// ./src/components/Header.tsx "(/* __next_internal_client_entry_do_not_use__ Header auto */ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; import Link from 'next/link'; import { useRouter, usePathname } from 'next/navigation'; import { useSession, signOut } from '@/lib/auth'; import { useLocale } from '@/context/locale'; import { formatShortName } from '@/lib/formatName'; import { LanguageSwitcher } from './LanguageSwitcher'; import { useState, useRef, useEffect } from 'react'; import { getUnreadCount, getMyDashboard } from '@/lib/api'; import { io } from 'socket.io-client'; const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; export function Header() { const router = useRouter(); const pathname = usePathname(); const { data: session } = useSession(); const { t, locale } = useLocale(); const [menuOpen, setMenuOpen] = useState(false); const [profileOpen, setProfileOpen] = useState(false); const [unreadNotif, setUnreadNotif] = useState(0); const [unreadChat, setUnreadChat] = useState(0); const [msgToast, setMsgToast] = useState(null); const [planTier, setPlanTier] = useState(null); const profileRef = useRef(null); const headerRef = useRef(null); const toastTimer = useRef(null); // Close dropdowns on outside click process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ function handleClick(e) { if (profileRef.current && !profileRef.current.contains(e.target)) { setProfileOpen(false); } } document.addEventListener('mousedown', handleClick); return ()=>document.removeEventListener('mousedown', handleClick); }, []); const isAdmin = session?.user?.role === 'admin'; const isSpecialist = session?.user?.role === 'specialist'; // Reset chat badge when entering chat process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (pathname === '/chat') setUnreadChat(0); }, [ pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) return; const socket = io(API_URL, { withCredentials: true, transports: [ 'websocket', 'polling' ] }); socket.on('new_message', (msg)=>{ if (pathname === '/chat') return; setUnreadChat((c)=>c + 1); if (toastTimer.current) clearTimeout(toastTimer.current); setMsgToast(msg); toastTimer.current = setTimeout(()=>setMsgToast(null), 5000); }); return ()=>{ socket.disconnect(); if (toastTimer.current) clearTimeout(toastTimer.current); }; }, [ session, pathname ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) { setUnreadNotif(0); return; } const fetch = ()=>getUnreadCount().then((r)=>setUnreadNotif(r.count)).catch(()=>{}); fetch(); const timer = setInterval(fetch, 30000); return ()=>clearInterval(timer); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ if (!session) { setPlanTier(null); return; } getMyDashboard().then((d)=>setPlanTier(d.plan?.tier ?? null)).catch(()=>{}); }, [ session ]); process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const onScroll = ()=>{ if (!headerRef.current) return; if (window.scrollY > 40) { headerRef.current.classList.add('header-shrink'); } else { headerRef.current.classList.remove('header-shrink'); } }; window.addEventListener('scroll', onScroll); return ()=>window.removeEventListener('scroll', onScroll); }, []); return /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx("header", { ref: headerRef, className: "header-base bg-white border-b border-gray-200 sticky top-0 z-50 transition-all duration-300", children: /*#__PURE__*/ _jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [ /*#__PURE__*/ _jsxs("div", { className: "flex items-center justify-between h-16 header-content transition-all duration-300", children: [ /*#__PURE__*/ _jsx(Link, { href: "/", className: "flex items-center shrink-0", children: /*#__PURE__*/ _jsx("span", { className: "logo-text text-2xl font-bold text-blue-600 transition-all duration-300", children: "CanHelp" }) }), /*#__PURE__*/ _jsxs("nav", { className: "hidden md:flex items-center gap-5 ml-auto", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/tasks", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.find_tasks') }), /*#__PURE__*/ _jsx(Link, { href: "/dashboard", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.dashboard') }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/tasks/new", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('dashboard.new_task') }), /*#__PURE__*/ _jsx(Link, { href: "/specialists", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.specialists') }) ] }), /*#__PURE__*/ _jsx(Link, { href: "/pricing", className: `font-medium text-sm transition ${pathname === '/pricing' ? 'text-blue-600' : 'text-gray-600 hover:text-blue-600'}`, children: t('nav.pricing', 'Pricing') }), session ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ _jsx("svg", { className: `w-5 h-5 ${unreadNotif > 0 ? 'text-orange-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "relative text-gray-600 hover:text-gray-900 flex items-center", children: [ /*#__PURE__*/ _jsx("svg", { className: `w-5 h-5 ${unreadChat > 0 ? 'text-green-500' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }), /*#__PURE__*/ _jsxs("div", { className: "relative", ref: profileRef, children: [ /*#__PURE__*/ _jsxs("button", { onClick: ()=>setProfileOpen(!profileOpen), className: "flex items-center gap-1.5 text-sm font-medium text-gray-600 hover:text-blue-600", children: [ /*#__PURE__*/ _jsx("span", { className: "truncate max-w-[100px]", children: formatShortName(session.user.firstName, session.user.lastName, session.user.name) }), planTier === 'pro' && /*#__PURE__*/ _jsx("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-blue-100 text-blue-700 leading-none", children: "Pro" }), planTier === 'ultimate' && /*#__PURE__*/ _jsx("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-gradient-to-r from-amber-400 via-yellow-400 to-amber-400 text-gray-900 shadow-sm shadow-amber-300/50 leading-none", children: "★" }), /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) ] }), profileOpen && /*#__PURE__*/ _jsxs("div", { className: "absolute right-0 mt-2 w-52 bg-white border border-gray-200 rounded-xl shadow-lg py-1 z-50", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 shrink-0 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 shrink-0 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full leading-none", children: unreadChat > 99 ? '99+' : unreadChat }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/tasks", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ _jsxs(Link, { href: "/schedule", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/admin", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsxs("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/profile", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/favorites", className: "flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50", onClick: ()=>setProfileOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), /*#__PURE__*/ _jsx("hr", { className: "my-1 border-gray-100" }), /*#__PURE__*/ _jsxs("button", { className: "w-full flex items-center gap-2.5 px-4 py-2 text-sm text-red-500 hover:bg-red-50", onClick: ()=>{ setProfileOpen(false); signOut().then(()=>{ window.location.href = '/'; }); }, children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/login", className: "text-gray-600 hover:text-blue-600 font-medium text-sm", children: t('nav.login') }), /*#__PURE__*/ _jsx(Link, { href: "/register", className: "bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 font-medium text-sm", children: t('nav.register') }) ] }), /*#__PURE__*/ _jsx(LanguageSwitcher, {}) ] }), /*#__PURE__*/ _jsxs("div", { className: "md:hidden flex items-center gap-2", children: [ /*#__PURE__*/ _jsx(LanguageSwitcher, {}), /*#__PURE__*/ _jsx("button", { className: "p-2", onClick: ()=>setMenuOpen(!menuOpen), "aria-label": "Toggle menu", children: /*#__PURE__*/ _jsx("svg", { className: "w-5 h-5 text-gray-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: menuOpen ? /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) : /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4 6h16M4 12h16M4 18h16" }) }) }) ] }) ] }), menuOpen && /*#__PURE__*/ _jsxs("div", { className: "md:hidden py-4 border-t border-gray-100 flex flex-col gap-3", children: [ isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), t('nav.find_tasks') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }), session ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/chat", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 ${unreadChat > 0 ? 'text-green-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" }) }), t('nav.chat'), unreadChat > 0 && /*#__PURE__*/ _jsx("span", { className: "ml-1 px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full", children: unreadChat }) ] }), isSpecialist ? /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/tasks/new", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4v16m8-8H4" }) }), t('nav.new_task') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/specialists", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" }) }), t('nav.specialists') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsxs(Link, { href: "/notifications", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: `w-4 h-4 ${unreadNotif > 0 ? 'text-orange-500' : 'text-gray-400'}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }), /*#__PURE__*/ _jsxs("span", { className: "flex items-center gap-1.5", children: [ t('nav.notifications'), unreadNotif > 0 && /*#__PURE__*/ _jsx("span", { className: "px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full", children: unreadNotif > 99 ? '99+' : unreadNotif }) ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/dashboard", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" }) }), t('nav.dashboard') ] }) ] }), /*#__PURE__*/ _jsxs(Link, { href: "/favorites", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }) }), t('nav.favorites') ] }), (isSpecialist || isAdmin) && /*#__PURE__*/ _jsxs(Link, { href: "/schedule", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), t('nav.schedule') ] }), isAdmin && /*#__PURE__*/ _jsxs(Link, { href: "/admin", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsxs("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: [ /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }) ] }), t('nav.admin') ] }), /*#__PURE__*/ _jsxs(Link, { href: "/profile", className: "flex items-center gap-2 text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }), t('nav.profile') ] }), /*#__PURE__*/ _jsxs("button", { onClick: ()=>{ setMenuOpen(false); signOut().then(()=>{ window.location.href = '/'; }); }, className: "flex items-center gap-2 text-left text-red-500 py-1 font-medium", children: [ /*#__PURE__*/ _jsx("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /*#__PURE__*/ _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" }) }), t('nav.logout') ] }) ] }) : /*#__PURE__*/ _jsxs(_Fragment, { children: [ /*#__PURE__*/ _jsx(Link, { href: "/login", className: "text-gray-700 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.login') }), /*#__PURE__*/ _jsx(Link, { href: "/register", className: "text-blue-600 font-medium py-1", onClick: ()=>setMenuOpen(false), children: t('nav.register') }) ] }) ] }) ] }) }), msgToast && /*#__PURE__*/ _jsx("div", { className: "fixed bottom-5 right-5 z-[200] max-w-sm w-full", children: /*#__PURE__*/ _jsxs("div", { className: "bg-white border border-gray-200 rounded-xl shadow-xl p-4 flex items-start gap-3 animate-fade-in", children: [ /*#__PURE__*/ _jsx("span", { className: "text-2xl shrink-0", children: "\uD83D\uDCAC" }), /*#__PURE__*/ _jsxs("div", { className: "flex-1 min-w-0", children: [ /*#__PURE__*/ _jsx("p", { className: "font-semibold text-gray-900 text-sm", children: t('chat.toast_title') }), /*#__PURE__*/ _jsx("p", { className: "text-xs text-gray-500 truncate mt-0.5", children: msgToast.body }) ] }), /*#__PURE__*/ _jsxs("div", { className: "flex flex-col items-end gap-2 shrink-0", children: [ /*#__PURE__*/ _jsx("button", { onClick: ()=>setMsgToast(null), className: "text-gray-400 hover:text-gray-600 text-lg leading-none", "aria-label": "close", children: "\xd7" }), /*#__PURE__*/ _jsx(Link, { href: `/chat?room=${msgToast.roomId}`, onClick: ()=>setMsgToast(null), className: "text-xs text-blue-600 hover:underline font-medium", children: t('chat.toast_open') }) ] }) ] }) }) ] }); } PT60145undefined147175undefined177233undefined235283undefined285329undefined331381undefined383436undefined438489undefined491549undefined551588undefined606636"https://api.canhelp.gr"undefined6416630undefined666672undefined712720__WEBPACK_MODULE_REFERENCE__2_5b22757365526f75746572225d_call_directImport_asiSafe1__._undefined746756__WEBPACK_MODULE_REFERENCE__2_5b22757365506174686e616d65225d_call_directImport_asiSafe1__._undefined791800__WEBPACK_MODULE_REFERENCE__3_5b2275736553657373696f6e225d_call_directImport_asiSafe1__._undefined831839__WEBPACK_MODULE_REFERENCE__4_5b227573654c6f63616c65225d_call_directImport_asiSafe1__._undefined880887__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined939946__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined9981005__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined10511058__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined11001107__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined11521159__WEBPACK_MODULE_REFERENCE__6_5b227573655374617465225d_call_directImport_asiSafe1__._undefined11911196__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined12271232__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined12641269__WEBPACK_MODULE_REFERENCE__6_5b22757365526566225d_call_directImport_asiSafe1__._undefined13731381__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined19281936__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined20852093__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined21542155__WEBPACK_MODULE_REFERENCE__10_5b22696f225d_call_directImport_asiSafe1__._undefined28642872__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined29913004__WEBPACK_MODULE_REFERENCE__9_5b22676574556e72656164436f756e74225d_call_directImport_asiSafe1__._undefined32533261__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined33623375__WEBPACK_MODULE_REFERENCE__9_5b226765744d7944617368626f617264225d_call_directImport_asiSafe1__._undefined35273535__WEBPACK_MODULE_REFERENCE__6_5b22757365456666656374225d_call_directImport_asiSafe1__._undefined39953999__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined40014009__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined40604063__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined42714275__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined44294433__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined46544657__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined46594662__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined48514854__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined51725176__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined53965400__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined54025410__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined55335536__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined55385541__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined59305933__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined59355938__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined63726376__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined63786386__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined65096512__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined65146517__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined69146917__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined69196922__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined73997402__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined74047407__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined78367840__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined78427850__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined79737977__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined79797982__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined83248327__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined88668869__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined95499552__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1013010134__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1013610139__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined1047210475__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1101211015__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1164211645__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1222312227__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1251612520__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1294112944__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1313913153__WEBPACK_MODULE_REFERENCE__5_5b22666f726d617453686f72744e616d65225d_call_directImport_asiSafe1__._undefined1338913392__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1385613859__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1437214375__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1492514928__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1557015574__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1591415918__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1592015928__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined1609916103__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1610516108__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined1666816671__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1733317336__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1819018194__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined1819618199__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined1876118764__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined1942619429__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2053920543__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2054520553__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined2072420728__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2073020733__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined2129721300__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2200522008__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2281322817__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2328223285__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2412824132__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2413424137__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined2469224695__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2539825401__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2615426158__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2661326616__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2745927463__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2746527468__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined2802828031__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2869328696__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined2982129825__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined2982729830__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3034630349__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3096330966__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3180831812__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3181431817__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3233632339__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3295332956__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3382133825__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3382733830__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3434634350__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3504635049__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3602936032__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3692336927__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3692936932__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3745037453__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3806738070__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined3890438908__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined3891038913__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined3943339436__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4005040053__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4094540948__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4120641210__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4163641642__WEBPACK_MODULE_REFERENCE__3_5b227369676e4f7574225d_call_directImport_asiSafe1__._undefined4207442077__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4267742680__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4378743791__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4379343801__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined4392443927__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4392943932__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4431644319__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4432144324__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4482344826__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4482844843__WEBPACK_MODULE_REFERENCE__8_5b224c616e67756167655377697463686572225d_directImport_asiSafe1__._undefined4497044974__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4517145174__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4517645191__WEBPACK_MODULE_REFERENCE__8_5b224c616e67756167655377697463686572225d_directImport_asiSafe1__._undefined4525345256__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4555445557__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4600346006__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4631646319__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4688746891__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4710547109__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4711147119__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined4722647230__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4723247235__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4760847611__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4807248075__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4867248676__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined4867848681__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined4905849061__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined4952249525__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5025650260__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5026250270__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5037750381__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5038350386__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5076350766__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5122751230__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5179651800__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5180251805__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5218452187__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5264852651__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5348253486__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5348853496__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5360353607__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5360953612__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5398453987__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5448954492__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5513455137__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5557655580__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5558255590__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5571355717__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5571955722__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5613956142__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5665156654__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5729257296__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5729857301__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5772057723__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5823258235__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined5910559109__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5911159119__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined5924259246__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined5924859251__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined5967259675__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6022760230__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6089160895__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6126461267__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6190561909__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6191161914__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6233162334__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6284362846__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6369663700__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6370263705__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6408264085__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6454664549__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6525465258__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6526065263__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6563965642__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6610366106__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6675566759__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6676166764__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6713767141__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6766067663__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6852368526__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined6917769181__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined6918369186__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined6956169564__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7002570028__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7064670650__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7083970845__WEBPACK_MODULE_REFERENCE__3_5b227369676e4f7574225d_call_directImport_asiSafe1__._undefined7127971282__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7172971732__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7240572409__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7241172419__WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._undefined7252672529__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7253172534__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined7293272935__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7293772940__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined7351473517__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7364573649__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7386073863__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7405474058__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7421274215__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7446074463__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7475174755__WEBPACK_MODULE_REFERENCE__0_5b226a737873225d_call_directImport_asiSafe1__._undefined7493374936__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7531775320__WEBPACK_MODULE_REFERENCE__0_5b226a7378225d_call_directImport_asiSafe1__._undefined7532275325__WEBPACK_MODULE_REFERENCE__1_5b2264656661756c74225d_directImport_asiSafe1__._undefined`$156242(0,navigation.useRouter)undefined268358(0,navigation.usePathname)undefined393481(0,auth/* useSession */.wV)undefined512598(0,context_locale/* useLocale */.Y)undefined639723(0,react.useState)undefined775859(0,react.useState)undefined911995(0,react.useState)undefined10411125(0,react.useState)undefined11671251(0,react.useState)undefined12961380(0,react.useState)undefined14121492(0,react.useRef)undefined15231603(0,react.useRef)undefined16351715(0,react.useRef)undefined18191905(0,react.useEffect)undefined24522538(0,react.useEffect)undefined26872773(0,react.useEffect)undefined28342907(0,esm_debug.io)undefined36163702(0,react.useEffect)undefined38213917(0,api/* getUnreadCount */.$M)undefined41664252(0,react.useEffect)undefined43534449(0,api/* getMyDashboard */.H)undefined46014687(0,react.useEffect)undefined51475223(0,react_jsx_runtime.jsxs)undefined52255304react_jsx_runtime.Fragmentundefined53555429(0,react_jsx_runtime.jsx)undefined56375713(0,react_jsx_runtime.jsxs)undefined58675943(0,react_jsx_runtime.jsxs)undefined61646238(0,react_jsx_runtime.jsx)undefined62406317(link_default())undefined65066580(0,react_jsx_runtime.jsx)undefined68986974(0,react_jsx_runtime.jsxs)undefined71947270(0,react_jsx_runtime.jsxs)undefined72727351react_jsx_runtime.Fragmentundefined74747548(0,react_jsx_runtime.jsx)undefined75507627(link_default())undefined80168090(0,react_jsx_runtime.jsx)undefined80928169(link_default())undefined86038679(0,react_jsx_runtime.jsxs)undefined86818760react_jsx_runtime.Fragmentundefined88838957(0,react_jsx_runtime.jsx)undefined89599036(link_default())undefined94339507(0,react_jsx_runtime.jsx)undefined95099586(link_default())undefined1006310137(0,react_jsx_runtime.jsx)undefined1013910216(link_default())undefined1064510721(0,react_jsx_runtime.jsxs)undefined1072310802react_jsx_runtime.Fragmentundefined1092511001(0,react_jsx_runtime.jsxs)undefined1100311080(link_default())undefined1142211496(0,react_jsx_runtime.jsx)undefined1203512109(0,react_jsx_runtime.jsx)undefined1278912863(0,react_jsx_runtime.jsx)undefined1344113517(0,react_jsx_runtime.jsxs)undefined1351913596(link_default())undefined1392914003(0,react_jsx_runtime.jsx)undefined1454014614(0,react_jsx_runtime.jsx)undefined1524115315(0,react_jsx_runtime.jsx)undefined1589315969(0,react_jsx_runtime.jsxs)undefined1625816334(0,react_jsx_runtime.jsxs)undefined1675516829(0,react_jsx_runtime.jsx)undefined1702417122(0,formatName/* formatShortName */.H)undefined1735817432(0,react_jsx_runtime.jsx)undefined1789617970(0,react_jsx_runtime.jsx)undefined1848318557(0,react_jsx_runtime.jsx)undefined1910719181(0,react_jsx_runtime.jsx)undefined1982319899(0,react_jsx_runtime.jsxs)undefined2023920315(0,react_jsx_runtime.jsxs)undefined2031720396react_jsx_runtime.Fragmentundefined2056720643(0,react_jsx_runtime.jsxs)undefined2064520722(link_default())undefined2128221356(0,react_jsx_runtime.jsx)undefined2201822092(0,react_jsx_runtime.jsx)undefined2294623022(0,react_jsx_runtime.jsxs)undefined2302423101(link_default())undefined2366323737(0,react_jsx_runtime.jsx)undefined2439924473(0,react_jsx_runtime.jsx)undefined2558325659(0,react_jsx_runtime.jsxs)undefined2566125740react_jsx_runtime.Fragmentundefined2591125987(0,react_jsx_runtime.jsxs)undefined2598926066(link_default())undefined2663026704(0,react_jsx_runtime.jsx)undefined2740927483(0,react_jsx_runtime.jsx)undefined2828828364(0,react_jsx_runtime.jsxs)undefined2882928903(0,react_jsx_runtime.jsx)undefined2974629822(0,react_jsx_runtime.jsxs)undefined2982429901(link_default())undefined3045630530(0,react_jsx_runtime.jsx)undefined3123331307(0,react_jsx_runtime.jsx)undefined3206032136(0,react_jsx_runtime.jsxs)undefined3259132665(0,react_jsx_runtime.jsx)undefined3350833584(0,react_jsx_runtime.jsxs)undefined3358633663(link_default())undefined3422334297(0,react_jsx_runtime.jsx)undefined3495935033(0,react_jsx_runtime.jsx)undefined3615836234(0,react_jsx_runtime.jsxs)undefined3623636313(link_default())undefined3682936903(0,react_jsx_runtime.jsx)undefined3751737591(0,react_jsx_runtime.jsx)undefined3843338509(0,react_jsx_runtime.jsxs)undefined3851138588(link_default())undefined3910739181(0,react_jsx_runtime.jsx)undefined3979539869(0,react_jsx_runtime.jsx)undefined4073440810(0,react_jsx_runtime.jsxs)undefined4081240889(link_default())undefined4140541481(0,react_jsx_runtime.jsxs)undefined4217742251(0,react_jsx_runtime.jsx)undefined4323143305(0,react_jsx_runtime.jsx)undefined4419644272(0,react_jsx_runtime.jsxs)undefined4427444351(link_default())undefined4486944943(0,react_jsx_runtime.jsx)undefined4555745631(0,react_jsx_runtime.jsx)undefined4646546541(0,react_jsx_runtime.jsxs)undefined4654346620(link_default())undefined4714047214(0,react_jsx_runtime.jsx)undefined4782847902(0,react_jsx_runtime.jsx)undefined4879448868(0,react_jsx_runtime.jsx)undefined4912649202(0,react_jsx_runtime.jsxs)undefined4962849710(0,auth/* signOut */.CI)undefined5014250216(0,react_jsx_runtime.jsx)undefined5081650890(0,react_jsx_runtime.jsx)undefined5199752073(0,react_jsx_runtime.jsxs)undefined5207552154react_jsx_runtime.Fragmentundefined5227752351(0,react_jsx_runtime.jsx)undefined5235352430(link_default())undefined5281452888(0,react_jsx_runtime.jsx)undefined5289052967(link_default())undefined5346653540(0,react_jsx_runtime.jsx)undefined5354253637LanguageSwitcherundefined5376453840(0,react_jsx_runtime.jsxs)undefined5403754111(0,react_jsx_runtime.jsx)undefined5411354208LanguageSwitcherundefined5427054344(0,react_jsx_runtime.jsx)undefined5464254716(0,react_jsx_runtime.jsx)undefined5516255236(0,react_jsx_runtime.jsx)undefined5554655620(0,react_jsx_runtime.jsx)undefined5618856264(0,react_jsx_runtime.jsxs)undefined5647856554(0,react_jsx_runtime.jsxs)undefined5655656635react_jsx_runtime.Fragmentundefined5674256818(0,react_jsx_runtime.jsxs)undefined5682056897(link_default())undefined5727057344(0,react_jsx_runtime.jsx)undefined5780557879(0,react_jsx_runtime.jsx)undefined5847658552(0,react_jsx_runtime.jsxs)undefined5855458631(link_default())undefined5900859082(0,react_jsx_runtime.jsx)undefined5954359617(0,react_jsx_runtime.jsx)undefined6034860424(0,react_jsx_runtime.jsxs)undefined6042660505react_jsx_runtime.Fragmentundefined6061260688(0,react_jsx_runtime.jsxs)undefined6069060767(link_default())undefined6114461218(0,react_jsx_runtime.jsx)undefined6167961753(0,react_jsx_runtime.jsx)undefined6231962395(0,react_jsx_runtime.jsxs)undefined6239762474(link_default())undefined6285362927(0,react_jsx_runtime.jsx)undefined6338863462(0,react_jsx_runtime.jsx)undefined6429364369(0,react_jsx_runtime.jsxs)undefined6437164450react_jsx_runtime.Fragmentundefined6455764633(0,react_jsx_runtime.jsxs)undefined6463564712(link_default())undefined6508465158(0,react_jsx_runtime.jsx)undefined6566065734(0,react_jsx_runtime.jsx)undefined6637666450(0,react_jsx_runtime.jsx)undefined6688966965(0,react_jsx_runtime.jsxs)undefined6696767046react_jsx_runtime.Fragmentundefined6716967245(0,react_jsx_runtime.jsxs)undefined6724767324(link_default())undefined6774167815(0,react_jsx_runtime.jsx)undefined6832468398(0,react_jsx_runtime.jsx)undefined6903669112(0,react_jsx_runtime.jsxs)undefined6911469191(link_default())undefined6961069684(0,react_jsx_runtime.jsx)undefined7019370267(0,react_jsx_runtime.jsx)undefined7113771213(0,react_jsx_runtime.jsxs)undefined7121571294react_jsx_runtime.Fragmentundefined7141771493(0,react_jsx_runtime.jsxs)undefined7149571572(link_default())undefined7199372067(0,react_jsx_runtime.jsx)undefined7261972693(0,react_jsx_runtime.jsx)undefined7335473430(0,react_jsx_runtime.jsxs)undefined7379973873(0,react_jsx_runtime.jsx)undefined7451174587(0,react_jsx_runtime.jsxs)undefined7458974666(link_default())undefined7508375157(0,react_jsx_runtime.jsx)undefined7566675740(0,react_jsx_runtime.jsx)undefined7659076666(0,react_jsx_runtime.jsxs)undefined7666876745(link_default())undefined7712277196(0,react_jsx_runtime.jsx)undefined7765777731(0,react_jsx_runtime.jsx)undefined7843678512(0,react_jsx_runtime.jsxs)undefined7851478591(link_default())undefined7896779041(0,react_jsx_runtime.jsx)undefined7950279576(0,react_jsx_runtime.jsx)undefined8022580301(0,react_jsx_runtime.jsxs)undefined8030380380(link_default())undefined8075380829(0,react_jsx_runtime.jsxs)undefined8134881422(0,react_jsx_runtime.jsx)undefined8228282356(0,react_jsx_runtime.jsx)undefined8300783083(0,react_jsx_runtime.jsxs)undefined8308583162(link_default())undefined8353783611(0,react_jsx_runtime.jsx)undefined8407284146(0,react_jsx_runtime.jsx)undefined8476484840(0,react_jsx_runtime.jsxs)undefined8502985111(0,auth/* signOut */.CI)undefined8554585619(0,react_jsx_runtime.jsx)undefined8606686140(0,react_jsx_runtime.jsx)undefined8681386889(0,react_jsx_runtime.jsxs)undefined8689186970react_jsx_runtime.Fragmentundefined8707787151(0,react_jsx_runtime.jsx)undefined8715387230(link_default())undefined8762887702(0,react_jsx_runtime.jsx)undefined8770487781(link_default())undefined8835588429(0,react_jsx_runtime.jsx)undefined8855788633(0,react_jsx_runtime.jsxs)undefined8884488918(0,react_jsx_runtime.jsx)undefined8910989185(0,react_jsx_runtime.jsxs)undefined8933989413(0,react_jsx_runtime.jsx)undefined8965889732(0,react_jsx_runtime.jsx)undefined9002090096(0,react_jsx_runtime.jsxs)undefined9027490348(0,react_jsx_runtime.jsx)undefined9072990803(0,react_jsx_runtime.jsx)undefined9080590882(link_default())undefined, /***/ 64271: import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/builtin/global-error.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/client-page.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/client-segment.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/layout-router.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/metadata/async-metadata.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/client/components/render-from-template-context.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/lib/framework/boundary-components.js"); ; import(/* webpackMode: "eager" */ "/opt/canhelp/node_modules/next/dist/lib/metadata/generate/icon-mark.js"); 0113Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 58671, 23))undefined118222Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56542, 23))undefined227334Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 88248, 23))undefined339467Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 49743, 23))undefined472578Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 96231, 23))undefined583699Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 10959, 23))undefined704825Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 72041, 23))undefined830938Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 95094, 23))undefined9431049Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 67487, 23))undefined, /***/ 67674: /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Header: () => (/* binding */ Header) /* harmony export */ }); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25459); /* harmony import */ var react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_server_dom_webpack_server__WEBPACK_IMPORTED_MODULE_0__); // This file is generated by the Webpack next-flight-loader. import { registerClientReference } from "react-server-dom-webpack/server"; export const Header = registerClientReference( function() { throw new Error("Attempted to call Header() from the server but Header is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component."); }, "/opt/canhelp/apps/web/src/components/Header.tsx", "Header", );, /***/ 72088: , /***/ 72519: 0113Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 48365, 23))undefined118222Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 64596, 23))undefined227334Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56186, 23))undefined339467Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 67805, 23))undefined472578Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 27561, 23))undefined583699Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 47569, 23))undefined704825Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 42747, 23))undefined830938Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 56676, 23))undefined9431049Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 97225))undefined, /***/ 85998: r0136Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 3498, 23))undefined, /***/ 91864: /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ $7: () => (/* binding */ updateCategory), /* harmony export */ $H: () => (/* binding */ acceptOffer), /* harmony export */ $M: () => (/* binding */ getUnreadCount), /* harmony export */ Bb: () => (/* binding */ getMySpecialistCards), /* harmony export */ Bm: () => (/* binding */ getUserRating), /* harmony export */ Bq: () => (/* binding */ getSpecialistCards), /* harmony export */ Br: () => (/* binding */ getAdminNotifLogs), /* harmony export */ CX: () => (/* binding */ updateAdminSettings), /* harmony export */ Cs: () => (/* binding */ previewPlanChange), /* harmony export */ D1: () => (/* binding */ setAvailabilityRange), /* harmony export */ Em: () => (/* binding */ request), /* harmony export */ F7: () => (/* binding */ getSpecialists), /* harmony export */ F9: () => (/* binding */ getTaskInvite), /* harmony export */ FI: () => (/* binding */ sendTestEmail), /* harmony export */ Fu: () => (/* binding */ getMyTasks), /* harmony export */ GB: () => (/* binding */ deleteTaskAdmin), /* harmony export */ Gp: () => (/* binding */ getAutoResponseSettings), /* harmony export */ H: () => (/* binding */ getMyDashboard), /* harmony export */ H6: () => (/* binding */ getTaskReviews), /* harmony export */ He: () => (/* binding */ activateUser), /* harmony export */ Ip: () => (/* binding */ markRead), /* harmony export */ Je: () => (/* binding */ purchasePlan), /* harmony export */ K7: () => (/* binding */ deleteCategory), /* harmony export */ KD: () => (/* binding */ getAdminCategories), /* harmony export */ Lb: () => (/* binding */ declineOffer), /* harmony export */ Lp: () => (/* binding */ getAdminEmailTemplates), /* harmony export */ ML: () => (/* binding */ getCustomerFomoDashboard), /* harmony export */ Mm: () => (/* binding */ changeUserRole), /* harmony export */ NL: () => (/* binding */ markAllRead), /* harmony export */ Nt: () => (/* binding */ updateLocation), /* harmony export */ OM: () => (/* binding */ setAvailability), /* harmony export */ OV: () => (/* binding */ runAutoMatch), /* harmony export */ OX: () => (/* binding */ getAdminPlans), /* harmony export */ On: () => (/* binding */ getCanMessage), /* harmony export */ P0: () => (/* binding */ adminTopUpUserBalance), /* harmony export */ QN: () => (/* binding */ getOrCreateDirectRoom), /* harmony export */ RN: () => (/* binding */ getSiteStats), /* harmony export */ RQ: () => (/* binding */ updateAutoResponseSettings), /* harmony export */ Rt: () => (/* binding */ completeTask), /* harmony export */ S$: () => (/* binding */ getPublicSiteProfile), /* harmony export */ Sw: () => (/* binding */ getOffers), /* harmony export */ T9: () => (/* binding */ getPlans), /* harmony export */ Tr: () => (/* binding */ getNotifications), /* harmony export */ UE: () => (/* binding */ trackSiteMessage), /* harmony export */ UT: () => (/* binding */ createTask), /* harmony export */ V: () => (/* binding */ addSpecialistFavorite), /* harmony export */ VL: () => (/* binding */ getMessages), /* harmony export */ VM: () => (/* binding */ getUserProfile), /* harmony export */ Vs: () => (/* binding */ getLocations), /* harmony export */ Wi: () => (/* binding */ deactivateUser), /* harmony export */ Xz: () => (/* binding */ getSpecialistAvailability), /* harmony export */ Yj: () => (/* binding */ getAdminTasks), /* harmony export */ Zp: () => (/* binding */ getChatRooms), /* harmony export */ _z: () => (/* binding */ sendMessage), /* harmony export */ aT: () => (/* binding */ getMyOffers), /* harmony export */ bR: () => (/* binding */ deletePlan), /* harmony export */ bW: () => (/* binding */ getCategories), /* harmony export */ bc: () => (/* binding */ toggleStatus), /* harmony export */ bi: () => (/* binding */ getAdminNotifStats), /* harmony export */ bx: () => (/* binding */ createReview), /* harmony export */ cS: () => (/* binding */ getAdminUsers), /* harmony export */ dE: () => (/* binding */ getAdminStats), /* harmony export */ eR: () => (/* binding */ createSpecialistCard), /* harmony export */ eU: () => (/* binding */ updateReportStatus), /* harmony export */ f5: () => (/* binding */ deleteSpecialistCard), /* harmony export */ fm: () => (/* binding */ getBalanceHistory), /* harmony export */ g0: () => (/* binding */ getAdminBalanceHistory), /* harmony export */ gg: () => (/* binding */ getTask), /* harmony export */ hD: () => (/* binding */ adminWithdrawUserBalance), /* harmony export */ hl: () => (/* binding */ updatePortfolioItem), /* harmony export */ iN: () => (/* binding */ getMyAvailability), /* harmony export */ j_: () => (/* binding */ getAdminAiLogs), /* harmony export */ jd: () => (/* binding */ getAdminUser), /* harmony export */ jg: () => (/* binding */ updateAdminEmailTemplate), /* harmony export */ k_: () => (/* binding */ getAdminLocations), /* harmony export */ lC: () => (/* binding */ updateTask), /* harmony export */ nf: () => (/* binding */ cancelTaskAdmin), /* harmony export */ oh: () => (/* binding */ initiateTopUp), /* harmony export */ oq: () => (/* binding */ adminUpdateSpecialistCard), /* harmony export */ pD: () => (/* binding */ getSpecialistFavorites), /* harmony export */ pK: () => (/* binding */ getPaymentHistory), /* harmony export */ q7: () => (/* binding */ getMyReviews), /* harmony export */ qT: () => (/* binding */ createPlan), /* harmony export */ qt: () => (/* binding */ getAdminMailLogs), /* harmony export */ rC: () => (/* binding */ getAdminSettings), /* harmony export */ rl: () => (/* binding */ getSkillSuggestions), /* harmony export */ sD: () => (/* binding */ removeSpecialistFavorite), /* harmony export */ st: () => (/* binding */ getMyReferralInfo), /* harmony export */ td: () => (/* binding */ updatePlan), /* harmony export */ ts: () => (/* binding */ createOffer), /* harmony export */ u4: () => (/* binding */ getAdminMailStats), /* harmony export */ v9: () => (/* binding */ getUserReviews), /* harmony export */ vh: () => (/* binding */ getTaskStats), /* harmony export */ vy: () => (/* binding */ getAdminUserSpecialistCards), /* harmony export */ wc: () => (/* binding */ translateAdminEmailTemplate), /* harmony export */ wl: () => (/* binding */ updateAdminUser), /* harmony export */ yJ: () => (/* binding */ createLocation), /* harmony export */ yO: () => (/* binding */ getAdminActivityLogs), /* harmony export */ yk: () => (/* binding */ dismissNotification), /* harmony export */ z4: () => (/* binding */ getDailyUsage), /* harmony export */ z5: () => (/* binding */ getAdminReports), /* harmony export */ z6: () => (/* binding */ getMyStatuses), /* harmony export */ zB: () => (/* binding */ deletePortfolioItem), /* harmony export */ zR: () => (/* binding */ deleteLocation), /* harmony export */ zZ: () => (/* binding */ createCategory), /* harmony export */ zc: () => (/* binding */ updateSpecialistCard), /* harmony export */ zk: () => (/* binding */ getSpecialistFomoDashboard) /* harmony export */ }); /* unused harmony exports getTasks, getTaskBudgetRange, searchTasks, getTasksForSpecialist, getTaskCountsByCategory, cancelTask, updateNotifSettings, getFavorites, addFavorite, removeFavorite, getMyPortfolio, addPortfolioItem, getSpecialistPortfolio, getFomoRecommendations, getAutoMatchResults, getGoogleCalendarStatus, disconnectGoogleCalendar, importFromGoogleCalendar, getGoogleCalendarConnectUrl */ ~Oconst BASE = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; export async function request(path, init) { const res = await fetch(`${BASE}/api${path}`, { ...init, credentials: 'include', headers: { 'Content-Type': 'application/json', ...init?.headers } }); if (!res.ok) { const err = await res.json().catch(()=>({ error: res.statusText })); const msg = typeof err.error === 'string' ? err.error : typeof err.message === 'string' ? err.message : res.statusText || 'Request failed'; throw new Error(msg); } return res.json(); } // ─── Tasks ──────────────────────────────────────────────────────────────── export const getTasks = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks${qs}`); }; export const getTaskBudgetRange = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks/budget-range${qs}`); }; export const searchTasks = (params)=>request(`/tasks/search?${new URLSearchParams(params)}`); export const getMyTasks = ()=>request('/tasks/my'); export const getTasksForSpecialist = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/tasks/for-me${qs}`); }; export const getTaskCountsByCategory = ()=>request('/tasks/counts-by-category'); export const getTask = (id)=>request(`/tasks/${id}`); export const createTask = (data)=>request('/tasks', { method: 'POST', body: JSON.stringify(data) }); export const updateTask = (id, data)=>request(`/tasks/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const completeTask = (id)=>request(`/tasks/${id}/complete`, { method: 'PATCH' }); export const cancelTask = (id)=>request(`/tasks/${id}/cancel`, { method: 'PATCH' }); // ─── Offers ──────────────────────────────────────────────────────────────── export const getOffers = (taskId)=>request(`/offers?taskId=${taskId}`); export const getMyOffers = ()=>request('/offers/my'); export const createOffer = (data)=>request('/offers', { method: 'POST', body: JSON.stringify(data) }); export const acceptOffer = (id)=>request(`/offers/${id}/accept`, { method: 'PATCH' }); export const declineOffer = (id)=>request(`/offers/${id}/decline`, { method: 'PATCH' }); export const getUserProfile = (id)=>request(`/users/${id}/profile`); export const getSpecialists = (params)=>{ const qs = params ? '?' + new URLSearchParams(params) : ''; return request(`/users/specialists${qs}`); }; export const createReview = (data)=>request('/reviews', { method: 'POST', body: JSON.stringify(data) }); export const getTaskReviews = (taskId)=>request(`/reviews/task/${taskId}`); export const getMyReviews = ()=>request('/reviews/my'); // ─── Chat ────────────────────────────────────────────────────────────────── export const getChatRooms = ()=>request('/chat/rooms'); export const getOrCreateDirectRoom = (userId)=>request(`/chat/direct/${userId}`); export const getCanMessage = (userId)=>request(`/chat/can-message/${userId}`); export const getMessages = (roomId)=>request(`/chat/rooms/${roomId}/messages`); export const sendMessage = (roomId, body)=>request('/chat/messages', { method: 'POST', body: JSON.stringify({ roomId, body }) }); // ─── Notifications ──────────────────────────────────────────────────────── export const updateNotifSettings = (data)=>request('/users/me', { method: 'PATCH', body: JSON.stringify(data) }); export const getNotifications = ()=>request('/notifications'); export const getUnreadCount = ()=>request('/notifications/count'); export const markRead = (id)=>request(`/notifications/${id}/read`, { method: 'PATCH' }); export const markAllRead = ()=>request('/notifications/read-all', { method: 'PATCH' }); export const getTaskInvite = (taskId)=>request(`/notifications?type=task_invite&referenceId=${taskId}`); export const dismissNotification = (id)=>request(`/notifications/${id}`, { method: 'DELETE' }); // ─── Referral ───────────────────────────────────────────────────────────── export const getMyReferralInfo = ()=>request('/users/me/referral'); // ─── Reviews ────────────────────────────────────────────────────────────── export const getUserReviews = (userId)=>request(`/reviews/user/${userId}`); export const getUserRating = (userId)=>request(`/reviews/user/${userId}/rating`); // ─── Categories ─────────────────────────────────────────────────────────── export const getCategories = ()=>request('/categories'); // ─── Locations ──────────────────────────────────────────────────────────── export const getLocations = ()=>request('/locations'); // ─── Favorites ──────────────────────────────────────────────────────────── export const getFavorites = ()=>request('/favorites'); export const addFavorite = (taskId)=>request(`/favorites/${taskId}`, { method: 'POST' }); export const removeFavorite = (taskId)=>request(`/favorites/${taskId}`, { method: 'DELETE' }); export const getSpecialistFavorites = ()=>request('/favorites/specialists'); export const addSpecialistFavorite = (specialistId)=>request(`/favorites/specialists/${specialistId}`, { method: 'POST' }); export const removeSpecialistFavorite = (specialistId)=>request(`/favorites/specialists/${specialistId}`, { method: 'DELETE' }); // ─── Admin ───────────────────────────────────────────────────────────────── // ─── Admin Categories ────────────────────────────────────────────────────── export const getAdminCategories = ()=>request('/admin/categories'); export const createCategory = (data)=>request('/admin/categories', { method: 'POST', body: JSON.stringify(data) }); export const updateCategory = (id, data)=>request(`/admin/categories/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deleteCategory = (id)=>request(`/admin/categories/${id}`, { method: 'DELETE' }); // ─── Admin ───────────────────────────────────────────────────────────────── export const getAdminStats = ()=>request('/admin/stats'); export const getAdminUsers = (page = 1, q, role)=>{ const p = new URLSearchParams({ page: String(page), limit: '20' }); if (q) p.set('q', q); if (role) p.set('role', role); return request(`/admin/users?${p}`); }; export const deactivateUser = (id)=>request(`/admin/users/${id}/deactivate`, { method: 'PATCH' }); export const activateUser = (id)=>request(`/admin/users/${id}/activate`, { method: 'PATCH' }); export const changeUserRole = (id, role)=>request(`/admin/users/${id}/role`, { method: 'PATCH', body: JSON.stringify({ role }) }); export const getAdminUser = (id)=>request(`/admin/users/${id}`); export const getAdminUserSpecialistCards = (userId)=>request(`/admin/users/${userId}/specialist-cards`); export const adminUpdateSpecialistCard = (id, data)=>request(`/admin/specialist-cards/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const updateAdminUser = (id, data)=>request(`/admin/users/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const getAdminTasks = (page = 1, q, status)=>{ const p = new URLSearchParams({ page: String(page), limit: '20' }); if (q) p.set('q', q); if (status) p.set('status', status); return request(`/admin/tasks?${p}`); }; export const cancelTaskAdmin = (id)=>request(`/admin/tasks/${id}/cancel`, { method: 'PATCH' }); export const deleteTaskAdmin = (id)=>request(`/admin/tasks/${id}`, { method: 'DELETE' }); export const getAdminReports = (page = 1)=>request(`/admin/reports?page=${page}&limit=20`); export const updateReportStatus = (id, status)=>request(`/admin/reports/${id}/status`, { method: 'PATCH', body: JSON.stringify({ status }) }); export const getAdminAiLogs = (page = 1)=>request(`/admin/ai-logs?page=${page}&limit=50`); export const getAdminActivityLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.event) p.set('event', params.event); if (params.userId) p.set('userId', params.userId); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/activity-logs?${p}`); }; export const getAdminMailLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.event) p.set('event', params.event); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/mail-logs?${p}`); }; export const getAdminNotifLogs = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.type) p.set('type', params.type); if (params.dateFrom) p.set('dateFrom', params.dateFrom); if (params.dateTo) p.set('dateTo', params.dateTo); p.set('limit', '50'); return request(`/admin/notification-logs?${p}`); }; export const getAdminNotifStats = ()=>request('/admin/notification-stats'); export const getAdminMailStats = ()=>request('/admin/mail-stats'); // ─── Admin Locations ─────────────────────────────────────────────────────── export const getAdminLocations = ()=>request('/admin/locations'); export const createLocation = (data)=>request('/admin/locations', { method: 'POST', body: JSON.stringify(data) }); export const updateLocation = (id, data)=>request(`/admin/locations/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deleteLocation = (id)=>request(`/admin/locations/${id}`, { method: 'DELETE' }); // ─── Admin Plans ─────────────────────────────────────────────────────────── export const getAdminPlans = ()=>request('/admin/plans'); export const createPlan = (data)=>request('/admin/plans', { method: 'POST', body: JSON.stringify(data) }); export const updatePlan = (id, data)=>request(`/admin/plans/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deletePlan = (id)=>request(`/admin/plans/${id}`, { method: 'DELETE' }); // ─── Admin Settings ──────────────────────────────────────────────────────── export const getAdminSettings = ()=>request('/admin/settings'); export const updateAdminSettings = (data)=>request('/admin/settings', { method: 'PUT', body: JSON.stringify(data) }); export const getAdminEmailTemplates = ()=>request('/admin/settings/templates'); export const updateAdminEmailTemplate = (key, data)=>request(`/admin/settings/templates/${key}`, { method: 'PUT', body: JSON.stringify(data) }); export const translateAdminEmailTemplate = (data)=>request('/admin/settings/templates/translate', { method: 'POST', body: JSON.stringify(data) }); export const sendTestEmail = ()=>request('/admin/settings/test-email', { method: 'POST' }); // ─── Availability ────────────────────────────────────────────────────────── export const getMyAvailability = (month)=>request(`/availability/my${month ? `?month=${month}` : ''}`); export const setAvailability = (date, status, note)=>request('/availability/set', { method: 'POST', body: JSON.stringify({ date, status, note }) }); export const setAvailabilityRange = (from, to, status)=>request('/availability/set-range', { method: 'POST', body: JSON.stringify({ from, to, status }) }); export const getSpecialistAvailability = (userId, month)=>request(`/availability/user/${userId}${month ? `?month=${month}` : ''}`); export const getMyPortfolio = ()=>request('/portfolio/my'); export const addPortfolioItem = (formData)=>fetch(`${BASE}/api/portfolio`, { method: 'POST', credentials: 'include', body: formData }).then(async (res)=>{ if (!res.ok) { const err = await res.json().catch(()=>({ error: res.statusText })); throw new Error(err.error || 'Upload failed'); } return res.json(); }); export const updatePortfolioItem = (id, data)=>request(`/portfolio/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deletePortfolioItem = (id)=>request(`/portfolio/${id}`, { method: 'DELETE' }); export const getSpecialistPortfolio = (userId)=>request(`/portfolio/user/${userId}`); export const getMySpecialistCards = ()=>request('/specialist-cards/my'); export const createSpecialistCard = (data)=>request('/specialist-cards', { method: 'POST', body: JSON.stringify(data) }); export const updateSpecialistCard = (id, data)=>request(`/specialist-cards/${id}`, { method: 'PATCH', body: JSON.stringify(data) }); export const deleteSpecialistCard = (id)=>request(`/specialist-cards/${id}`, { method: 'DELETE' }); export const getSpecialistCards = (userId)=>request(`/specialist-cards/user/${userId}`); export const getSkillSuggestions = (categorySlugs)=>{ const params = categorySlugs?.length ? '?' + categorySlugs.map((s)=>`category=${encodeURIComponent(s)}`).join('&') : ''; return request(`/skill-suggestions${params}`); }; export const initiateTopUp = (amount)=>request('/payments/topup/init', { method: 'POST', body: JSON.stringify({ amount }) }); export const getPaymentHistory = ()=>request('/payments/history'); export const getBalanceHistory = (limit = 50)=>request(`/payments/balance-history?limit=${limit}`); export const getAdminBalanceHistory = (params = {})=>{ const p = new URLSearchParams(); if (params.page) p.set('page', String(params.page)); if (params.userId) p.set('userId', params.userId); if (params.kind) p.set('kind', params.kind); p.set('limit', '50'); return request(`/admin/balance-history?${p}`); }; export const adminTopUpUserBalance = (id, data)=>request(`/admin/users/${id}/balance/topup`, { method: 'POST', body: JSON.stringify(data) }); export const adminWithdrawUserBalance = (id, data)=>request(`/admin/users/${id}/balance/withdraw`, { method: 'POST', body: JSON.stringify(data) }); export const previewPlanChange = (planId)=>request('/payments/plan/preview', { method: 'POST', body: JSON.stringify({ planId }) }); export const getPlans = (role)=>{ const qs = role ? `?role=${role}` : ''; return request(`/plans${qs}`); }; export const getMyDashboard = ()=>request('/dashboard/me'); export const getDailyUsage = ()=>request('/plans/daily-usage'); export const purchasePlan = (planId, payFromBalance = true)=>request('/payments/plan/purchase', { method: 'POST', body: JSON.stringify({ planId, payFromBalance }) }); // ─── Statuses ────────────────────────────────────────────────────────────── export const getMyStatuses = ()=>request('/statuses/me'); export const toggleStatus = (statusType, active)=>request('/statuses/toggle', { method: 'POST', body: JSON.stringify({ statusType, active }) }); export const getAutoResponseSettings = ()=>request('/auto-response'); export const updateAutoResponseSettings = (data)=>request('/auto-response', { method: 'PUT', body: JSON.stringify(data) }); // ─── FOMO ────────────────────────────────────────────────────────────────── export const getSpecialistFomoDashboard = ()=>request('/fomo/specialist'); export const getCustomerFomoDashboard = ()=>request('/fomo/customer'); export const getFomoRecommendations = ()=>request('/fomo/recommendations'); // ─── Auto-match ──────────────────────────────────────────────────────────── export const getAutoMatchResults = (taskId)=>request(`/auto-match/${taskId}`); export const runAutoMatch = (taskId)=>request(`/auto-match/${taskId}`, { method: 'POST' }); // ─── Google Calendar ─────────────────────────────────────────────────────── export const getGoogleCalendarStatus = ()=>request('/google/calendar/status'); export const disconnectGoogleCalendar = ()=>request('/google/calendar/disconnect', { method: 'DELETE' }); export const importFromGoogleCalendar = ()=>request('/google/calendar/import', { method: 'POST' }); export const getGoogleCalendarConnectUrl = ()=>`${BASE}/api/google/calendar/connect`; // ─── Personal site ───────────────────────────────────────────────────────── export const getPublicSiteProfile = (slug)=>request(`/users/site/${slug}`); export const getSiteStats = ()=>request('/users/me/site-stats'); export const trackSiteMessage = (slug)=>request(`/users/site/${slug}/track-message`, { method: 'POST' }).catch(()=>{}); // ─── Task stats (FOMO) ───────────────────────────────────────────────────── export const getTaskStats = (taskId)=>request(`/tasks/${taskId}/stats`); 1343"https://api.canhelp.gr"undefined48700undefined7379undefined743749undefined881887undefined10421048undefined11361142undefined11881194undefined13461352undefined14271433undefined14811487undefined16021608undefined17341740undefined18351841undefined20112017undefined20832089undefined21372143undefined22602266undefined23592365undefined24602466undefined25292535undefined26852691undefined28102816undefined28862892undefined30213027undefined30773083undefined31593165undefined32383244undefined33183324undefined35783584undefined37123718undefined37753781undefined38423848undefined39433949undefined40434049undefined41484154undefined43344340undefined44804486undefined45564562undefined47164722undefined48514857undefined49844990undefined50395045undefined51415147undefined52485254undefined53255331undefined54615467undefined57605766undefined58285834undefined59645970undefined61116117undefined62966302undefined63546360undefined66036609undefined67146720undefined68216827undefined69926998undefined70577063undefined71627168undefined73267332undefined74697475undefined77267732undefined78347840undefined79367942undefined80288034undefined82118217undefined83028308undefined87508756undefined91359141undefined95269532undefined96029608undefined97489754undefined98149820undefined99499955undefined1009510101undefined1027910285undefined1033710343undefined1046410470undefined1060210608undefined1077810784undefined1084210848undefined1098010986undefined1106011066undefined1122511231undefined1139211398undefined1157511581undefined1167911685undefined1189211898undefined1211212118undefined1224412250undefined1230412310undefined1273112737undefined1287612882undefined1298012986undefined1306613072undefined1313913145undefined1328113287undefined1343413440undefined1354613552undefined1363513641undefined1386813874undefined1403414040undefined1410114107undefined1420114207undefined1453414540undefined1469614702undefined1486414870undefined1503615042undefined1515215158undefined1521215218undefined1527615282undefined1557415580undefined1563215638undefined1582915835undefined1589915905undefined1612216128undefined1619716203undefined1626816274undefined1642316429undefined1650216508undefined1668516691undefined1676416770undefined1688216888undefined1699417000undefined1715917165undefined1723517241undefined1730017306undefined1751117517undefined, /***/ 91946:  __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43560); /* harmony import */ var next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__); Z import { fillMetadataSegment } from 'next/dist/lib/metadata/get-metadata-route' export default async (props) => { const imageData = {"type":"image/svg+xml","sizes":"any"} const imageUrl = fillMetadataSegment(".", await props.params, "icon.svg") return [{ ...imageData, url: imageUrl + "?71a523b2dd824001", }] }280undefined8599/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (undefined8599undefined201219(0,next_dist_lib_metadata_get_metadata_route__WEBPACK_IMPORTED_MODULE_0__.fillMetadataSegment)undefined346345.5);undefined, /***/ 95837: 0111Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 39348))undefined116227Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 67674))undefined232365Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 32948))undefined370486Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 20138))undefined491611Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 1697))undefined616704Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 33219, 23))undefined, /***/ 96484: /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocaleProvider: () => (/* binding */ LocaleProvider), /* harmony export */ Y: () => (/* binding */ useLocale) /* harmony export */ }); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78157); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31768); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71159); /* harmony import */ var _lib_translations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12998);  /* __next_internal_client_entry_do_not_use__ LocaleProvider,useLocale auto */ import { jsx as _jsx } from "react/jsx-runtime"; import { createContext, useContext, useState, useEffect, useCallback } from 'react'; import { useRouter } from 'next/navigation'; import { getTranslations } from '@/lib/translations'; const COOKIE_KEY = 'canhelp_locale'; const DEFAULT_LOCALE = 'el'; const LocaleContext = /*#__PURE__*/ createContext({ locale: DEFAULT_LOCALE, setLocale: ()=>{}, t: (key)=>key }); function readCookieLocale() { if (typeof document === 'undefined') return DEFAULT_LOCALE; const match = document.cookie.match(/canhelp_locale=([^;]+)/); const val = match?.[1]; return val && [ 'el', 'en', 'ru' ].includes(val) ? val : DEFAULT_LOCALE; } export function LocaleProvider({ children, initialLocale }) { const router = useRouter(); const [locale, setLocaleState] = useState(initialLocale ?? DEFAULT_LOCALE); // Sync from cookie on mount (client-side) process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && useEffect(()=>{ const cookieLocale = readCookieLocale(); if (cookieLocale !== locale) setLocaleState(cookieLocale); // Sync cookie locale to DB on first load (in case DB is out of sync) const apiBase = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; fetch(`${apiBase}/api/users/me`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ locale: cookieLocale }) }).catch(()=>{}); }, []); const setLocale = useCallback((next)=>{ setLocaleState(next); document.cookie = `${COOKIE_KEY}=${next}; path=/; max-age=31536000; SameSite=Lax`; document.documentElement.lang = next; // Persist locale to user profile in DB (best-effort, non-blocking) const apiBase = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; fetch(`${apiBase}/api/users/me`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ locale: next }) }).catch(()=>{}); // Re-render server components with new cookie router.refresh(); }, [ router ]); const t = useCallback((key, fallback)=>getTranslations(locale)(key, fallback), [ locale ]); return /*#__PURE__*/ _jsx(LocaleContext.Provider, { value: { locale, setLocale, t }, children: children }); } export function useLocale() { return useContext(LocaleContext); } G78125undefined127210undefined212255undefined257309undefined413425(0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)undefined798804undefined879887(0,next_navigation__WEBPACK_IMPORTED_MODULE_2__.useRouter)undefined929936(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)undefined10741082(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)undefined13081338"https://api.canhelp.gr"undefined134313650undefined17121722(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)undefined20012031"https://api.canhelp.gr"undefined203620580undefined24902500(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)undefined25192533(0,_lib_translations__WEBPACK_IMPORTED_MODULE_3__/* .getTranslations */ .$)undefined26092612(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)undefined27622768undefined28032812(0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)undefined }; ;webpack/lib/util/registerExternalSerializerwebpack-sources/RawSource"dexports.id=244,exports.ids=[244],exports.modules={1241:()=>{},1697:(a,b,c)=>{"use strict";c.d(b,{LocationProvider:()=>e});var d=c(25459);let e=(0,d.registerClientReference)(function(){throw Error("Attempted to call LocationProvider() from the server but LocationProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/opt/canhelp/apps/web/src/context/location.tsx","LocationProvider");(0,d.registerClientReference)(function(){throw Error("Attempted to call useLocation() from the server but useLocation is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/opt/canhelp/apps/web/src/context/location.tsx","useLocation")},12998:(a,b,c)=>{"use strict";c.d(b,{$:()=>f,YZ:()=>d});let d=[{code:"el",label:"Ελληνικά",flag:"\uD83C\uDDEC\uD83C\uDDF7"},{code:"en",label:"English",flag:"\uD83C\uDDEC\uD83C\uDDE7"},{code:"ru",label:"Русский",flag:"\uD83C\uDDF7\uD83C\uDDFA"}],e={el:{"footer.slogan":"Η εργασία σου — η φροντίδα μας! Λύνουμε κάθε ζήτημα γρήγορα και εύκολα.","footer.links":"Σύνδεσμοι","footer.socials":"Στα κοινωνικά δίκτυα","nav.home":"Αρχική","nav.tasks":"Εργασίες","nav.post":"+ Δημοσίευση","nav.dashboard":"Πίνακας","nav.chat":"Μηνύματα","nav.notifications":"Ειδοποιήσεις","nav.profile":"Προφίλ","nav.admin":"Διαχείριση","nav.specialists":"Ειδικοί","nav.new_task":"Νέα εργασία","nav.login":"Σύνδεση","nav.register":"Εγγραφή","nav.logout":"Έξοδος","hero.title":"Βρες ειδικό για κάθε δουλειά","hero.subtitle":"Δημοσίευσε εργασία, λάβε προσφορές και επίλεξε τον καλύτερο επαγγελματία","hero.cta.post":"Δημοσίευσε εργασία","hero.cta.browse":"Βρες εργασία","hero.search.placeholder":"Τι χρειάζεσαι; π.χ. ηλεκτρολόγος, καθαρισμός...","stats.specialists":"ειδικοί","stats.tasks":"εργασίες","stats.categories":"κατηγορίες","stats.free":"δωρεάν εγγραφή","section.categories":"Δημιούργησε εργασία σε οποιαδήποτε κατηγορία","section.how":"Πώς λειτουργεί","section.recent":"Πρόσφατες εργασίες","section.all":"Δες όλες →","section.more":"ακόμα","section.cities":"Πόλεις & Περιοχές","section.community":"Ένα κοινοτικό έργο για όλους","community.subtitle":"Το CanHelp δεν είναι απλώς μια αγορά — είναι μια κοινότητα αμοιβαίας βοήθειας. Οποιοσδήποτε έχει γνώση ή δεξιότητα μπορεί να βρει έναν πελάτη. Οποιοσδήποτε έχει ένα πρόβλημα μπορεί να βρει έναν ειδικό.","community.point1.title":"Είσαι ειδικός σε κάτι;","community.point1.desc":"Επισκευές, μαθήματα, σχεδιασμός, μεταφράσεις, φροντίδα — κάθε δεξιότητα αξίζει. Δημιούργησε προφίλ και βρες πελάτες κοντά σου.","community.point2.title":"Χρειάζεσαι βοήθεια;","community.point2.desc":"Δημοσίευσε εργασία σε λιγότερο από ένα λεπτό και λάβε προσφορές από επαληθευμένους ειδικούς στην πόλη σου.","community.point3.title":"Βοήθησε το έργο να αναπτυχθεί","community.point3.desc":"Το CanHelp αναπτύσσεται χάρη στις κοινότητες. Μοιράσου το σύνδεσμο με φίλους και γνωστούς — μαζί χτίζουμε κάτι χρήσιμο για όλους.","community.share":"Μοιράσου με φίλους","community.share.copied":"Σύνδεσμος αντιγράφηκε!","section.referral":"Πρόγραμμα παραπομπών","referral.home.subtitle":"Μοιράσου τον σύνδεσμό σου — κάθε νέος χρήστης που εγγράφεται μέσα από αυτόν σου αποφέρει ανταμοιβή.","referral.home.step1.title":"Εγγραφείσε και λάβε σύνδεσμο","referral.home.step1.desc":"Δημιούργησε λογαριασμό και βρες τον μοναδικό σου σύνδεσμο παραπομπής στο προφίλ σου.","referral.home.step2.title":"Μοιράσου με φίλους","referral.home.step2.desc":"Στείλε τον σύνδεσμο σε φίλους, γνωστούς ή δημοσίευσέ τον στα social media.","referral.home.step3.title":"Κέρδισε ανταμοιβές","referral.home.step3.desc":"Μόλις ο φίλος σου επαληθεύσει το email του, λαμβάνεις αυτόματα την ανταμοιβή σου.","referral.home.cta":"Πάρε τον σύνδεσμό σου","referral.home.badge":"Πρόγραμμα παραπομπών","section.faq":"Συχνές Ερωτήσεις","faq.q1":"Πώς λειτουργεί το CanHelp;","faq.a1":"Δημοσίευσε μια εργασία, λάβε προσφορές από ειδικούς, επέλεξε τον καλύτερο και ξεκίνα τη συνεργασία. Είναι γρήγορο, απλό και δωρεάν για πελάτες.","faq.q2":"Πόσο κοστίζει η χρήση της πλατφόρμας;","faq.a2":"Η εγγραφή και η δημοσίευση εργασιών είναι εντελώς δωρεάν για πελάτες. Οι ειδικοί έχουν στη διάθεσή τους δωρεάν πλάνο καθώς και premium επιλογές.","faq.q3":"Πώς μπορώ να γίνω ειδικός;","faq.a3":"Κάνε εγγραφή, πήγαινε στο \xabΓίνε Ειδικός\xbb, συμπλήρωσε το προφίλ σου με δεξιότητες και κατηγορίες και αρχίνισε να λαμβάνεις εργασίες.","faq.q4":"Πώς επιλέγω τον κατάλληλο ειδικό;","faq.a4":"Δες τις αξιολογήσεις, την εμπειρία, τις δεξιότητες και το χαρτοφυλάκιο κάθε ειδικού. Επικοινώνησε μαζί του μέσω chat και συζήτα τις λεπτομέρειες πριν αποφασίσεις.","faq.q5":"Τι γίνεται αν δεν είμαι ικανοποιημένος;","faq.a5":"Μπορείς να αφήσεις αξιολόγηση για τον ειδικό και να τον βαθμολογήσεις από 1 έως 5 αστέρια. Οι αξιολογήσεις βοηθούν άλλους χρήστες να επιλέξουν έμπιστους επαγγελματίες.","faq.q6":"Μπορώ να επικοινωνήσω με τον ειδικό πριν την αποδοχή;","faq.a6":"Ναι. Μόλις λάβεις μια προσφορά, μπορείς να ανοίξεις chat με τον ειδικό, να κάνεις ερωτήσεις και να συντονίσεις τις λεπτομέρειες πριν αποφασίσεις.","faq.q7":"Πόσος χρόνος χρειάζεται για να λάβω προσφορές;","faq.a7":"Συνήθως μέσα σε λίγες ώρες. Οι ειδικοί λαμβάνουν ειδοποίηση για νέες εργασίες και μπορούν να απαντήσουν γρήγορα.","faq.q8":"Μπορώ να δημοσιεύσω εργασία σε οποιαδήποτε πόλη της Ελλάδας;","faq.a8":"Ναι! Το CanHelp καλύπτει όλη την Ελλάδα. Μπορείς να βρεις ειδικούς στην Αθήνα, στη Θεσσαλονίκη, στην Πάτρα και αλλού.","faq.q9":"Τι είδη εργασιών μπορώ να βρω στο CanHelp;","faq.a9":"Επισκευές, καθαρισμό, ηλεκτρολόγους, μαθήματα, σχεδιασμό, IT, μετακομίσεις, ομορφιά και πολλά άλλα. Οι κατηγορίες αυξάνονται συνεχώς.","faq.q10":"Υπάρχει εφαρμογή για κινητό;","faq.a10":"Ναι! Το CanHelp διατίθεται για Android και iOS. Κατέβασε την εφαρμογή και διαχειρίσου τα πάντα από το τηλέφωνό σου.","how.step1.title":"Δημοσίευσε εργασία","how.step1.desc":"Περίγραψε τι χρειάζεσαι και ορίζε τον προϋπολογισμό σου","how.step2.title":"Λάβε προσφορές","how.step2.desc":"Ειδικοί θα σου στείλουν προσφορές με τιμή και χρόνο","how.step3.title":"Επίλεξε & ξεκίνα","how.step3.desc":"Επέλεξε τον καλύτερο επαγγελματία και ξεκίνα τη συνεργασία","tasks.title":"εργασίες","tasks.filters":"Φίλτρα","tasks.search":"Αναζήτηση","tasks.search.placeholder":"Τίτλος ή λέξη κλειδί...","tasks.search.btn":"Αναζήτηση","tasks.publish":"Δημοσίευση","tasks.category.all":"Όλες","tasks.category.all_in":"Όλα στην","tasks.category.label":"Κατηγορία","tasks.location.label":"Πόλη","tasks.location.placeholder":"π.χ. Αθήνα","tasks.empty":"Δεν βρέθηκαν εργασίες","tasks.empty.cta":"Δημοσίευσε την πρώτη","task.status.open":"Ανοιχτή","task.status.in_progress":"Σε εξέλιξη","task.status.completed":"Ολοκληρωμένη","task.status.cancelled":"Ακυρωμένη","task.status.draft":"Πρόχειρο","task.budget":"Προϋπολογισμός","task.location":"Τοποθεσία","task.deadline":"Ημερομηνία έναρξης","task.created_at":"Δημιουργήθηκε","task.customer":"Πελάτης","task.offer.btn":"Υποβολή προσφοράς","task.invite.banner_title":"Σας προσκαλούν σε αυτήν την εργασία","task.invite.banner_hint":"Ο πελάτης σας πρόσκαλεσε προσωπικά","task.invite.accept":"Αποστολή προσφοράς","task.invite.decline":"Άρνηση","offer.accept":"Αποδοχή","offer.decline":"Απόρριψη","task.complete":"Ολοκλήρωση εργασίας","task.complete.confirm":"Να ολοκληρωθεί η εργασία;","task.edit":"Επεξεργασία","task.status_label":"Κατάσταση","task.yours":"Η εργασία σου","task.offer.yours":"Η προσφορά σου","review.leave":"Άφησε αξιολόγηση","review.rating":"Βαθμολογία","review.comment":"Σχόλιο","review.comment.placeholder":"Πες μας για την εμπειρία σου...","review.submit":"Υποβολή αξιολόγησης","review.submitting":"Αποστολή...","review.done":"Η αξιολόγηση καταχωρήθηκε!","profile.reviews":"Αξιολογήσεις","profile.no_reviews":"Δεν υπάρχουν αξιολογήσεις ακόμα","profile.rating":"Βαθμολογία","profile.skills.label":"Δεξιότητες","profile.member_since":"Μέλος από","task.offers":"Προσφορές","task.offers.none":"Δεν υπάρχουν ακόμα προσφορές","create.title":"Δημοσίευση εργασίας","create.field.title":"Τίτλος","create.field.description":"Περιγραφή","create.field.category":"Κατηγορία","create.field.category.select":"Επιλέξτε...","create.field.location":"Τοποθεσία","create.field.location.any":"Οπουδήποτε","create.field.location.all":"Ολόκληρη η πόλη","create.field.budget":"Προϋπολογισμός (€)","create.field.deadline":"Ημερομηνία έναρξης","create.field.budget_negotiable":"Η τιμή είναι διαπραγματεύσιμη","create.field.time_slot":"Χρόνος εκτέλεσης","create.field.time_slot.any":"Οποιαδήποτε","create.field.time_slot.morning":"Πρωινό (08:00–13:00)","create.field.time_slot.afternoon":"Μεσημέρι (13:00–18:00)","create.field.time_slot.evening":"Βράδυ (18:00–22:00)","create.field.time_slot.weekend":"Σαββατοκύριακο","create.field.address":"Διεύθυνση (προαιρετικά)","create.field.address.district":"Συνοικία","create.field.address.street":"Οδός","create.field.address.house":"Αριθμός","create.field.confidential":"Εμπιστευτική σημείωση","create.field.confidential.placeholder":"Λεπτομέρειες που θα δει μόνο ο αναδοχόμενος...","create.field.confidential.hint":"Δεν εμφανίζεται δημόσια","create.field.photos":"Φωτογραφίες","create.field.photos.add":"Προσθήκη φωτογραφίας","create.field.photos.uploading":"Ανέβασμα...","task.budget_negotiable":"Τιμή διαπραγματεύσιμη","task.time_slot":"Χρόνος","task.confidential":"Εμπιστευτική σημείωση","create.field.title.placeholder":"π.χ. Καθαρισμός διαμερίσματος 80τμ","create.field.description.placeholder":"Περίγραψε λεπτομερώς τι χρειάζεσαι...","create.field.location.placeholder":"π.χ. Αθήνα, Κολωνάκι","create.field.budget.placeholder":"π.χ. 100","create.submit":"Δημοσίευση εργασίας","create.submitting":"Δημοσίευση...","login.title":"Καλωσόρισες","login.subtitle":"Σύνδεση στο CanHelp","login.email":"Email","login.password":"Κωδικός","login.submit":"Σύνδεση","login.submitting":"Σύνδεση...","login.error":"Λάθος email ή κωδικός","login.unverified.title":"Επιβεβαιώστε το email σας","login.unverified.desc":"Στείλαμε σύνδεσμο επαλήθευσης στο email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε το σύνδεσμο.","login.unverified.resend":"Αποστολή νέου email επαλήθευσης","login.unverified.sending":"Αποστολή...","login.unverified.sent":"✓ Εστάλη — ελέγξτε τα εισερχόμενα","profile.email.verified":"Email επαληθεύτηκε","profile.email.not_verified":"Email δεν επαληθεύτηκε","login.no_account":"Δεν έχεις λογαριασμό;","login.register_link":"Εγγραφή","login.forgot_password":"Ξέχασα τον κωδικό","login.or_continue_with":"ή συνεχίστε με","login.continue_google":"Σύνδεση με Google","forgot.title":"Ξέχασα τον κωδικό","forgot.subtitle":"Εισάγετε το email σας για να λάβετε σύνδεσμο ανάκτησης","forgot.email":"Email","forgot.submit":"Αποστολή","forgot.submitting":"Αποστολή...","forgot.sent.title":"Ελέγξτε τα εισερχόμενά σας","forgot.sent.desc":"Αν υπάρχει λογαριασμός με αυτό το email, θα σας στείλουμε σύνδεσμο ανάκτησης κωδικού.","forgot.back_to_login":"Επιστροφή στη σύνδεση","forgot.error":"Αποτυχία αποστολής. Ελέγξτε το email σας ή δοκιμάστε ξανά.","forgot.error.not_found":"Δεν βρέθηκε λογαριασμός με αυτό το email.","forgot.error.send_failed":"Αποτυχία αποστολής email. Δοκιμάστε ξανά αργότερα","reset.title":"Νέος κωδικός","reset.subtitle":"Εισάγετε τον νέο σας κωδικό","reset.password":"Νέος κωδικός","reset.confirm":"Επιβεβαίωση κωδικού","reset.submit":"Αλλαγή κωδικού","reset.submitting":"Αποθήκευση...","reset.success":"Ο κωδικός άλλαξε επιτυχώς. Ανακατεύθυνση στη σύνδεση...","reset.back_to_login":"Επιστροφή στη σύνδεση","reset.error.mismatch":"Οι κωδικοί δεν ταιριάζουν","reset.error.invalid":"Μη έγκυρος σύνδεσμος. Παρακαλώ ζητήστε νέο.","register.title":"Εγγραφή","register.subtitle":"Δημιουργία λογαριασμού στο CanHelp","register.first_name":"Όνομα","register.last_name":"Επώνυμο","register.email":"Email","register.password":"Κωδικός (min 8 χαρακτήρες)","register.role":"Ρόλος","register.role.customer":"Χρήστης","register.role.customer.desc":"Δημοσιεύω εργασίες","register.role.specialist":"Ειδικός","register.role.specialist.desc":"Αναλαμβάνω εργασίες","register.submit":"Δημιουργία λογαριασμού","register.submitting":"Εγγραφή...","register.has_account":"Έχεις ήδη λογαριασμό;","register.login_link":"Σύνδεση","register.continue_google":"Εγγραφή με Google","register.check_email.title":"Ελέγξτε το email σας","register.check_email.desc":"Στείλαμε σύνδεσμο επαλήθευσης στη διεύθυνση email σας. Ελέγξτε τα εισερχόμενα (ή spam) και πατήστε τον σύνδεσμο.","register.check_email.login":"Επιστροφή στη σύνδεση","dashboard.title":"Πίνακας ελέγχου","dashboard.new_task":"+ Νέα εργασία","dashboard.my_tasks":"Οι εργασίες μου","dashboard.my_offers":"Οι προσφορές μου","dashboard.invitations":"Προσκλήσεις για εργασία","dashboard.offers_count":"προσφορές","dashboard.declined_count":"απορρίφθηκαν","dashboard.completed_tasks":"Ολοκληρωμένες εργασίες","dashboard.completed_offers":"Ολοκληρωμένες προσφορές","dashboard.review_pending":"Η αξιολόγηση δεν έχει υποβληθεί ακόμα","tasks.new.top_specialists":"Κορυφαίοι ειδικοί","tasks.new.select_category":"Επιλέξτε κατηγορία για να δείτε ειδικούς","tasks.new.invite":"Πρόσκληση","tasks.new.invited":"Επιλέχθηκε ✓","reviews.count":"αξιολογήσεις","filter.location":"Τοποθεσία","filter.language":"Γλώσσες","filter.language.any":"Οποιαδήποτε γλώσσα","filter.category.all":"Όλες οι κατηγορίες","user.categories":"Κατηγορίες","user.work_area":"Περιοχή εργασίας","dashboard.tasks.empty":"Δεν έχεις δημοσιεύσει εργασίες","dashboard.tasks.empty.cta":"Δημοσίευσε την πρώτη σου","dashboard.tasks.add_new":"Πρόσθεσε νέα εργασία","dashboard.offers.empty":"Δεν έχεις υποβάλλει προσφορές","dashboard.offers.empty.cta":"Βρες εργασίες","dashboard.customer.specialists_title":"Ψάχνεις εκτελεστή;","dashboard.customer.specialists_hint":"Δες προφίλ ειδικών, διάβασε αξιολογήσεις και κάλεσέ τους στις εργασίες σου","dashboard.customer.specialists_cta":"Βρες ειδικό","dashboard.customer.how_title":"Πώς λειτουργεί","dashboard.customer.step1":"Δημιούργησε εργασία με περιγραφή και προϋπολογισμό","dashboard.customer.step2":"Οι ειδικοί θα στείλουν προσφορές με τιμή και χρόνο","dashboard.customer.step3":"Επίλεξε τον κατάλληλο και ξεκίνα τη συνεργασία","notif.title":"Ειδοποιήσεις","notif.mark_all":"Σήμανση όλων ως αναγνωσμένα","notif.empty":"Δεν υπάρχουν ειδοποιήσεις","notif.type.new_offer":"Νέα προσφορά","notif.type.offer_accepted":"Η προσφορά σας έγινε δεκτή","notif.type.offer_declined":"Η προσφορά σας απορρίφθηκε","notif.type.task_completed":"Η εργασία ολοκληρώθηκε","notif.type.task_cancelled":"Η εργασία ακυρώθηκε","notif.type.new_message":"Νέο μήνυμα","notif.type.new_review":"Νέα αξιολόγηση","notif.type.task_invite":"Πρόσκληση σε εργασία","notif.body.new_offer":"Νέα προσφορά για \xab{title}\xbb","notif.body.offer_accepted":"Η προσφορά σας για \xab{title}\xbb έγινε δεκτή","notif.body.offer_declined":"Η προσφορά σας για \xab{title}\xbb απορρίφθηκε","notif.body.task_invite":"Σας προσκαλούν για \xab{title}\xbb","notif.body.new_review":"Λάβατε αξιολόγηση {rating}★","offer.status.pending":"Εκκρεμεί","offer.status.accepted":"Αποδεκτή","offer.status.declined":"Απορρίφθηκε","offer.status.withdrawn":"Αποσύρθηκε","offer.status.other_accepted":"Επιλέχθηκε άλλος ειδικός","common.loading":"Φόρτωση...","common.error":"Σφάλμα","common.save":"Αποθήκευση","common.saving":"Αποθήκευση...","common.cancel":"Ακύρωση","common.add":"Προσθήκη","common.close":"Κλείσιμο","common.edit":"Επεξεργασία","common.delete":"Διαγραφή","common.from":"από","common.currency":"€","common.greece":"Ελλάδα","chat.connected":"Συνδεδεμένος","chat.disconnected":"Αποσυνδεδεμένος","chat.no_rooms":"Δεν υπάρχουν συνομιλίες ακόμα","chat.task_fallback":"Εργασία","chat.select":"Επίλεξε συνομιλία","chat.no_messages":"Δεν υπάρχουν μηνύματα","chat.placeholder":"Γράψε μήνυμα... (Enter για αποστολή)","chat.conversation_fallback":"Συνομιλία","chat.direct_chat":"Απευθείας συνομιλία","chat.linked_task":"Συνδεδεμένη εργασία","chat.write_btn":"Μήνυμα","chat.just_now":"μόλις τώρα","chat.min_ago":"λ","chat.write_specialist":"Γράψε στον ειδικό","chat.write_customer":"Γράψε στον πελάτη","chat.notif_settings":"Ρυθμίσεις ειδοποιήσεων","chat.notif_messages":"Ειδοποιήσεις για νέα μηνύματα","chat.toast_title":"Νέο μήνυμα","chat.toast_open":"Άνοιγμα συνομιλίας","offer.price":"Τιμή","offer.price.placeholder":"π.χ. 80","offer.customer_budget":"Προϋπολογισμός πελάτη","offer.message":"Μήνυμα","offer.optional":"προαιρετικό","offer.message.placeholder":"Παρουσίασε τον εαυτό σου, την εμπειρία σου και γιατί είσαι η καλύτερη επιλογή...","offer.submitting":"Αποστολή...","profile.photo":"Φωτογραφία προφίλ","profile.photo.change":"Αλλαγή φωτογραφίας","profile.photo.hint":"JPEG, PNG, WebP \xb7 έως 5MB","profile.basic_info":"Βασικά στοιχεία","profile.phone":"Τηλέφωνο","profile.phone.placeholder":"+30 6901234567","profile.bio":"Σύντομη περιγραφή","profile.bio.placeholder":"Πες μας λίγα λόγια για εσένα...","profile.language":"Γλώσσα","profile.language.hint":"Γλώσσα διεπαφής και email ειδοποιήσεων","profile.languages":"Γλώσσες επικοινωνίας","profile.languages.hint":"Επιλέξτε όλες τις γλώσσες που μιλάτε","profile.skills":"Δεξιότητες","profile.skills.subtitle":"Προσθέσε τις υπηρεσίες που προσφέρεις","profile.skills.placeholder":"π.χ. Καθαρισμός, IT, Μαθήματα...","profile.role":"Ρόλος λογαριασμού","profile.role.specialist":"\uD83D\uDD27 Ειδικός","profile.role.admin":"\uD83D\uDC51 Admin","profile.role.customer":"\uD83D\uDC64 Χρήστης","profile.role.change":"Για αλλαγή ρόλου επικοινωνήστε με την υποστήριξη.","profile.become_specialist":"Γίνε Ειδικός","profile.become_specialist.desc":"Αναβαθμίσου σε Ειδικό για να δέχεσαι εργασίες και να δημιουργήσεις το προφίλ σου.","become_specialist.hero.title":"Κέρδισε χρήματα κάνοντας αυτό που ξέρεις","become_specialist.hero.subtitle":"Δημιούργησε προφίλ ειδικού και λάβε παραγγελίες από πελάτες σε όλη την Ελλάδα","become_specialist.how.title":"Πώς λειτουργεί","become_specialist.step1.title":"Δημιούργησε κάρτα ειδικού","become_specialist.step1.desc":"Δήλωσε κατηγορίες, δεξιότητες και περιοχές κάλυψης — το σύστημα θα βρει τις κατάλληλες εργασίες για σένα αυτόματα","become_specialist.step2.title":"Βρες εργασίες","become_specialist.step2.desc":"Ανακάλυψε εργασίες στις κατηγορίες σου στην ενότητα \xabΑναζήτηση εργασιών\xbb","become_specialist.step3.title":"Στείλε προσφορά & κέρδισε","become_specialist.step3.desc":"Υποβάλε προσφορές με τιμή και χρόνο, επικοινωνήσε με πελάτες και ολοκλήρωσε εργασίες","become_specialist.benefits.title":"Πλεονεκτήματα προφίλ ειδικού","become_specialist.benefit1":"Αναζήτηση εργασιών ανά κατηγορία και τοποθεσία","become_specialist.benefit2":"Δημόσιο προφίλ με αξιολογήσεις πελατών","become_specialist.benefit3":"Πρόγραμμα διαθεσιμότητας ορατό στους πελάτες","become_specialist.benefit4":"Προσθήκη σε αγαπημένα από πελάτες","become_specialist.cta":"Γίνε Ειδικός — είναι δωρεάν","become_specialist.free_badge":"Δωρεάν εγγραφή","profile.tab.notifications":"Ειδοποιήσεις","profile.tab.reviews":"Αξιολογήσεις","profile.tab.referral":"Παραπομπές","profile.tab.auto_response":"Αυτόματη απάντηση","profile.tab.site":"Site","profile.site.title":"Προσωπική σελίδα","profile.site.url_label":"Προσωπικό site","profile.site.copy":"Αντιγραφή","profile.site.copied":"Αντιγράφηκε","profile.site.visible_title":"Τι εμφανίζεται στη σελίδα σας","profile.site.visible.name":"Όνομα και φωτογραφία","profile.site.visible.bio":"Βιογραφικό","profile.site.visible.rating":"Αξιολόγηση και κριτικές","profile.site.visible.portfolio":"Χαρτοφυλάκιο / Κάρτες","profile.site.visible.contacts":"Στοιχεία επικοινωνίας","profile.site.visible.full_last_name":"Πλήρες επώνυμο","profile.site.visible.services":"Κάρτες υπηρεσιών","profile.site.visible.reviews":"Ενότητα κριτικών","profile.site.visible.status":"Κατάσταση \xabΈτοιμος να βοηθήσω\xbb","profile.site.theme":"Θέμα εμφάνισης","profile.site.theme.dark":"Σκοτεινό","profile.site.theme.light":"Φωτεινό","profile.site.slug_taken":"Αυτή η διεύθυνση είναι ήδη κατειλημμένη","profile.site.stats.title":"Στατιστικά επισκεψιμότητας","profile.site.stats.days":"τελευταίες 30 ημέρες","profile.site.stats.views":"Προβολές","profile.site.stats.unique":"Μοναδικοί επισκέπτες","profile.site.stats.messages":"Μηνύματα","profile.site.stats.total_views":"Συνολικές προβολές","profile.site.stats.total_unique":"Μοναδικοί επισκέπτες","profile.site.stats.total_messages":"Μηνύματα","profile.site.stats.empty":"Δεν υπάρχουν δεδομένα ακόμη","profile.site.stats.loading":"Φόρτωση στατιστικών...","profile.site.stats.no_slug":"Ορίστε τη διεύθυνση του site για να δείτε στατιστικά","profile.site.edit_bio_hint":"Το βιογραφικό και η φωτογραφία ρυθμίζονται στην καρτέλα \xabΒασικά\xbb.","status.can_help_now_hint":"Η κάρτα σου εμφανίζεται ψηλότερα","status.need_help_hint":"Οι ειδικοί μπορούν να σε βοηθήσουν","profile.referral.title":"Πρόγραμμα παραπομπών","profile.referral.desc":"Μοιράσου τον σύνδεσμο σου και κέρδισε ανταμοιβές για κάθε νέο χρήστη.","profile.referral.link_label":"Ο σύνδεσμος παραπομπής σου","profile.referral.copy":"Αντιγραφή","profile.referral.copied":"Αντιγράφηκε!","profile.referral.invited_count":"επιτυχείς παραπομπές","profile.referral.no_code":"Ο κωδικός παραπομπής δεν είναι διαθέσιμος.","notifications.title":"Ρυθμίσεις ειδοποιήσεων","notifications.email.new_tasks":"Email για νέες εργασίες","notifications.email.new_tasks.desc":"Λάβε email όταν δημοσιευτεί νέα εργασία στις κατηγορίες σου","notifications.messages.desc":"Λαμβάνεις ειδοποίηση όταν έρθει νέο μήνυμα","notifications.saved":"Ρυθμίσεις αποθηκεύτηκαν","notifications.plan_required":"Συνδρομή απαιτείται για αυτή τη λειτουργία","profile.tab.info":"Βασικά στοιχεία","profile.tab.finance":"Οικονομικά","profile.tab.skills":"Δεξιότητες","profile.tab.categories":"Κατηγορίες","profile.tab.geography":"Γεωγραφία","profile.specialist.categories":"Κατηγορίες εργασιών","profile.specialist.categories.desc":"Επίλεξε τις κατηγορίες στις οποίες εργάζεσαι","profile.specialist.geography":"Περιοχές κάλυψης","profile.specialist.geography.desc":"Επίλεξε τις πόλεις / περιοχές όπου δραστηριοποιείσαι","profile.saving":"Αποθήκευση...","profile.upload.error":"Σφάλμα κατά την αναφόρτωση","profile.saved":"Αποθηκεύτηκε","profile.tab.cards":"Χαρτοφυλάκιο","profile.cards.count":"Χαρτοφυλάκια","profile.cards.add":"Νέο χαρτοφυλάκιο","profile.cards.new_title":"Τίτλος νέου χαρτοφυλακίου","profile.cards.placeholder":"π.χ. Υδραυλικά","profile.cards.create":"Δημιουργία","profile.cards.cancel":"Ακύρωση","profile.cards.empty":"Δεν έχετε χαρτοφυλάκιο","profile.cards.create_first":"Δημιουργήστε το πρώτο σας χαρτοφυλάκιο","profile.cards.delete_confirm":"Διαγραφή χαρτοφυλακίου;","profile.card.tab.main":"Γενικά","profile.card.tab.skills":"Δεξιότητες","profile.card.tab.categories":"Κατηγορίες","profile.card.tab.geography":"Γεωγραφία","profile.card.tab.portfolio":"Γκαλερί","profile.card.active":"Ενεργή","profile.card.save":"Αποθήκευση","profile.card.saved":"Αποθηκεύτηκε","profile.card.delete":"Διαγραφή","profile.card.skill.add":"Προσθήκη δεξιότητας","profile.card.photo.add":"Προσθήκη φωτογραφίας","profile.card.photo.uploading":"Μεταφόρτωση...","profile.card.photo.empty":"Δεν υπάρχουν φωτογραφίες","profile.card.item.title":"Τίτλος","profile.card.item.desc":"Περιγραφή","profile.card.item.save":"Αποθήκευση","profile.card.item.cancel":"Ακύρωση","profile.card.item.edit":"Επεξεργασία","profile.upgrade.cards_limit":"Όριο χαρτοφυλακίων εξαντλήθηκε","profile.upgrade.plan":"Τρέχον πλάνο:","profile.upgrade.contact":"Επικοινωνήστε με τον διαχειριστή για αλλαγή πλάνου","profile.upgrade.ok":"Εντάξει","profile.plan.title":"Πλάνο συνδρομής","profile.balance":"Υπόλοιπο","profile.balance.topup":"Αναπλήρωση υπολοίπου","profile.balance.topup.title":"Αναπλήρωση υπολοίπου","profile.balance.topup.amount":"Ποσό (σε EUR)","profile.balance.topup.hint":"Επιλέξτε ποσό ή εισαγάγετε μανούαλα","profile.balance.topup.submit":"Πληρωμή","profile.balance.topup.loading":"Ρεδιρεκτάρισμα...","profile.balance.topup.error":"Σφάλμα μετάβασης στην πληρωμή. Προσπαθήστε ξανά.","payment.success.title":"Πληρωμή επιτυχής!","payment.success.desc":"Το υπόλοιπό σας ενημερώθηκε.","payment.cancelled.title":"Ακύρωση πληρωμής","payment.cancelled.desc":"Η πληρωμή ακυρώθηκε. Κανένα χρήμα δεν χρεώθηκε.","payment.pending.title":"Σε εξέλιξη...","payment.pending.desc":"Επεξεργαζόμαστε την πληρωμή σας.","payment.back_to_profile":"Επιστροφή στο προφίλ","profile.plan.basic":"Βασικό (δωρεάν)","profile.plan.contact_upgrade":"Επικοινωνήστε με τον διαχειριστή για αναβάθμιση","profile.plan.cards_up_to":"Χαρτοφυλάκια: έως","profile.plan.cards_unlimited":"Χαρτοφυλάκια: απεριόριστα","profile.plan.tasks_up_to":"Εργασίες: έως","profile.plan.offers_up_to":"Προσφορές: έως","profile.plan.valid_until":"Ισχύει έως","profile.plan.no_expiry":"Δεν λήγει","create.error":"Σφάλμα κατά τη δημοσίευση","tasks.category.general":"Γενικά","tasks.budget.range":"Εύρος:","tasks.budget.from":"από","tasks.budget.to":"έως","tasks.filter.reset":"Εκκαθάριση φίλτρων","tasks.load_more":"Φόρτωση ακόμα","tasks.showing":"Αποτελέσματα:","tasks.field.budget":"Προϋπολογισμός, €","admin.title":"Πίνακας Διαχείρισης","admin.tab.stats":"Στατιστικά","admin.tab.users":"Χρήστες","admin.tab.tasks":"Εργασίες","admin.tab.reports":"Αναφορές","admin.stats.users":"Χρήστες","admin.stats.tasks":"Εργασίες","admin.stats.offers":"Προσφορές","admin.stats.reviews":"Αξιολογήσεις","admin.tasks.by_status":"Εργασίες ανά κατάσταση","admin.col.user":"Χρήστης","admin.col.email":"Email","admin.col.role":"Ρόλος","admin.col.registered":"Εγγραφή","admin.col.status":"Κατάσταση","admin.col.title":"Τίτλος","admin.col.budget":"Προϋπολογισμός","admin.col.created":"Δημιουργία","admin.users.active":"Ενεργός","admin.users.inactive":"Ανενεργός","admin.users.deactivate":"Απενεργοποίηση","admin.users.activate":"Ενεργοποίηση","admin.tasks.cancel":"Ακύρωση","admin.reports.none":"Δεν υπάρχουν αναφορές","admin.reports.reviewed":"Αναθεωρήθηκε","admin.reports.dismiss":"Απόρριψη","admin.pagination.total":"Σύνολο","admin.users.role.change":"Αλλαγή ρόλου","admin.users.search.placeholder":"Αναζήτηση ονόματος ή email...","admin.tasks.delete":"Διαγραφή","admin.tasks.delete.confirm":"Διαγραφή αυτής της εργασίας μόνιμα;","admin.tasks.search.placeholder":"Αναζήτηση τίτλου...","admin.col.customer":"Πελάτης","admin.col.reporter":"Καταγγέλλων","admin.col.target":"Στόχος","admin.filter.all_roles":"Όλοι οι ρόλοι","admin.filter.all_statuses":"Όλες οι καταστάσεις","admin.reports.target.task":"Εργασία","admin.reports.target.user":"Χρήστης","admin.tab.categories":"Κατηγορίες","admin.tab.locations":"Πόλεις & Περιοχές","admin.tab.logs":"Αρχεία","admin.tab.plans":"Πακέτα","admin.tab.settings":"Ρυθμίσεις","admin.logs.subtab.ai":"AI Logs","admin.logs.subtab.activity":"Δραστηριότητα","admin.logs.subtab.mail":"Mail","admin.logs.subtab.notifications":"Ειδοποιήσεις","admin.notif_logs.type":"Τύπος","admin.notif_logs.title":"Τίτλος","admin.notif_logs.read":"Διαβασμένο","admin.notif_logs.empty":"Δεν υπάρχουν αρχεία ειδοποιήσεων","admin.stats.notif_chart_title":"Ειδοποιήσεις ανά ημέρα","admin.stats.notif_label":"Ειδοποιήσεις","admin.stats.mail_chart_title":"Emails ανά ημέρα","admin.stats.mail_label":"Emails","admin.filter.all":"Όλα","admin.stats.specialists":"Ειδικοί","admin.col.plan":"Πακέτο","admin.back_home":"Αρχική","admin.plans.title":"Πακέτα συνδρομής","admin.plans.add":"+ Νέο πακέτο","admin.plans.empty":"Δεν υπάρχουν πακέτα","admin.plans.form.new":"Νέο πακέτο","admin.plans.form.edit":"Επεξεργασία πακέτου","admin.plans.form.name":"Όνομα","admin.plans.form.price":"Τιμή (EUR)","admin.plans.form.old_price":"Παλιά τιμή (EUR, προαιρετικό)","admin.plans.form.max_offers":"Μέγ. προσφορές (κενό = χωρίς όριο)","admin.plans.form.max_cards":"Μέγ. χαρτοφυλάκιο (κενό = χωρίς όριο)","admin.plans.form.duration_days":"Διάρκεια (ημέρες, κενό = χωρίς λήξη)","admin.plans.form.description":"Περιγραφή","admin.plans.form.features":"Δυνατότητες (μία ανά γραμμή)","admin.plans.form.notify":"Ειδοποιήσεις νέων εργασιών","admin.plans.form.default":"Προεπιλογή","admin.plans.form.active":"Ενεργό","admin.plans.form.order":"Σειρά","admin.plans.form.role":"Ρόλος","admin.plans.form.tier":"Επίπεδο","admin.plans.form.role.customer":"Πελάτης","admin.plans.form.role.specialist":"Ειδικός","admin.plans.form.tier.free":"Δωρεάν","admin.plans.form.tier.pro":"Pro","admin.plans.form.tier.ultimate":"Ultimate","admin.plans.form.section.limits":"Όρια (κενό = χωρίς όριο)","admin.plans.form.max_messages_day":"Μέγ. μηνύματα/ημέρα","admin.plans.form.max_orders_day":"Μέγ. παραγγελίες/ημέρα","admin.plans.form.max_skills":"Μέγ. δεξιότητες","admin.plans.form.max_profiles":"Μέγ. προφίλ","admin.plans.form.max_portfolio":"Μέγ. στοιχεία χαρτοφυλακίου","admin.plans.form.section.boost":"Πολλαπλασιαστές & Ενίσχυση","admin.plans.form.search_boost":"Ενίσχυση αναζήτησης","admin.plans.form.offers_multiplier":"Πολλαπλασιαστής προσφορών","admin.plans.form.section.contact":"Δικαιώματα επικοινωνίας","admin.plans.form.can_contact_free":"Επικοινωνία με δωρεάν χρήστες","admin.plans.form.can_contact_pro":"Επικοινωνία με Pro χρήστες","admin.plans.form.can_contact_all":"Επικοινωνία με όλους","admin.plans.form.can_show_contact":"Εμφάνιση στοιχείων επικοινωνίας","admin.plans.form.can_view_phone":"Προβολή τηλεφώνου","admin.plans.form.section.features":"Λειτουργίες","admin.plans.form.upload_video":"Μεταφόρτωση βίντεο","admin.plans.form.favorites":"Αγαπημένα","admin.plans.form.google_calendar":"Google Calendar","admin.plans.form.verified_badge":"Σήμα επαλήθευσης","admin.plans.form.highlighted_reviews":"Προβεβλημένες κριτικές","admin.plans.form.personal_site":"Προσωπική σελίδα","admin.plans.form.can_help_now":"Κατάσταση \xabΜπορώ να βοηθήσω\xbb","admin.plans.form.need_help":"Κατάσταση \xabΧρειάζομαι βοήθεια\xbb","admin.plans.form.auto_response":"Αυτόματη απάντηση","admin.plans.form.auto_match":"Αυτόματη αντιστοίχιση","admin.plans.form.instant_dispatch_free":"Άμεση αποστολή (δωρεάν)","admin.plans.form.instant_dispatch_pro":"Άμεση αποστολή (Pro)","admin.plans.badge.default":"Προεπιλογή","admin.plans.badge.inactive":"Ανενεργό","admin.plans.make_default":"Ορισμός ως προεπιλογή","admin.plans.tasks":"Εργασίες","admin.plans.offers":"Προσφορές","admin.plans.cards":"Χαρτοφυλάκιο","admin.plans.notify_tasks":"Ειδοποιήσεις εργασιών","admin.plans.delete.confirm":"Διαγραφή πακέτου","admin.activity.title":"Αρχείο δραστηριότητας","admin.activity.event":"Γεγονός","admin.activity.all_events":"Όλα τα γεγονότα","admin.activity.from":"Από","admin.activity.to":"Έως","admin.activity.reset":"Επαναφορά","admin.activity.total":"Σύνολο","admin.activity.empty":"Δεν υπάρχουν εγγραφές","admin.mail.event":"Συμβάν email","admin.mail.all_events":"Όλα τα email συμβάντα","admin.mail.from":"Από","admin.mail.to":"Έως","admin.mail.reset":"Επαναφορά","admin.mail.total":"Σύνολο","admin.mail.empty":"Δεν υπάρχουν email logs","admin.mail.recipient":"Παραλήπτης","admin.mail.provider":"Πάροχος","admin.mail.details":"Λεπτομέρειες","admin.mail.status":"Κατάσταση","admin.mail.success":"Επιτυχία","admin.mail.failed":"Σφάλμα","admin.event.email_sent":"Email sent","admin.event.email_failed":"Email failed","admin.event.email_dev":"Email DEV fallback","admin.event.admin_email_test_sent":"Admin test email sent","admin.event.admin_email_test_failed":"Admin test email failed","admin.logs.empty":"Δεν υπάρχουν εγγραφές","admin.logs.date":"Ημερομηνία","admin.logs.provider":"Πάροχος","admin.logs.model":"Μοντέλο","admin.logs.action":"Ενέργεια","admin.logs.langs":"Γλώσσες","admin.logs.in":"Είσοδος","admin.logs.out":"Έξοδος","admin.logs.total":"Σύνολο","admin.logs.ms":"ms","admin.logs.status":"Κατάσταση","admin.stats.activity_30d":"Δραστηριότητα 30 ημερών","admin.stats.tasks_label":"Εργασίες","admin.stats.users_label":"Χρήστες","admin.stats.specialists_label":"Ειδικοί","admin.stats.tokens_title":"Χρήση tokens (ανά μήνα)","admin.stats.tokens_out":"Εξερχόμενα","admin.stats.tokens_in":"Εισερχόμενα","admin.stats.tokens_out_label":"Εξερχόμενα tokens","admin.stats.tokens_in_label":"Εισερχόμενα tokens","admin.stats.cost_label":"Κόστος (USD)","admin.stats.tasks_by_status":"Εργασίες ανά κατάσταση","admin.task_status.open":"Ανοιχτές","admin.task_status.in_progress":"Σε εξέλιξη","admin.task_status.completed":"Ολοκληρωμένες","admin.task_status.cancelled":"Ακυρωμένες","admin.task_status.draft":"Προσχέδια","admin.settings.tab.general":"Γενικά","admin.settings.tab.smtp":"E-Mail","admin.settings.tab.notifications":"Ειδοποιήσεις","admin.settings.tab.payment":"Πληρωμή","admin.settings.tab.referral":"Παραπομπές","admin.settings.tab.seo":"SEO","admin.settings.seo.title":"SEO & Συντήρηση","admin.settings.seo.maintenance_label":"Λειτουργία συντήρησης","admin.settings.seo.maintenance_hint":"Εμφάνιση σελίδας συντήρησης σε όλους τους επισκέπτες","admin.settings.seo.indexing_label":"Ευρετηρίαση από μηχανές αναζήτησης","admin.settings.seo.indexing_hint":"Επιτρέπει στις μηχανές αναζήτησης να ευρετηριάσουν τον ιστότοπο","admin.settings.seo.head_scripts_label":"Scripts στο (JS)","admin.settings.seo.head_scripts_hint":"Εκτελείται σε κάθε σελίδα (Google Tag Manager, analytics κ.λπ.)","admin.settings.seo.site_title_label":"Τίτλος ιστότοπου","admin.settings.seo.site_description_label":"Περιγραφή ιστότοπου (meta description)","admin.settings.referral.title":"Πρόγραμμα παραπομπών","admin.settings.referral.hint":"Επιβράβευσε χρήστες που φέρνουν νέους εγγεγραμμένους.","admin.settings.referral.enabled_label":"Ενεργό","admin.settings.referral.enabled_hint":"Ενεργοποίηση / απενεργοποίηση εφαρμογής ανταμοιβών","admin.settings.referral.customer_section":"Για πελάτες","admin.settings.referral.specialist_section":"Για ειδικούς","admin.settings.referral.plan_label":"Πλάνο ανταμοιβής","admin.settings.referral.no_plan":"— χωρίς πλάνο —","admin.settings.referral.plan_hint":"Αυτό το πλάνο θα ανατεθεί στον χρήστη που έφερε νέους. Εάν το τρέχον πλάνο του είναι υψηλότερο, θα προστεθούν μόνο οι μέρες.","admin.settings.referral.days_label":"Ημέρες ανταμοιβής","admin.settings.referral.days_hint":"Αριθμός ημερών που θα προστεθούν στη λήξη του πλάνου.","admin.settings.general.title":"Γενικές ρυθμίσεις","admin.settings.general.site_name":"Όνομα ιστότοπου","admin.settings.general.site_url":"URL ιστότοπου","admin.settings.general.contact_email":"Email επικοινωνίας","admin.settings.general.support_phone":"Τηλέφωνο υποστήριξης","admin.settings.smtp.title":"Ρυθμίσεις SMTP","admin.settings.smtp.hint":"Χρησιμοποιείται για αποστολή ειδοποιήσεων email.","admin.settings.smtp.host":"SMTP Host","admin.settings.smtp.port":"Θύρα","admin.settings.smtp.encryption":"Κρυπτογράφηση","admin.settings.smtp.enc.none":"Χωρίς","admin.settings.smtp.enc.tls":"STARTTLS (θύρα 587)","admin.settings.smtp.enc.ssl":"SSL/TLS (θύρα 465)","admin.settings.smtp.username":"Όνομα χρήστη","admin.settings.smtp.password":"Κωδικός / App Password","admin.settings.smtp.from_name":"Όνομα αποστολέα","admin.settings.smtp.from_email":"Email αποστολέα","admin.settings.smtp.test":"Αποστολή δοκιμαστικού email","admin.settings.smtp.sending":"Αποστολή...","admin.settings.payment.hint":"Τα στοιχεία για ePay Piraeus Bank.","admin.settings.env.test":"Δοκιμαστικό (sandbox)","admin.settings.env.prod":"Παραγωγή","admin.settings.env.label":"Περιβάλλον","admin.settings.merchant_id":"Merchant ID","admin.settings.api_user":"API User","admin.settings.api_password":"API Password","admin.settings.confirm_url":"Confirmation URL (webhook)","admin.settings.cancel_url":"Cancel URL","admin.settings.active":"Ενεργό","admin.settings.saving":"Αποθήκευση...","admin.settings.saved":"✓ Αποθηκεύτηκε","admin.notif.vars_hint":"Διαθέσιμες μεταβλητές στα πρότυπα","admin.notif.tmpl.not_set":"Πρότυπο δεν έχει οριστεί","admin.notif.tmpl.subject_label":"Θέμα email","admin.notif.tmpl.body_label":"Κείμενο email (HTML)","admin.notif.tmpl.save":"Αποθήκευση","admin.notif.tmpl.close":"Κλείσιμο","admin.notif.tmpl.translate":"Αυτόματη μετάφραση","admin.notif.tmpl.translating":"Μετάφραση...","admin.notif.tmpl.saving":"Αποθήκευση...","admin.notif.email_verification":"Επαλήθευση email","admin.notif.registration_success":"Επιτυχής εγγραφή","admin.notif.password_reset":"Επαναφορά κωδικού","admin.notif.new_offer":"Νέα προσφορά","admin.notif.new_task":"Νέα εργασία","admin.notif.offer_accepted":"Προσφορά αποδεκτή","admin.notif.new_message":"Νέο μήνυμα","admin.notif.offer_declined":"Απόρριψη προσφοράς","admin.notif.offer_other_accepted":"Επιλέχθηκε άλλος ειδικός","admin.notif.task_updated":"Ενημέρωση εργασίας","admin.notif.deadline_reminder":"Υπενθύμιση προθεσμίας","admin.notif.task_archived":"Αυτόματη απόσυρση εργασίας","admin.notif.referral_reward":"Ανταμοιβή παραπομπής","admin.email_template.plan_activated":"Τιμολόγιο — ενεργοποίηση πλάνου","admin.email_template.plan_upgraded":"Τιμολόγιο — αναβάθμιση πλάνου","admin.email_template.plan_downgrade_scheduled":"Τιμολόγιο — προγραμματισμένη υποβάθμιση","admin.email_template.plan_downgrade_applied":"Τιμολόγιο — εφαρμογή υποβάθμισης","admin.email_template.plan_renewal_reminder":"Τιμολόγιο — υπενθύμιση ανανέωσης","admin.email_template.plan_insufficient_funds":"Τιμολόγιο — ανεπαρκές υπόλοιπο","pricing.confirm.title":"Επιβεβαίωση επιλογής πλάνου","pricing.confirm.plan":"Πλάνο","pricing.confirm.prorated":"Αναλογική έκπτωση","pricing.confirm.effective_price":"Προς πληρωμή","pricing.confirm.your_balance":"Το υπόλοιπό σας","pricing.confirm.downgrade_info":"Η μετάβαση στο νέο πλάνο θα γίνει αυτόματα μετά τη λήξη της τρέχουσας περιόδου.","pricing.confirm.insufficient":"Ανεπαρκές υπόλοιπο.","pricing.confirm.top_up":"Ανανέωση","pricing.confirm.schedule_downgrade":"Προγραμματισμός μετάβασης","pricing.confirm.pay":"Πληρωμή","admin.user_edit.title":"Επεξεργασία χρήστη","admin.user_edit.email":"Email","admin.user_edit.id":"ID","admin.user_edit.registered":"Εγγραφή","admin.user_edit.last_seen":"Τελευταία σύνδεση","admin.user_edit.lang":"Γλώσσα","admin.user_edit.first_name":"Όνομα","admin.user_edit.last_name":"Επώνυμο","admin.user_edit.phone":"Τηλέφωνο","admin.user_edit.bio":"Βιογραφικό","admin.user_edit.role":"Ρόλος","admin.user_edit.plan":"Πακέτο","admin.user_edit.no_plan":"— Χωρίς πακέτο —","admin.user_edit.active":"Ενεργός λογαριασμός","admin.user_edit.balance":"Υπόλοιπο (EUR)","admin.user_edit.skills":"Δεξιότητες","admin.user_edit.tab.profile":"Προφίλ","admin.user_edit.tab.account":"Λογαριασμός","admin.user_edit.tab.balance":"Υπόλοιπο","admin.user_edit.tab.settings":"Ρυθμίσεις","admin.user_edit.tab.specialist":"Χαρτοφυλάκιο","admin.user_edit.tab.site":"Ιστοσελίδα","admin.user_edit.plan_expires":"Λήξη πλάνου","admin.user_edit.interface_lang":"Γλώσσα διεπαφής","admin.user_edit.comm_languages":"Γλώσσες επικοινωνίας","admin.user_edit.personal_site_slug":"Προσωπική σελίδα","admin.user_edit.show_contact_info":"Εμφάνιση στοιχείων επικοινωνίας","admin.user_edit.show_contact_info.hint":"Ορατό στους πελάτες","admin.user_edit.notify_new_tasks":"Ειδοποίηση για νέες εργασίες","admin.user_edit.notify_new_tasks.hint":"Push και email ειδοποιήσεις","admin.user_edit.notif_messages":"Ειδοποιήσεις μηνυμάτων","admin.user_edit.notif_messages.hint":"Νέα μηνύματα στη συνομιλία","admin.user_edit.site_settings":"Ρυθμίσεις προσωπικής σελίδας","admin.user_edit.categories":"Κατηγορίες υπηρεσιών","admin.user_edit.locations":"Περιοχές εξυπηρέτησης","admin.user_edit.skill_placeholder":"Νέα δεξιότητα...","admin.user_edit.add_category":"— Επιλέξτε κατηγορία —","admin.user_edit.add_location":"— Επιλέξτε περιοχή —","admin.user_edit.specialist_cards":"Χαρτοφυλάκιο ειδικού","admin.user_edit.no_cards":"Δεν βρέθηκαν στοιχεία χαρτοφυλακίου","admin.user_edit.card_title":"Τίτλος χαρτοφυλακίου","admin.user_edit.card_description":"Περιγραφή","admin.balance.topup.btn":"Αναπλήρωση","admin.balance.withdraw.btn":"Αφαίρεση","admin.balance.modal_hint":"Οι αλλαγές ισχύουν άμεσα και καταγράφονται στο ιστορικό","admin.balance.topup.title":"Αναπλήρωση υπολοίπου","admin.balance.topup.amount":"Ποσό","admin.balance.topup.description":"Σχόλιο","admin.balance.topup.description.placeholder":"Για παράδειγμα: bonus ή χειροκίνητη αναπλήρωση","admin.balance.topup.submit":"Αναπλήρωση υπολοίπου","admin.balance.withdraw.title":"Αφαίρεση υπολοίπου","admin.balance.withdraw.amount":"Ποσό","admin.balance.withdraw.description":"Σχόλιο","admin.balance.withdraw.description.placeholder":"Για παράδειγμα: επιστροφή ή χειροκίνητη χρέωση","admin.balance.withdraw.submit":"Αφαίρεση από το υπόλοιπο","admin.user_edit.role.customer":"Πελάτης","admin.user_edit.role.specialist":"Ειδικός","admin.user_edit.role.admin":"Διαχειριστής","common.refresh":"Ανανέωση","common.back_home":"Αρχική","admin.loc.hint":"Διαχείριση πόλεων και συνοικιών","admin.loc.add_city":"Νέα πόλη","admin.loc.add_district":"Προσθήκη συνοικίας","admin.loc.new":"Νέα τοποθεσία","admin.loc.edit":"Επεξεργασία τοποθεσίας","admin.loc.district":"συνοικία","admin.loc.empty":"Δεν υπάρχουν τοποθεσίες","admin.loc.delete.confirm":"Διαγραφή τοποθεσίας; Όλες οι συνοικίες θα διαγραφούν επίσης.","admin.cat.add_root":"Νέα κατηγορία","admin.cat.add_sub":"Υποκατηγορία","admin.cat.edit":"Επεξεργασία","admin.cat.delete":"Διαγραφή","admin.cat.delete.confirm":"Διαγραφή κατηγορίας; Όλες οι υποκατηγορίες θα διαγραφούν επίσης.","admin.cat.slug":"Slug","admin.cat.icon":"Εικονίδιο","admin.cat.name_el":"Ελληνικά","admin.cat.name_en":"Αγγλικά","admin.cat.name_ru":"Ρωσικά","admin.cat.order":"Σειρά","admin.cat.active":"Ενεργή","admin.cat.parent":"Γονική κατηγορία","admin.cat.no_parent":"Κορυφαίο επίπεδο","admin.cat.save":"Αποθήκευση","admin.cat.cancel":"Ακύρωση","admin.cat.empty":"Δεν υπάρχουν κατηγορίες","admin.cat.hint":"Διαχείριση κατηγοριών με πολυεπίπεδη ιεραρχία","admin.cat.new":"Νέα κατηγορία","admin.cat.subcategory":"υποκατηγορία","admin.cat.add_child":"Προσθήκη υποκατηγορίας","admin.cat.inactive":"Ανενεργή","admin.event.user_login":"Σύνδεση","admin.event.user_register":"Εγγραφή","admin.event.admin_user_deactivate":"Αποκλεισμός χρήστη","admin.event.admin_user_activate":"Ενεργοποίηση χρήστη","admin.event.admin_user_role_changed":"Αλλαγή ρόλου","admin.event.admin_task_cancelled":"Ακύρωση εργασίας","admin.event.admin_task_deleted":"Διαγραφή εργασίας","admin.event.admin_report_reviewed":"Αναφορά εξετάστηκε","admin.event.admin_report_dismissed":"Αναφορά απορρίφθηκε","admin.event.task_created":"Δημιουργία εργασίας","user.online":"Σε σύνδεση","user.seen_minutes":"ήταν εδώ πριν {n} λεπτά","user.seen_hours":"ήταν εδώ πριν {n} ώρες","user.seen_yesterday":"ήταν εδώ χθες","user.seen_days":"ήταν εδώ πριν {n} μέρες","specialists.title":"Ειδικοί","specialists.search":"Αναζήτηση ειδικού...","specialists.search.btn":"Αναζήτηση","specialists.empty":"Δεν βρέθηκαν ειδικοί","specialists.no_bio":"Χωρίς περιγραφή","specialists.view":"Προβολή προφίλ","specialists.reviews":"αξιολογήσεις","specialist.favorite":"Προσθήκη στα αγαπημένα","specialist.unfavorite":"Αφαίρεση από αγαπημένα","specialist.site_link":"Προσωπικό site","favorites.specialists.title":"Αγαπημένοι ειδικοί","favorites.specialists.empty":"Δεν έχετε αγαπημένους ειδικούς","nav.favorites":"Αγαπημένα","nav.schedule":"Πρόγραμμα","nav.find_tasks":"Αναζήτηση εργασιών","schedule.title":"Το πρόγραμμά μου","schedule.subtitle":"Σημειώστε τις ημέρες που είστε ελεύθεροι ή απασχολημένοι — οι πελάτες θα δουν τη διαθεσιμότητά σας","schedule.available":"Ελεύθερος","schedule.busy":"Απασχολημένος","schedule.unset":"Μη ορισμένο","schedule.click_hint":"← κλικ για εναλλαγή κατάστασης","schedule.range_mode":"Επιλογή εύρους","schedule.range_from":"Από {date} — επιλέξτε τελική ημερομηνία","schedule.click_to_set":"Κλικ για ορισμό","schedule.free":"ελεύθερα","schedule.busy_count":"απασχολημένα","schedule.free_days":"ελεύθερες ημέρες","schedule.googleCalendar":"Google Calendar","schedule.connectGoogle":"Σύνδεση με Google Calendar","schedule.disconnectGoogle":"Αποσύνδεση","schedule.connectedAs":"Συνδεδεμένο ως","schedule.importFromGoogle":"Συγχρονισμός από Google","schedule.gcalConnected":"✓ Google Calendar συνδέθηκε","schedule.gcalError":"Σφάλμα σύνδεσης Google Calendar","schedule.gcalImportDone":"Εισήχθησαν {n} ημερ. από Google Calendar","schedule.gcalAutoSyncNote":"Οι αλλαγές αποστέλλονται αυτόματα στο Google Calendar","schedule.gcalConnectDesc":"Συνδέστε το Google Calendar για αυτόματο συγχρονισμό","schedule.gcalDisconnectConfirm":"Αποσύνδεση Google Calendar;","find_tasks.title":"Αναζήτηση εργασιών","find_tasks.for_me":"Για μένα","find_tasks.all":"Όλες οι εργασίες","find_tasks.by_category":"Ανά κατηγορία","find_tasks.list":"Λίστα","find_tasks.already_offered":"Προσφορά υποβλήθηκε","find_tasks.offer_now":"Υποβολή προσφοράς","find_tasks.empty_for_me":"Δεν βρέθηκαν εργασίες στις κατηγορίες σας","find_tasks.banner_hint":"Βρείτε εργασίες που ταιριάζουν με το χαρτοφυλάκιό σας","find_tasks.no_cards":"Δημιουργήστε ένα χαρτοφυλάκιο ειδικού για να δείτε εργασίες για εσάς","find_tasks.add_card":"Δημιουργία χαρτοφυλακίου","find_tasks.search":"Αναζήτηση εργασιών...","find_tasks.tasks_count":"εργασίες","footer.tagline":"Η πλατφόρμα εργασιών για την Ελλάδα","footer.rights":"Όλα τα δικαιώματα διατηρούνται.","app.download_title":"Κατεβάστε την εφαρμογή CanHelp","app.download_desc":"Όλο το CanHelp — πάντα μαζί σας. Διαθέσιμο για Android και iOS.","nav.pricing":"Τιμές","pricing.title":"Τιμολόγηση","pricing.subtitle":"Επιλέξτε το κατάλληλο πρόγραμμα","pricing.role.customer":"Πελάτης","pricing.role.specialist":"Ειδικός","pricing.free":"Δωρεάν","pricing.per_month":"μήνα","pricing.duration":"Διάρκεια","pricing.days":"ημ.","pricing.current_plan":"Το πρόγραμμά σας","pricing.popular":"Δημοφιλές","pricing.choose":"Επιλογή","pricing.your_plan":"Ενεργό πρόγραμμα","pricing.free_default":"Προεπιλογή","pricing.compare":"Σύγκριση λειτουργιών","pricing.feature":"Λειτουργία","pricing.faq_note":"Η πληρωμή γίνεται από το υπόλοιπο CanHelp. Ανατροφοδότηση διαθέσιμη στην Πληρωμή.","pricing.feat.messages":"Μηνύματα / ημέρα","pricing.feat.orders":"Παραγγελίες / ημέρα","pricing.feat.contact_all":"Επικοινωνία με όλους","pricing.feat.view_phone":"Εμφάνιση τηλεφώνου","pricing.feat.show_contact":"Εμφάνιση στοιχείων επαφής","pricing.feat.favorites":"Αγαπημένα","pricing.feat.verified_badge":"Επαληθευμένο badge","pricing.feat.google_calendar":"Google Calendar","pricing.feat.personal_site":"Προσωπικό site","pricing.feat.auto_response":"Αυτόματη απάντηση","pricing.feat.auto_match":"Αυτόματη αντιστοίχιση","pricing.feat.highlighted_reviews":"Επισημασμένες αξιολογήσεις","pricing.feat.portfolio":"Στοιχεία χαρτοφυλακίου","pricing.feat.cards":"Κάρτες ειδικού","pricing.feat.notify_tasks":"Ειδοποιήσεις νέων εργασιών","pricing.feat.video":"Βίντεο στο χαρτοφυλάκιο","upgrade.available_in":"Διαθέσιμο στο","upgrade.cta":"Αναβάθμιση","dashboard.plan.title":"Το πρόγραμμά μου","dashboard.plan.expires":"Λήγει σε {n} ημέρες","dashboard.plan.upgrade":"Αναβάθμιση προγράμματος","dashboard.plan.no_plan":"Δωρεάν πρόγραμμα","dashboard.plan.messages":"Μηνύματα σήμερα","dashboard.plan.orders":"Παραγγελίες σήμερα","dashboard.plan.limits":"Ημερήσια όρια","dashboard.plan.features":"Λειτουργίες","dashboard.plan.stats":"Στατιστικά","dashboard.stats.cards":"Χαρτοφυλάκια","dashboard.stats.maxCards":"Μέγ. χαρτοφυλάκια","dashboard.stats.portfolioItems":"Στοιχεία portfolio","dashboard.stats.maxPortfolioItems":"Μέγ. στοιχεία","dashboard.stats.activeOffers":"Ενεργές προσφορές","dashboard.stats.reviewsReceived":"Αξιολογήσεις","dashboard.stats.activeTasks":"Ενεργές εργασίες","dashboard.stats.completedTasks":"Ολοκληρωμένες","status.can_help_now":"Είμαι διαθέσιμος τώρα","status.need_help":"Χρειάζομαι βοήθεια","status.active":"Ενεργό","status.toggle_on":"Ενεργοποίηση","status.toggle_off":"Απενεργοποίηση","fomo.missed_orders":"Χάσατε {n} παραγγελίες","fomo.missed_value":"Αξία €{v}","fomo.upgrade_hint":"Αναβαθμίστε για να λαμβάνετε περισσότερες παραγγελίες","fomo.conversion":"Μετατροπές εργασιών","fomo.active":"Ενεργές","fomo.with_offers":"Με προσφορές","fomo.completed":"Ολοκληρωμένες","fomo.already_offered":"{n} ειδικοί έχουν ήδη απαντήσει","fomo.specialist_missed":"Χάσατε {n} παραγγελίες","fomo.top_categories":"Κατηγορίες","fomo.offers_received":"προσφορές ελήφθησαν","fomo.avg_offers":"Μέσο {n}/εργασία","fomo.completion_rate":"ολοκληρωμένες","task.auto_match":"Αυτόματη αντιστοίχιση","task.auto_match_results":"Κορυφαίοι ειδικοί","task.no_offer_yet":"Δεν έχετε στείλει προσφορά ακόμα","task.make_offer":"Αποστολή προσφοράς","auto_response.title":"Αυτόματη Απάντηση","auto_response.enabled":"Ενεργοποίηση αυτόματης απάντησης","auto_response.min_budget":"Ελάχ. προϋπολογισμός","auto_response.max_budget":"Μέγ. προϋπολογισμός","auto_response.default_price":"Προεπιλεγμένη τιμή","auto_response.default_message":"Προεπιλεγμένο μήνυμα","auto_response.max_per_day":"Μέγ. αυτόματες προσφορές/ημέρα","auto_response.save":"Αποθήκευση","auto_response.saved":"Αποθηκεύτηκε","auto_response.categories":"Κατηγορίες","auto_response.locations":"Τοποθεσίες","profile.personal_site":"Προσωπικό Site","profile.site_slug":"Slug URL","profile.site_slug_hint":"Μόνο λατινικοί χαρακτήρες, αριθμοί, - και _","profile.site_open":"Άνοιγμα site","profile.site_preview":"Το site σας","profile.show_contact":"Εμφάνιση στοιχείων επαφής","profile.show_contact_hint":"Πελάτες με Pro/Ultimate πρόγραμμα θα βλέπουν το τηλέφωνό σας","gcal.upgrade_required":"Το Google Calendar απαιτεί Pro ή Ultimate πρόγραμμα","chat.limit_warning":"Απομένουν {n} μηνύματα σήμερα","chat.limit_reached":"Εξαντλήθηκαν τα μηνύματα. Αναβαθμίστε το πρόγραμμά σας","chat.upgrade":"Αναβάθμιση","site.member_since":"Μαζί μας από","site.rating":"Βαθμολογία","site.completed_tasks":"Ολοκληρώθηκαν","site.languages":"Γλώσσες","site.photos":"φωτ.","site.contact_form":"Επικοινωνία","site.contact_sent":"Το μήνυμα στάλθηκε!","site.contact_sent_desc":"Ο ειδικός θα επικοινωνήσει μαζί σας σύντομα","site.contact_name":"Όνομα","site.contact_name_ph":"Το όνομά σας","site.contact_email_ph":"your@email.com","site.contact_message":"Μήνυμα","site.contact_message_ph":"Περιγράψτε την εργασία σας...","site.contact_send":"Αποστολή","site.share":"Κοινοποίηση","site.speaks_languages":"Μιλάει","site.message_sent":"Το μήνυμα εστάλη!","site.message_sent_desc":"Ο ειδικός θα το λάβει στη συνομιλία","site.message_placeholder":"Γράψτε το μήνυμά σας...","site.write_to_chat":"Γράψτε στο chat","site.auth_required_title":"Απαιτείται σύνδεση","site.auth_required_desc":"Για να γράψετε στο chat, χρειάζεται να συνδεθείτε στο λογαριασμό σας.","site.auth_login_btn":"Σύνδεση","site.auth_contact_form_btn":"Επικοινωνία μέσω φόρμας","specialist.services":"Υπηρεσίες","portfolio.title":"Χαρτοφυλάκιο","common.not_found":"Η σελίδα δεν βρέθηκε","common.anonymous":"Ανώνυμα"},en:{"footer.slogan":"Your task — our care! We solve any issue quickly and easily.","footer.links":"Links","footer.socials":"Socials","nav.home":"Home","nav.tasks":"Tasks","nav.post":"+ Post task","nav.dashboard":"Dashboard","nav.chat":"Messages","nav.notifications":"Notifications","nav.profile":"Profile","nav.admin":"Admin Panel","nav.specialists":"Specialists","nav.new_task":"New task","nav.login":"Login","nav.register":"Register","nav.logout":"Logout","hero.title":"Find a specialist for any job","hero.subtitle":"Post a task, receive offers and choose the best professional","hero.cta.post":"Post a task","hero.cta.browse":"Find work","hero.search.placeholder":"What do you need? e.g. electrician, cleaning...","stats.specialists":"specialists","stats.tasks":"tasks","stats.categories":"categories","stats.free":"free sign-up","section.categories":"Create a task in any category","section.how":"How it works","section.recent":"Recent tasks","section.all":"See all →","section.more":"more","section.cities":"Cities & Districts","section.community":"A community project for everyone","community.subtitle":"CanHelp is not just a marketplace — it's a community of mutual help. Anyone with knowledge or a skill can find a client. Anyone with a problem can find a specialist.","community.point1.title":"Are you good at something?","community.point1.desc":"Repairs, tutoring, design, translation, care — every skill has value. Create a profile and find clients near you.","community.point2.title":"Need help with something?","community.point2.desc":"Post a task in under a minute and receive offers from verified specialists in your city.","community.point3.title":"Help the project grow","community.point3.desc":"CanHelp grows through communities. Share the link with friends and acquaintances — together we build something useful for everyone.","community.share":"Share with friends","community.share.copied":"Link copied!","section.referral":"Referral Program","referral.home.subtitle":"Share your link — every new user who signs up through it earns you a reward.","referral.home.step1.title":"Sign up and get your link","referral.home.step1.desc":"Create an account and find your unique referral link in your profile.","referral.home.step2.title":"Share with friends","referral.home.step2.desc":"Send the link to friends, acquaintances, or post it on social media.","referral.home.step3.title":"Earn rewards","referral.home.step3.desc":"Once your friend verifies their email, you automatically receive your reward.","referral.home.cta":"Get your link","referral.home.badge":"Referral Program","section.faq":"Frequently Asked Questions","faq.q1":"How does CanHelp work?","faq.a1":"Post a task, receive offers from specialists, choose the best one and start working together. It's fast, simple and free for customers.","faq.q2":"How much does it cost to use the platform?","faq.a2":"Registration and task posting is completely free for customers. Specialists have access to a free plan as well as premium options.","faq.q3":"How can I become a specialist?","faq.a3":"Register, go to \xabBecome a Specialist\xbb, fill in your profile with skills and categories, and start receiving tasks.","faq.q4":"How do I choose the right specialist?","faq.a4":"Check their reviews, experience, skills and portfolio. Chat with them through the platform and discuss the details before deciding.","faq.q5":"What if I am not satisfied?","faq.a5":"You can leave a review about the specialist and rate them from 1 to 5 stars. Reviews help other users find trusted professionals.","faq.q6":"Can I contact a specialist before accepting their offer?","faq.a6":"Yes. Once you receive an offer, you can open a chat with the specialist, ask questions and discuss all the details before making a decision.","faq.q7":"How long does it take to receive offers?","faq.a7":"Usually within a few hours. Specialists get notified about new tasks and can respond quickly.","faq.q8":"Can I post a task in any city in Greece?","faq.a8":"Yes! CanHelp covers all of Greece — Athens, Thessaloniki, Patras and more.","faq.q9":"What types of tasks can I find on CanHelp?","faq.a9":"Repairs, cleaning, electricians, tutoring, design, IT, moving, beauty and much more. Categories are constantly expanding.","faq.q10":"Is there a mobile app?","faq.a10":"Yes! CanHelp is available for Android and iOS. Download the app and manage everything from your phone.","how.step1.title":"Post a task","how.step1.desc":"Describe what you need and set your budget","how.step2.title":"Receive offers","how.step2.desc":"Specialists will send you offers with price and timeline","how.step3.title":"Choose & start","how.step3.desc":"Pick the best professional and start the collaboration","tasks.title":"tasks","tasks.filters":"Filters","tasks.search":"Search","tasks.search.placeholder":"Title or keyword...","tasks.search.btn":"Search","tasks.publish":"Post","tasks.category.all":"All","tasks.category.all_in":"All in","tasks.category.label":"Category","tasks.location.label":"City","tasks.location.placeholder":"e.g. Athens","tasks.empty":"No tasks found","tasks.empty.cta":"Post the first one","task.status.open":"Open","task.status.in_progress":"In progress","task.status.completed":"Completed","task.status.cancelled":"Cancelled","task.status.draft":"Draft","task.budget":"Budget","task.location":"Location","task.deadline":"Start date","task.created_at":"Created","task.customer":"Customer","task.offer.btn":"Submit offer","task.invite.banner_title":"You've been invited to this task","task.invite.banner_hint":"The customer personally invited you","task.invite.accept":"Send offer","task.invite.decline":"Decline","offer.accept":"Accept","offer.decline":"Decline","task.complete":"Complete task","task.complete.confirm":"Mark this task as complete?","task.edit":"Edit","task.status_label":"Status","task.yours":"Your task","task.offer.yours":"Your offer","review.leave":"Leave a review","review.rating":"Rating","review.comment":"Comment","review.comment.placeholder":"Tell us about your experience...","review.submit":"Submit review","review.submitting":"Submitting...","review.done":"Review submitted!","profile.reviews":"Reviews","profile.no_reviews":"No reviews yet","profile.rating":"Rating","profile.skills.label":"Skills","profile.member_since":"Member since","task.offers":"Offers","task.offers.none":"No offers yet","create.title":"Post a task","create.field.title":"Title","create.field.description":"Description","create.field.category":"Category","create.field.category.select":"Select...","create.field.location":"Location","create.field.location.any":"Anywhere","create.field.location.all":"Entire city","create.field.budget":"Budget (€)","create.field.deadline":"Start date","create.field.budget_negotiable":"Price is negotiable","create.field.time_slot":"Time slot","create.field.time_slot.any":"Anytime","create.field.time_slot.morning":"Morning (08:00–13:00)","create.field.time_slot.afternoon":"Afternoon (13:00–18:00)","create.field.time_slot.evening":"Evening (18:00–22:00)","create.field.time_slot.weekend":"Weekend","create.field.address":"Address (optional)","create.field.address.district":"District","create.field.address.street":"Street","create.field.address.house":"Number","create.field.confidential":"Confidential note","create.field.confidential.placeholder":"Details visible only to the assigned specialist...","create.field.confidential.hint":"Not shown publicly","create.field.photos":"Photos","create.field.photos.add":"Add photo","create.field.photos.uploading":"Uploading...","task.budget_negotiable":"Price negotiable","task.time_slot":"Time slot","task.confidential":"Confidential note","create.field.title.placeholder":"e.g. Clean 80sqm apartment","create.field.description.placeholder":"Describe in detail what you need...","create.field.location.placeholder":"e.g. Athens, Kolonaki","create.field.budget.placeholder":"e.g. 100","create.submit":"Post task","create.submitting":"Posting...","login.title":"Welcome back","login.subtitle":"Sign in to CanHelp","login.email":"Email","login.password":"Password","login.submit":"Sign in","login.submitting":"Signing in...","login.error":"Invalid email or password","login.unverified.title":"Verify your email address","login.unverified.desc":"We sent a verification link to your email. Check your inbox (or spam) and click the link.","login.unverified.resend":"Resend verification email","login.unverified.sending":"Sending...","login.unverified.sent":"✓ Sent — check your inbox","profile.email.verified":"Email verified","profile.email.not_verified":"Email not verified","login.no_account":"Don't have an account?","login.register_link":"Register","login.forgot_password":"Forgot password?","login.or_continue_with":"or continue with","login.continue_google":"Continue with Google","forgot.title":"Forgot password","forgot.subtitle":"Enter your email to receive a reset link","forgot.email":"Email","forgot.submit":"Send reset link","forgot.submitting":"Sending...","forgot.sent.title":"Check your inbox","forgot.sent.desc":"If an account exists with that email, we'll send you a password reset link.","forgot.back_to_login":"Back to sign in","forgot.error":"Could not send reset link. Check the email address and try again.","forgot.error.not_found":"No account found with this email address.","forgot.error.send_failed":"Failed to send email. Please try again later.","reset.title":"New password","reset.subtitle":"Enter your new password","reset.password":"New password","reset.confirm":"Confirm password","reset.submit":"Change password","reset.submitting":"Saving...","reset.success":"Password changed successfully. Redirecting to sign in...","reset.back_to_login":"Back to sign in","reset.error.mismatch":"Passwords do not match","reset.error.invalid":"Invalid or expired link. Please request a new one.","register.title":"Register","register.subtitle":"Create a CanHelp account","register.first_name":"First name","register.last_name":"Last name","register.email":"Email","register.password":"Password (min 8 characters)","register.role":"Role","register.role.customer":"User","register.role.customer.desc":"I post tasks","register.role.specialist":"Specialist","register.role.specialist.desc":"I take on tasks","register.submit":"Create account","register.submitting":"Registering...","register.has_account":"Already have an account?","register.login_link":"Sign in","register.continue_google":"Continue with Google","register.check_email.title":"Check your email","register.check_email.desc":"We sent a verification link to your email address. Check your inbox (or spam) and click the link.","register.check_email.login":"Back to sign in","dashboard.title":"Dashboard","dashboard.new_task":"+ New task","dashboard.my_tasks":"My tasks","dashboard.my_offers":"My offers","dashboard.invitations":"Job invitations","dashboard.offers_count":"offers","dashboard.declined_count":"declined","dashboard.completed_tasks":"Completed tasks","dashboard.completed_offers":"Completed offers","dashboard.review_pending":"Review not yet submitted","tasks.new.top_specialists":"Top specialists","tasks.new.select_category":"Select a category to see matching specialists","tasks.new.invite":"Offer work","tasks.new.invited":"Selected ✓","reviews.count":"reviews","filter.location":"Location","filter.language":"Languages","filter.language.any":"Any language","filter.category.all":"All categories","user.categories":"Categories","user.work_area":"Work area","dashboard.tasks.empty":"You haven't posted any tasks","dashboard.tasks.empty.cta":"Post your first one","dashboard.tasks.add_new":"Add a new task","dashboard.offers.empty":"You haven't submitted any offers","dashboard.offers.empty.cta":"Find tasks","dashboard.customer.specialists_title":"Looking for a specialist?","dashboard.customer.specialists_hint":"Browse specialist profiles, read reviews and invite them to your tasks","dashboard.customer.specialists_cta":"Find a specialist","dashboard.customer.how_title":"How it works","dashboard.customer.step1":"Create a task with a description and budget","dashboard.customer.step2":"Specialists will send offers with price and timeline","dashboard.customer.step3":"Choose the right one and start working","notif.title":"Notifications","notif.mark_all":"Mark all as read","notif.empty":"No notifications","notif.type.new_offer":"New offer","notif.type.offer_accepted":"Your offer was accepted","notif.type.offer_declined":"Your offer was declined","notif.type.task_completed":"Task completed","notif.type.task_cancelled":"Task cancelled","notif.type.new_message":"New message","notif.type.new_review":"New review","notif.type.task_invite":"Job invitation","notif.body.new_offer":"New offer for \xab{title}\xbb","notif.body.offer_accepted":"Your offer for \xab{title}\xbb was accepted","notif.body.offer_declined":"Your offer for \xab{title}\xbb was declined","notif.body.task_invite":"You've been invited for \xab{title}\xbb","notif.body.new_review":"You received a {rating}★ review","offer.status.pending":"Pending","offer.status.accepted":"Accepted","offer.status.declined":"Declined","offer.status.withdrawn":"Withdrawn","offer.status.other_accepted":"Another specialist was chosen","common.loading":"Loading...","common.error":"Error","common.save":"Save","common.saving":"Saving...","common.cancel":"Cancel","common.add":"Add","common.close":"Close","common.edit":"Edit","common.delete":"Delete","common.from":"by","common.currency":"€","common.greece":"Greece","chat.connected":"Connected","chat.disconnected":"Disconnected","chat.no_rooms":"No conversations yet","chat.task_fallback":"Task","chat.select":"Select a conversation","chat.no_messages":"No messages yet","chat.placeholder":"Write a message... (Enter to send)","chat.conversation_fallback":"Conversation","chat.direct_chat":"Direct chat","chat.linked_task":"Linked task","chat.write_btn":"Message","chat.just_now":"just now","chat.min_ago":"m","chat.write_specialist":"Write to specialist","chat.write_customer":"Write to customer","chat.notif_settings":"Notification settings","chat.notif_messages":"Notifications for new messages","chat.toast_title":"New message","chat.toast_open":"Open chat","offer.price":"Price","offer.price.placeholder":"e.g. 80","offer.customer_budget":"Client budget","offer.message":"Message","offer.optional":"optional","offer.message.placeholder":"Introduce yourself, your experience and why you are the best choice...","offer.submitting":"Sending...","profile.photo":"Profile photo","profile.photo.change":"Change photo","profile.photo.hint":"JPEG, PNG, WebP \xb7 up to 5MB","profile.basic_info":"Basic info","profile.phone":"Phone","profile.phone.placeholder":"+30 6901234567","profile.bio":"Short bio","profile.bio.placeholder":"Tell us a bit about yourself...","profile.language":"Language","profile.language.hint":"App interface and email notification language","profile.languages":"Languages spoken","profile.languages.hint":"Select all languages you speak","profile.skills":"Skills","profile.skills.subtitle":"Add the services you offer","profile.skills.placeholder":"e.g. Cleaning, IT, Tutoring...","profile.role":"Account role","profile.role.specialist":"\uD83D\uDD27 Specialist","profile.role.admin":"\uD83D\uDC51 Admin","profile.role.customer":"\uD83D\uDC64 User","profile.role.change":"To change your role please contact support.","profile.become_specialist":"Become a Specialist","profile.become_specialist.desc":"Upgrade to Specialist to take on tasks and build your profile.","become_specialist.hero.title":"Earn money doing what you do best","become_specialist.hero.subtitle":"Create a specialist profile and receive orders from clients across Greece","become_specialist.how.title":"How it works","become_specialist.step1.title":"Create a specialist portfolio","become_specialist.step1.desc":"Set your categories, skills and coverage areas — the system will automatically match you with relevant tasks","become_specialist.step2.title":"Find tasks","become_specialist.step2.desc":'Discover tasks in your categories in the "Find Orders" section',"become_specialist.step3.title":"Send an offer & earn","become_specialist.step3.desc":"Submit offers with price and timeline, chat with clients and complete tasks","become_specialist.benefits.title":"Specialist profile advantages","become_specialist.benefit1":"Task search filtered by your categories and location","become_specialist.benefit2":"Public profile with client reviews","become_specialist.benefit3":"Availability schedule visible to clients","become_specialist.benefit4":"Saved to favourites by clients","become_specialist.cta":"Become a Specialist — it's free","become_specialist.free_badge":"Free registration","profile.tab.notifications":"Notifications","profile.tab.reviews":"Reviews","profile.tab.referral":"Referrals","profile.tab.auto_response":"Auto-response","profile.tab.site":"Site","profile.site.title":"Personal page","profile.site.url_label":"Personal site","profile.site.copy":"Copy","profile.site.copied":"Copied","profile.site.visible_title":"What's on your page","profile.site.visible.name":"Name and photo","profile.site.visible.bio":"Bio","profile.site.visible.rating":"Rating and reviews","profile.site.visible.portfolio":"Portfolio / Cards","profile.site.visible.contacts":"Contact info","profile.site.visible.full_last_name":"Full last name","profile.site.visible.services":"Service cards","profile.site.visible.reviews":"Reviews section","profile.site.visible.status":'"Ready to help" status',"profile.site.theme":"Appearance theme","profile.site.theme.dark":"Dark","profile.site.theme.light":"Light","profile.site.slug_taken":"This address is already taken","profile.site.stats.title":"Site analytics","profile.site.stats.days":"last 30 days","profile.site.stats.views":"Views","profile.site.stats.unique":"Unique visitors","profile.site.stats.messages":"Messages","profile.site.stats.total_views":"Total views","profile.site.stats.total_unique":"Unique visitors","profile.site.stats.total_messages":"Messages","profile.site.stats.empty":"No data yet","profile.site.stats.loading":"Loading analytics...","profile.site.stats.no_slug":"Set your site URL to see analytics","profile.site.edit_bio_hint":'Bio and photo are edited in the "Basic info" tab.',"status.title":"Status","status.can_help_now_hint":"Your card is shown higher in search","status.need_help_hint":"Specialists can offer you help","profile.referral.title":"Referral program","profile.referral.desc":"Share your link and earn rewards for every new user you invite.","profile.referral.link_label":"Your referral link","profile.referral.copy":"Copy","profile.referral.copied":"Copied!","profile.referral.invited_count":"successful referrals","profile.referral.no_code":"Referral code is not available.","notifications.title":"Notification settings","notifications.email.new_tasks":"Email for new tasks","notifications.email.new_tasks.desc":"Receive an email when a new task is posted in your categories","notifications.messages.desc":"Receive a notification when a new message arrives","notifications.saved":"Settings saved","notifications.plan_required":"Not available in your plan","profile.tab.info":"Basic info","profile.tab.finance":"Finance","profile.tab.skills":"Skills","profile.tab.categories":"Categories","profile.tab.geography":"Geography","profile.specialist.categories":"Work categories","profile.specialist.categories.desc":"Select the categories you work in","profile.specialist.geography":"Coverage areas","profile.specialist.geography.desc":"Select the cities / districts where you are active","profile.saving":"Saving...","profile.upload.error":"Error uploading photo","profile.saved":"Saved","profile.tab.cards":"Portfolio","profile.cards.count":"Portfolio","profile.cards.add":"Add portfolio","profile.cards.new_title":"New portfolio title","profile.cards.placeholder":"e.g. Plumbing","profile.cards.create":"Create","profile.cards.cancel":"Cancel","profile.cards.empty":"No portfolio yet","profile.cards.create_first":"Create your first portfolio","profile.cards.delete_confirm":"Delete portfolio?","profile.card.tab.main":"General","profile.card.tab.skills":"Skills","profile.card.tab.categories":"Categories","profile.card.tab.geography":"Geography","profile.card.tab.portfolio":"Portfolio","profile.card.active":"Active","profile.card.save":"Save","profile.card.saved":"Saved","profile.card.delete":"Delete","profile.card.skill.add":"Add skill","profile.card.photo.add":"Add photo","profile.card.photo.uploading":"Uploading...","profile.card.photo.empty":"No photos yet","profile.card.item.title":"Title","profile.card.item.desc":"Description","profile.card.item.save":"Save","profile.card.item.cancel":"Cancel","profile.card.item.edit":"Edit","profile.upgrade.cards_limit":"Portfolio limit reached","profile.upgrade.plan":"Current plan:","profile.upgrade.contact":"Contact the administrator to change your plan","profile.upgrade.ok":"Got it","profile.plan.title":"Subscription plan","profile.balance":"Balance","profile.balance.topup":"Top Up Balance","profile.balance.topup.title":"Top Up Balance","profile.balance.topup.amount":"Amount (EUR)","profile.balance.topup.hint":"Choose a preset or enter a custom amount","profile.balance.topup.submit":"Proceed to Payment","profile.balance.topup.loading":"Redirecting...","profile.balance.topup.error":"Payment initiation failed. Please try again.","payment.success.title":"Payment Successful!","payment.success.desc":"Your balance has been updated.","payment.cancelled.title":"Payment Cancelled","payment.cancelled.desc":"Payment was cancelled. No charges were made.","payment.pending.title":"Processing...","payment.pending.desc":"Your payment is being processed.","payment.back_to_profile":"Back to Profile","profile.plan.basic":"Basic (free)","profile.plan.contact_upgrade":"Contact admin to upgrade your plan","profile.plan.cards_up_to":"Portfolio: up to","profile.plan.cards_unlimited":"Portfolio: unlimited","profile.plan.tasks_up_to":"Tasks: up to","profile.plan.offers_up_to":"Offers: up to","profile.plan.valid_until":"Valid until","profile.plan.no_expiry":"No expiry","create.error":"Error posting task","tasks.category.general":"General","tasks.budget.range":"Range:","tasks.budget.from":"from","tasks.budget.to":"to","tasks.filter.reset":"Reset filters","tasks.load_more":"Load more","tasks.showing":"Results:","tasks.field.budget":"Budget, €","admin.title":"Admin Panel","admin.tab.stats":"Statistics","admin.tab.users":"Users","admin.tab.tasks":"Tasks","admin.tab.reports":"Reports","admin.stats.users":"Users","admin.stats.tasks":"Tasks","admin.stats.offers":"Offers","admin.stats.reviews":"Reviews","admin.tasks.by_status":"Tasks by status","admin.col.user":"User","admin.col.email":"Email","admin.col.role":"Role","admin.col.registered":"Registered","admin.col.status":"Status","admin.col.title":"Title","admin.col.budget":"Budget","admin.col.created":"Created","admin.users.active":"Active","admin.users.inactive":"Inactive","admin.users.deactivate":"Deactivate","admin.users.activate":"Activate","admin.tasks.cancel":"Cancel","admin.reports.none":"No reports","admin.reports.reviewed":"Reviewed","admin.reports.dismiss":"Dismiss","admin.pagination.total":"Total","admin.users.role.change":"Change role","admin.users.search.placeholder":"Search name or email...","admin.tasks.delete":"Delete","admin.tasks.delete.confirm":"Permanently delete this task?","admin.tasks.search.placeholder":"Search title...","admin.col.customer":"Customer","admin.col.reporter":"Reporter","admin.col.target":"Target","admin.filter.all_roles":"All roles","admin.filter.all_statuses":"All statuses","admin.reports.target.task":"Task","admin.reports.target.user":"User","admin.tab.categories":"Categories","admin.tab.locations":"Cities & Districts","admin.tab.logs":"Logs","admin.tab.plans":"Plans","admin.tab.settings":"Settings","admin.logs.subtab.ai":"AI Logs","admin.logs.subtab.activity":"Activity","admin.logs.subtab.mail":"Mail","admin.logs.subtab.notifications":"Notifications","admin.notif_logs.type":"Type","admin.notif_logs.title":"Title","admin.notif_logs.read":"Read","admin.notif_logs.empty":"No notification logs","admin.stats.notif_chart_title":"Notifications per day","admin.stats.notif_label":"Notifications","admin.stats.mail_chart_title":"Emails per day","admin.stats.mail_label":"Emails","admin.filter.all":"All","admin.stats.specialists":"Specialists","admin.col.plan":"Plan","admin.back_home":"Home","admin.plans.title":"Subscription plans","admin.plans.add":"+ New plan","admin.plans.empty":"No plans created","admin.plans.form.new":"New plan","admin.plans.form.edit":"Edit plan","admin.plans.form.name":"Name","admin.plans.form.price":"Price (EUR)","admin.plans.form.old_price":"Old price (EUR, optional)","admin.plans.form.max_offers":"Max offers (empty = no limit)","admin.plans.form.max_cards":"Max portfolio (empty = no limit)","admin.plans.form.duration_days":"Duration (days, empty = no expiry)","admin.plans.form.description":"Description","admin.plans.form.features":"Features (one per line)","admin.plans.form.notify":"Notify about new tasks","admin.plans.form.default":"Default","admin.plans.form.active":"Active","admin.plans.form.order":"Order","admin.plans.form.role":"Role","admin.plans.form.tier":"Tier","admin.plans.form.role.customer":"Customer","admin.plans.form.role.specialist":"Specialist","admin.plans.form.tier.free":"Free","admin.plans.form.tier.pro":"Pro","admin.plans.form.tier.ultimate":"Ultimate","admin.plans.form.section.limits":"Limits (empty = unlimited)","admin.plans.form.max_messages_day":"Max Messages/Day","admin.plans.form.max_orders_day":"Max Orders/Day","admin.plans.form.max_skills":"Max Skills","admin.plans.form.max_profiles":"Max Profiles","admin.plans.form.max_portfolio":"Max Portfolio Items","admin.plans.form.section.boost":"Multipliers & Boost","admin.plans.form.search_boost":"Search Boost","admin.plans.form.offers_multiplier":"Offers Multiplier","admin.plans.form.section.contact":"Contact Permissions","admin.plans.form.can_contact_free":"Contact Free Plan users","admin.plans.form.can_contact_pro":"Contact Pro Plan users","admin.plans.form.can_contact_all":"Contact All users","admin.plans.form.can_show_contact":"Show Contact Info","admin.plans.form.can_view_phone":"View Phone","admin.plans.form.section.features":"Feature Flags","admin.plans.form.upload_video":"Upload Video","admin.plans.form.favorites":"Favorites","admin.plans.form.google_calendar":"Google Calendar","admin.plans.form.verified_badge":"Verified Badge","admin.plans.form.highlighted_reviews":"Highlighted Reviews","admin.plans.form.personal_site":"Personal Site","admin.plans.form.can_help_now":"Can Help Now Status","admin.plans.form.need_help":"Need Help Status","admin.plans.form.auto_response":"Auto Response","admin.plans.form.auto_match":"Auto Match","admin.plans.form.instant_dispatch_free":"Instant Dispatch (Free)","admin.plans.form.instant_dispatch_pro":"Instant Dispatch (Pro)","admin.plans.badge.default":"Default","admin.plans.badge.inactive":"Inactive","admin.plans.make_default":"Set as default","admin.plans.tasks":"Tasks","admin.plans.offers":"Offers","admin.plans.cards":"Portfolio","admin.plans.notify_tasks":"Task notifications","admin.plans.delete.confirm":"Delete plan","admin.activity.title":"Activity log","admin.activity.event":"Event","admin.activity.all_events":"All events","admin.activity.from":"From","admin.activity.to":"To","admin.activity.reset":"Reset","admin.activity.total":"Total","admin.activity.empty":"No records","admin.mail.event":"Email event","admin.mail.all_events":"All email events","admin.mail.from":"From","admin.mail.to":"To","admin.mail.reset":"Reset","admin.mail.total":"Total","admin.mail.empty":"No email logs","admin.mail.recipient":"Recipient","admin.mail.provider":"Provider","admin.mail.details":"Details","admin.mail.status":"Status","admin.mail.success":"Success","admin.mail.failed":"Failed","admin.event.email_sent":"Email sent","admin.event.email_failed":"Email failed","admin.event.email_dev":"Email DEV fallback","admin.event.admin_email_test_sent":"Admin test email sent","admin.event.admin_email_test_failed":"Admin test email failed","admin.logs.empty":"No records","admin.logs.date":"Date","admin.logs.provider":"Provider","admin.logs.model":"Model","admin.logs.action":"Action","admin.logs.langs":"Languages","admin.logs.in":"In","admin.logs.out":"Out","admin.logs.total":"Total","admin.logs.ms":"ms","admin.logs.status":"Status","admin.stats.activity_30d":"Activity over 30 days","admin.stats.tasks_label":"Tasks","admin.stats.users_label":"Users","admin.stats.specialists_label":"Specialists","admin.stats.tokens_title":"Token usage (by month)","admin.stats.tokens_out":"Output","admin.stats.tokens_in":"Input","admin.stats.tokens_out_label":"Output tokens","admin.stats.tokens_in_label":"Input tokens","admin.stats.cost_label":"Cost (USD)","admin.stats.tasks_by_status":"Tasks by status","admin.task_status.open":"Open","admin.task_status.in_progress":"In progress","admin.task_status.completed":"Completed","admin.task_status.cancelled":"Cancelled","admin.task_status.draft":"Drafts","admin.settings.tab.general":"General","admin.settings.tab.smtp":"E-Mail","admin.settings.tab.notifications":"Notifications","admin.settings.tab.payment":"Payment","admin.settings.tab.referral":"Referrals","admin.settings.tab.seo":"SEO","admin.settings.seo.title":"SEO & Maintenance","admin.settings.seo.maintenance_label":"Maintenance Mode","admin.settings.seo.maintenance_hint":"Show a maintenance page to all visitors","admin.settings.seo.indexing_label":"Search Engine Indexing","admin.settings.seo.indexing_hint":"Allow search engines to index the site","admin.settings.seo.head_scripts_label":" Scripts (JS)","admin.settings.seo.head_scripts_hint":"Runs on every page (Google Tag Manager, analytics, etc.)","admin.settings.seo.site_title_label":"Site Title","admin.settings.seo.site_description_label":"Site Description (meta description)","admin.settings.referral.title":"Referral program","admin.settings.referral.hint":"Reward users who bring new registrations.","admin.settings.referral.enabled_label":"Enabled","admin.settings.referral.enabled_hint":"Enable / disable reward application","admin.settings.referral.customer_section":"For customers","admin.settings.referral.specialist_section":"For specialists","admin.settings.referral.plan_label":"Reward plan","admin.settings.referral.no_plan":"— no plan —","admin.settings.referral.plan_hint":"This plan will be assigned to the referrer. If their current plan is higher, only days will be added.","admin.settings.referral.days_label":"Reward days","admin.settings.referral.days_hint":"Number of days added to the plan expiry.","admin.settings.general.title":"General settings","admin.settings.general.site_name":"Site name","admin.settings.general.site_url":"Site URL","admin.settings.general.contact_email":"Contact email","admin.settings.general.support_phone":"Support phone","admin.settings.smtp.title":"SMTP settings","admin.settings.smtp.hint":"Used to send email notifications.","admin.settings.smtp.host":"SMTP Host","admin.settings.smtp.port":"Port","admin.settings.smtp.encryption":"Encryption","admin.settings.smtp.enc.none":"None","admin.settings.smtp.enc.tls":"STARTTLS (port 587)","admin.settings.smtp.enc.ssl":"SSL/TLS (port 465)","admin.settings.smtp.username":"Username","admin.settings.smtp.password":"Password / App Password","admin.settings.smtp.from_name":"Sender name","admin.settings.smtp.from_email":"Sender email","admin.settings.smtp.test":"Send test email","admin.settings.smtp.sending":"Sending...","admin.settings.payment.hint":"ePay Piraeus Bank credentials.","admin.settings.env.test":"Test (sandbox)","admin.settings.env.prod":"Production","admin.settings.env.label":"Environment","admin.settings.merchant_id":"Merchant ID","admin.settings.api_user":"API User","admin.settings.api_password":"API Password","admin.settings.confirm_url":"Confirmation URL (webhook)","admin.settings.cancel_url":"Cancel URL","admin.settings.active":"Active","admin.settings.saving":"Saving...","admin.settings.saved":"Saved","admin.notif.vars_hint":"Available variables in templates","admin.notif.tmpl.not_set":"Template not configured","admin.notif.tmpl.subject_label":"Email subject","admin.notif.tmpl.body_label":"Email body (HTML)","admin.notif.tmpl.save":"Save","admin.notif.tmpl.close":"Close","admin.notif.tmpl.translate":"Auto-translate to other languages","admin.notif.tmpl.translating":"Translating...","admin.notif.tmpl.saving":"Saving...","admin.notif.email_verification":"Email verification","admin.notif.registration_success":"Successful registration","admin.notif.password_reset":"Password reset","admin.notif.new_offer":"New offer","admin.notif.new_task":"New task","admin.notif.offer_accepted":"Offer accepted","admin.notif.new_message":"New message","admin.notif.offer_declined":"Offer declined","admin.notif.offer_other_accepted":"Another specialist chosen","admin.notif.task_updated":"Task updated","admin.notif.deadline_reminder":"Deadline reminder","admin.notif.task_archived":"Task unpublished automatically","admin.notif.referral_reward":"Referral reward","admin.email_template.plan_activated":"Plan activated","admin.email_template.plan_upgraded":"Plan upgraded","admin.email_template.plan_downgrade_scheduled":"Downgrade scheduled","admin.email_template.plan_downgrade_applied":"Downgrade applied","admin.email_template.plan_renewal_reminder":"Renewal reminder","admin.email_template.plan_insufficient_funds":"Insufficient funds warning","pricing.confirm.title":"Confirm plan selection","pricing.confirm.plan":"Plan","pricing.confirm.prorated":"Prorated credit","pricing.confirm.effective_price":"Amount due","pricing.confirm.your_balance":"Your balance","pricing.confirm.downgrade_info":"The switch to the new plan will happen automatically after the current period ends.","pricing.confirm.insufficient":"Insufficient balance.","pricing.confirm.top_up":"Top up","pricing.confirm.schedule_downgrade":"Schedule downgrade","pricing.confirm.pay":"Pay","admin.user_edit.title":"Edit user","admin.user_edit.email":"Email","admin.user_edit.id":"ID","admin.user_edit.registered":"Registered","admin.user_edit.last_seen":"Last seen","admin.user_edit.lang":"Language","admin.user_edit.first_name":"First name","admin.user_edit.last_name":"Last name","admin.user_edit.phone":"Phone","admin.user_edit.bio":"Bio","admin.user_edit.role":"Role","admin.user_edit.plan":"Plan","admin.user_edit.no_plan":"— No plan —","admin.user_edit.active":"Active account","admin.user_edit.balance":"Balance (EUR)","admin.user_edit.skills":"Skills","admin.user_edit.tab.profile":"Profile","admin.user_edit.tab.account":"Account","admin.user_edit.tab.balance":"Balance","admin.user_edit.tab.settings":"Settings","admin.user_edit.tab.specialist":"Portfolio","admin.user_edit.tab.site":"Website","admin.user_edit.plan_expires":"Plan expires","admin.user_edit.interface_lang":"Interface language","admin.user_edit.comm_languages":"Communication languages","admin.user_edit.personal_site_slug":"Personal page","admin.user_edit.show_contact_info":"Show contact info","admin.user_edit.show_contact_info.hint":"Visible to customers","admin.user_edit.notify_new_tasks":"Notify about new tasks","admin.user_edit.notify_new_tasks.hint":"Push and email notifications","admin.user_edit.notif_messages":"Message notifications","admin.user_edit.notif_messages.hint":"New messages in chat","admin.user_edit.site_settings":"Personal page settings","admin.user_edit.categories":"Service categories","admin.user_edit.locations":"Service areas","admin.user_edit.skill_placeholder":"New skill...","admin.user_edit.add_category":"— Select category —","admin.user_edit.add_location":"— Select location —","admin.user_edit.specialist_cards":"Portfolio","admin.user_edit.no_cards":"No portfolio found","admin.user_edit.card_title":"Portfolio title","admin.user_edit.card_description":"Description","admin.balance.topup.btn":"Top up","admin.balance.withdraw.btn":"Withdraw","admin.balance.modal_hint":"Changes take effect immediately and are recorded in history","admin.balance.topup.title":"Top up balance","admin.balance.topup.amount":"Amount","admin.balance.topup.description":"Comment","admin.balance.topup.description.placeholder":"For example: bonus or manual top-up","admin.balance.topup.submit":"Top up balance","admin.balance.withdraw.title":"Withdraw balance","admin.balance.withdraw.amount":"Amount","admin.balance.withdraw.description":"Comment","admin.balance.withdraw.description.placeholder":"For example: refund or manual debit","admin.balance.withdraw.submit":"Withdraw from balance","admin.user_edit.role.customer":"Customer","admin.user_edit.role.specialist":"Specialist","admin.user_edit.role.admin":"Administrator","common.refresh":"Refresh","common.back_home":"Home","admin.loc.hint":"Manage cities and districts","admin.loc.add_city":"New city","admin.loc.add_district":"Add district","admin.loc.new":"New location","admin.loc.edit":"Edit location","admin.loc.district":"district","admin.loc.empty":"No locations","admin.loc.delete.confirm":"Delete location? All districts will also be deleted.","admin.cat.add_root":"New category","admin.cat.add_sub":"Subcategory","admin.cat.edit":"Edit","admin.cat.delete":"Delete","admin.cat.delete.confirm":"Delete category? All subcategories will also be deleted.","admin.cat.slug":"Slug","admin.cat.icon":"Icon","admin.cat.name_el":"Greek","admin.cat.name_en":"English","admin.cat.name_ru":"Russian","admin.cat.order":"Order","admin.cat.active":"Active","admin.cat.parent":"Parent category","admin.cat.no_parent":"Top level","admin.cat.save":"Save","admin.cat.cancel":"Cancel","admin.cat.empty":"No categories","admin.cat.hint":"Manage categories with multi-level hierarchy","admin.cat.new":"New category","admin.cat.subcategory":"subcategory","admin.cat.add_child":"Add subcategory","admin.cat.inactive":"Inactive","admin.event.user_login":"Login","admin.event.user_register":"Registration","admin.event.admin_user_deactivate":"User blocked","admin.event.admin_user_activate":"User activated","admin.event.admin_user_role_changed":"Role changed","admin.event.admin_task_cancelled":"Task cancelled","admin.event.admin_task_deleted":"Task deleted","admin.event.admin_report_reviewed":"Report reviewed","admin.event.admin_report_dismissed":"Report dismissed","admin.event.task_created":"Task created","user.online":"Online","user.seen_minutes":"was here {n} min ago","user.seen_hours":"was here {n} hr ago","user.seen_yesterday":"was here yesterday","user.seen_days":"was here {n} days ago","specialists.title":"Specialists","specialists.search":"Search specialist...","specialists.search.btn":"Search","specialists.empty":"No specialists found","specialists.no_bio":"No description","specialists.view":"View profile","specialists.reviews":"reviews","specialist.favorite":"Add to favorites","specialist.unfavorite":"Remove from favorites","specialist.site_link":"Personal site","favorites.specialists.title":"Favourite specialists","favorites.specialists.empty":"No favourite specialists yet","nav.favorites":"Favourites","nav.schedule":"Schedule","nav.find_tasks":"Find Orders","schedule.title":"My Schedule","schedule.subtitle":"Mark the days when you are free or busy — clients will see your availability","schedule.available":"Available","schedule.busy":"Busy","schedule.unset":"Not set","schedule.click_hint":"← click to cycle status","schedule.range_mode":"Select range","schedule.range_from":"From {date} — select end date","schedule.click_to_set":"Click to set","schedule.free":"free","schedule.busy_count":"busy","schedule.free_days":"free days","schedule.googleCalendar":"Google Calendar","schedule.connectGoogle":"Connect Google Calendar","schedule.disconnectGoogle":"Disconnect","schedule.connectedAs":"Connected as","schedule.importFromGoogle":"Sync from Google","schedule.gcalConnected":"✓ Google Calendar connected","schedule.gcalError":"Google Calendar connection error","schedule.gcalImportDone":"Imported {n} days from Google Calendar","schedule.gcalAutoSyncNote":"Availability changes are automatically synced to Google Calendar","schedule.gcalConnectDesc":"Connect Google Calendar to automatically sync your availability","schedule.gcalDisconnectConfirm":"Disconnect Google Calendar?","find_tasks.title":"Find Orders","find_tasks.for_me":"For me","find_tasks.all":"All orders","find_tasks.by_category":"By category","find_tasks.list":"List","find_tasks.already_offered":"Offer sent","find_tasks.offer_now":"Make an offer","find_tasks.empty_for_me":"No tasks found in your categories","find_tasks.banner_hint":"Find tasks matching your portfolio categories","find_tasks.no_cards":"Create a specialist portfolio to see tasks matched to you","find_tasks.add_card":"Create portfolio","find_tasks.search":"Search tasks...","find_tasks.tasks_count":"tasks","footer.tagline":"The task platform for Greece","footer.rights":"All rights reserved.","app.download_title":"Download the CanHelp mobile app","app.download_desc":"All of CanHelp — always at your fingertips. Available for Android and iOS.","nav.pricing":"Pricing","pricing.title":"Pricing","pricing.subtitle":"Choose the right plan for you","pricing.role.customer":"Customer","pricing.role.specialist":"Specialist","pricing.free":"Free","pricing.per_month":"mo","pricing.duration":"Duration","pricing.days":"days","pricing.current_plan":"Your plan","pricing.popular":"Popular","pricing.choose":"Choose","pricing.your_plan":"Active plan","pricing.free_default":"Default","pricing.compare":"Compare features","pricing.feature":"Feature","pricing.faq_note":"Payment is deducted from your CanHelp balance. Top up available in Payments.","pricing.feat.messages":"Messages / day","pricing.feat.orders":"Orders / day","pricing.feat.contact_all":"Contact everyone","pricing.feat.view_phone":"View phone number","pricing.feat.show_contact":"Show contact info","pricing.feat.favorites":"Favorites","pricing.feat.verified_badge":"Verified badge","pricing.feat.google_calendar":"Google Calendar","pricing.feat.personal_site":"Personal site","pricing.feat.auto_response":"Auto-response","pricing.feat.auto_match":"Auto-match","pricing.feat.highlighted_reviews":"Highlighted reviews","pricing.feat.portfolio":"Portfolio items","pricing.feat.cards":"Specialist cards","pricing.feat.notify_tasks":"New task notifications","pricing.feat.video":"Video in portfolio","upgrade.available_in":"Available in","upgrade.cta":"Upgrade","dashboard.plan.title":"My Plan","dashboard.plan.expires":"Expires in {n} days","dashboard.plan.upgrade":"Upgrade plan","dashboard.plan.no_plan":"Free plan","dashboard.plan.messages":"Messages today","dashboard.plan.orders":"Orders today","dashboard.plan.limits":"Daily limits","dashboard.plan.features":"Features","dashboard.plan.stats":"Stats","dashboard.stats.cards":"Portfolios","dashboard.stats.maxCards":"Max portfolios","dashboard.stats.portfolioItems":"Portfolio items","dashboard.stats.maxPortfolioItems":"Max items","dashboard.stats.activeOffers":"Active offers","dashboard.stats.reviewsReceived":"Reviews","dashboard.stats.activeTasks":"Active tasks","dashboard.stats.completedTasks":"Completed","status.need_help":"I need help","status.active":"Active","status.toggle_on":"Enable","status.toggle_off":"Disable","fomo.missed_orders":"Missed {n} orders","fomo.missed_value":"Worth €{v}","fomo.upgrade_hint":"Upgrade to receive more orders","fomo.conversion":"Task conversion","fomo.active":"Active","fomo.with_offers":"With offers","fomo.completed":"Completed","fomo.already_offered":"{n} specialists have already responded","fomo.specialist_missed":"You missed {n} orders","fomo.top_categories":"Categories","fomo.offers_received":"offers received","fomo.avg_offers":"Avg {n}/task","fomo.completion_rate":"completed","task.auto_match":"Auto-match","task.auto_match_results":"Top specialists","task.no_offer_yet":"You haven't sent an offer yet","task.make_offer":"Send offer","auto_response.title":"Auto-Response","auto_response.enabled":"Enable auto-response","auto_response.min_budget":"Min budget","auto_response.max_budget":"Max budget","auto_response.default_price":"Default price","auto_response.default_message":"Default message","auto_response.max_per_day":"Max auto-offers per day","auto_response.save":"Save","auto_response.saved":"Saved","auto_response.categories":"Categories","auto_response.locations":"Locations","profile.personal_site":"Personal Site","profile.site_slug":"URL slug","profile.site_slug_hint":"Only latin letters, numbers, - and _","profile.site_open":"Open site","profile.site_preview":"Your site","profile.show_contact":"Show contact info","profile.show_contact_hint":"Customers with Pro/Ultimate plans will see your phone number","gcal.upgrade_required":"Google Calendar requires a Pro or Ultimate plan","chat.limit_warning":"{n} messages left today","chat.limit_reached":"Message limit reached. Upgrade your plan","chat.upgrade":"Upgrade","site.member_since":"Member since","site.rating":"Rating","site.completed_tasks":"Completed","site.languages":"Languages","site.photos":"photos","site.contact_form":"Get in touch","site.contact_sent":"Message sent!","site.contact_sent_desc":"The specialist will contact you soon","site.contact_name":"Name","site.contact_name_ph":"Your name","site.contact_email_ph":"your@email.com","site.contact_message":"Message","site.contact_message_ph":"Describe your task...","site.contact_send":"Send","site.share":"Share","site.speaks_languages":"Speaks","site.message_sent":"Message sent!","site.message_sent_desc":"The specialist will receive it in the chat","site.message_placeholder":"Write your message...","site.write_to_chat":"Write to chat","site.auth_required_title":"Sign in required","site.auth_required_desc":"To write in the chat, you need to sign in to your CanHelp account.","site.auth_login_btn":"Sign in","site.auth_contact_form_btn":"Contact via feedback form","specialist.services":"Services","portfolio.title":"Portfolio","status.can_help_now":"Available now","common.not_found":"Page not found","common.anonymous":"Anonymous"},ru:{"footer.slogan":"Ваша задача — наша забота! Решаем любые вопросы быстро и удобно.","footer.links":"Ссылки","footer.socials":"Мы в соцсетях","nav.home":"Главная","nav.tasks":"Задачи","nav.post":"+ Опубликовать","nav.dashboard":"Панель управления","nav.chat":"Сообщения","nav.notifications":"Уведомления","nav.profile":"Профиль","nav.admin":"Админка","nav.specialists":"Специалисты","nav.new_task":"Новая задача","nav.login":"Войти","nav.register":"Регистрация","nav.logout":"Выйти","hero.title":"Найди специалиста для любой работы","hero.subtitle":"Опубликуй задачу, получи предложения и выбери лучшего профессионала","hero.cta.post":"Опубликовать задачу","hero.cta.browse":"Найти работу","hero.search.placeholder":"Что нужно? напр. электрик, уборка...","stats.specialists":"специалистов","stats.tasks":"задач","stats.categories":"категорий","stats.free":"бесплатная регистрация","section.categories":"Создай задачу в любой категории","section.how":"Как это работает","section.recent":"Последние задачи","section.all":"Смотреть все →","section.more":"ещё","section.cities":"Города и районы","section.community":"Общественный проект для всех","community.subtitle":"CanHelp — не просто маркетплейс, это сообщество взаимопомощи. Любой, у кого есть знания или навык, может найти клиента. Любой, у кого есть задача, может найти специалиста.","community.point1.title":"Умеете что-то делать?","community.point1.desc":"Ремонт, репетиторство, дизайн, переводы, уход — каждый навык имеет ценность. Создайте профиль и находите клиентов рядом с вами.","community.point2.title":"Нужна помощь?","community.point2.desc":"Опубликуйте задачу за минуту и получайте предложения от проверенных специалистов в вашем городе.","community.point3.title":"Помогите проекту расти","community.point3.desc":"CanHelp развивается благодаря сообществам. Поделитесь ссылкой с друзьями и знакомыми — вместе мы строим что-то полезное для всех.","community.share":"Поделиться с друзьями","community.share.copied":"Ссылка скопирована!","section.referral":"Реферальная программа","referral.home.subtitle":"Поделитесь ссылкой — каждый новый пользователь, зарегистрировавшийся по ней, принесёт вам награду.","referral.home.step1.title":"Зарегистрируйтесь и получите ссылку","referral.home.step1.desc":"Создайте аккаунт и найдите свою уникальную реферальную ссылку в профиле.","referral.home.step2.title":"Поделитесь с друзьями","referral.home.step2.desc":"Отправьте ссылку друзьям, знакомым или опубликуйте в социальных сетях.","referral.home.step3.title":"Получайте награды","referral.home.step3.desc":"Как только друг подтвердит email, вы автоматически получите свою награду.","referral.home.cta":"Получить ссылку","referral.home.badge":"Реферальная программа","section.faq":"Частые вопросы","faq.q1":"Как работает CanHelp?","faq.a1":"Опубликуйте задачу, получите предложения от специалистов, выберите лучшего и начните сотрудничество. Это быстро, просто и бесплатно для клиентов.","faq.q2":"Сколько стоит использование платформы?","faq.a2":"Регистрация и публикация задач полностью бесплатны для клиентов. Специалисты имеют доступ к бесплатному плану, а также к премиум-опциям.","faq.q3":"Как стать специалистом?","faq.a3":"Зарегистрируйтесь, перейдите в \xabСтать специалистом\xbb, заполните профиль навыками и категориями и начните получать задачи.","faq.q4":"Как выбрать подходящего специалиста?","faq.a4":"Оцените отзывы, опыт, навыки и портфолио каждого специалиста. Общайтесь через чат платформы и уточняйте детали до принятия решения.","faq.q5":"Что если я не доволен результатом?","faq.a5":"Вы можете оставить отзыв о специалисте и поставить оценку от 1 до 5 звёзд. Отзывы помогают другим пользователям выбирать проверенных профессионалов.","faq.q6":"Можно ли связаться со специалистом до принятия предложения?","faq.a6":"Да. Как только вы получили предложение, можно открыть чат со специалистом, задать вопросы и уточнить все детали до принятия решения.","faq.q7":"Сколько времени ждать предложений?","faq.a7":"Как правило, в течение нескольких часов. Специалисты получают уведомление о новых задачах и могут быстро ответить.","faq.q8":"Можно ли разместить задачу в любом городе Греции?","faq.a8":"Да! CanHelp охватывает всю Грецию — Афины, Фессалоники, Патры и другие города.","faq.q9":"Какие виды задач есть на CanHelp?","faq.a9":"Ремонт, уборка, электрики, репетиторство, дизайн, IT, переезды, красота и многое другое. Категории постоянно расширяются.","faq.q10":"Есть ли мобильное приложение?","faq.a10":"Да! CanHelp доступно для Android и iOS. Скачайте приложение и управляйте всем со своего телефона.","how.step1.title":"Опубликуй задачу","how.step1.desc":"Опиши что нужно и установи бюджет","how.step2.title":"Получи предложения","how.step2.desc":"Специалисты пришлют предложения с ценой и сроками","how.step3.title":"Выбери и начни","how.step3.desc":"Выбери лучшего профессионала и начни сотрудничество","tasks.title":"задач","tasks.filters":"Фильтры","tasks.search":"Поиск","tasks.search.placeholder":"Название или ключевое слово...","tasks.search.btn":"Поиск","tasks.publish":"Опубликовать","tasks.category.all":"Все","tasks.category.all_in":"Все в","tasks.category.label":"Категория","tasks.location.label":"Город","tasks.location.placeholder":"напр. Афины","tasks.empty":"Задачи не найдены","tasks.empty.cta":"Опубликуй первую","task.status.open":"Открыта","task.status.in_progress":"В работе","task.status.completed":"Завершена","task.status.cancelled":"Отменена","task.status.draft":"Черновик","task.budget":"Бюджет","task.location":"Местоположение","task.deadline":"Дата начала","task.created_at":"Создано","task.customer":"Заказчик","task.offer.btn":"Отправить предложение","task.invite.banner_title":"Вас пригласили на это задание","task.invite.banner_hint":"Заказчик лично пригласил вас","task.invite.accept":"Отправить предложение","task.invite.decline":"Отказаться","offer.accept":"Принять","offer.decline":"Отклонить","task.complete":"Завершить задачу","task.complete.confirm":"Отметить задачу как выполненную?","task.edit":"Редактировать","task.status_label":"Статус","task.yours":"Ваша задача","task.offer.yours":"Ваше предложение","review.leave":"Оставить отзыв","review.rating":"Оценка","review.comment":"Комментарий","review.comment.placeholder":"Расскажите о своём опыте...","review.submit":"Отправить отзыв","review.submitting":"Отправка...","review.done":"Отзыв отправлен!","profile.reviews":"Отзывы","profile.no_reviews":"Отзывов пока нет","profile.rating":"Рейтинг","profile.skills.label":"Навыки","profile.member_since":"Участник с","task.offers":"Предложения","task.offers.none":"Предложений пока нет","create.title":"Опубликовать задачу","create.field.title":"Название","create.field.description":"Описание","create.field.category":"Категория","create.field.category.select":"Выберите...","create.field.location":"Местоположение","create.field.location.any":"Где угодно","create.field.location.all":"Весь город","create.field.budget":"Бюджет (€)","create.field.deadline":"Дата начала","create.field.budget_negotiable":"Цена обсуждается","create.field.time_slot":"Время выполнения","create.field.time_slot.any":"В любое время","create.field.time_slot.morning":"Утром (08:00–13:00)","create.field.time_slot.afternoon":"Днём (13:00–18:00)","create.field.time_slot.evening":"Вечером (18:00–22:00)","create.field.time_slot.weekend":"Выходной","create.field.address":"Адрес (необязательно)","create.field.address.district":"Квартал","create.field.address.street":"Улица","create.field.address.house":"Дом","create.field.confidential":"Конфиденциальная заметка","create.field.confidential.placeholder":"Детали, видные только назначенному специалисту...","create.field.confidential.hint":"Не отображается публично","create.field.photos":"Фотографии","create.field.photos.add":"Добавить фото","create.field.photos.uploading":"Загрузка...","task.budget_negotiable":"Цена обсуждается","task.time_slot":"Время","task.confidential":"Конфид. заметка","create.field.title.placeholder":"напр. Уборка квартиры 80кв","create.field.description.placeholder":"Подробно опишите что нужно...","create.field.location.placeholder":"напр. Афины, Колонаки","create.field.budget.placeholder":"напр. 100","create.submit":"Опубликовать задачу","create.submitting":"Публикация...","login.title":"Добро пожаловать","login.subtitle":"Вход в CanHelp","login.email":"Email","login.password":"Пароль","login.submit":"Войти","login.submitting":"Вход...","login.error":"Неверный email или пароль","login.unverified.title":"Подтвердите ваш email","login.unverified.desc":"Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.","login.unverified.resend":"Отправить письмо повторно","login.unverified.sending":"Отправка...","login.unverified.sent":"✓ Отправлено — проверьте входящие","profile.email.verified":"Email подтверждён","profile.email.not_verified":"Email не подтверждён","login.no_account":"Нет аккаунта?","login.register_link":"Зарегистрироваться","login.forgot_password":"Забыл пароль?","login.or_continue_with":"или продолжите через","login.continue_google":"Войти через Google","forgot.title":"Забыл пароль","forgot.subtitle":"Введите email для получения ссылки восстановления","forgot.email":"Email","forgot.submit":"Отправить ссылку","forgot.submitting":"Отправка...","forgot.sent.title":"Проверьте входящие","forgot.sent.desc":"Если аккаунт с таким email существует, мы отправим ссылку для сброса пароля.","forgot.back_to_login":"Вернуться ко входу","forgot.error":"Не удалось отправить ссылку. Проверьте адрес и попробуйте снова.","forgot.error.not_found":"Аккаунт с таким email не найден.","forgot.error.send_failed":"Ошибка отправки письма. Попробуйте позже.","reset.title":"Новый пароль","reset.subtitle":"Введите новый пароль","reset.password":"Новый пароль","reset.confirm":"Подтвердите пароль","reset.submit":"Изменить пароль","reset.submitting":"Сохранение...","reset.success":"Пароль успешно изменён. Перенаправление ко входу...","reset.back_to_login":"Вернуться ко входу","reset.error.mismatch":"Пароли не совпадают","reset.error.invalid":"Недействительная или устаревшая ссылка. Запросите новую.","register.title":"Регистрация","register.subtitle":"Создать аккаунт в CanHelp","register.first_name":"Имя","register.last_name":"Фамилия","register.email":"Email","register.password":"Пароль (мин. 8 символов)","register.role":"Роль","register.role.customer":"Пользователь","register.role.customer.desc":"Публикую задачи","register.role.specialist":"Специалист","register.role.specialist.desc":"Беру задачи","register.submit":"Создать аккаунт","register.submitting":"Регистрация...","register.has_account":"Уже есть аккаунт?","register.login_link":"Войти","register.continue_google":"Зарегистрироваться через Google","register.check_email.title":"Проверьте почту","register.check_email.desc":"Мы отправили ссылку для подтверждения на ваш email. Проверьте входящие (или спам) и перейдите по ссылке.","register.check_email.login":"Вернуться к входу","dashboard.title":"Панель управления","dashboard.new_task":"+ Новая задача","dashboard.my_tasks":"Мои задачи","dashboard.my_offers":"Мои предложения","dashboard.invitations":"Приглашения на задания","dashboard.offers_count":"предл.","dashboard.declined_count":"откл.","dashboard.completed_tasks":"Завершённые задачи","dashboard.completed_offers":"Завершённые предложения","dashboard.review_pending":"Оценка ещё не оставлена","tasks.new.top_specialists":"Топ специалисты","tasks.new.select_category":"Выберите категорию, чтобы увидеть специалистов","tasks.new.invite":"Предложить работу","tasks.new.invited":"Выбран ✓","reviews.count":"отзывов","filter.location":"Локация","filter.language":"Языки","filter.language.any":"Любой язык","filter.category.all":"Все категории","user.categories":"Категории","user.work_area":"Район работы","dashboard.tasks.empty":"Вы не публиковали задачи","dashboard.tasks.empty.cta":"Опубликуйте первую","dashboard.tasks.add_new":"Добавить новую задачу","dashboard.offers.empty":"Вы не отправляли предложений","dashboard.offers.empty.cta":"Найти задачи","dashboard.customer.specialists_title":"Ищете исполнителя?","dashboard.customer.specialists_hint":"Просматривайте профили специалистов, читайте отзывы и приглашайте их на свои задачи","dashboard.customer.specialists_cta":"Найти исполнителя","dashboard.customer.how_title":"Как это работает","dashboard.customer.step1":"Создайте задачу с описанием и бюджетом","dashboard.customer.step2":"Специалисты пришлют предложения с ценой и сроками","dashboard.customer.step3":"Выберите подходящего и начните работу","notif.title":"Уведомления","notif.mark_all":"Отметить все как прочитанные","notif.empty":"Нет уведомлений","notif.type.new_offer":"Новое предложение","notif.type.offer_accepted":"Ваше предложение принято","notif.type.offer_declined":"Ваше предложение отклонено","notif.type.task_completed":"Задание выполнено","notif.type.task_cancelled":"Задание отменено","notif.type.new_message":"Новое сообщение","notif.type.new_review":"Новый отзыв","notif.type.task_invite":"Приглашение на задание","notif.body.new_offer":"Новое предложение на \xab{title}\xbb","notif.body.offer_accepted":"Ваше предложение на \xab{title}\xbb принято","notif.body.offer_declined":"Ваше предложение на \xab{title}\xbb отклонено","notif.body.task_invite":"Вас приглашают на \xab{title}\xbb","notif.body.new_review":"Вы получили оценку {rating}★","offer.status.pending":"Ожидает","offer.status.accepted":"Принято","offer.status.declined":"Отклонено","offer.status.withdrawn":"Отозвано","offer.status.other_accepted":"Выбран другой исполнитель","common.loading":"Загрузка...","common.error":"Ошибка","common.save":"Сохранить","common.saving":"Сохранение...","common.cancel":"Отмена","common.add":"Добавить","common.close":"Закрыть","common.edit":"Редактировать","common.delete":"Удалить","common.from":"от","common.currency":"€","common.greece":"Греция","chat.connected":"Подключено","chat.disconnected":"Отключено","chat.no_rooms":"Переписок пока нет","chat.task_fallback":"Задача","chat.select":"Выберите переписку","chat.no_messages":"Сообщений пока нет","chat.placeholder":"Напишите сообщение... (Enter для отправки)","chat.conversation_fallback":"Переписка","chat.direct_chat":"Личный чат","chat.linked_task":"Прикреплённый заказ","chat.write_btn":"Написать","chat.just_now":"только что","chat.min_ago":"м","chat.write_specialist":"Написать специалисту","chat.write_customer":"Написать заказчику","chat.notif_settings":"Настройки уведомлений","chat.notif_messages":"Уведомления о новых сообщениях","chat.toast_title":"Новое сообщение","chat.toast_open":"Открыть чат","offer.price":"Цена","offer.price.placeholder":"напр. 80","offer.customer_budget":"Бюджет заказчика","offer.message":"Сообщение","offer.optional":"необязательно","offer.message.placeholder":"Представьтесь, расскажите об опыте и почему вы лучший выбор...","offer.submitting":"Отправка...","profile.photo":"Фото профиля","profile.photo.change":"Изменить фото","profile.photo.hint":"JPEG, PNG, WebP \xb7 до 5MB","profile.basic_info":"Основная информация","profile.phone":"Телефон","profile.phone.placeholder":"+30 6901234567","profile.bio":"Краткое описание","profile.bio.placeholder":"Расскажите немного о себе...","profile.language":"Язык","profile.language.hint":"Язык интерфейса и email-уведомлений","profile.languages":"Языки общения","profile.languages.hint":"Выберите все языки, на которых вы общаетесь","profile.skills":"Навыки","profile.skills.subtitle":"Добавьте услуги, которые вы предлагаете","profile.skills.placeholder":"напр. Уборка, IT, Репетиторство...","profile.role":"Роль аккаунта","profile.role.specialist":"\uD83D\uDD27 Специалист","profile.role.admin":"\uD83D\uDC51 Admin","profile.role.customer":"\uD83D\uDC64 Пользователь","profile.role.change":"Для смены роли обратитесь в службу поддержки.","profile.become_specialist":"Стать специалистом","profile.become_specialist.desc":"Перейдите в роль специалиста, чтобы брать задачи и наполнить профиль.","become_specialist.hero.title":"Зарабатывай, делая то, что умеешь","become_specialist.hero.subtitle":"Создай профиль специалиста и получай заказы от клиентов по всей Греции","become_specialist.how.title":"Как это работает","become_specialist.step1.title":"Создай портфолио специалиста","become_specialist.step1.desc":"Укажи категории, навыки и зону покрытия — система автоматически подберёт подходящие заказы","become_specialist.step2.title":"Ищи заказы","become_specialist.step2.desc":"Просматривай задачи по своим категориям в разделе \xabПоиск заказов\xbb","become_specialist.step3.title":"Откликайся и зарабатывай","become_specialist.step3.desc":"Отправляй предложения с ценой и сроками, общайся с клиентами и выполняй заказы","become_specialist.benefits.title":"Преимущества профиля специалиста","become_specialist.benefit1":"Поиск заказов по вашим категориям и локации","become_specialist.benefit2":"Публичный профиль с отзывами клиентов","become_specialist.benefit3":"Расписание доступности, видимое клиентам","become_specialist.benefit4":"Добавление в избранное клиентами","become_specialist.cta":"Стать специалистом — это бесплатно","become_specialist.free_badge":"Бесплатная регистрация","profile.tab.notifications":"Уведомления","profile.tab.reviews":"Отзывы","profile.tab.referral":"Рефералы","profile.tab.auto_response":"Авто-ответ","profile.tab.site":"Сайт","profile.site.title":"Персональная страница","profile.site.url_label":"Личный сайт","profile.site.copy":"Копировать","profile.site.copied":"Скопировано","profile.site.visible_title":"Что отображается на вашей странице","profile.site.visible.name":"Имя и фото","profile.site.visible.bio":"Биография","profile.site.visible.rating":"Рейтинг и отзывы","profile.site.visible.portfolio":"Портфолио / Карточки","profile.site.visible.contacts":"Контактные данные","profile.site.visible.full_last_name":"Фамилия полностью","profile.site.visible.services":"Карточки услуг","profile.site.visible.reviews":"Раздел с отзывами","profile.site.visible.status":"Статус \xabГотов помочь\xbb","profile.site.theme":"Тема оформления","profile.site.theme.dark":"Тёмная","profile.site.theme.light":"Светлая","profile.site.slug_taken":"Этот адрес уже занят","profile.site.stats.title":"Аналитика сайта","profile.site.stats.days":"последние 30 дней","profile.site.stats.views":"Просмотры","profile.site.stats.unique":"Уникальные посетители","profile.site.stats.messages":"Сообщения","profile.site.stats.total_views":"Просмотры","profile.site.stats.total_unique":"Уник. посетители","profile.site.stats.total_messages":"Сообщения","profile.site.stats.empty":"Данных пока нет","profile.site.stats.loading":"Загрузка аналитики...","profile.site.stats.no_slug":"Укажите адрес сайта, чтобы видеть статистику","profile.site.edit_bio_hint":"Биография и фото настраиваются во вкладке \xabОсновное\xbb.","status.title":"Статус","status.can_help_now_hint":"Ваша карточка показывается выше в поиске","status.need_help_hint":"Специалисты могут предложить вам помощь","profile.referral.title":"Партнёрская программа","profile.referral.desc":"Поделитесь ссылкой и получайте награду за каждого привлечённого пользователя.","profile.referral.link_label":"Ваша реферальная ссылка","profile.referral.copy":"Копировать","profile.referral.copied":"Скопировано!","profile.referral.invited_count":"успешных приглашений","profile.referral.no_code":"Реферальный код недоступен.","notifications.title":"Настройки уведомлений","notifications.email.new_tasks":"Email о новых заказах","notifications.email.new_tasks.desc":"Получать email, когда в ваших категориях публикуется новый заказ","notifications.messages.desc":"Получать уведомление при новом входящем сообщении","notifications.saved":"Настройки сохранены","notifications.plan_required":"Недоступно в вашем тарифе","profile.tab.info":"Основное","profile.tab.finance":"Финансы","profile.tab.skills":"Навыки","profile.tab.categories":"Категории","profile.tab.geography":"География","profile.specialist.categories":"Категории работ","profile.specialist.categories.desc":"Выберите категории, в которых вы работаете","profile.specialist.geography":"Города покрытия","profile.specialist.geography.desc":"Выберите города / районы, где вы работаете","profile.saving":"Сохранение...","profile.upload.error":"Ошибка загрузки фото","profile.saved":"Сохранено","profile.tab.cards":"Портфолио","profile.cards.count":"Портфолио","profile.cards.add":"Добавить портфолио","profile.cards.new_title":"Название нового портфолио","profile.cards.placeholder":"Например: Сантехника","profile.cards.create":"Создать","profile.cards.cancel":"Отмена","profile.cards.empty":"У вас нет портфолио","profile.cards.create_first":"Создать первое портфолио","profile.cards.delete_confirm":"Удалить портфолио?","profile.card.tab.main":"Основное","profile.card.tab.skills":"Навыки","profile.card.tab.categories":"Категории","profile.card.tab.geography":"География","profile.card.tab.portfolio":"Галерея","profile.card.active":"Активна","profile.card.save":"Сохранить","profile.card.saved":"Сохранено","profile.card.delete":"Удалить","profile.card.skill.add":"Добавить навык","profile.card.photo.add":"Добавить фото","profile.card.photo.uploading":"Загрузка...","profile.card.photo.empty":"Нет фотографий","profile.card.item.title":"Заголовок","profile.card.item.desc":"Описание","profile.card.item.save":"Сохранить","profile.card.item.cancel":"Отмена","profile.card.item.edit":"Описание работы","profile.upgrade.cards_limit":"Лимит портфолио исчерпан","profile.upgrade.plan":"Текущий тариф:","profile.upgrade.contact":"Обратитесь к администратору для смены тарифа","profile.upgrade.ok":"Понятно","profile.plan.title":"Тарифный план","profile.balance":"Баланс","profile.balance.topup":"Пополнить баланс","profile.balance.topup.title":"Пополнить баланс","profile.balance.topup.amount":"Сумма (в EUR)","profile.balance.topup.hint":"Выберите сумму или введите вручную","profile.balance.topup.submit":"Перейти к оплате","profile.balance.topup.loading":"Перенаправление...","profile.balance.topup.error":"Ошибка инициализации платежа. Попробуйте снова.","payment.success.title":"Оплата прошла успешно!","payment.success.desc":"Ваш баланс обновлён.","payment.cancelled.title":"Оплата отменена","payment.cancelled.desc":"Оплата была отменена. Средства не списаны.","payment.pending.title":"Обрабатывается...","payment.pending.desc":"Ваш платёж в обработке.","payment.back_to_profile":"Вернуться в профиль","profile.plan.basic":"Базовый (бесплатный)","profile.plan.contact_upgrade":"Обратитесь к администратору для подключения тарифа","profile.plan.cards_up_to":"Портфолио: до","profile.plan.cards_unlimited":"Портфолио: безлимитно","profile.plan.tasks_up_to":"Задач: до","profile.plan.offers_up_to":"Откликов: до","profile.plan.valid_until":"Действителен до","profile.plan.no_expiry":"Бессрочно","create.error":"Ошибка при публикации","tasks.category.general":"Общее","tasks.budget.range":"Диапазон:","tasks.budget.from":"от","tasks.budget.to":"до","tasks.filter.reset":"Сбросить фильтры","tasks.load_more":"Загрузить ещё","tasks.showing":"Результатов:","tasks.field.budget":"Бюджет, €","admin.title":"Панель администратора","admin.tab.stats":"Статистика","admin.tab.users":"Пользователи","admin.tab.tasks":"Задачи","admin.tab.reports":"Жалобы","admin.stats.users":"Пользователи","admin.stats.tasks":"Задачи","admin.stats.offers":"Предложения","admin.stats.reviews":"Отзывы","admin.tasks.by_status":"Задачи по статусу","admin.col.user":"Пользователь","admin.col.email":"Email","admin.col.role":"Роль","admin.col.registered":"Регистрация","admin.col.status":"Статус","admin.col.title":"Название","admin.col.budget":"Бюджет","admin.col.created":"Создано","admin.users.active":"Активен","admin.users.inactive":"Неактивен","admin.users.deactivate":"Деактивировать","admin.users.activate":"Активировать","admin.tasks.cancel":"Отменить","admin.reports.none":"Жалоб нет","admin.reports.reviewed":"Рассмотрено","admin.reports.dismiss":"Отклонить","admin.pagination.total":"Всего","admin.users.role.change":"Изменить роль","admin.users.search.placeholder":"Поиск по имени или email...","admin.tasks.delete":"Удалить","admin.tasks.delete.confirm":"Удалить эту задачу навсегда?","admin.tasks.search.placeholder":"Поиск по названию...","admin.col.customer":"Заказчик","admin.col.reporter":"Жалобщик","admin.col.target":"Цель","admin.filter.all_roles":"Все роли","admin.filter.all_statuses":"Все статусы","admin.reports.target.task":"Задача","admin.reports.target.user":"Пользователь","admin.tab.categories":"Категории","admin.tab.locations":"Города и районы","admin.tab.logs":"Логи","admin.tab.plans":"Тарифы","admin.tab.settings":"Настройки","admin.logs.subtab.ai":"AI логи","admin.logs.subtab.activity":"Активность","admin.logs.subtab.mail":"Mail","admin.logs.subtab.notifications":"Уведомления","admin.notif_logs.type":"Тип","admin.notif_logs.title":"Заголовок","admin.notif_logs.read":"Прочитано","admin.notif_logs.empty":"Логи уведомлений пусты","admin.stats.notif_chart_title":"Уведомления по дням","admin.stats.notif_label":"Уведомления","admin.stats.mail_chart_title":"Email по дням","admin.stats.mail_label":"Emails","admin.filter.all":"Все","admin.stats.specialists":"Исполнители","admin.col.plan":"Тариф","admin.back_home":"На главную","admin.plans.title":"Тарифные пакеты","admin.plans.add":"+ Добавить тариф","admin.plans.empty":"Тарифы не созданы","admin.plans.form.new":"Новый тариф","admin.plans.form.edit":"Редактировать тариф","admin.plans.form.name":"Название","admin.plans.form.price":"Цена (EUR)","admin.plans.form.old_price":"Старая цена (EUR, необязательно)","admin.plans.form.max_offers":"Макс. откликов (пусто = без лимита)","admin.plans.form.max_cards":"Макс. портфолио (пусто = без лимита)","admin.plans.form.duration_days":"Срок (дней, пусто = без истечения)","admin.plans.form.description":"Описание","admin.plans.form.features":"Возможности (по одной на строку)","admin.plans.form.notify":"Уведомления о новых заказах","admin.plans.form.default":"По умолчанию","admin.plans.form.active":"Активен","admin.plans.form.order":"Порядок","admin.plans.form.role":"Роль","admin.plans.form.tier":"Уровень","admin.plans.form.role.customer":"Заказчик","admin.plans.form.role.specialist":"Специалист","admin.plans.form.tier.free":"Бесплатный","admin.plans.form.tier.pro":"Pro","admin.plans.form.tier.ultimate":"Ultimate","admin.plans.form.section.limits":"Лимиты (пусто = без ограничений)","admin.plans.form.max_messages_day":"Макс. сообщений/день","admin.plans.form.max_orders_day":"Макс. заказов/день","admin.plans.form.max_skills":"Макс. навыков","admin.plans.form.max_profiles":"Макс. профилей","admin.plans.form.max_portfolio":"Макс. элементов портфолио","admin.plans.form.section.boost":"Множители & Буст","admin.plans.form.search_boost":"Буст в поиске","admin.plans.form.offers_multiplier":"Множитель откликов","admin.plans.form.section.contact":"Права контактов","admin.plans.form.can_contact_free":"Контакт с бесплатными пользователями","admin.plans.form.can_contact_pro":"Контакт с Pro пользователями","admin.plans.form.can_contact_all":"Контакт со всеми","admin.plans.form.can_show_contact":"Показывать контакты","admin.plans.form.can_view_phone":"Просмотр телефона","admin.plans.form.section.features":"Возможности","admin.plans.form.upload_video":"Загрузка видео","admin.plans.form.favorites":"Избранное","admin.plans.form.google_calendar":"Google Calendar","admin.plans.form.verified_badge":"Знак верификации","admin.plans.form.highlighted_reviews":"Выделенные отзывы","admin.plans.form.personal_site":"Личный сайт","admin.plans.form.can_help_now":"Статус \xabМогу помочь\xbb","admin.plans.form.need_help":"Статус \xabНужна помощь\xbb","admin.plans.form.auto_response":"Автоответ","admin.plans.form.auto_match":"Автоподбор","admin.plans.form.instant_dispatch_free":"Мгновенная рассылка (бесплатно)","admin.plans.form.instant_dispatch_pro":"Мгновенная рассылка (Pro)","admin.plans.badge.default":"По умолчанию","admin.plans.badge.inactive":"Неактивен","admin.plans.make_default":"Сделать по умолчанию","admin.plans.tasks":"Задач","admin.plans.offers":"Откликов","admin.plans.cards":"Портфолио","admin.plans.notify_tasks":"Уведомления о заказах","admin.plans.delete.confirm":"Удалить тариф","admin.activity.title":"Журнал активности","admin.activity.event":"Событие","admin.activity.all_events":"Все события","admin.activity.from":"От","admin.activity.to":"До","admin.activity.reset":"Сбросить","admin.activity.total":"Всего","admin.activity.empty":"Нет записей","admin.mail.event":"Email событие","admin.mail.all_events":"Все email события","admin.mail.from":"От","admin.mail.to":"До","admin.mail.reset":"Сбросить","admin.mail.total":"Всего","admin.mail.empty":"Нет email логов","admin.mail.recipient":"Получатель","admin.mail.provider":"Провайдер","admin.mail.details":"Детали","admin.mail.status":"Статус","admin.mail.success":"Успешно","admin.mail.failed":"Ошибка","admin.event.email_sent":"Email отправлен","admin.event.email_failed":"Email не отправлен","admin.event.email_dev":"Email DEV fallback","admin.event.admin_email_test_sent":"Тестовый email отправлен","admin.event.admin_email_test_failed":"Тестовый email не отправлен","admin.logs.empty":"Нет записей","admin.logs.date":"Дата","admin.logs.provider":"Провайдер","admin.logs.model":"Модель","admin.logs.action":"Действие","admin.logs.langs":"Языки","admin.logs.in":"Вход","admin.logs.out":"Выход","admin.logs.total":"Итого","admin.logs.ms":"мс","admin.logs.status":"Статус","admin.stats.activity_30d":"Активность за 30 дней","admin.stats.tasks_label":"Заявки","admin.stats.users_label":"Пользователи","admin.stats.specialists_label":"Исполнители","admin.stats.tokens_title":"Расход токенов (по месяцам)","admin.stats.tokens_out":"Исходящие","admin.stats.tokens_in":"Входящие","admin.stats.tokens_out_label":"Исходящие токены","admin.stats.tokens_in_label":"Входящие токены","admin.stats.cost_label":"Стоимость (USD)","admin.stats.tasks_by_status":"Заявки по статусам","admin.task_status.open":"Открытые","admin.task_status.in_progress":"В работе","admin.task_status.completed":"Завершённые","admin.task_status.cancelled":"Отменённые","admin.task_status.draft":"Черновики","admin.settings.tab.general":"Общие","admin.settings.tab.smtp":"E-Mail","admin.settings.tab.notifications":"Уведомления","admin.settings.tab.payment":"Оплата","admin.settings.tab.referral":"Реферальная","admin.settings.tab.seo":"SEO","admin.settings.seo.title":"SEO и обслуживание","admin.settings.seo.maintenance_label":"Режим обслуживания","admin.settings.seo.maintenance_hint":"Показывать страницу обслуживания всем посетителям","admin.settings.seo.indexing_label":"Индексация поисковыми системами","admin.settings.seo.indexing_hint":"Разрешить поисковым системам индексировать сайт","admin.settings.seo.head_scripts_label":"Скрипты в (JS)","admin.settings.seo.head_scripts_hint":"Выполняется на каждой странице (Google Tag Manager, аналитика и т.д.)","admin.settings.seo.site_title_label":"Заголовок сайта","admin.settings.seo.site_description_label":"Описание сайта (meta description)","admin.settings.referral.title":"Партнёрская программа","admin.settings.referral.hint":"Награждайте пользователей, приводящих новых участников.","admin.settings.referral.enabled_label":"Включено","admin.settings.referral.enabled_hint":"Включить / отключить выдачу наград","admin.settings.referral.customer_section":"Для клиентов","admin.settings.referral.specialist_section":"Для специалистов","admin.settings.referral.plan_label":"Тарифный план за реферала","admin.settings.referral.no_plan":"— без плана —","admin.settings.referral.plan_hint":"Этот план будет назначен пригласившему. Если его текущий план выше — добавятся только дни.","admin.settings.referral.days_label":"Дней награды","admin.settings.referral.days_hint":"Количество дней, добавляемых к сроку действия плана.","admin.settings.general.title":"Общие настройки","admin.settings.general.site_name":"Название сайта","admin.settings.general.site_url":"URL сайта","admin.settings.general.contact_email":"Email для связи","admin.settings.general.support_phone":"Телефон поддержки","admin.settings.smtp.title":"Настройки SMTP сервера","admin.settings.smtp.hint":"Используется для отправки email-уведомлений.","admin.settings.smtp.host":"SMTP Хост","admin.settings.smtp.port":"Порт","admin.settings.smtp.encryption":"Шифрование","admin.settings.smtp.enc.none":"Нет","admin.settings.smtp.enc.tls":"STARTTLS (порт 587)","admin.settings.smtp.enc.ssl":"SSL/TLS (порт 465)","admin.settings.smtp.username":"Имя пользователя","admin.settings.smtp.password":"Пароль / App Password","admin.settings.smtp.from_name":"Имя отправителя","admin.settings.smtp.from_email":"Email отправителя","admin.settings.smtp.test":"Отправить тестовый email","admin.settings.smtp.sending":"Отправка...","admin.settings.payment.hint":"Данные для подключения к ePay Piraeus Bank.","admin.settings.env.test":"Тест (sandbox)","admin.settings.env.prod":"Боевой режим","admin.settings.env.label":"Среда","admin.settings.merchant_id":"Merchant ID","admin.settings.api_user":"API User","admin.settings.api_password":"API Password","admin.settings.confirm_url":"Confirmation URL (webhook)","admin.settings.cancel_url":"Cancel URL","admin.settings.active":"Активен","admin.settings.saving":"Сохранение...","admin.settings.saved":"Сохранено","admin.notif.vars_hint":"Доступные переменные в шаблонах","admin.notif.tmpl.not_set":"Шаблон не настроен","admin.notif.tmpl.subject_label":"Тема письма","admin.notif.tmpl.body_label":"Текст письма (HTML)","admin.notif.tmpl.save":"Сохранить","admin.notif.tmpl.close":"Закрыть","admin.notif.tmpl.translate":"Авто-перевод на другие языки","admin.notif.tmpl.translating":"Перевод...","admin.notif.tmpl.saving":"Сохранение...","admin.notif.email_verification":"Подтверждение email адреса","admin.notif.registration_success":"Успешная регистрация","admin.notif.password_reset":"Восстановление пароля","admin.notif.new_offer":"Новое предложение","admin.notif.new_task":"Новая задача","admin.notif.offer_accepted":"Предложение принято","admin.notif.new_message":"Новое сообщение","admin.notif.offer_declined":"Отклонение предложения","admin.notif.offer_other_accepted":"Выбран другой исполнитель","admin.notif.task_updated":"Изменение задания","admin.notif.deadline_reminder":"Напоминание о дедлайне","admin.notif.task_archived":"Автоснятие задания","admin.notif.referral_reward":"Реферальная награда","admin.email_template.plan_activated":"Тарифы — активация тарифа","admin.email_template.plan_upgraded":"Тарифы — повышение тарифа","admin.email_template.plan_downgrade_scheduled":"Тарифы — запланированное понижение","admin.email_template.plan_downgrade_applied":"Тарифы — применение понижения","admin.email_template.plan_renewal_reminder":"Тарифы — напоминание о продлении","admin.email_template.plan_insufficient_funds":"Тарифы — нехватка средств","pricing.confirm.title":"Подтвердите выбор тарифа","pricing.confirm.plan":"Тариф","pricing.confirm.prorated":"Зачёт остатка","pricing.confirm.effective_price":"К оплате","pricing.confirm.your_balance":"Ваш баланс","pricing.confirm.downgrade_info":"Переход на новый тариф произойдёт автоматически после окончания текущего периода.","pricing.confirm.insufficient":"Недостаточно средств на балансе.","pricing.confirm.top_up":"Пополнить","pricing.confirm.schedule_downgrade":"Запланировать переход","pricing.confirm.pay":"Оплатить","admin.user_edit.title":"Редактирование пользователя","admin.user_edit.email":"Email","admin.user_edit.id":"ID","admin.user_edit.registered":"Регистрация","admin.user_edit.last_seen":"Последний визит","admin.user_edit.lang":"Язык","admin.user_edit.first_name":"Имя","admin.user_edit.last_name":"Фамилия","admin.user_edit.phone":"Телефон","admin.user_edit.bio":"О себе","admin.user_edit.role":"Роль","admin.user_edit.plan":"Тариф","admin.user_edit.no_plan":"— Без тарифа —","admin.user_edit.active":"Активный аккаунт","admin.user_edit.balance":"Баланс (EUR)","admin.user_edit.skills":"Навыки","admin.user_edit.tab.profile":"Профиль","admin.user_edit.tab.account":"Аккаунт","admin.user_edit.tab.balance":"Баланс","admin.user_edit.tab.settings":"Настройки","admin.user_edit.tab.specialist":"Портфолио","admin.user_edit.tab.site":"Сайт","admin.user_edit.plan_expires":"Тариф истекает","admin.user_edit.interface_lang":"Язык интерфейса","admin.user_edit.comm_languages":"Языки общения","admin.user_edit.personal_site_slug":"Персональная страница","admin.user_edit.show_contact_info":"Показывать контакты","admin.user_edit.show_contact_info.hint":"Видно заказчикам","admin.user_edit.notify_new_tasks":"Уведомлять о новых задачах","admin.user_edit.notify_new_tasks.hint":"Push и email уведомления","admin.user_edit.notif_messages":"Уведомления о сообщениях","admin.user_edit.notif_messages.hint":"Новые сообщения в чате","admin.user_edit.site_settings":"Настройки персональной страницы","admin.user_edit.categories":"Категории услуг","admin.user_edit.locations":"Районы обслуживания","admin.user_edit.skill_placeholder":"Новый навык...","admin.user_edit.add_category":"— Выберите категорию —","admin.user_edit.add_location":"— Выберите район —","admin.user_edit.specialist_cards":"Портфолио специалиста","admin.user_edit.no_cards":"Портфолио не найдено","admin.user_edit.card_title":"Заголовок портфолио","admin.user_edit.card_description":"Описание","admin.balance.topup.btn":"Пополнить","admin.balance.withdraw.btn":"Списать","admin.balance.modal_hint":"Изменения применяются сразу и фиксируются в истории","admin.balance.topup.title":"Пополнение баланса","admin.balance.topup.amount":"Сумма","admin.balance.topup.description":"Комментарий","admin.balance.topup.description.placeholder":"Например: бонус или ручное пополнение","admin.balance.topup.submit":"Пополнить баланс","admin.balance.withdraw.title":"Снятие баланса","admin.balance.withdraw.amount":"Сумма","admin.balance.withdraw.description":"Комментарий","admin.balance.withdraw.description.placeholder":"Например: возврат или ручное списание","admin.balance.withdraw.submit":"Списать баланс","admin.user_edit.role.customer":"Заказчик","admin.user_edit.role.specialist":"Исполнитель","admin.user_edit.role.admin":"Администратор","common.refresh":"Обновить","common.back_home":"На главную","admin.loc.hint":"Управление городами и районами","admin.loc.add_city":"Новый город","admin.loc.add_district":"Добавить район","admin.loc.new":"Новая локация","admin.loc.edit":"Редактировать локацию","admin.loc.district":"район","admin.loc.empty":"Нет локаций","admin.loc.delete.confirm":"Удалить локацию? Все районы также будут удалены.","admin.cat.add_root":"Новая категория","admin.cat.add_sub":"Подкатегория","admin.cat.edit":"Редактировать","admin.cat.delete":"Удалить","admin.cat.delete.confirm":"Удалить категорию? Все подкатегории также будут удалены.","admin.cat.slug":"Slug","admin.cat.icon":"Иконка","admin.cat.name_el":"Греческий","admin.cat.name_en":"Английский","admin.cat.name_ru":"Русский","admin.cat.order":"Порядок","admin.cat.active":"Активна","admin.cat.parent":"Родительская категория","admin.cat.no_parent":"Верхний уровень","admin.cat.save":"Сохранить","admin.cat.cancel":"Отмена","admin.cat.empty":"Нет категорий","admin.cat.hint":"Управление категориями с многоуровневой иерархией","admin.cat.new":"Новая категория","admin.cat.subcategory":"подкатегория","admin.cat.add_child":"Добавить подкатегорию","admin.cat.inactive":"Неактивна","admin.event.user_login":"Вход","admin.event.user_register":"Регистрация","admin.event.admin_user_deactivate":"Блокировка юзера","admin.event.admin_user_activate":"Разблокировка юзера","admin.event.admin_user_role_changed":"Смена роли","admin.event.admin_task_cancelled":"Отмена задачи","admin.event.admin_task_deleted":"Удаление задачи","admin.event.admin_report_reviewed":"Жалоба рассмотрена","admin.event.admin_report_dismissed":"Жалоба отклонена","admin.event.task_created":"Создана задача","user.online":"Онлайн","user.seen_minutes":"был здесь {n} мин назад","user.seen_hours":"был здесь {n} ч назад","user.seen_yesterday":"был здесь вчера","user.seen_days":"был здесь {n} дн назад","specialists.title":"Специалисты","specialists.search":"Поиск специалиста...","specialists.search.btn":"Поиск","specialists.empty":"Специалисты не найдены","specialists.no_bio":"Без описания","specialists.view":"Смотреть профиль","specialists.reviews":"отзывов","specialist.favorite":"Добавить в избранное","specialist.unfavorite":"Убрать из избранного","specialist.site_link":"Личный сайт","favorites.specialists.title":"Избранные специалисты","favorites.specialists.empty":"Вы ещё не добавили специалистов в избранное","nav.favorites":"Избранное","nav.schedule":"Расписание","nav.find_tasks":"Поиск заказов","schedule.title":"Моё расписание","schedule.subtitle":"Отмечайте дни когда вы свободны или заняты — заказчики увидят вашу доступность","schedule.available":"Свободен","schedule.busy":"Занят","schedule.unset":"Не указано","schedule.click_hint":"← клик меняет статус по кругу","schedule.range_mode":"Выделить диапазон","schedule.range_from":"С {date} — выберите конечную дату","schedule.click_to_set":"Нажмите чтобы отметить","schedule.free":"свободно","schedule.busy_count":"занято","schedule.free_days":"свободных дней","schedule.googleCalendar":"Google Календарь","schedule.connectGoogle":"Подключить Google Календарь","schedule.disconnectGoogle":"Отключить","schedule.connectedAs":"Подключено как","schedule.importFromGoogle":"Синхр. из Google","schedule.gcalConnected":"✓ Google Календарь подключён","schedule.gcalError":"Ошибка подключения Google Календарь","schedule.gcalImportDone":"Импортировано {n} дней из Google Календарь","schedule.gcalAutoSyncNote":"Изменения доступности автоматически отправляются в Google Календарь","schedule.gcalConnectDesc":"Подключите Google Календарь для автоматической синхронизации расписания","schedule.gcalDisconnectConfirm":"Отключить Google Календарь?","find_tasks.title":"Поиск заказов","find_tasks.for_me":"Для меня","find_tasks.all":"Все заказы","find_tasks.by_category":"По категориям","find_tasks.list":"Списком","find_tasks.already_offered":"Предложение отправлено","find_tasks.offer_now":"Откликнуться","find_tasks.empty_for_me":"Нет заказов в ваших категориях","find_tasks.banner_hint":"Найдите заказы по категориям вашего портфолио","find_tasks.no_cards":"Создайте портфолио специалиста, чтобы видеть подходящие заказы","find_tasks.add_card":"Создать портфолио","find_tasks.search":"Поиск заказов...","find_tasks.tasks_count":"заданий","footer.tagline":"Платформа задач для Греции","footer.rights":"Все права защищены.","app.download_title":"Скачайте мобильное приложение CanHelp","app.download_desc":"Всё CanHelp — всегда под рукой. Доступно для Android и iOS.","nav.pricing":"Тарифы","pricing.title":"Тарифы","pricing.subtitle":"Выберите подходящий план","pricing.role.customer":"Заказчик","pricing.role.specialist":"Специалист","pricing.free":"Бесплатно","pricing.per_month":"мес","pricing.duration":"Срок","pricing.days":"дн.","pricing.current_plan":"Ваш план","pricing.popular":"Популярный","pricing.choose":"Выбрать","pricing.your_plan":"Активный план","pricing.free_default":"По умолчанию","pricing.compare":"Сравнение функций","pricing.feature":"Функция","pricing.faq_note":"Оплата списывается с баланса CanHelp. Пополнение доступно в разделе Оплата.","pricing.feat.messages":"Сообщений / день","pricing.feat.orders":"Заказов / день","pricing.feat.contact_all":"Связь со всеми","pricing.feat.view_phone":"Просмотр телефона","pricing.feat.show_contact":"Показывать контакты","pricing.feat.favorites":"Избранное","pricing.feat.verified_badge":"Верифицированный бейдж","pricing.feat.google_calendar":"Google Календарь","pricing.feat.personal_site":"Персональный сайт","pricing.feat.auto_response":"Авто-ответ","pricing.feat.auto_match":"Авто-подбор","pricing.feat.highlighted_reviews":"Выделенные отзывы","pricing.feat.portfolio":"Элементов портфолио","pricing.feat.cards":"Карточки специалиста","pricing.feat.notify_tasks":"Уведомления о новых задачах","pricing.feat.video":"Видео в портфолио","upgrade.available_in":"Доступно в","upgrade.cta":"Улучшить","dashboard.plan.title":"Мой план","dashboard.plan.expires":"Истекает через {n} дней","dashboard.plan.upgrade":"Улучшить план","dashboard.plan.no_plan":"Бесплатный план","dashboard.plan.messages":"Сообщений сегодня","dashboard.plan.orders":"Заказов сегодня","dashboard.plan.limits":"Дневные лимиты","dashboard.plan.features":"Функции","dashboard.plan.stats":"Статистика","dashboard.stats.cards":"Портфолио","dashboard.stats.maxCards":"Макс. портфолио","dashboard.stats.portfolioItems":"Элементы портфолио","dashboard.stats.maxPortfolioItems":"Макс. элементы","dashboard.stats.activeOffers":"Активные отклики","dashboard.stats.reviewsReceived":"Отзывы","dashboard.stats.activeTasks":"Активные задачи","dashboard.stats.completedTasks":"Завершённые","status.need_help":"Нужна помощь","status.active":"Активен","status.toggle_on":"Включить","status.toggle_off":"Выключить","fomo.missed_orders":"Пропущено {n} заказов","fomo.missed_value":"На сумму €{v}","fomo.upgrade_hint":"Улучшите план — получайте больше заказов","fomo.conversion":"Конверсия задач","fomo.active":"Активные","fomo.with_offers":"С офертами","fomo.completed":"Завершённые","fomo.already_offered":"{n} специалистов уже откликнулись","fomo.specialist_missed":"Вы пропустили {n} заказов","fomo.top_categories":"Категории","fomo.offers_received":"предложений получено","fomo.avg_offers":"В среднем {n}/задача","fomo.completion_rate":"завершено","task.auto_match":"Авто-матч","task.auto_match_results":"Топ специалисты","task.no_offer_yet":"Вы ещё не отправили предложение","task.make_offer":"Отправить предложение","auto_response.title":"Авто-ответ","auto_response.enabled":"Включить авто-ответ","auto_response.min_budget":"Мин. бюджет","auto_response.max_budget":"Макс. бюджет","auto_response.default_price":"Цена по умолчанию","auto_response.default_message":"Сообщение по умолчанию","auto_response.max_per_day":"Макс. авто-офертов в день","auto_response.save":"Сохранить","auto_response.saved":"Сохранено","auto_response.categories":"Категории","auto_response.locations":"Локации","profile.personal_site":"Персональный сайт","profile.site_slug":"URL slug","profile.site_slug_hint":"Только латинские буквы, цифры, - и _","profile.site_open":"Открыть сайт","profile.site_preview":"Ваш сайт","profile.show_contact":"Показывать контакты","profile.show_contact_hint":"Заказчики с Pro/Ultimate-планом увидят ваш телефон","gcal.upgrade_required":"Google Календарь требует план Pro или Ultimate","chat.limit_warning":"Осталось {n} сообщений сегодня","chat.limit_reached":"Лимит сообщений исчерпан. Улучшите план","chat.upgrade":"Улучшить","site.member_since":"С нами с","site.rating":"Рейтинг","site.completed_tasks":"Выполнено","site.languages":"Языков","site.photos":"фото","site.contact_form":"Связаться","site.contact_sent":"Сообщение отправлено!","site.contact_sent_desc":"Специалист свяжется с вами в ближайшее время","site.contact_name":"Имя","site.contact_name_ph":"Ваше имя","site.contact_email_ph":"your@email.com","site.contact_message":"Сообщение","site.contact_message_ph":"Опишите вашу задачу...","site.contact_send":"Отправить","site.share":"Поделиться","site.speaks_languages":"Говорит на языках","site.message_sent":"Сообщение отправлено!","site.message_sent_desc":"Специалист получит его в чате","site.message_placeholder":"Напишите сообщение...","site.write_to_chat":"Написать в чат","site.auth_required_title":"Нужна авторизация","site.auth_required_desc":"Чтобы написать в чат, необходимо войти в аккаунт CanHelp.","site.auth_login_btn":"Войти в аккаунт","site.auth_contact_form_btn":"Написать через форму обратной связи","specialist.services":"Услуги","portfolio.title":"Портфолио","status.can_help_now":"Готов помочь","common.not_found":"Страница не найдена","common.anonymous":"Анонимно"}};function f(a){let b=e[a]??e.el;return(a,c)=>b[a]??e.el[a]??c??a}},13260:(a,b,c)=>{"use strict";c.d(b,{CI:()=>f,Hh:()=>g,Jv:()=>e,wV:()=>h,yK:()=>d});let d=(0,c(69183).M)({baseURL:"https://api.canhelp.gr"}),{signIn:e,signOut:f,signUp:g,useSession:h}=d},14276:()=>{},15043:(a,b,c)=>{"use strict";c.d(b,{Footer:()=>i});var d=c(78157),e=c(96484),f=c(94496),g=c.n(f);function h({className:a=""}){return(0,d.jsxs)("div",{className:`flex gap-4 ${a}`,children:[(0,d.jsx)("a",{href:"https://t.me/canhelp",target:"_blank",rel:"noopener","aria-label":"Telegram",className:"hover:text-blue-500 transition",children:(0,d.jsx)("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"currentColor",xmlns:"http://www.w3.org/2000/svg",children:(0,d.jsx)("path",{d:"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z"})})}),(0,d.jsx)("a",{href:"https://instagram.com/canhelp",target:"_blank",rel:"noopener","aria-label":"Instagram",className:"hover:text-pink-500 transition",children:(0,d.jsx)("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"currentColor",xmlns:"http://www.w3.org/2000/svg",children:(0,d.jsx)("path",{d:"M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm6.406-11.845a1.44 1.44 0 1 0 0 2.881 1.44 1.44 0 0 0 0-2.881z"})})})]})}function i(){let{t:a}=(0,e.Y)(),b=new Date().getFullYear();return(0,d.jsx)("footer",{className:"bg-white border-t border-gray-200 mt-16",children:(0,d.jsxs)("div",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12",children:[(0,d.jsxs)("div",{className:"flex flex-col md:flex-row justify-between items-start gap-10",children:[(0,d.jsxs)("div",{className:"flex-1 min-w-[200px] flex flex-col items-start",children:[(0,d.jsx)("span",{className:"logo-text text-3xl text-blue-700 font-bold mb-2",children:"CanHelp"}),(0,d.jsx)("p",{className:"text-base text-gray-600 mb-4",children:a("footer.slogan")})]}),(0,d.jsxs)("div",{className:"flex-1 min-w-[180px]",children:[(0,d.jsx)("h3",{className:"text-lg font-semibold text-blue-900 mb-3",children:a("footer.links")}),(0,d.jsxs)("ul",{className:"space-y-2",children:[(0,d.jsx)("li",{children:(0,d.jsx)(g(),{href:"/",className:"hover:text-blue-600 transition",children:a("nav.home")})}),(0,d.jsx)("li",{children:(0,d.jsx)(g(),{href:"/tasks",className:"hover:text-blue-600 transition",children:a("nav.tasks")})}),(0,d.jsx)("li",{children:(0,d.jsx)(g(),{href:"/become-specialist",className:"hover:text-blue-600 transition",children:a("nav.specialists")})})]})]}),(0,d.jsxs)("div",{className:"flex-1 min-w-[180px]",children:[(0,d.jsx)("h3",{className:"text-lg font-semibold text-blue-900 mb-3",children:a("footer.socials")}),(0,d.jsx)("p",{className:"text-gray-500 text-sm mb-2",children:"info@canhelp.gr"}),(0,d.jsx)(h,{className:"mt-2"})]})]}),(0,d.jsxs)("div",{className:"mt-10 border-t border-gray-100 pt-6 text-center text-gray-400 text-sm",children:["\xa9 ",b," CanHelp. ",a("footer.rights")]})]})})}},20138:(a,b,c)=>{"use strict";c.d(b,{LocaleProvider:()=>e});var d=c(25459);let e=(0,d.registerClientReference)(function(){throw Error("Attempted to call LocaleProvider() from the server but LocaleProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/opt/canhelp/apps/web/src/context/locale.tsx","LocaleProvider");(0,d.registerClientReference)(function(){throw Error("Attempted to call useLocale() from the server but useLocale is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/opt/canhelp/apps/web/src/context/locale.tsx","useLocale")},21046:(a,b,c)=>{"use strict";c.d(b,{ScrollToTopButton:()=>f});var d=c(78157),e=c(31768);function f(){let[a,b]=(0,e.useState)(!1);return(0,d.jsx)("button",{className:`scroll-to-top-btn${a?" visible":""}`,"aria-label":"Наверх",onClick:()=>window.scrollTo({top:0,behavior:"smooth"}),children:(0,d.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:(0,d.jsx)("path",{d:"M10 16V4M10 4L4 10M10 4L16 10",stroke:"white",strokeWidth:"2.8",strokeLinecap:"round",strokeLinejoin:"round"})})})}},30460:()=>{},32948:(a,b,c)=>{"use strict";c.d(b,{ScrollToTopButton:()=>d});let d=(0,c(25459).registerClientReference)(function(){throw Error("Attempted to call ScrollToTopButton() from the server but ScrollToTopButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/opt/canhelp/apps/web/src/components/ScrollToTopButton.tsx","ScrollToTopButton")},33506:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>g});var d=c(5939),e=c(3498),f=c.n(e);function g(){return(0,d.jsx)("div",{className:"min-h-screen flex items-center justify-center text-center px-4",children:(0,d.jsxs)("div",{children:[(0,d.jsx)("h1",{className:"text-8xl font-bold text-blue-600 mb-4",children:"404"}),(0,d.jsx)("p",{className:"text-xl text-gray-700 mb-6",children:"Η σελίδα δεν βρέθηκε"}),(0,d.jsx)(f(),{href:"/",className:"bg-blue-600 text-white px-6 py-3 rounded-xl font-semibold hover:bg-blue-700",children:"Επιστροφή στην Αρχική"})]})})}},39348:(a,b,c)=>{"use strict";c.d(b,{Footer:()=>d});let d=(0,c(25459).registerClientReference)(function(){throw Error("Attempted to call Footer() from the server but Footer is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/opt/canhelp/apps/web/src/components/Footer.tsx","Footer")},39805:(a,b,c)=>{Promise.resolve().then(c.bind(c,15043)),Promise.resolve().then(c.bind(c,58719)),Promise.resolve().then(c.bind(c,21046)),Promise.resolve().then(c.bind(c,96484)),Promise.resolve().then(c.bind(c,56003)),Promise.resolve().then(c.t.bind(c,24653,23))},47570:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>n,generateMetadata:()=>m});var d=c(5939),e=c(56057),f=c(95692);c(14276);var g=c(67674),h=c(39348),i=c(20138),j=c(1697),k=c(32948);async function l(){try{let a=await fetch("https://api.canhelp.gr/api/admin/seo-public",{next:{revalidate:60}});if(!a.ok)return{};return a.json()}catch{return{}}}async function m(){let a=await l();return{title:a["seo.siteTitle"]||"CanHelp — Βρες ειδικό για κάθε δουλειά",description:a["seo.siteDescription"]||"Η ελληνική πλατφόρμα για online ανάθεση εργασιών. Βρες επαγγελματίες για καθαρισμό, υδραυλικά, μαθήματα και πολλά άλλα.",keywords:"εργασίες, ειδικοί, Ελλάδα, freelance, καθαρισμός, υδραυλικά",robots:"false"===a["seo.indexingEnabled"]?"noindex, nofollow":void 0}}async function n({children:a}){let b=await (0,e.UL)(),c=((await (0,e.b3)()).get("x-pathname")??"").startsWith("/site/"),m=b.get("canhelp_locale")?.value,n=["el","en","ru"].includes(m)?m:"el",o=decodeURIComponent(b.get("canhelp_location")?.value??""),p=(await l())["seo.headScripts"]??"";return(0,d.jsx)("html",{lang:n,children:(0,d.jsxs)("body",{children:[p&&(0,d.jsx)(f.default,{id:"seo-head-scripts",strategy:"beforeInteractive",dangerouslySetInnerHTML:{__html:p}}),(0,d.jsx)(i.LocaleProvider,{initialLocale:n,children:(0,d.jsxs)(j.LocationProvider,{initialSlug:o,children:[!c&&(0,d.jsx)(g.Header,{}),(0,d.jsx)("main",{className:"min-h-screen",children:a}),!c&&(0,d.jsx)(k.ScrollToTopButton,{}),!c&&(0,d.jsx)(h.Footer,{})]})})]})})}},48178:(a,b,c)=>{"use strict";function d(a){if(!a?.trim())return"—";let b=a.trim().split(/\s+/);return b.length<2||!b[1]?b[0]:`${b[0]} ${b[1][0].toUpperCase()}.`}function e(a,b,c){if(a?.trim()){let c=b?.trim();return c?`${a.trim()} ${c[0].toUpperCase()}.`:a.trim()}return d(c)}c.d(b,{E:()=>d,H:()=>e})},49046:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,94496,23))},56003:(a,b,c)=>{"use strict";c.d(b,{LocationProvider:()=>g,z:()=>h});var d=c(78157),e=c(31768);c(91864);let f=(0,e.createContext)({locationSlug:"",locationTree:[],locationLoading:!0,setLocation:()=>{},getLabel:()=>""});function g({children:a,initialSlug:b=""}){let[c,g]=(0,e.useState)(b),[h,i]=(0,e.useState)([]),[j,k]=(0,e.useState)(!0),l=(0,e.useCallback)(a=>{g(a);let b=encodeURIComponent(a);document.cookie=`canhelp_location=${b}; path=/; max-age=31536000; SameSite=Lax`},[]),m=(0,e.useCallback)(a=>{if(!c)return"";for(let b of h){if(b.slug===c)return b.names[a]??b.names.el;for(let d of b.children??[])if(d.slug===c)return d.names[a]??d.names.el}return c},[c,h]);return(0,d.jsx)(f.Provider,{value:{locationSlug:c,locationTree:h,locationLoading:j,setLocation:l,getLabel:m},children:a})}function h(){return(0,e.useContext)(f)}},58719:(a,b,c)=>{"use strict";c.d(b,{Header:()=>n});var d=c(78157),e=c(94496),f=c.n(e),g=c(71159),h=c(13260),i=c(96484),j=c(48178),k=c(31768),l=c(12998);function m(){let{locale:a,setLocale:b}=(0,i.Y)(),[c,e]=(0,k.useState)(!1),f=(0,k.useRef)(null),g=l.YZ.find(b=>b.code===a)??l.YZ[0];return(0,d.jsxs)("div",{ref:f,className:"relative",children:[(0,d.jsxs)("button",{onClick:()=>e(!c),className:"flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg border border-gray-200 hover:border-blue-400 hover:bg-blue-50 transition text-sm font-medium text-gray-700","aria-label":"Change language",children:[(0,d.jsx)("span",{children:g.code.toUpperCase()}),(0,d.jsx)("svg",{className:`w-3.5 h-3.5 text-gray-400 transition-transform ${c?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),c&&(0,d.jsx)("div",{className:"absolute right-0 mt-1 w-40 bg-white border border-gray-200 rounded-xl shadow-lg z-50 overflow-hidden",children:l.YZ.map(c=>(0,d.jsxs)("button",{onClick:()=>{b(c.code),e(!1)},className:`w-full flex items-center gap-2.5 px-3.5 py-2.5 text-sm hover:bg-blue-50 transition ${a===c.code?"bg-blue-50 text-blue-700 font-medium":"text-gray-700"}`,children:[(0,d.jsx)("span",{children:c.label}),a===c.code&&(0,d.jsx)("svg",{className:"w-3.5 h-3.5 ml-auto text-blue-600",fill:"currentColor",viewBox:"0 0 20 20",children:(0,d.jsx)("path",{fillRule:"evenodd",d:"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",clipRule:"evenodd"})})]},c.code))})]})}function n(){(0,g.useRouter)();let a=(0,g.usePathname)(),{data:b}=(0,h.wV)(),{t:c,locale:e}=(0,i.Y)(),[l,n]=(0,k.useState)(!1),[o,p]=(0,k.useState)(!1),[q,r]=(0,k.useState)(0),[s,t]=(0,k.useState)(0),[u,v]=(0,k.useState)(null),[w,x]=(0,k.useState)(null),y=(0,k.useRef)(null),z=(0,k.useRef)(null);(0,k.useRef)(null);let A=b?.user?.role==="admin",B=b?.user?.role==="specialist";return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("header",{ref:z,className:"header-base bg-white border-b border-gray-200 sticky top-0 z-50 transition-all duration-300",children:(0,d.jsxs)("div",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8",children:[(0,d.jsxs)("div",{className:"flex items-center justify-between h-16 header-content transition-all duration-300",children:[(0,d.jsx)(f(),{href:"/",className:"flex items-center shrink-0",children:(0,d.jsx)("span",{className:"logo-text text-2xl font-bold text-blue-600 transition-all duration-300",children:"CanHelp"})}),(0,d.jsxs)("nav",{className:"hidden md:flex items-center gap-5 ml-auto",children:[B?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f(),{href:"/tasks",className:"text-gray-600 hover:text-blue-600 font-medium text-sm",children:c("nav.find_tasks")}),(0,d.jsx)(f(),{href:"/dashboard",className:"text-gray-600 hover:text-blue-600 font-medium text-sm",children:c("nav.dashboard")})]}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f(),{href:"/tasks/new",className:"text-gray-600 hover:text-blue-600 font-medium text-sm",children:c("dashboard.new_task")}),(0,d.jsx)(f(),{href:"/specialists",className:"text-gray-600 hover:text-blue-600 font-medium text-sm",children:c("nav.specialists")})]}),(0,d.jsx)(f(),{href:"/pricing",className:`font-medium text-sm transition ${"/pricing"===a?"text-blue-600":"text-gray-600 hover:text-blue-600"}`,children:c("nav.pricing","Pricing")}),b?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(f(),{href:"/notifications",className:"relative text-gray-600 hover:text-gray-900 flex items-center",children:[(0,d.jsx)("svg",{className:`w-5 h-5 ${q>0?"text-orange-500":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0"})}),q>0&&(0,d.jsx)("span",{className:"absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none",children:q>99?"99+":q})]}),(0,d.jsxs)(f(),{href:"/chat",className:"relative text-gray-600 hover:text-gray-900 flex items-center",children:[(0,d.jsx)("svg",{className:`w-5 h-5 ${s>0?"text-green-500":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"})}),s>0&&(0,d.jsx)("span",{className:"absolute -top-1.5 -right-1.5 min-w-[16px] h-4 px-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none",children:s>99?"99+":s})]}),(0,d.jsxs)("div",{className:"relative",ref:y,children:[(0,d.jsxs)("button",{onClick:()=>p(!o),className:"flex items-center gap-1.5 text-sm font-medium text-gray-600 hover:text-blue-600",children:[(0,d.jsx)("span",{className:"truncate max-w-[100px]",children:(0,j.H)(b.user.firstName,b.user.lastName,b.user.name)}),"pro"===w&&(0,d.jsx)("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-blue-100 text-blue-700 leading-none",children:"Pro"}),"ultimate"===w&&(0,d.jsx)("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded-full text-[10px] font-bold bg-gradient-to-r from-amber-400 via-yellow-400 to-amber-400 text-gray-900 shadow-sm shadow-amber-300/50 leading-none",children:"★"}),(0,d.jsx)("svg",{className:"w-4 h-4 shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),o&&(0,d.jsxs)("div",{className:"absolute right-0 mt-2 w-52 bg-white border border-gray-200 rounded-xl shadow-lg py-1 z-50",children:[B?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(f(),{href:"/tasks/new",className:"flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:()=>p(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400 shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 4v16m8-8H4"})}),c("nav.new_task")]}),(0,d.jsxs)(f(),{href:"/specialists",className:"flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:()=>p(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400 shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z"})}),c("nav.specialists")]})]}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(f(),{href:"/notifications",className:"flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:()=>p(!1),children:[(0,d.jsx)("svg",{className:`w-4 h-4 shrink-0 ${q>0?"text-orange-500":"text-gray-400"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0"})}),(0,d.jsxs)("span",{className:"flex items-center gap-1.5",children:[c("nav.notifications"),q>0&&(0,d.jsx)("span",{className:"px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full leading-none",children:q>99?"99+":q})]})]}),(0,d.jsxs)(f(),{href:"/chat",className:"flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:()=>p(!1),children:[(0,d.jsx)("svg",{className:`w-4 h-4 shrink-0 ${s>0?"text-green-500":"text-gray-400"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"})}),(0,d.jsxs)("span",{className:"flex items-center gap-1.5",children:[c("nav.chat"),s>0&&(0,d.jsx)("span",{className:"px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full leading-none",children:s>99?"99+":s})]})]}),(0,d.jsxs)(f(),{href:"/dashboard",className:"flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:()=>p(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400 shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"})}),c("nav.dashboard")]})]}),A&&(0,d.jsxs)(f(),{href:"/tasks",className:"flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:()=>p(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400 shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"})}),c("nav.find_tasks")]}),(B||A)&&(0,d.jsxs)(f(),{href:"/schedule",className:"flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:()=>p(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400 shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"})}),c("nav.schedule")]}),A&&(0,d.jsxs)(f(),{href:"/admin",className:"flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:()=>p(!1),children:[(0,d.jsxs)("svg",{className:"w-4 h-4 text-gray-400 shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:[(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"}),(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})]}),c("nav.admin")]}),(0,d.jsxs)(f(),{href:"/profile",className:"flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:()=>p(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400 shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"})}),c("nav.profile")]}),(0,d.jsxs)(f(),{href:"/favorites",className:"flex items-center gap-2.5 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:()=>p(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400 shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"})}),c("nav.favorites")]}),(0,d.jsx)("hr",{className:"my-1 border-gray-100"}),(0,d.jsxs)("button",{className:"w-full flex items-center gap-2.5 px-4 py-2 text-sm text-red-500 hover:bg-red-50",onClick:()=>{p(!1),(0,h.CI)().then(()=>{window.location.href="/"})},children:[(0,d.jsx)("svg",{className:"w-4 h-4 shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"})}),c("nav.logout")]})]})]})]}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f(),{href:"/login",className:"text-gray-600 hover:text-blue-600 font-medium text-sm",children:c("nav.login")}),(0,d.jsx)(f(),{href:"/register",className:"bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 font-medium text-sm",children:c("nav.register")})]}),(0,d.jsx)(m,{})]}),(0,d.jsxs)("div",{className:"md:hidden flex items-center gap-2",children:[(0,d.jsx)(m,{}),(0,d.jsx)("button",{className:"p-2",onClick:()=>n(!l),"aria-label":"Toggle menu",children:(0,d.jsx)("svg",{className:"w-5 h-5 text-gray-600",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:l?(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"}):(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4 6h16M4 12h16M4 18h16"})})})]})]}),l&&(0,d.jsxs)("div",{className:"md:hidden py-4 border-t border-gray-100 flex flex-col gap-3",children:[B?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(f(),{href:"/tasks",className:"flex items-center gap-2 text-gray-700 font-medium py-1",onClick:()=>n(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"})}),c("nav.find_tasks")]}),(0,d.jsxs)(f(),{href:"/dashboard",className:"flex items-center gap-2 text-gray-700 font-medium py-1",onClick:()=>n(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"})}),c("nav.dashboard")]})]}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(f(),{href:"/tasks/new",className:"flex items-center gap-2 text-gray-700 font-medium py-1",onClick:()=>n(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 4v16m8-8H4"})}),c("nav.new_task")]}),(0,d.jsxs)(f(),{href:"/specialists",className:"flex items-center gap-2 text-gray-700 font-medium py-1",onClick:()=>n(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z"})}),c("nav.specialists")]})]}),b?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(f(),{href:"/chat",className:"flex items-center gap-2 text-gray-700 font-medium py-1",onClick:()=>n(!1),children:[(0,d.jsx)("svg",{className:`w-4 h-4 ${s>0?"text-green-500":"text-gray-400"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 10h.01M12 10h.01M16 10h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"})}),c("nav.chat"),s>0&&(0,d.jsx)("span",{className:"ml-1 px-1.5 py-0.5 bg-green-500 text-white text-[10px] font-bold rounded-full",children:s})]}),B?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(f(),{href:"/tasks/new",className:"flex items-center gap-2 text-gray-700 font-medium py-1",onClick:()=>n(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 4v16m8-8H4"})}),c("nav.new_task")]}),(0,d.jsxs)(f(),{href:"/specialists",className:"flex items-center gap-2 text-gray-700 font-medium py-1",onClick:()=>n(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z"})}),c("nav.specialists")]})]}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(f(),{href:"/notifications",className:"flex items-center gap-2 text-gray-700 font-medium py-1",onClick:()=>n(!1),children:[(0,d.jsx)("svg",{className:`w-4 h-4 ${q>0?"text-orange-500":"text-gray-400"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0"})}),(0,d.jsxs)("span",{className:"flex items-center gap-1.5",children:[c("nav.notifications"),q>0&&(0,d.jsx)("span",{className:"px-1.5 py-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full",children:q>99?"99+":q})]})]}),(0,d.jsxs)(f(),{href:"/dashboard",className:"flex items-center gap-2 text-gray-700 font-medium py-1",onClick:()=>n(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"})}),c("nav.dashboard")]})]}),(0,d.jsxs)(f(),{href:"/favorites",className:"flex items-center gap-2 text-gray-700 font-medium py-1",onClick:()=>n(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"})}),c("nav.favorites")]}),(B||A)&&(0,d.jsxs)(f(),{href:"/schedule",className:"flex items-center gap-2 text-gray-700 font-medium py-1",onClick:()=>n(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"})}),c("nav.schedule")]}),A&&(0,d.jsxs)(f(),{href:"/admin",className:"flex items-center gap-2 text-gray-700 font-medium py-1",onClick:()=>n(!1),children:[(0,d.jsxs)("svg",{className:"w-4 h-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:[(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"}),(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})]}),c("nav.admin")]}),(0,d.jsxs)(f(),{href:"/profile",className:"flex items-center gap-2 text-gray-700 font-medium py-1",onClick:()=>n(!1),children:[(0,d.jsx)("svg",{className:"w-4 h-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"})}),c("nav.profile")]}),(0,d.jsxs)("button",{onClick:()=>{n(!1),(0,h.CI)().then(()=>{window.location.href="/"})},className:"flex items-center gap-2 text-left text-red-500 py-1 font-medium",children:[(0,d.jsx)("svg",{className:"w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"})}),c("nav.logout")]})]}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f(),{href:"/login",className:"text-gray-700 font-medium py-1",onClick:()=>n(!1),children:c("nav.login")}),(0,d.jsx)(f(),{href:"/register",className:"text-blue-600 font-medium py-1",onClick:()=>n(!1),children:c("nav.register")})]})]})]})}),u&&(0,d.jsx)("div",{className:"fixed bottom-5 right-5 z-[200] max-w-sm w-full",children:(0,d.jsxs)("div",{className:"bg-white border border-gray-200 rounded-xl shadow-xl p-4 flex items-start gap-3 animate-fade-in",children:[(0,d.jsx)("span",{className:"text-2xl shrink-0",children:"\uD83D\uDCAC"}),(0,d.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,d.jsx)("p",{className:"font-semibold text-gray-900 text-sm",children:c("chat.toast_title")}),(0,d.jsx)("p",{className:"text-xs text-gray-500 truncate mt-0.5",children:u.body})]}),(0,d.jsxs)("div",{className:"flex flex-col items-end gap-2 shrink-0",children:[(0,d.jsx)("button",{onClick:()=>v(null),className:"text-gray-400 hover:text-gray-600 text-lg leading-none","aria-label":"close",children:"\xd7"}),(0,d.jsx)(f(),{href:`/chat?room=${u.roomId}`,onClick:()=>v(null),className:"text-xs text-blue-600 hover:underline font-medium",children:c("chat.toast_open")})]})]})})]})}c(91864),c(44826)},64271:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,58671,23)),Promise.resolve().then(c.t.bind(c,56542,23)),Promise.resolve().then(c.t.bind(c,88248,23)),Promise.resolve().then(c.t.bind(c,49743,23)),Promise.resolve().then(c.t.bind(c,96231,23)),Promise.resolve().then(c.t.bind(c,10959,23)),Promise.resolve().then(c.t.bind(c,72041,23)),Promise.resolve().then(c.t.bind(c,95094,23)),Promise.resolve().then(c.t.bind(c,67487,23))},67674:(a,b,c)=>{"use strict";c.d(b,{Header:()=>d});let d=(0,c(25459).registerClientReference)(function(){throw Error("Attempted to call Header() from the server but Header is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/opt/canhelp/apps/web/src/components/Header.tsx","Header")},72088:()=>{},72519:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,48365,23)),Promise.resolve().then(c.t.bind(c,64596,23)),Promise.resolve().then(c.t.bind(c,56186,23)),Promise.resolve().then(c.t.bind(c,67805,23)),Promise.resolve().then(c.t.bind(c,27561,23)),Promise.resolve().then(c.t.bind(c,47569,23)),Promise.resolve().then(c.t.bind(c,42747,23)),Promise.resolve().then(c.t.bind(c,56676,23)),Promise.resolve().then(c.bind(c,97225))},85998:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,3498,23))},91864:(a,b,c)=>{"use strict";async function d(a,b){let c=await fetch(`https://api.canhelp.gr/api${a}`,{...b,credentials:"include",headers:{"Content-Type":"application/json",...b?.headers}});if(!c.ok){let a=await c.json().catch(()=>({error:c.statusText}));throw Error("string"==typeof a.error?a.error:"string"==typeof a.message?a.message:c.statusText||"Request failed")}return c.json()}c.d(b,{$7:()=>O,$H:()=>m,$M:()=>z,Bb:()=>aC,Bm:()=>G,Bq:()=>aG,Br:()=>af,CX:()=>ar,Cs:()=>aO,D1:()=>ay,Em:()=>d,F7:()=>p,F9:()=>C,FI:()=>av,Fu:()=>e,GB:()=>_,Gp:()=>aV,H:()=>aQ,H6:()=>r,He:()=>T,Ip:()=>A,Je:()=>aS,K7:()=>P,KD:()=>M,Lb:()=>n,Lp:()=>as,ML:()=>aY,Mm:()=>U,NL:()=>B,Nt:()=>ak,OM:()=>ax,OV:()=>aZ,OX:()=>am,On:()=>v,P0:()=>aM,QN:()=>u,RN:()=>a_,RQ:()=>aW,Rt:()=>i,S$:()=>a$,Sw:()=>j,T9:()=>aP,Tr:()=>y,UE:()=>a0,UT:()=>g,V:()=>K,VL:()=>w,VM:()=>o,Vs:()=>I,Wi:()=>S,Xz:()=>az,Yj:()=>Z,Zp:()=>t,_z:()=>x,aT:()=>k,bR:()=>ap,bW:()=>H,bc:()=>aU,bi:()=>ag,bx:()=>q,cS:()=>R,dE:()=>Q,eR:()=>aD,eU:()=>ab,f5:()=>aF,fm:()=>aK,g0:()=>aL,gg:()=>f,hD:()=>aN,hl:()=>aA,iN:()=>aw,j_:()=>ac,jd:()=>V,jg:()=>at,k_:()=>ai,lC:()=>h,nf:()=>$,oh:()=>aI,oq:()=>X,pD:()=>J,pK:()=>aJ,q7:()=>s,qT:()=>an,qt:()=>ae,rC:()=>aq,rl:()=>aH,sD:()=>L,st:()=>E,td:()=>ao,ts:()=>l,u4:()=>ah,v9:()=>F,vh:()=>a1,vy:()=>W,wc:()=>au,wl:()=>Y,yJ:()=>aj,yO:()=>ad,yk:()=>D,z4:()=>aR,z5:()=>aa,z6:()=>aT,zB:()=>aB,zR:()=>al,zZ:()=>N,zc:()=>aE,zk:()=>aX});let e=()=>d("/tasks/my"),f=a=>d(`/tasks/${a}`),g=a=>d("/tasks",{method:"POST",body:JSON.stringify(a)}),h=(a,b)=>d(`/tasks/${a}`,{method:"PATCH",body:JSON.stringify(b)}),i=a=>d(`/tasks/${a}/complete`,{method:"PATCH"}),j=a=>d(`/offers?taskId=${a}`),k=()=>d("/offers/my"),l=a=>d("/offers",{method:"POST",body:JSON.stringify(a)}),m=a=>d(`/offers/${a}/accept`,{method:"PATCH"}),n=a=>d(`/offers/${a}/decline`,{method:"PATCH"}),o=a=>d(`/users/${a}/profile`),p=a=>{let b=a?"?"+new URLSearchParams(a):"";return d(`/users/specialists${b}`)},q=a=>d("/reviews",{method:"POST",body:JSON.stringify(a)}),r=a=>d(`/reviews/task/${a}`),s=()=>d("/reviews/my"),t=()=>d("/chat/rooms"),u=a=>d(`/chat/direct/${a}`),v=a=>d(`/chat/can-message/${a}`),w=a=>d(`/chat/rooms/${a}/messages`),x=(a,b)=>d("/chat/messages",{method:"POST",body:JSON.stringify({roomId:a,body:b})}),y=()=>d("/notifications"),z=()=>d("/notifications/count"),A=a=>d(`/notifications/${a}/read`,{method:"PATCH"}),B=()=>d("/notifications/read-all",{method:"PATCH"}),C=a=>d(`/notifications?type=task_invite&referenceId=${a}`),D=a=>d(`/notifications/${a}`,{method:"DELETE"}),E=()=>d("/users/me/referral"),F=a=>d(`/reviews/user/${a}`),G=a=>d(`/reviews/user/${a}/rating`),H=()=>d("/categories"),I=()=>d("/locations"),J=()=>d("/favorites/specialists"),K=a=>d(`/favorites/specialists/${a}`,{method:"POST"}),L=a=>d(`/favorites/specialists/${a}`,{method:"DELETE"}),M=()=>d("/admin/categories"),N=a=>d("/admin/categories",{method:"POST",body:JSON.stringify(a)}),O=(a,b)=>d(`/admin/categories/${a}`,{method:"PATCH",body:JSON.stringify(b)}),P=a=>d(`/admin/categories/${a}`,{method:"DELETE"}),Q=()=>d("/admin/stats"),R=(a=1,b,c)=>{let e=new URLSearchParams({page:String(a),limit:"20"});return b&&e.set("q",b),c&&e.set("role",c),d(`/admin/users?${e}`)},S=a=>d(`/admin/users/${a}/deactivate`,{method:"PATCH"}),T=a=>d(`/admin/users/${a}/activate`,{method:"PATCH"}),U=(a,b)=>d(`/admin/users/${a}/role`,{method:"PATCH",body:JSON.stringify({role:b})}),V=a=>d(`/admin/users/${a}`),W=a=>d(`/admin/users/${a}/specialist-cards`),X=(a,b)=>d(`/admin/specialist-cards/${a}`,{method:"PATCH",body:JSON.stringify(b)}),Y=(a,b)=>d(`/admin/users/${a}`,{method:"PATCH",body:JSON.stringify(b)}),Z=(a=1,b,c)=>{let e=new URLSearchParams({page:String(a),limit:"20"});return b&&e.set("q",b),c&&e.set("status",c),d(`/admin/tasks?${e}`)},$=a=>d(`/admin/tasks/${a}/cancel`,{method:"PATCH"}),_=a=>d(`/admin/tasks/${a}`,{method:"DELETE"}),aa=(a=1)=>d(`/admin/reports?page=${a}&limit=20`),ab=(a,b)=>d(`/admin/reports/${a}/status`,{method:"PATCH",body:JSON.stringify({status:b})}),ac=(a=1)=>d(`/admin/ai-logs?page=${a}&limit=50`),ad=(a={})=>{let b=new URLSearchParams;return a.page&&b.set("page",String(a.page)),a.event&&b.set("event",a.event),a.userId&&b.set("userId",a.userId),a.dateFrom&&b.set("dateFrom",a.dateFrom),a.dateTo&&b.set("dateTo",a.dateTo),b.set("limit","50"),d(`/admin/activity-logs?${b}`)},ae=(a={})=>{let b=new URLSearchParams;return a.page&&b.set("page",String(a.page)),a.event&&b.set("event",a.event),a.dateFrom&&b.set("dateFrom",a.dateFrom),a.dateTo&&b.set("dateTo",a.dateTo),b.set("limit","50"),d(`/admin/mail-logs?${b}`)},af=(a={})=>{let b=new URLSearchParams;return a.page&&b.set("page",String(a.page)),a.type&&b.set("type",a.type),a.dateFrom&&b.set("dateFrom",a.dateFrom),a.dateTo&&b.set("dateTo",a.dateTo),b.set("limit","50"),d(`/admin/notification-logs?${b}`)},ag=()=>d("/admin/notification-stats"),ah=()=>d("/admin/mail-stats"),ai=()=>d("/admin/locations"),aj=a=>d("/admin/locations",{method:"POST",body:JSON.stringify(a)}),ak=(a,b)=>d(`/admin/locations/${a}`,{method:"PATCH",body:JSON.stringify(b)}),al=a=>d(`/admin/locations/${a}`,{method:"DELETE"}),am=()=>d("/admin/plans"),an=a=>d("/admin/plans",{method:"POST",body:JSON.stringify(a)}),ao=(a,b)=>d(`/admin/plans/${a}`,{method:"PATCH",body:JSON.stringify(b)}),ap=a=>d(`/admin/plans/${a}`,{method:"DELETE"}),aq=()=>d("/admin/settings"),ar=a=>d("/admin/settings",{method:"PUT",body:JSON.stringify(a)}),as=()=>d("/admin/settings/templates"),at=(a,b)=>d(`/admin/settings/templates/${a}`,{method:"PUT",body:JSON.stringify(b)}),au=a=>d("/admin/settings/templates/translate",{method:"POST",body:JSON.stringify(a)}),av=()=>d("/admin/settings/test-email",{method:"POST"}),aw=a=>d(`/availability/my${a?`?month=${a}`:""}`),ax=(a,b,c)=>d("/availability/set",{method:"POST",body:JSON.stringify({date:a,status:b,note:c})}),ay=(a,b,c)=>d("/availability/set-range",{method:"POST",body:JSON.stringify({from:a,to:b,status:c})}),az=(a,b)=>d(`/availability/user/${a}${b?`?month=${b}`:""}`),aA=(a,b)=>d(`/portfolio/${a}`,{method:"PATCH",body:JSON.stringify(b)}),aB=a=>d(`/portfolio/${a}`,{method:"DELETE"}),aC=()=>d("/specialist-cards/my"),aD=a=>d("/specialist-cards",{method:"POST",body:JSON.stringify(a)}),aE=(a,b)=>d(`/specialist-cards/${a}`,{method:"PATCH",body:JSON.stringify(b)}),aF=a=>d(`/specialist-cards/${a}`,{method:"DELETE"}),aG=a=>d(`/specialist-cards/user/${a}`),aH=a=>{let b=a?.length?"?"+a.map(a=>`category=${encodeURIComponent(a)}`).join("&"):"";return d(`/skill-suggestions${b}`)},aI=a=>d("/payments/topup/init",{method:"POST",body:JSON.stringify({amount:a})}),aJ=()=>d("/payments/history"),aK=(a=50)=>d(`/payments/balance-history?limit=${a}`),aL=(a={})=>{let b=new URLSearchParams;return a.page&&b.set("page",String(a.page)),a.userId&&b.set("userId",a.userId),a.kind&&b.set("kind",a.kind),b.set("limit","50"),d(`/admin/balance-history?${b}`)},aM=(a,b)=>d(`/admin/users/${a}/balance/topup`,{method:"POST",body:JSON.stringify(b)}),aN=(a,b)=>d(`/admin/users/${a}/balance/withdraw`,{method:"POST",body:JSON.stringify(b)}),aO=a=>d("/payments/plan/preview",{method:"POST",body:JSON.stringify({planId:a})}),aP=a=>{let b=a?`?role=${a}`:"";return d(`/plans${b}`)},aQ=()=>d("/dashboard/me"),aR=()=>d("/plans/daily-usage"),aS=(a,b=!0)=>d("/payments/plan/purchase",{method:"POST",body:JSON.stringify({planId:a,payFromBalance:b})}),aT=()=>d("/statuses/me"),aU=(a,b)=>d("/statuses/toggle",{method:"POST",body:JSON.stringify({statusType:a,active:b})}),aV=()=>d("/auto-response"),aW=a=>d("/auto-response",{method:"PUT",body:JSON.stringify(a)}),aX=()=>d("/fomo/specialist"),aY=()=>d("/fomo/customer"),aZ=a=>d(`/auto-match/${a}`,{method:"POST"}),a$=a=>d(`/users/site/${a}`),a_=()=>d("/users/me/site-stats"),a0=a=>d(`/users/site/${a}/track-message`,{method:"POST"}).catch(()=>{}),a1=a=>d(`/tasks/${a}/stats`)},91946:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>e});var d=c(43560);let e=async a=>[{type:"image/svg+xml",sizes:"any",url:(0,d.fillMetadataSegment)(".",await a.params,"icon.svg")+"?71a523b2dd824001"}]},95837:(a,b,c)=>{Promise.resolve().then(c.bind(c,39348)),Promise.resolve().then(c.bind(c,67674)),Promise.resolve().then(c.bind(c,32948)),Promise.resolve().then(c.bind(c,20138)),Promise.resolve().then(c.bind(c,1697)),Promise.resolve().then(c.t.bind(c,33219,23))},96484:(a,b,c)=>{"use strict";c.d(b,{LocaleProvider:()=>i,Y:()=>j});var d=c(78157),e=c(31768),f=c(71159),g=c(12998);let h=(0,e.createContext)({locale:"el",setLocale:()=>{},t:a=>a});function i({children:a,initialLocale:b}){let c=(0,f.useRouter)(),[i,j]=(0,e.useState)(b??"el"),k=(0,e.useCallback)(a=>{j(a),document.cookie=`canhelp_locale=${a}; path=/; max-age=31536000; SameSite=Lax`,document.documentElement.lang=a,fetch("https://api.canhelp.gr/api/users/me",{method:"PATCH",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({locale:a})}).catch(()=>{}),c.refresh()},[c]),l=(0,e.useCallback)((a,b)=>(0,g.$)(i)(a,b),[i]);return(0,d.jsx)(h.Provider,{value:{locale:i,setLocale:k,t:l},children:a})}function j(){return(0,e.useContext)(h)}}};