diff --git a/src/Command/InstallLunarCommand.php b/src/Command/InstallLunarCommand.php index c20f636..969f3d5 100644 --- a/src/Command/InstallLunarCommand.php +++ b/src/Command/InstallLunarCommand.php @@ -18,9 +18,6 @@ use Lunar\Models\Product; use Lunar\Models\ProductType; use Lunar\Models\TaxClass; use Lunar\Models\TaxZone; -use Modules\Core\Localization\Models\LanguageLine; -use Modules\Core\Localization\Services\StorefrontLabels; -use Modules\Core\Localization\Services\TranslationService; use Modules\Core\Payment\Models\PaymentMethod; /** @@ -35,7 +32,7 @@ class InstallLunarCommand extends Command protected $description = 'Seed the default Lunar store data (countries, channel, currency, tax zone, attributes, product type)'; - public function handle(TranslationService $translations): void + public function handle(): void { $this->components->info('Seeding default Lunar store data...'); @@ -255,9 +252,6 @@ class InstallLunarCommand extends Command } }); - $this->components->info('Seeding storefront label translations'); - $this->seedStorefrontLabels($translations); - $this->components->info('Seeding payment method settings'); $this->seedPaymentMethods(); @@ -267,32 +261,6 @@ class InstallLunarCommand extends Command $this->components->info('Lunar default data seeded.'); } - /** - * Per-key upsert, not an all-or-nothing "only seed if the group is empty" guard — - * a key already present in the database (including one an admin has since edited - * via the Filament Languages resource) is left untouched; only keys missing - * entirely are created. This is what makes it safe to add new keys to - * StorefrontLabels later and re-run this on an already-installed store without - * either skipping the new keys (the old all-or-nothing guard) or reverting an - * admin's edits back to the hardcoded default (a naive updateOrCreate would). - */ - private function seedStorefrontLabels(TranslationService $translations): void - { - $labels = StorefrontLabels::all(); - - $existingKeys = LanguageLine::where('group', 'storefront') - ->whereIn('key', array_keys($labels)) - ->pluck('key'); - - foreach ($labels as $key => $text) { - if ($existingKeys->contains($key)) { - continue; - } - - $translations->create('storefront', $key, $text); - } - } - /** * A single, deliberately opinionated starter row on fresh install — * `PaymentMethod` is now fully admin-creatable/deletable (see @@ -304,7 +272,7 @@ class InstallLunarCommand extends Command * order status should be called; that's a merchant decision. * * Skip-if-exists on `type`, same idempotent convention as - * seedStorefrontLabels() — an admin who has since edited or deleted + * StorefrontTranslationsSeeder — an admin who has since edited or deleted * this row (via the Filament Payment Methods resource) is left alone; * re-running lunar:install never recreates a deleted starter row. * diff --git a/src/Localization/Database/Seeders/StorefrontTranslationsSeeder.php b/src/Localization/Database/Seeders/StorefrontTranslationsSeeder.php new file mode 100644 index 0000000..ae2b61b --- /dev/null +++ b/src/Localization/Database/Seeders/StorefrontTranslationsSeeder.php @@ -0,0 +1,314 @@ +lines() as $key => [$en, $el]) { + $exists = LanguageLine::query() + ->where('group', 'storefront') + ->where('key', $key) + ->exists(); + + if ($exists) { + $this->command?->warn("storefront.{$key} already exists — skipped"); + + continue; + } + + $translations->create('storefront', $key, ['en' => $en, 'el' => $el]); + $this->command?->info("storefront.{$key} added"); + } + } + + /** + * key => [English, Greek]. + * + * @return array + */ + private function lines(): array + { + return [ + // ── Navigation ────────────────────────────────────────────── + 'nav.home' => ['Home', 'Αρχική'], + 'nav.products' => ['Products', 'Προϊόντα'], + 'nav.cart' => ['Cart', 'Καλάθι'], + 'nav.account' => ['Account', 'Λογαριασμός'], + 'nav.back' => ['Back', 'Πίσω'], + 'nav.contact' => ['Contact', 'Επικοινωνία'], + 'nav.close' => ['Close', 'Κλείσιμο'], + + // ── Cart ──────────────────────────────────────────────────── + 'cart.empty' => ['Your cart is empty', 'Το καλάθι σας είναι άδειο'], + 'cart.checkout' => ['Checkout', 'Ολοκλήρωση Παραγγελίας'], + 'cart.total' => ['Total', 'Σύνολο'], + 'cart.remove' => ['Remove', 'Αφαίρεση'], + + // ── Product ───────────────────────────────────────────────── + 'product.add_to_cart' => ['Add to Cart', 'Προσθήκη στο Καλάθι'], + 'product.out_of_stock' => ['Out of Stock', 'Εξαντλήθηκε'], + 'product.sold' => ['Sold', 'Εξαντλήθηκε'], + 'product.price' => ['Price', 'Τιμή'], + 'product.description' => ['Description', 'Περιγραφή'], + 'product.no_image' => ['No image', 'Χωρίς εικόνα'], + 'product.read_more' => ['Read more', 'Περισσότερα'], + 'product.reviews' => ['Reviews', 'Αξιολογήσεις'], + 'product.related' => ['You may also like', 'Μπορεί επίσης να σου αρέσει'], + + // ── Auth (login link) ─────────────────────────────────────── + 'auth.login' => ['Log In', 'Σύνδεση'], + 'auth.logout' => ['Log Out', 'Αποσύνδεση'], + + // ── Search ────────────────────────────────────────────────── + 'search.placeholder' => ['Search products…', 'Αναζήτηση προϊόντων…'], + 'search.results_for' => ['Search results for ', 'Αποτελέσματα αναζήτησης για '], + + 'customer_reviews' => [ + '{0} No customer reviews|{1} :count customer review|[2,*] :count customer reviews', + '{0} Καμία αξιολόγηση πελάτη|{1} :count αξιολόγηση πελάτη|[2,*] :count αξιολογήσεις πελατών', + ], + + // ── Pagination ────────────────────────────────────────────── + 'pagination.nav_label' => ['Pagination', 'Σελιδοποίηση'], + 'pagination.next' => ['Next page', 'Επόμενη σελίδα'], + 'pagination.previous' => ['Previous page', 'Προηγούμενη σελίδα'], + 'pagination.page' => ['Page :page', 'Σελίδα :page'], + + // ── Reviews ───────────────────────────────────────────────── + 'review.rating' => ['Rating', 'Βαθμολογία'], + 'review.write_label' => ['Write a review', 'Γράψε μια αξιολόγηση'], + 'review.name' => ['Name', 'Όνομα'], + 'review.name_optional' => ['Optional', 'Προαιρετικό'], + 'review.email' => ['Email', 'Email'], + 'review.email_not_published' => ['Will not be published', 'Δεν θα δημοσιευτεί'], + 'review.save_info' => [ + 'Save my name and email for the next time I comment.', + 'Αποθήκευσε το όνομα και το email μου για την επόμενη φορά που θα σχολιάσω.', + ], + 'review.submit' => ['Submit', 'Υποβολή'], + 'review.stars_count' => ['{1} :count star|[2,*] :count stars', '{1} :count αστέρι|[2,*] :count αστέρια'], + 'review.no_reviews_yet' => ['No reviews yet.', 'Δεν υπάρχουν αξιολογήσεις ακόμα.'], + 'review.write_first' => ['Write the first review', 'Γράψε την πρώτη'], + 'review.write_new' => ['Add a review', 'Πρόσθεσε μια'], + 'review.for_product' => ['review for ":name"', 'αξιολόγηση για το «:name»'], + 'review.rating_required' => ['Please select a rating.', 'Παρακαλούμε επίλεξε βαθμολογία.'], + 'review.reply' => ['Reply', 'Απάντηση'], + 'review.thank_you' => ['Thanks for your review!', 'Ευχαριστούμε για την αξιολόγησή σου!'], + + // ── Shop / listing page ───────────────────────────────────── + 'shop.showing_results' => [ + '{0} No products found|{1} Showing :first–:last of :total result|[2,*] Showing :first–:last of :total results', + '{0} Δεν βρέθηκαν προϊόντα|{1} Εμφάνιση :first–:last από :total αποτέλεσμα|[2,*] Εμφάνιση :first–:last από :total αποτελέσματα', + ], + 'shop.all_products' => ['All Products', 'Όλα τα Προϊόντα'], + 'shop.sort_label' => ['Sort products', 'Ταξινόμηση προϊόντων'], + 'shop.sort_default' => ['Default sorting', 'Προεπιλεγμένη ταξινόμηση'], + 'shop.sort_popularity' => ['Popularity', 'Δημοφιλή'], + 'shop.sort_price_asc' => ['Price: Low to High', 'Τιμή: Αύξουσα'], + 'shop.sort_price_desc' => ['Price: High to Low', 'Τιμή: Φθίνουσα'], + 'shop.sort_newest' => ['Newest', 'Νεότερα'], + 'shop.no_products' => ['No products found in this category.', 'Δεν βρέθηκαν προϊόντα σε αυτή την κατηγορία.'], + 'shop.search_label' => ['Search products', 'Αναζήτηση προϊόντων'], + 'shop.search_placeholder' => ['Search products…', 'Αναζήτησε προϊόντα…'], + 'shop.filter_price' => ['Filter by price', 'Φίλτρο τιμής'], + 'shop.price_min' => ['Min price', 'Ελάχιστη τιμή'], + 'shop.price_max' => ['Max price', 'Μέγιστη τιμή'], + 'shop.reset' => ['Reset', 'Επαναφορά'], + 'shop.apply' => ['Apply', 'Εφαρμογή'], + 'shop.availability' => ['Availability', 'Διαθεσιμότητα'], + 'shop.in_stock_only' => ['In-stock products only', 'Μόνο διαθέσιμα προϊόντα'], + + // ── Passwordless login (Auth\Services\UserOtpService) ─────── + 'auth.login_intro' => [ + 'Enter your email and we\'ll send you a code to sign in — no password needed.', + 'Γράψε το email σου και θα σου στείλουμε έναν κωδικό σύνδεσης — δεν χρειάζεται κωδικός πρόσβασης.', + ], + 'auth.email' => ['Email', 'Email'], + 'auth.terms_notice' => [ + 'By continuing, you accept the Terms of Use and have read the Privacy Policy.', + 'Συνεχίζοντας, αποδέχεσαι τους Όρους Χρήσης και έχεις διαβάσει την Πολιτική Απορρήτου.', + ], + 'auth.send_code' => ['Send code', 'Αποστολή κωδικού'], + 'auth.enter_code' => ['Enter the code', 'Εισάγετε τον κωδικό'], + 'auth.code_sent_to' => ['We sent a code to', 'Στείλαμε έναν κωδικό στο'], + 'auth.code' => ['Code', 'Κωδικός'], + 'auth.resend_code' => ['Resend code', 'Επαναποστολή κωδικού'], + 'auth.code_resent' => ['A new code was sent.', 'Στάλθηκε νέος κωδικός.'], + 'auth.change_email' => ['Use a different email', 'Χρήση διαφορετικού email'], + 'auth.invalid_code' => ['That code is invalid or has expired.', 'Ο κωδικός δεν είναι έγκυρος ή έχει λήξει.'], + 'auth.too_many_codes' => [ + 'Too many attempts. Please wait a few minutes and try again.', + 'Πολλές προσπάθειες. Περίμενε λίγα λεπτά και ξαναδοκίμασε.', + ], + 'auth.captcha_failed' => [ + 'Please complete the captcha and try again.', + 'Παρακαλούμε ολοκλήρωσε το captcha και ξαναδοκίμασε.', + ], + + // ── Account profile page (account/show.blade.php) ─────────── + 'account.nav_profile' => ['Profile', 'Προφίλ'], + 'account.nav_orders' => ['Orders', 'Παραγγελίες'], + 'account.nav_wishlist' => ['Wishlist', 'Λίστα επιθυμιών'], + 'account.email_heading' => ['Login email', 'Email σύνδεσης'], + 'account.email_change' => ['Change email', 'Αλλαγή email'], + 'account.details_heading' => ['Your details', 'Τα στοιχεία σου'], + 'account.first_name' => ['First name', 'Όνομα'], + 'account.last_name' => ['Last name', 'Επώνυμο'], + 'account.invoice' => ['I need an invoice', 'Χρειάζομαι τιμολόγιο'], + 'account.company_name' => ['Company name', 'Επωνυμία εταιρείας'], + 'account.tax_identifier' => ['Tax ID (VAT)', 'ΑΦΜ'], + 'account.address_heading' => ['Address', 'Διεύθυνση'], + 'account.line_one' => ['Address', 'Διεύθυνση'], + 'account.city' => ['City', 'Πόλη'], + 'account.postcode' => ['Postcode', 'Ταχυδρομικός κώδικας'], + 'account.state' => ['Region', 'Περιοχή'], + 'account.state_placeholder' => ['Select a region', 'Επίλεξε περιοχή'], + 'account.phone' => ['Phone', 'Τηλέφωνο'], + 'account.emails_heading' => ['Emails', 'Ειδοποιήσεις email'], + 'account.recovery_consent' => [ + 'Email me a reminder if I don\'t finish my order', + 'Στείλε μου υπενθύμιση αν δεν ολοκληρώσω την παραγγελία μου', + ], + 'account.save' => ['Save changes', 'Αποθήκευση'], + 'account.saved' => ['Your details were saved.', 'Τα στοιχεία σου αποθηκεύτηκαν.'], + 'account.delete_heading' => ['Delete account', 'Διαγραφή λογαριασμού'], + 'account.delete_text' => [ + 'This permanently deletes your account and personal data. This cannot be undone.', + 'Αυτό διαγράφει οριστικά τον λογαριασμό και τα προσωπικά σου δεδομένα. Δεν μπορεί να αναιρεθεί.', + ], + 'account.delete' => ['Delete my account', 'Διαγραφή λογαριασμού'], + 'account.delete_confirm_heading' => ['Are you sure?', 'Είσαι σίγουρος/η;'], + 'account.delete_confirm_text' => [ + 'This cannot be undone. Your account and personal data will be permanently deleted.', + 'Αυτό δεν μπορεί να αναιρεθεί. Ο λογαριασμός και τα προσωπικά σου δεδομένα θα διαγραφούν οριστικά.', + ], + 'account.delete_confirm' => ['Yes, delete my account', 'Ναι, διαγραφή λογαριασμού'], + 'account.delete_cancel' => ['Cancel', 'Ακύρωση'], + 'account.deletion_requested' => [ + 'Your account deletion has been requested.', + 'Ζητήθηκε η διαγραφή του λογαριασμού σου.', + ], + + // ── Account email-change flow (account/email.blade.php, account/email-code.blade.php) ── + 'account.email_change_heading' => ['Change your email', 'Αλλαγή email'], + 'account.email_current' => ['Your current email is', 'Το τρέχον email σου είναι'], + 'account.email_new' => ['New email', 'Νέο email'], + 'account.email_new_hint' => [ + 'We\'ll send a code to this address to confirm it\'s yours.', + 'Θα στείλουμε έναν κωδικό σε αυτή τη διεύθυνση για να επιβεβαιώσουμε ότι είναι δική σου.', + ], + 'account.email_confirm' => ['Confirm', 'Επιβεβαίωση'], + 'account.email_same' => ['That\'s already your current email.', 'Αυτό είναι ήδη το τρέχον email σου.'], + 'account.email_taken' => [ + 'That email address is already in use.', + 'Αυτή η διεύθυνση email χρησιμοποιείται ήδη.', + ], + 'account.email_changed' => ['Your email was changed.', 'Το email σου άλλαξε.'], + + // ── Order history (account/orders/index.blade.php, account/orders/show.blade.php) ── + 'orders.empty' => ['You have no orders yet.', 'Δεν έχεις παραγγελίες ακόμα.'], + 'orders.shop_now' => ['Shop now', 'Αγόρασε τώρα'], + 'orders.date' => ['Date', 'Ημερομηνία'], + 'orders.number' => ['Order', 'Παραγγελία'], + 'orders.status' => ['Status', 'Κατάσταση'], + 'orders.total' => ['Total', 'Σύνολο'], + 'orders.view' => ['View', 'Προβολή'], + 'orders.view_order' => ['View order :number', 'Προβολή παραγγελίας :number'], + 'orders.order_title' => ['Order :number', 'Παραγγελία :number'], + 'orders.back' => ['Back to orders', 'Πίσω στις παραγγελίες'], + 'orders.payment' => ['Payment method', 'Τρόπος πληρωμής'], + 'orders.shipping_method' => ['Shipping method', 'Τρόπος αποστολής'], + 'orders.tracking' => ['Tracking', 'Παρακολούθηση αποστολής'], + 'orders.items' => ['Items', 'Προϊόντα'], + 'orders.subtotal' => ['Subtotal', 'Μερικό σύνολο'], + 'orders.discount' => ['Discount', 'Έκπτωση'], + 'orders.shipping' => ['Shipping', 'Μεταφορικά'], + 'orders.tax' => ['Tax', 'ΦΠΑ'], + 'orders.shipping_to' => ['Shipping to', 'Αποστολή σε'], + 'orders.billing' => ['Billing details', 'Στοιχεία τιμολόγησης'], + + // ── Contact details (components/contact-details.blade.php) ── + 'contact.address' => ['Address', 'Διεύθυνση'], + 'contact.phone' => ['Phone', 'Τηλέφωνο'], + + // ── Contact form (contact.blade.php, ContactController, emails.contact-confirmation) ── + 'contact.sent' => [ + 'Your message was sent — we\'ll get back to you soon.', + 'Το μήνυμά σου στάλθηκε — θα σου απαντήσουμε σύντομα.', + ], + 'contact.send_failed' => [ + 'Something went wrong sending your message. Please try again.', + 'Κάτι πήγε στραβά κατά την αποστολή. Παρακαλούμε δοκίμασε ξανά.', + ], + 'contact.too_many' => [ + 'Too many messages sent. Please wait a while before trying again.', + 'Στάλθηκαν πολλά μηνύματα. Περίμενε λίγο πριν ξαναδοκιμάσεις.', + ], + 'contact.confirmation_subject' => ['We received your message', 'Λάβαμε το μήνυμά σου'], + 'contact.confirmation_preheader' => [ + 'Thanks for reaching out — here\'s a copy of your message.', + 'Ευχαριστούμε για την επικοινωνία — εδώ είναι ένα αντίγραφο του μηνύματός σου.', + ], + 'contact.confirmation_heading' => ['We received your message', 'Λάβαμε το μήνυμά σου'], + 'contact.confirmation_body' => [ + 'Thanks for getting in touch. We\'ll reply as soon as we can.', + 'Ευχαριστούμε που επικοινώνησες μαζί μας. Θα απαντήσουμε το συντομότερο δυνατό.', + ], + 'contact.confirmation_footer' => [ + 'This is a copy of the message you sent us.', + 'Αυτό είναι ένα αντίγραφο του μηνύματος που μας έστειλες.', + ], + + // ── Product page — custom fields, add-to-cart failure (product/show.blade.php, + // components/product-custom-fields.blade.php) ───────────── + 'product.personalize' => ['Personalize', 'Εξατομίκευση'], + 'product.custom_field_photo_hint' => ['Max file size: :size MB.', 'Μέγιστο μέγεθος αρχείου: :size MB.'], + 'product.custom_field_uploading' => ['Uploading…', 'Μεταφόρτωση…'], + 'product.custom_field_upload_failed' => [ + 'Upload failed. Please try again.', + 'Η μεταφόρτωση απέτυχε. Παρακαλούμε δοκίμασε ξανά.', + ], + 'product.add_to_cart_failed' => [ + '{0} Sorry, that\'s out of stock|{1} Only :count left in stock|[2,*] Only :count left in stock', + '{0} Λυπούμαστε, εξαντλήθηκε|{1} Απομένει μόνο :count κομμάτι|[2,*] Απομένουν μόνο :count κομμάτια', + ], + + // ── Wishlist (components/wishlist-button.blade.php, wishlist/guest.blade.php, wishlist/list.blade.php) ── + 'wishlist.add' => ['Add to wishlist', 'Προσθήκη στη λίστα επιθυμιών'], + 'wishlist.remove' => ['Remove from wishlist', 'Αφαίρεση από τη λίστα επιθυμιών'], + 'wishlist.added' => ['Added to wishlist', 'Προστέθηκε στη λίστα επιθυμιών'], + 'wishlist.removed' => ['Removed from wishlist', 'Αφαιρέθηκε από τη λίστα επιθυμιών'], + 'wishlist.empty' => ['Your wishlist is empty.', 'Η λίστα επιθυμιών σου είναι άδεια.'], + 'wishlist.guest_hint' => [ + 'Log in to keep your wishlist across devices.', + 'Συνδέσου για να κρατήσεις τη λίστα επιθυμιών σου σε όλες τις συσκευές.', + ], + 'wishlist.remove_named' => ['Remove :name from wishlist', 'Αφαίρεση :name από τη λίστα επιθυμιών'], + 'wishlist.remove_short' => ['Remove', 'Αφαίρεση'], + ]; + } +} diff --git a/src/Localization/Services/StorefrontLabels.php b/src/Localization/Services/StorefrontLabels.php deleted file mode 100644 index db09964..0000000 --- a/src/Localization/Services/StorefrontLabels.php +++ /dev/null @@ -1,274 +0,0 @@ -> keyed by `group.key` dot-notation, - * each value a locale => text map (`en`/`el`). - */ - public static function all(): array - { - return [ - 'nav.home' => ['en' => 'Home', 'el' => 'Αρχική'], - 'nav.products' => ['en' => 'Products', 'el' => 'Προϊόντα'], - 'nav.cart' => ['en' => 'Cart', 'el' => 'Καλάθι'], - 'nav.account' => ['en' => 'Account', 'el' => 'Λογαριασμός'], - 'nav.back' => ['en' => 'Back', 'el' => 'Πίσω'], - 'nav.contact' => ['en' => 'Contact', 'el' => 'Επικοινωνία'], - 'nav.close' => ['en' => 'Close', 'el' => 'Κλείσιμο'], - 'cart.empty' => ['en' => 'Your cart is empty', 'el' => 'Το καλάθι σας είναι άδειο'], - 'cart.checkout' => ['en' => 'Checkout', 'el' => 'Ολοκλήρωση Παραγγελίας'], - 'cart.total' => ['en' => 'Total', 'el' => 'Σύνολο'], - 'cart.remove' => ['en' => 'Remove', 'el' => 'Αφαίρεση'], - 'product.add_to_cart' => ['en' => 'Add to Cart', 'el' => 'Προσθήκη στο Καλάθι'], - 'product.out_of_stock' => ['en' => 'Out of Stock', 'el' => 'Εξαντλήθηκε'], - 'product.sold' => ['en' => 'Sold', 'el' => 'Εξαντλήθηκε'], - 'product.price' => ['en' => 'Price', 'el' => 'Τιμή'], - 'product.description' => ['en' => 'Description', 'el' => 'Περιγραφή'], - 'product.no_image' => ['en' => 'No image', 'el' => 'Χωρίς εικόνα'], - 'product.read_more' => ['en' => 'Read more', 'el' => 'Περισσότερα'], - 'product.reviews' => ['en' => 'Reviews', 'el' => 'Αξιολογήσεις'], - 'product.related' => ['en' => 'You may also like', 'el' => 'Μπορεί επίσης να σου αρέσει'], - 'auth.login' => ['en' => 'Log In', 'el' => 'Σύνδεση'], - 'auth.logout' => ['en' => 'Log Out', 'el' => 'Αποσύνδεση'], - 'search.placeholder' => ['en' => 'Search products…', 'el' => 'Αναζήτηση προϊόντων…'], - 'search.results_for' => ['en' => 'Search results for ', 'el' => 'Αποτελέσματα αναζήτησης για '], - 'customer_reviews' => [ - 'en' => '{0} No customer reviews|{1} :count customer review|[2,*] :count customer reviews', - 'el' => '{0} Καμία αξιολόγηση πελάτη|{1} :count αξιολόγηση πελάτη|[2,*] :count αξιολογήσεις πελατών', - ], - 'pagination.nav_label' => ['en' => 'Pagination', 'el' => 'Σελιδοποίηση'], - 'pagination.next' => ['en' => 'Next page', 'el' => 'Επόμενη σελίδα'], - 'pagination.previous' => ['en' => 'Previous page', 'el' => 'Προηγούμενη σελίδα'], - 'pagination.page' => ['en' => 'Page :page', 'el' => 'Σελίδα :page'], - 'review.rating' => ['en' => 'Rating', 'el' => 'Βαθμολογία'], - 'review.write_label' => ['en' => 'Write a review', 'el' => 'Γράψε μια αξιολόγηση'], - 'review.name' => ['en' => 'Name', 'el' => 'Όνομα'], - 'review.name_optional' => ['en' => 'Optional', 'el' => 'Προαιρετικό'], - 'review.email' => ['en' => 'Email', 'el' => 'Email'], - 'review.email_not_published' => ['en' => 'Will not be published', 'el' => 'Δεν θα δημοσιευτεί'], - 'review.save_info' => [ - 'en' => 'Save my name and email for the next time I comment.', - 'el' => 'Αποθήκευσε το όνομα και το email μου για την επόμενη φορά που θα σχολιάσω.', - ], - 'review.submit' => ['en' => 'Submit', 'el' => 'Υποβολή'], - 'review.stars_count' => ['en' => '{1} :count star|[2,*] :count stars', 'el' => '{1} :count αστέρι|[2,*] :count αστέρια'], - 'review.no_reviews_yet' => ['en' => 'No reviews yet.', 'el' => 'Δεν υπάρχουν αξιολογήσεις ακόμα.'], - 'review.write_first' => ['en' => 'Write the first review', 'el' => 'Γράψε την πρώτη'], - 'review.write_new' => ['en' => 'Add a review', 'el' => 'Πρόσθεσε μια'], - 'review.for_product' => ['en' => 'review for ":name"', 'el' => 'αξιολόγηση για το «:name»'], - 'shop.showing_results' => [ - 'en' => '{0} No products found|{1} Showing :first–:last of :total result|[2,*] Showing :first–:last of :total results', - 'el' => '{0} Δεν βρέθηκαν προϊόντα|{1} Εμφάνιση :first–:last από :total αποτέλεσμα|[2,*] Εμφάνιση :first–:last από :total αποτελέσματα', - ], - 'shop.all_products' => ['en' => 'All Products', 'el' => 'Όλα τα Προϊόντα'], - 'shop.sort_label' => ['en' => 'Sort products', 'el' => 'Ταξινόμηση προϊόντων'], - 'shop.sort_default' => ['en' => 'Default sorting', 'el' => 'Προεπιλεγμένη ταξινόμηση'], - 'shop.sort_popularity' => ['en' => 'Popularity', 'el' => 'Δημοφιλή'], - 'shop.sort_price_asc' => ['en' => 'Price: Low to High', 'el' => 'Τιμή: Αύξουσα'], - 'shop.sort_price_desc' => ['en' => 'Price: High to Low', 'el' => 'Τιμή: Φθίνουσα'], - 'shop.sort_newest' => ['en' => 'Newest', 'el' => 'Νεότερα'], - 'shop.no_products' => ['en' => 'No products found in this category.', 'el' => 'Δεν βρέθηκαν προϊόντα σε αυτή την κατηγορία.'], - 'shop.search_label' => ['en' => 'Search products', 'el' => 'Αναζήτηση προϊόντων'], - 'shop.search_placeholder' => ['en' => 'Search products…', 'el' => 'Αναζήτησε προϊόντα…'], - 'shop.filter_price' => ['en' => 'Filter by price', 'el' => 'Φίλτρο τιμής'], - 'shop.price_min' => ['en' => 'Min price', 'el' => 'Ελάχιστη τιμή'], - 'shop.price_max' => ['en' => 'Max price', 'el' => 'Μέγιστη τιμή'], - 'shop.reset' => ['en' => 'Reset', 'el' => 'Επαναφορά'], - 'shop.apply' => ['en' => 'Apply', 'el' => 'Εφαρμογή'], - 'shop.availability' => ['en' => 'Availability', 'el' => 'Διαθεσιμότητα'], - 'shop.in_stock_only' => ['en' => 'In-stock products only', 'el' => 'Μόνο διαθέσιμα προϊόντα'], - - // Passwordless login (Auth\Services\UserOtpService) - 'auth.login_intro' => [ - 'en' => 'Enter your email and we\'ll send you a code to sign in — no password needed.', - 'el' => 'Γράψε το email σου και θα σου στείλουμε έναν κωδικό σύνδεσης — δεν χρειάζεται κωδικός πρόσβασης.', - ], - 'auth.email' => ['en' => 'Email', 'el' => 'Email'], - 'auth.terms_notice' => [ - 'en' => 'By continuing, you accept the Terms of Use and have read the Privacy Policy.', - 'el' => 'Συνεχίζοντας, αποδέχεσαι τους Όρους Χρήσης και έχεις διαβάσει την Πολιτική Απορρήτου.', - ], - 'auth.send_code' => ['en' => 'Send code', 'el' => 'Αποστολή κωδικού'], - 'auth.enter_code' => ['en' => 'Enter the code', 'el' => 'Εισάγετε τον κωδικό'], - 'auth.code_sent_to' => ['en' => 'We sent a code to', 'el' => 'Στείλαμε έναν κωδικό στο'], - 'auth.code' => ['en' => 'Code', 'el' => 'Κωδικός'], - 'auth.resend_code' => ['en' => 'Resend code', 'el' => 'Επαναποστολή κωδικού'], - 'auth.code_resent' => ['en' => 'A new code was sent.', 'el' => 'Στάλθηκε νέος κωδικός.'], - 'auth.change_email' => ['en' => 'Use a different email', 'el' => 'Χρήση διαφορετικού email'], - 'auth.invalid_code' => ['en' => 'That code is invalid or has expired.', 'el' => 'Ο κωδικός δεν είναι έγκυρος ή έχει λήξει.'], - 'auth.too_many_codes' => [ - 'en' => 'Too many attempts. Please wait a few minutes and try again.', - 'el' => 'Πολλές προσπάθειες. Περίμενε λίγα λεπτά και ξαναδοκίμασε.', - ], - 'auth.captcha_failed' => [ - 'en' => 'Please complete the captcha and try again.', - 'el' => 'Παρακαλούμε ολοκλήρωσε το captcha και ξαναδοκίμασε.', - ], - - // Account profile page (account/show.blade.php) - 'account.nav_profile' => ['en' => 'Profile', 'el' => 'Προφίλ'], - 'account.nav_orders' => ['en' => 'Orders', 'el' => 'Παραγγελίες'], - 'account.nav_wishlist' => ['en' => 'Wishlist', 'el' => 'Λίστα επιθυμιών'], - 'account.email_heading' => ['en' => 'Login email', 'el' => 'Email σύνδεσης'], - 'account.email_change' => ['en' => 'Change email', 'el' => 'Αλλαγή email'], - 'account.details_heading' => ['en' => 'Your details', 'el' => 'Τα στοιχεία σου'], - 'account.first_name' => ['en' => 'First name', 'el' => 'Όνομα'], - 'account.last_name' => ['en' => 'Last name', 'el' => 'Επώνυμο'], - 'account.invoice' => ['en' => 'I need an invoice', 'el' => 'Χρειάζομαι τιμολόγιο'], - 'account.company_name' => ['en' => 'Company name', 'el' => 'Επωνυμία εταιρείας'], - 'account.tax_identifier' => ['en' => 'Tax ID (VAT)', 'el' => 'ΑΦΜ'], - 'account.address_heading' => ['en' => 'Address', 'el' => 'Διεύθυνση'], - 'account.line_one' => ['en' => 'Address', 'el' => 'Διεύθυνση'], - 'account.city' => ['en' => 'City', 'el' => 'Πόλη'], - 'account.postcode' => ['en' => 'Postcode', 'el' => 'Ταχυδρομικός κώδικας'], - 'account.state' => ['en' => 'Region', 'el' => 'Περιοχή'], - 'account.state_placeholder' => ['en' => 'Select a region', 'el' => 'Επίλεξε περιοχή'], - 'account.phone' => ['en' => 'Phone', 'el' => 'Τηλέφωνο'], - 'account.emails_heading' => ['en' => 'Emails', 'el' => 'Ειδοποιήσεις email'], - 'account.recovery_consent' => [ - 'en' => 'Email me a reminder if I don\'t finish my order', - 'el' => 'Στείλε μου υπενθύμιση αν δεν ολοκληρώσω την παραγγελία μου', - ], - 'account.save' => ['en' => 'Save changes', 'el' => 'Αποθήκευση'], - 'account.saved' => ['en' => 'Your details were saved.', 'el' => 'Τα στοιχεία σου αποθηκεύτηκαν.'], - 'account.delete_heading' => ['en' => 'Delete account', 'el' => 'Διαγραφή λογαριασμού'], - 'account.delete_text' => [ - 'en' => 'This permanently deletes your account and personal data. This cannot be undone.', - 'el' => 'Αυτό διαγράφει οριστικά τον λογαριασμό και τα προσωπικά σου δεδομένα. Δεν μπορεί να αναιρεθεί.', - ], - 'account.delete' => ['en' => 'Delete my account', 'el' => 'Διαγραφή λογαριασμού'], - 'account.delete_confirm_heading' => ['en' => 'Are you sure?', 'el' => 'Είσαι σίγουρος/η;'], - 'account.delete_confirm_text' => [ - 'en' => 'This cannot be undone. Your account and personal data will be permanently deleted.', - 'el' => 'Αυτό δεν μπορεί να αναιρεθεί. Ο λογαριασμός και τα προσωπικά σου δεδομένα θα διαγραφούν οριστικά.', - ], - 'account.delete_confirm' => ['en' => 'Yes, delete my account', 'el' => 'Ναι, διαγραφή λογαριασμού'], - 'account.delete_cancel' => ['en' => 'Cancel', 'el' => 'Ακύρωση'], - 'account.deletion_requested' => [ - 'en' => 'Your account deletion has been requested.', - 'el' => 'Ζητήθηκε η διαγραφή του λογαριασμού σου.', - ], - - // Account email-change flow (account/email.blade.php, account/email-code.blade.php) - 'account.email_change_heading' => ['en' => 'Change your email', 'el' => 'Αλλαγή email'], - 'account.email_current' => ['en' => 'Your current email is', 'el' => 'Το τρέχον email σου είναι'], - 'account.email_new' => ['en' => 'New email', 'el' => 'Νέο email'], - 'account.email_new_hint' => [ - 'en' => 'We\'ll send a code to this address to confirm it\'s yours.', - 'el' => 'Θα στείλουμε έναν κωδικό σε αυτή τη διεύθυνση για να επιβεβαιώσουμε ότι είναι δική σου.', - ], - 'account.email_confirm' => ['en' => 'Confirm', 'el' => 'Επιβεβαίωση'], - 'account.email_same' => [ - 'en' => 'That\'s already your current email.', - 'el' => 'Αυτό είναι ήδη το τρέχον email σου.', - ], - 'account.email_taken' => [ - 'en' => 'That email address is already in use.', - 'el' => 'Αυτή η διεύθυνση email χρησιμοποιείται ήδη.', - ], - 'account.email_changed' => ['en' => 'Your email was changed.', 'el' => 'Το email σου άλλαξε.'], - - // Order history (account/orders/index.blade.php, account/orders/show.blade.php) - 'orders.empty' => ['en' => 'You have no orders yet.', 'el' => 'Δεν έχεις παραγγελίες ακόμα.'], - 'orders.shop_now' => ['en' => 'Shop now', 'el' => 'Αγόρασε τώρα'], - 'orders.date' => ['en' => 'Date', 'el' => 'Ημερομηνία'], - 'orders.number' => ['en' => 'Order', 'el' => 'Παραγγελία'], - 'orders.status' => ['en' => 'Status', 'el' => 'Κατάσταση'], - 'orders.total' => ['en' => 'Total', 'el' => 'Σύνολο'], - 'orders.view' => ['en' => 'View', 'el' => 'Προβολή'], - 'orders.view_order' => ['en' => 'View order :number', 'el' => 'Προβολή παραγγελίας :number'], - 'orders.order_title' => ['en' => 'Order :number', 'el' => 'Παραγγελία :number'], - 'orders.back' => ['en' => 'Back to orders', 'el' => 'Πίσω στις παραγγελίες'], - 'orders.payment' => ['en' => 'Payment method', 'el' => 'Τρόπος πληρωμής'], - 'orders.shipping_method' => ['en' => 'Shipping method', 'el' => 'Τρόπος αποστολής'], - 'orders.tracking' => ['en' => 'Tracking', 'el' => 'Παρακολούθηση αποστολής'], - 'orders.items' => ['en' => 'Items', 'el' => 'Προϊόντα'], - 'orders.subtotal' => ['en' => 'Subtotal', 'el' => 'Μερικό σύνολο'], - 'orders.discount' => ['en' => 'Discount', 'el' => 'Έκπτωση'], - 'orders.shipping' => ['en' => 'Shipping', 'el' => 'Μεταφορικά'], - 'orders.tax' => ['en' => 'Tax', 'el' => 'ΦΠΑ'], - 'orders.shipping_to' => ['en' => 'Shipping to', 'el' => 'Αποστολή σε'], - 'orders.billing' => ['en' => 'Billing details', 'el' => 'Στοιχεία τιμολόγησης'], - - // Contact details (components/contact-details.blade.php) - 'contact.address' => ['en' => 'Address', 'el' => 'Διεύθυνση'], - 'contact.phone' => ['en' => 'Phone', 'el' => 'Τηλέφωνο'], - - // Contact form (contact.blade.php, ContactController, emails.contact-confirmation) - 'contact.sent' => [ - 'en' => 'Your message was sent — we\'ll get back to you soon.', - 'el' => 'Το μήνυμά σου στάλθηκε — θα σου απαντήσουμε σύντομα.', - ], - 'contact.send_failed' => [ - 'en' => 'Something went wrong sending your message. Please try again.', - 'el' => 'Κάτι πήγε στραβά κατά την αποστολή. Παρακαλούμε δοκίμασε ξανά.', - ], - 'contact.too_many' => [ - 'en' => 'Too many messages sent. Please wait a while before trying again.', - 'el' => 'Στάλθηκαν πολλά μηνύματα. Περίμενε λίγο πριν ξαναδοκιμάσεις.', - ], - 'contact.confirmation_subject' => ['en' => 'We received your message', 'el' => 'Λάβαμε το μήνυμά σου'], - 'contact.confirmation_preheader' => [ - 'en' => 'Thanks for reaching out — here\'s a copy of your message.', - 'el' => 'Ευχαριστούμε για την επικοινωνία — εδώ είναι ένα αντίγραφο του μηνύματός σου.', - ], - 'contact.confirmation_heading' => ['en' => 'We received your message', 'el' => 'Λάβαμε το μήνυμά σου'], - 'contact.confirmation_body' => [ - 'en' => 'Thanks for getting in touch. We\'ll reply as soon as we can.', - 'el' => 'Ευχαριστούμε που επικοινώνησες μαζί μας. Θα απαντήσουμε το συντομότερο δυνατό.', - ], - 'contact.confirmation_footer' => [ - 'en' => 'This is a copy of the message you sent us.', - 'el' => 'Αυτό είναι ένα αντίγραφο του μηνύματος που μας έστειλες.', - ], - - // Product page — custom fields, add-to-cart failure (product/show.blade.php, - // components/product-custom-fields.blade.php) - 'product.personalize' => ['en' => 'Personalize', 'el' => 'Εξατομίκευση'], - 'product.custom_field_photo_hint' => [ - 'en' => 'Max file size: :size MB.', - 'el' => 'Μέγιστο μέγεθος αρχείου: :size MB.', - ], - 'product.custom_field_uploading' => ['en' => 'Uploading…', 'el' => 'Μεταφόρτωση…'], - 'product.custom_field_upload_failed' => [ - 'en' => 'Upload failed. Please try again.', - 'el' => 'Η μεταφόρτωση απέτυχε. Παρακαλούμε δοκίμασε ξανά.', - ], - 'product.add_to_cart_failed' => [ - 'en' => '{0} Sorry, that\'s out of stock|{1} Only :count left in stock|[2,*] Only :count left in stock', - 'el' => '{0} Λυπούμαστε, εξαντλήθηκε|{1} Απομένει μόνο :count κομμάτι|[2,*] Απομένουν μόνο :count κομμάτια', - ], - - // Reviews (components/review-form.blade.php, review-card.blade.php, product/show.blade.php) - 'review.rating_required' => ['en' => 'Please select a rating.', 'el' => 'Παρακαλούμε επίλεξε βαθμολογία.'], - 'review.reply' => ['en' => 'Reply', 'el' => 'Απάντηση'], - 'review.thank_you' => [ - 'en' => 'Thanks for your review!', - 'el' => 'Ευχαριστούμε για την αξιολόγησή σου!', - ], - - // Wishlist (components/wishlist-button.blade.php, wishlist/guest.blade.php, wishlist/list.blade.php) - 'wishlist.add' => ['en' => 'Add to wishlist', 'el' => 'Προσθήκη στη λίστα επιθυμιών'], - 'wishlist.remove' => ['en' => 'Remove from wishlist', 'el' => 'Αφαίρεση από τη λίστα επιθυμιών'], - 'wishlist.added' => ['en' => 'Added to wishlist', 'el' => 'Προστέθηκε στη λίστα επιθυμιών'], - 'wishlist.removed' => ['en' => 'Removed from wishlist', 'el' => 'Αφαιρέθηκε από τη λίστα επιθυμιών'], - 'wishlist.empty' => ['en' => 'Your wishlist is empty.', 'el' => 'Η λίστα επιθυμιών σου είναι άδεια.'], - 'wishlist.guest_hint' => [ - 'en' => 'Log in to keep your wishlist across devices.', - 'el' => 'Συνδέσου για να κρατήσεις τη λίστα επιθυμιών σου σε όλες τις συσκευές.', - ], - 'wishlist.remove_named' => ['en' => 'Remove :name from wishlist', 'el' => 'Αφαίρεση :name από τη λίστα επιθυμιών'], - 'wishlist.remove_short' => ['en' => 'Remove', 'el' => 'Αφαίρεση'], - ]; - } -}