Feat: Moving Storefront Labels into a proper seeder
This commit is contained in:
@@ -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.
|
||||
*
|
||||
|
||||
@@ -0,0 +1,314 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Core\Localization\Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use Modules\Core\Localization\Services\TranslationService;
|
||||
use Spatie\TranslationLoader\LanguageLine;
|
||||
|
||||
/**
|
||||
* Default `storefront` translation lines — nav, cart, product, shop, auth,
|
||||
* account, orders, contact, reviews, wishlist (see the storefront views
|
||||
* under resources/views for where each is used).
|
||||
*
|
||||
* Additive and idempotent: a group/key that already exists is left untouched,
|
||||
* so anything edited in the Filament Language Lines UI wins on a re-run. Runs
|
||||
* explicitly — `php artisan db:seed --class="Modules\Core\Localization\
|
||||
* Database\Seeders\StorefrontTranslationsSeeder"` — it is not wired into any
|
||||
* app's own DatabaseSeeder.
|
||||
*
|
||||
* Greek copy uses an informal register (εσύ/σου) — a consuming app with a
|
||||
* different house style overrides individual lines from the Filament
|
||||
* Language Lines UI same as any other translation, rather than forking
|
||||
* this class.
|
||||
*/
|
||||
class StorefrontTranslationsSeeder extends Seeder
|
||||
{
|
||||
public function run(): void
|
||||
{
|
||||
$translations = app(TranslationService::class);
|
||||
|
||||
foreach ($this->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<string, array{0: string, 1: string}>
|
||||
*/
|
||||
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 <a href=":terms">Terms of Use</a> and have read the <a href=":privacy">Privacy Policy</a>.',
|
||||
'Συνεχίζοντας, αποδέχεσαι τους <a href=":terms">Όρους Χρήσης</a> και έχεις διαβάσει την <a href=":privacy">Πολιτική Απορρήτου</a>.',
|
||||
],
|
||||
'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', 'Αφαίρεση'],
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,274 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Core\Localization\Services;
|
||||
|
||||
/**
|
||||
* Default storefront UI label translations (group `storefront`), seeded by
|
||||
* Modules\Core\Command\InstallLunarCommand. Kept as its own class, separate from
|
||||
* the seeding logic, so the actual label list can be scanned/diffed without wading
|
||||
* through the upsert mechanics — see InstallLunarCommand::seedStorefrontLabels()
|
||||
* for how (and how safely) these get written.
|
||||
*/
|
||||
class StorefrontLabels
|
||||
{
|
||||
/**
|
||||
* @return array<string, array<string, string>> 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 <a href=":terms">Terms of Use</a> and have read the <a href=":privacy">Privacy Policy</a>.',
|
||||
'el' => 'Συνεχίζοντας, αποδέχεσαι τους <a href=":terms">Όρους Χρήσης</a> και έχεις διαβάσει την <a href=":privacy">Πολιτική Απορρήτου</a>.',
|
||||
],
|
||||
'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' => 'Αφαίρεση'],
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user