feat: add multi-language (i18n) support for vendor dashboard and storefront

- Add database fields for language preferences:
  - Vendor: dashboard_language, storefront_language, storefront_languages
  - User: preferred_language
  - Customer: preferred_language

- Add language middleware for request-level language detection:
  - Cookie-based persistence
  - Browser Accept-Language fallback
  - Vendor storefront language constraints

- Add language API endpoints (/api/v1/language/*):
  - POST /set - Set language preference
  - GET /current - Get current language info
  - GET /list - List available languages
  - DELETE /clear - Clear preference

- Add i18n utilities (app/utils/i18n.py):
  - JSON-based translation loading
  - Jinja2 template integration
  - Language resolution helpers

- Add reusable language selector macros for templates
- Add languageSelector() Alpine.js component
- Add translation files (en, fr, de, lb) in static/locales/
- Add architecture rules documentation for language implementation
- Update marketplace-product-detail.js to use native language names

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-13 22:36:09 +01:00
parent d21cd366dc
commit d2b05441fc
30 changed files with 4615 additions and 33 deletions

View File

@@ -179,24 +179,24 @@ function adminMarketplaceProductDetail() {
},
/**
* Get full language name from ISO code
* Get full language name from ISO code (native names for Luxembourg languages)
*/
getLanguageName(code) {
const languages = {
'en': 'English',
'de': 'German',
'fr': 'French',
'lb': 'Luxembourgish',
'es': 'Spanish',
'it': 'Italian',
'nl': 'Dutch',
'pt': 'Portuguese',
'pl': 'Polish',
'cs': 'Czech',
'da': 'Danish',
'sv': 'Swedish',
'fi': 'Finnish',
'no': 'Norwegian',
'de': 'Deutsch',
'fr': 'Français',
'lb': 'Lëtzebuergesch',
'es': 'Español',
'it': 'Italiano',
'nl': 'Nederlands',
'pt': 'Português',
'pl': 'Polski',
'cs': 'Čeština',
'da': 'Dansk',
'sv': 'Svenska',
'fi': 'Suomi',
'no': 'Norsk',
'hu': 'Hungarian',
'ro': 'Romanian',
'bg': 'Bulgarian',

475
static/locales/de.json Normal file
View File

@@ -0,0 +1,475 @@
{
"common": {
"save": "Speichern",
"cancel": "Abbrechen",
"delete": "Löschen",
"edit": "Bearbeiten",
"create": "Erstellen",
"update": "Aktualisieren",
"add": "Hinzufügen",
"remove": "Entfernen",
"close": "Schließen",
"back": "Zurück",
"next": "Weiter",
"previous": "Zurück",
"submit": "Absenden",
"confirm": "Bestätigen",
"yes": "Ja",
"no": "Nein",
"ok": "OK",
"done": "Fertig",
"loading": "Laden...",
"saving": "Speichern...",
"processing": "Verarbeiten...",
"searching": "Suchen...",
"refresh": "Aktualisieren",
"retry": "Erneut versuchen",
"view": "Ansehen",
"view_details": "Details ansehen",
"view_all": "Alle anzeigen",
"show_more": "Mehr anzeigen",
"show_less": "Weniger anzeigen",
"search": "Suchen",
"filter": "Filtern",
"sort": "Sortieren",
"export": "Exportieren",
"import": "Importieren",
"download": "Herunterladen",
"upload": "Hochladen",
"select": "Auswählen",
"select_all": "Alle auswählen",
"deselect_all": "Auswahl aufheben",
"actions": "Aktionen",
"status": "Status",
"date": "Datum",
"time": "Zeit",
"name": "Name",
"email": "E-Mail",
"phone": "Telefon",
"address": "Adresse",
"description": "Beschreibung",
"notes": "Notizen",
"total": "Gesamt",
"amount": "Betrag",
"quantity": "Menge",
"price": "Preis",
"items": "Artikel",
"id": "ID",
"type": "Typ",
"category": "Kategorie",
"tags": "Tags",
"active": "Aktiv",
"inactive": "Inaktiv",
"enabled": "Aktiviert",
"disabled": "Deaktiviert",
"pending": "Ausstehend",
"completed": "Abgeschlossen",
"failed": "Fehlgeschlagen",
"success": "Erfolg",
"error": "Fehler",
"warning": "Warnung",
"info": "Info",
"all": "Alle",
"none": "Keine",
"other": "Andere",
"unknown": "Unbekannt",
"not_available": "N/V",
"required": "Erforderlich",
"optional": "Optional",
"language": "Sprache",
"settings": "Einstellungen",
"help": "Hilfe",
"support": "Support",
"contact": "Kontakt",
"about": "Über",
"privacy": "Datenschutz",
"terms": "AGB",
"copyright": "Urheberrecht"
},
"auth": {
"sign_in": "Anmelden",
"sign_out": "Abmelden",
"sign_up": "Registrieren",
"login": "Anmelden",
"logout": "Abmelden",
"register": "Registrieren",
"forgot_password": "Passwort vergessen?",
"reset_password": "Passwort zurücksetzen",
"change_password": "Passwort ändern",
"username": "Benutzername",
"password": "Passwort",
"confirm_password": "Passwort bestätigen",
"current_password": "Aktuelles Passwort",
"new_password": "Neues Passwort",
"remember_me": "Angemeldet bleiben",
"email_placeholder": "E-Mail eingeben",
"username_placeholder": "Benutzername eingeben",
"password_placeholder": "Passwort eingeben",
"login_success": "Anmeldung erfolgreich",
"login_failed": "Anmeldung fehlgeschlagen",
"logout_success": "Sie wurden abgemeldet",
"invalid_credentials": "Ungültiger Benutzername oder Passwort",
"session_expired": "Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.",
"account_locked": "Ihr Konto wurde gesperrt",
"account_inactive": "Ihr Konto ist inaktiv"
},
"nav": {
"dashboard": "Dashboard",
"products": "Produkte",
"orders": "Bestellungen",
"customers": "Kunden",
"inventory": "Inventar",
"analytics": "Analysen",
"reports": "Berichte",
"settings": "Einstellungen",
"profile": "Profil",
"team": "Team",
"marketplace": "Marktplatz",
"integrations": "Integrationen",
"notifications": "Benachrichtigungen",
"help": "Hilfe",
"home": "Startseite",
"shop": "Shop",
"cart": "Warenkorb",
"checkout": "Kasse",
"account": "Konto",
"wishlist": "Wunschliste"
},
"dashboard": {
"title": "Dashboard",
"welcome": "Willkommen zurück",
"overview": "Übersicht",
"quick_stats": "Schnellstatistiken",
"recent_activity": "Letzte Aktivitäten",
"total_products": "Produkte gesamt",
"total_orders": "Bestellungen gesamt",
"total_customers": "Kunden gesamt",
"total_revenue": "Gesamtumsatz",
"active_products": "Aktive Produkte",
"pending_orders": "Ausstehende Bestellungen",
"new_customers": "Neue Kunden",
"today": "Heute",
"this_week": "Diese Woche",
"this_month": "Dieser Monat",
"this_year": "Dieses Jahr",
"error_loading": "Fehler beim Laden des Dashboards",
"no_data": "Keine Daten verfügbar"
},
"products": {
"title": "Produkte",
"product": "Produkt",
"add_product": "Produkt hinzufügen",
"edit_product": "Produkt bearbeiten",
"delete_product": "Produkt löschen",
"product_name": "Produktname",
"product_code": "Produktcode",
"sku": "SKU",
"price": "Preis",
"sale_price": "Verkaufspreis",
"cost": "Kosten",
"stock": "Lagerbestand",
"in_stock": "Auf Lager",
"out_of_stock": "Nicht auf Lager",
"low_stock": "Geringer Bestand",
"availability": "Verfügbarkeit",
"available": "Verfügbar",
"unavailable": "Nicht verfügbar",
"brand": "Marke",
"category": "Kategorie",
"categories": "Kategorien",
"image": "Bild",
"images": "Bilder",
"main_image": "Hauptbild",
"gallery": "Galerie",
"weight": "Gewicht",
"dimensions": "Abmessungen",
"color": "Farbe",
"size": "Größe",
"material": "Material",
"condition": "Zustand",
"new": "Neu",
"used": "Gebraucht",
"refurbished": "Generalüberholt",
"no_products": "Keine Produkte gefunden",
"search_products": "Produkte suchen...",
"filter_by_category": "Nach Kategorie filtern",
"filter_by_status": "Nach Status filtern",
"sort_by": "Sortieren nach",
"sort_newest": "Neueste",
"sort_oldest": "Älteste",
"sort_price_low": "Preis: Niedrig bis Hoch",
"sort_price_high": "Preis: Hoch bis Niedrig",
"sort_name_az": "Name: A-Z",
"sort_name_za": "Name: Z-A"
},
"orders": {
"title": "Bestellungen",
"order": "Bestellung",
"order_id": "Bestellnummer",
"order_number": "Bestellnummer",
"order_date": "Bestelldatum",
"order_status": "Bestellstatus",
"order_details": "Bestelldetails",
"order_items": "Bestellartikel",
"order_total": "Bestellsumme",
"subtotal": "Zwischensumme",
"shipping": "Versand",
"tax": "Steuer",
"discount": "Rabatt",
"customer": "Kunde",
"shipping_address": "Lieferadresse",
"billing_address": "Rechnungsadresse",
"payment_method": "Zahlungsmethode",
"payment_status": "Zahlungsstatus",
"tracking": "Sendungsverfolgung",
"tracking_number": "Sendungsnummer",
"carrier": "Versanddienstleister",
"no_orders": "Keine Bestellungen gefunden",
"search_orders": "Bestellungen suchen...",
"filter_by_status": "Nach Status filtern",
"status_pending": "Ausstehend",
"status_processing": "In Bearbeitung",
"status_shipped": "Versendet",
"status_delivered": "Zugestellt",
"status_cancelled": "Storniert",
"status_refunded": "Erstattet",
"status_confirmed": "Bestätigt",
"status_rejected": "Abgelehnt",
"confirm_order": "Bestellung bestätigen",
"reject_order": "Bestellung ablehnen",
"set_tracking": "Sendungsverfolgung setzen",
"view_details": "Details ansehen"
},
"customers": {
"title": "Kunden",
"customer": "Kunde",
"add_customer": "Kunde hinzufügen",
"edit_customer": "Kunde bearbeiten",
"customer_name": "Kundenname",
"customer_email": "Kunden-E-Mail",
"customer_phone": "Kundentelefon",
"customer_number": "Kundennummer",
"first_name": "Vorname",
"last_name": "Nachname",
"company": "Firma",
"total_orders": "Bestellungen gesamt",
"total_spent": "Gesamtausgaben",
"last_order": "Letzte Bestellung",
"registered": "Registriert",
"no_customers": "Keine Kunden gefunden",
"search_customers": "Kunden suchen..."
},
"inventory": {
"title": "Inventar",
"stock_level": "Lagerbestand",
"quantity": "Menge",
"reorder_point": "Nachbestellpunkt",
"adjust_stock": "Bestand anpassen",
"stock_in": "Wareneingang",
"stock_out": "Warenausgang",
"transfer": "Transfer",
"history": "Verlauf",
"low_stock_alert": "Warnung bei geringem Bestand",
"out_of_stock_alert": "Warnung bei Ausverkauf"
},
"marketplace": {
"title": "Marktplatz",
"import": "Importieren",
"export": "Exportieren",
"sync": "Synchronisieren",
"source": "Quelle",
"source_url": "Quell-URL",
"import_products": "Produkte importieren",
"start_import": "Import starten",
"importing": "Importiere...",
"import_complete": "Import abgeschlossen",
"import_failed": "Import fehlgeschlagen",
"import_history": "Import-Verlauf",
"job_id": "Auftrags-ID",
"started_at": "Gestartet um",
"completed_at": "Abgeschlossen um",
"duration": "Dauer",
"imported_count": "Importiert",
"error_count": "Fehler",
"total_processed": "Gesamt verarbeitet",
"progress": "Fortschritt",
"no_import_jobs": "Noch keine Imports",
"start_first_import": "Starten Sie Ihren ersten Import mit dem Formular oben"
},
"letzshop": {
"title": "Letzshop-Integration",
"connection": "Verbindung",
"credentials": "Zugangsdaten",
"api_key": "API-Schlüssel",
"api_endpoint": "API-Endpunkt",
"auto_sync": "Auto-Sync",
"sync_interval": "Sync-Intervall",
"every_hour": "Jede Stunde",
"every_day": "Jeden Tag",
"test_connection": "Verbindung testen",
"save_credentials": "Zugangsdaten speichern",
"connection_success": "Verbindung erfolgreich",
"connection_failed": "Verbindung fehlgeschlagen",
"last_sync": "Letzte Synchronisation",
"sync_status": "Sync-Status",
"import_orders": "Bestellungen importieren",
"export_products": "Produkte exportieren",
"no_credentials": "Konfigurieren Sie Ihren API-Schlüssel in den Einstellungen",
"carriers": {
"dhl": "DHL",
"ups": "UPS",
"fedex": "FedEx",
"dpd": "DPD",
"gls": "GLS",
"post_luxembourg": "Post Luxemburg",
"other": "Andere"
}
},
"team": {
"title": "Team",
"members": "Mitglieder",
"add_member": "Mitglied hinzufügen",
"invite_member": "Mitglied einladen",
"remove_member": "Mitglied entfernen",
"role": "Rolle",
"owner": "Inhaber",
"manager": "Manager",
"editor": "Bearbeiter",
"viewer": "Betrachter",
"permissions": "Berechtigungen",
"pending_invitations": "Ausstehende Einladungen",
"invitation_sent": "Einladung gesendet",
"invitation_accepted": "Einladung angenommen"
},
"settings": {
"title": "Einstellungen",
"general": "Allgemein",
"store": "Shop",
"store_name": "Shop-Name",
"store_description": "Shop-Beschreibung",
"contact_email": "Kontakt-E-Mail",
"contact_phone": "Kontakttelefon",
"business_address": "Geschäftsadresse",
"tax_number": "Steuernummer",
"currency": "Währung",
"timezone": "Zeitzone",
"language": "Sprache",
"language_settings": "Spracheinstellungen",
"default_language": "Standardsprache",
"dashboard_language": "Dashboard-Sprache",
"storefront_language": "Shop-Sprache",
"enabled_languages": "Aktivierte Sprachen",
"notifications": "Benachrichtigungen",
"email_notifications": "E-Mail-Benachrichtigungen",
"integrations": "Integrationen",
"api_keys": "API-Schlüssel",
"webhooks": "Webhooks",
"save_settings": "Einstellungen speichern",
"settings_saved": "Einstellungen erfolgreich gespeichert"
},
"profile": {
"title": "Profil",
"my_profile": "Mein Profil",
"edit_profile": "Profil bearbeiten",
"personal_info": "Persönliche Informationen",
"first_name": "Vorname",
"last_name": "Nachname",
"email": "E-Mail",
"phone": "Telefon",
"avatar": "Profilbild",
"change_avatar": "Profilbild ändern",
"security": "Sicherheit",
"two_factor": "Zwei-Faktor-Authentifizierung",
"sessions": "Aktive Sitzungen",
"preferences": "Präferenzen",
"language_preference": "Sprachpräferenz",
"save_profile": "Profil speichern",
"profile_updated": "Profil erfolgreich aktualisiert"
},
"errors": {
"generic": "Ein Fehler ist aufgetreten",
"not_found": "Nicht gefunden",
"unauthorized": "Nicht autorisiert",
"forbidden": "Verboten",
"bad_request": "Ungültige Anfrage",
"server_error": "Serverfehler",
"network_error": "Netzwerkfehler",
"timeout": "Zeitüberschreitung",
"validation_error": "Validierungsfehler",
"field_required": "Dieses Feld ist erforderlich",
"invalid_email": "Ungültige E-Mail-Adresse",
"invalid_phone": "Ungültige Telefonnummer",
"password_mismatch": "Passwörter stimmen nicht überein",
"password_too_short": "Passwort ist zu kurz",
"try_again": "Bitte versuchen Sie es erneut",
"contact_support": "Bitte kontaktieren Sie den Support, wenn das Problem weiterhin besteht"
},
"confirmations": {
"delete_title": "Löschen bestätigen",
"delete_message": "Sind Sie sicher, dass Sie diesen Eintrag löschen möchten?",
"delete_warning": "Diese Aktion kann nicht rückgängig gemacht werden.",
"cancel_title": "Abbrechen bestätigen",
"cancel_message": "Sind Sie sicher, dass Sie abbrechen möchten?",
"unsaved_changes": "Sie haben ungespeicherte Änderungen. Sind Sie sicher, dass Sie die Seite verlassen möchten?",
"logout_title": "Abmelden bestätigen",
"logout_message": "Sind Sie sicher, dass Sie sich abmelden möchten?"
},
"notifications": {
"title": "Benachrichtigungen",
"mark_read": "Als gelesen markieren",
"mark_all_read": "Alle als gelesen markieren",
"no_notifications": "Keine Benachrichtigungen",
"new_order": "Neue Bestellung",
"order_updated": "Bestellung aktualisiert",
"low_stock": "Warnung bei geringem Bestand",
"import_complete": "Import abgeschlossen",
"import_failed": "Import fehlgeschlagen"
},
"shop": {
"welcome": "Willkommen in unserem Shop",
"browse_products": "Produkte durchstöbern",
"add_to_cart": "In den Warenkorb",
"buy_now": "Jetzt kaufen",
"view_cart": "Warenkorb ansehen",
"checkout": "Zur Kasse",
"continue_shopping": "Weiter einkaufen",
"start_shopping": "Einkaufen starten",
"empty_cart": "Ihr Warenkorb ist leer",
"cart_total": "Warenkorbsumme",
"proceed_checkout": "Zur Kasse gehen",
"payment": "Zahlung",
"place_order": "Bestellung aufgeben",
"order_placed": "Bestellung erfolgreich aufgegeben",
"thank_you": "Vielen Dank für Ihre Bestellung",
"order_confirmation": "Bestellbestätigung"
},
"footer": {
"all_rights_reserved": "Alle Rechte vorbehalten",
"powered_by": "Unterstützt von"
},
"time": {
"now": "Jetzt",
"today": "Heute",
"yesterday": "Gestern",
"tomorrow": "Morgen",
"this_week": "Diese Woche",
"last_week": "Letzte Woche",
"this_month": "Dieser Monat",
"last_month": "Letzter Monat",
"this_year": "Dieses Jahr",
"ago": "vor",
"seconds": "Sekunden",
"minutes": "Minuten",
"hours": "Stunden",
"days": "Tagen",
"weeks": "Wochen",
"months": "Monaten",
"years": "Jahren"
},
"formats": {
"date": "DD.MM.YYYY",
"time": "HH:mm",
"datetime": "DD.MM.YYYY HH:mm",
"currency": "{amount} {symbol}"
}
}

475
static/locales/en.json Normal file
View File

@@ -0,0 +1,475 @@
{
"common": {
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"edit": "Edit",
"create": "Create",
"update": "Update",
"add": "Add",
"remove": "Remove",
"close": "Close",
"back": "Back",
"next": "Next",
"previous": "Previous",
"submit": "Submit",
"confirm": "Confirm",
"yes": "Yes",
"no": "No",
"ok": "OK",
"done": "Done",
"loading": "Loading...",
"saving": "Saving...",
"processing": "Processing...",
"searching": "Searching...",
"refresh": "Refresh",
"retry": "Retry",
"view": "View",
"view_details": "View Details",
"view_all": "View All",
"show_more": "Show More",
"show_less": "Show Less",
"search": "Search",
"filter": "Filter",
"sort": "Sort",
"export": "Export",
"import": "Import",
"download": "Download",
"upload": "Upload",
"select": "Select",
"select_all": "Select All",
"deselect_all": "Deselect All",
"actions": "Actions",
"status": "Status",
"date": "Date",
"time": "Time",
"name": "Name",
"email": "Email",
"phone": "Phone",
"address": "Address",
"description": "Description",
"notes": "Notes",
"total": "Total",
"amount": "Amount",
"quantity": "Quantity",
"price": "Price",
"items": "Items",
"id": "ID",
"type": "Type",
"category": "Category",
"tags": "Tags",
"active": "Active",
"inactive": "Inactive",
"enabled": "Enabled",
"disabled": "Disabled",
"pending": "Pending",
"completed": "Completed",
"failed": "Failed",
"success": "Success",
"error": "Error",
"warning": "Warning",
"info": "Info",
"all": "All",
"none": "None",
"other": "Other",
"unknown": "Unknown",
"not_available": "N/A",
"required": "Required",
"optional": "Optional",
"language": "Language",
"settings": "Settings",
"help": "Help",
"support": "Support",
"contact": "Contact",
"about": "About",
"privacy": "Privacy",
"terms": "Terms",
"copyright": "Copyright"
},
"auth": {
"sign_in": "Sign In",
"sign_out": "Sign Out",
"sign_up": "Sign Up",
"login": "Login",
"logout": "Logout",
"register": "Register",
"forgot_password": "Forgot Password?",
"reset_password": "Reset Password",
"change_password": "Change Password",
"username": "Username",
"password": "Password",
"confirm_password": "Confirm Password",
"current_password": "Current Password",
"new_password": "New Password",
"remember_me": "Remember Me",
"email_placeholder": "Enter your email",
"username_placeholder": "Enter your username",
"password_placeholder": "Enter your password",
"login_success": "Login successful",
"login_failed": "Login failed",
"logout_success": "You have been logged out",
"invalid_credentials": "Invalid username or password",
"session_expired": "Your session has expired. Please login again.",
"account_locked": "Your account has been locked",
"account_inactive": "Your account is inactive"
},
"nav": {
"dashboard": "Dashboard",
"products": "Products",
"orders": "Orders",
"customers": "Customers",
"inventory": "Inventory",
"analytics": "Analytics",
"reports": "Reports",
"settings": "Settings",
"profile": "Profile",
"team": "Team",
"marketplace": "Marketplace",
"integrations": "Integrations",
"notifications": "Notifications",
"help": "Help",
"home": "Home",
"shop": "Shop",
"cart": "Cart",
"checkout": "Checkout",
"account": "Account",
"wishlist": "Wishlist"
},
"dashboard": {
"title": "Dashboard",
"welcome": "Welcome back",
"overview": "Overview",
"quick_stats": "Quick Stats",
"recent_activity": "Recent Activity",
"total_products": "Total Products",
"total_orders": "Total Orders",
"total_customers": "Total Customers",
"total_revenue": "Total Revenue",
"active_products": "Active Products",
"pending_orders": "Pending Orders",
"new_customers": "New Customers",
"today": "Today",
"this_week": "This Week",
"this_month": "This Month",
"this_year": "This Year",
"error_loading": "Error loading dashboard",
"no_data": "No data available"
},
"products": {
"title": "Products",
"product": "Product",
"add_product": "Add Product",
"edit_product": "Edit Product",
"delete_product": "Delete Product",
"product_name": "Product Name",
"product_code": "Product Code",
"sku": "SKU",
"price": "Price",
"sale_price": "Sale Price",
"cost": "Cost",
"stock": "Stock",
"in_stock": "In Stock",
"out_of_stock": "Out of Stock",
"low_stock": "Low Stock",
"availability": "Availability",
"available": "Available",
"unavailable": "Unavailable",
"brand": "Brand",
"category": "Category",
"categories": "Categories",
"image": "Image",
"images": "Images",
"main_image": "Main Image",
"gallery": "Gallery",
"weight": "Weight",
"dimensions": "Dimensions",
"color": "Color",
"size": "Size",
"material": "Material",
"condition": "Condition",
"new": "New",
"used": "Used",
"refurbished": "Refurbished",
"no_products": "No products found",
"search_products": "Search products...",
"filter_by_category": "Filter by category",
"filter_by_status": "Filter by status",
"sort_by": "Sort by",
"sort_newest": "Newest",
"sort_oldest": "Oldest",
"sort_price_low": "Price: Low to High",
"sort_price_high": "Price: High to Low",
"sort_name_az": "Name: A-Z",
"sort_name_za": "Name: Z-A"
},
"orders": {
"title": "Orders",
"order": "Order",
"order_id": "Order ID",
"order_number": "Order Number",
"order_date": "Order Date",
"order_status": "Order Status",
"order_details": "Order Details",
"order_items": "Order Items",
"order_total": "Order Total",
"subtotal": "Subtotal",
"shipping": "Shipping",
"tax": "Tax",
"discount": "Discount",
"customer": "Customer",
"shipping_address": "Shipping Address",
"billing_address": "Billing Address",
"payment_method": "Payment Method",
"payment_status": "Payment Status",
"tracking": "Tracking",
"tracking_number": "Tracking Number",
"carrier": "Carrier",
"no_orders": "No orders found",
"search_orders": "Search orders...",
"filter_by_status": "Filter by status",
"status_pending": "Pending",
"status_processing": "Processing",
"status_shipped": "Shipped",
"status_delivered": "Delivered",
"status_cancelled": "Cancelled",
"status_refunded": "Refunded",
"status_confirmed": "Confirmed",
"status_rejected": "Rejected",
"confirm_order": "Confirm Order",
"reject_order": "Reject Order",
"set_tracking": "Set Tracking",
"view_details": "View Details"
},
"customers": {
"title": "Customers",
"customer": "Customer",
"add_customer": "Add Customer",
"edit_customer": "Edit Customer",
"customer_name": "Customer Name",
"customer_email": "Customer Email",
"customer_phone": "Customer Phone",
"customer_number": "Customer Number",
"first_name": "First Name",
"last_name": "Last Name",
"company": "Company",
"total_orders": "Total Orders",
"total_spent": "Total Spent",
"last_order": "Last Order",
"registered": "Registered",
"no_customers": "No customers found",
"search_customers": "Search customers..."
},
"inventory": {
"title": "Inventory",
"stock_level": "Stock Level",
"quantity": "Quantity",
"reorder_point": "Reorder Point",
"adjust_stock": "Adjust Stock",
"stock_in": "Stock In",
"stock_out": "Stock Out",
"transfer": "Transfer",
"history": "History",
"low_stock_alert": "Low Stock Alert",
"out_of_stock_alert": "Out of Stock Alert"
},
"marketplace": {
"title": "Marketplace",
"import": "Import",
"export": "Export",
"sync": "Sync",
"source": "Source",
"source_url": "Source URL",
"import_products": "Import Products",
"start_import": "Start Import",
"importing": "Importing...",
"import_complete": "Import Complete",
"import_failed": "Import Failed",
"import_history": "Import History",
"job_id": "Job ID",
"started_at": "Started At",
"completed_at": "Completed At",
"duration": "Duration",
"imported_count": "Imported",
"error_count": "Errors",
"total_processed": "Total Processed",
"progress": "Progress",
"no_import_jobs": "No import jobs yet",
"start_first_import": "Start your first import using the form above"
},
"letzshop": {
"title": "Letzshop Integration",
"connection": "Connection",
"credentials": "Credentials",
"api_key": "API Key",
"api_endpoint": "API Endpoint",
"auto_sync": "Auto Sync",
"sync_interval": "Sync Interval",
"every_hour": "Every hour",
"every_day": "Every day",
"test_connection": "Test Connection",
"save_credentials": "Save Credentials",
"connection_success": "Connection successful",
"connection_failed": "Connection failed",
"last_sync": "Last Sync",
"sync_status": "Sync Status",
"import_orders": "Import Orders",
"export_products": "Export Products",
"no_credentials": "Configure your API key in Settings to get started",
"carriers": {
"dhl": "DHL",
"ups": "UPS",
"fedex": "FedEx",
"dpd": "DPD",
"gls": "GLS",
"post_luxembourg": "Post Luxembourg",
"other": "Other"
}
},
"team": {
"title": "Team",
"members": "Members",
"add_member": "Add Member",
"invite_member": "Invite Member",
"remove_member": "Remove Member",
"role": "Role",
"owner": "Owner",
"manager": "Manager",
"editor": "Editor",
"viewer": "Viewer",
"permissions": "Permissions",
"pending_invitations": "Pending Invitations",
"invitation_sent": "Invitation Sent",
"invitation_accepted": "Invitation Accepted"
},
"settings": {
"title": "Settings",
"general": "General",
"store": "Store",
"store_name": "Store Name",
"store_description": "Store Description",
"contact_email": "Contact Email",
"contact_phone": "Contact Phone",
"business_address": "Business Address",
"tax_number": "Tax Number",
"currency": "Currency",
"timezone": "Timezone",
"language": "Language",
"language_settings": "Language Settings",
"default_language": "Default Language",
"dashboard_language": "Dashboard Language",
"storefront_language": "Storefront Language",
"enabled_languages": "Enabled Languages",
"notifications": "Notifications",
"email_notifications": "Email Notifications",
"integrations": "Integrations",
"api_keys": "API Keys",
"webhooks": "Webhooks",
"save_settings": "Save Settings",
"settings_saved": "Settings saved successfully"
},
"profile": {
"title": "Profile",
"my_profile": "My Profile",
"edit_profile": "Edit Profile",
"personal_info": "Personal Information",
"first_name": "First Name",
"last_name": "Last Name",
"email": "Email",
"phone": "Phone",
"avatar": "Avatar",
"change_avatar": "Change Avatar",
"security": "Security",
"two_factor": "Two-Factor Authentication",
"sessions": "Active Sessions",
"preferences": "Preferences",
"language_preference": "Language Preference",
"save_profile": "Save Profile",
"profile_updated": "Profile updated successfully"
},
"errors": {
"generic": "An error occurred",
"not_found": "Not Found",
"unauthorized": "Unauthorized",
"forbidden": "Forbidden",
"bad_request": "Bad Request",
"server_error": "Server Error",
"network_error": "Network Error",
"timeout": "Request Timeout",
"validation_error": "Validation Error",
"field_required": "This field is required",
"invalid_email": "Invalid email address",
"invalid_phone": "Invalid phone number",
"password_mismatch": "Passwords do not match",
"password_too_short": "Password is too short",
"try_again": "Please try again",
"contact_support": "Please contact support if the problem persists"
},
"confirmations": {
"delete_title": "Confirm Delete",
"delete_message": "Are you sure you want to delete this item?",
"delete_warning": "This action cannot be undone.",
"cancel_title": "Confirm Cancel",
"cancel_message": "Are you sure you want to cancel?",
"unsaved_changes": "You have unsaved changes. Are you sure you want to leave?",
"logout_title": "Confirm Logout",
"logout_message": "Are you sure you want to log out?"
},
"notifications": {
"title": "Notifications",
"mark_read": "Mark as Read",
"mark_all_read": "Mark All as Read",
"no_notifications": "No notifications",
"new_order": "New Order",
"order_updated": "Order Updated",
"low_stock": "Low Stock Alert",
"import_complete": "Import Complete",
"import_failed": "Import Failed"
},
"shop": {
"welcome": "Welcome to our store",
"browse_products": "Browse Products",
"add_to_cart": "Add to Cart",
"buy_now": "Buy Now",
"view_cart": "View Cart",
"checkout": "Checkout",
"continue_shopping": "Continue Shopping",
"start_shopping": "Start Shopping",
"empty_cart": "Your cart is empty",
"cart_total": "Cart Total",
"proceed_checkout": "Proceed to Checkout",
"payment": "Payment",
"place_order": "Place Order",
"order_placed": "Order Placed Successfully",
"thank_you": "Thank you for your order",
"order_confirmation": "Order Confirmation"
},
"footer": {
"all_rights_reserved": "All rights reserved",
"powered_by": "Powered by"
},
"time": {
"now": "Now",
"today": "Today",
"yesterday": "Yesterday",
"tomorrow": "Tomorrow",
"this_week": "This Week",
"last_week": "Last Week",
"this_month": "This Month",
"last_month": "Last Month",
"this_year": "This Year",
"ago": "ago",
"seconds": "seconds",
"minutes": "minutes",
"hours": "hours",
"days": "days",
"weeks": "weeks",
"months": "months",
"years": "years"
},
"formats": {
"date": "MM/DD/YYYY",
"time": "HH:mm",
"datetime": "MM/DD/YYYY HH:mm",
"currency": "{symbol}{amount}"
}
}

475
static/locales/fr.json Normal file
View File

@@ -0,0 +1,475 @@
{
"common": {
"save": "Enregistrer",
"cancel": "Annuler",
"delete": "Supprimer",
"edit": "Modifier",
"create": "Créer",
"update": "Mettre à jour",
"add": "Ajouter",
"remove": "Retirer",
"close": "Fermer",
"back": "Retour",
"next": "Suivant",
"previous": "Précédent",
"submit": "Soumettre",
"confirm": "Confirmer",
"yes": "Oui",
"no": "Non",
"ok": "OK",
"done": "Terminé",
"loading": "Chargement...",
"saving": "Enregistrement...",
"processing": "Traitement...",
"searching": "Recherche...",
"refresh": "Actualiser",
"retry": "Réessayer",
"view": "Voir",
"view_details": "Voir les détails",
"view_all": "Voir tout",
"show_more": "Voir plus",
"show_less": "Voir moins",
"search": "Rechercher",
"filter": "Filtrer",
"sort": "Trier",
"export": "Exporter",
"import": "Importer",
"download": "Télécharger",
"upload": "Téléverser",
"select": "Sélectionner",
"select_all": "Tout sélectionner",
"deselect_all": "Tout désélectionner",
"actions": "Actions",
"status": "Statut",
"date": "Date",
"time": "Heure",
"name": "Nom",
"email": "E-mail",
"phone": "Téléphone",
"address": "Adresse",
"description": "Description",
"notes": "Notes",
"total": "Total",
"amount": "Montant",
"quantity": "Quantité",
"price": "Prix",
"items": "Articles",
"id": "ID",
"type": "Type",
"category": "Catégorie",
"tags": "Tags",
"active": "Actif",
"inactive": "Inactif",
"enabled": "Activé",
"disabled": "Désactivé",
"pending": "En attente",
"completed": "Terminé",
"failed": "Échoué",
"success": "Succès",
"error": "Erreur",
"warning": "Avertissement",
"info": "Info",
"all": "Tous",
"none": "Aucun",
"other": "Autre",
"unknown": "Inconnu",
"not_available": "N/D",
"required": "Obligatoire",
"optional": "Optionnel",
"language": "Langue",
"settings": "Paramètres",
"help": "Aide",
"support": "Support",
"contact": "Contact",
"about": "À propos",
"privacy": "Confidentialité",
"terms": "Conditions",
"copyright": "Droits d'auteur"
},
"auth": {
"sign_in": "Se connecter",
"sign_out": "Se déconnecter",
"sign_up": "S'inscrire",
"login": "Connexion",
"logout": "Déconnexion",
"register": "Inscription",
"forgot_password": "Mot de passe oublié ?",
"reset_password": "Réinitialiser le mot de passe",
"change_password": "Changer le mot de passe",
"username": "Nom d'utilisateur",
"password": "Mot de passe",
"confirm_password": "Confirmer le mot de passe",
"current_password": "Mot de passe actuel",
"new_password": "Nouveau mot de passe",
"remember_me": "Se souvenir de moi",
"email_placeholder": "Entrez votre e-mail",
"username_placeholder": "Entrez votre nom d'utilisateur",
"password_placeholder": "Entrez votre mot de passe",
"login_success": "Connexion réussie",
"login_failed": "Échec de la connexion",
"logout_success": "Vous avez été déconnecté",
"invalid_credentials": "Nom d'utilisateur ou mot de passe invalide",
"session_expired": "Votre session a expiré. Veuillez vous reconnecter.",
"account_locked": "Votre compte a été verrouillé",
"account_inactive": "Votre compte est inactif"
},
"nav": {
"dashboard": "Tableau de bord",
"products": "Produits",
"orders": "Commandes",
"customers": "Clients",
"inventory": "Inventaire",
"analytics": "Analyses",
"reports": "Rapports",
"settings": "Paramètres",
"profile": "Profil",
"team": "Équipe",
"marketplace": "Marketplace",
"integrations": "Intégrations",
"notifications": "Notifications",
"help": "Aide",
"home": "Accueil",
"shop": "Boutique",
"cart": "Panier",
"checkout": "Paiement",
"account": "Compte",
"wishlist": "Liste de souhaits"
},
"dashboard": {
"title": "Tableau de bord",
"welcome": "Bienvenue",
"overview": "Vue d'ensemble",
"quick_stats": "Statistiques rapides",
"recent_activity": "Activité récente",
"total_products": "Total des produits",
"total_orders": "Total des commandes",
"total_customers": "Total des clients",
"total_revenue": "Chiffre d'affaires total",
"active_products": "Produits actifs",
"pending_orders": "Commandes en attente",
"new_customers": "Nouveaux clients",
"today": "Aujourd'hui",
"this_week": "Cette semaine",
"this_month": "Ce mois",
"this_year": "Cette année",
"error_loading": "Erreur lors du chargement du tableau de bord",
"no_data": "Aucune donnée disponible"
},
"products": {
"title": "Produits",
"product": "Produit",
"add_product": "Ajouter un produit",
"edit_product": "Modifier le produit",
"delete_product": "Supprimer le produit",
"product_name": "Nom du produit",
"product_code": "Code produit",
"sku": "SKU",
"price": "Prix",
"sale_price": "Prix de vente",
"cost": "Coût",
"stock": "Stock",
"in_stock": "En stock",
"out_of_stock": "Rupture de stock",
"low_stock": "Stock faible",
"availability": "Disponibilité",
"available": "Disponible",
"unavailable": "Indisponible",
"brand": "Marque",
"category": "Catégorie",
"categories": "Catégories",
"image": "Image",
"images": "Images",
"main_image": "Image principale",
"gallery": "Galerie",
"weight": "Poids",
"dimensions": "Dimensions",
"color": "Couleur",
"size": "Taille",
"material": "Matériau",
"condition": "État",
"new": "Neuf",
"used": "Occasion",
"refurbished": "Reconditionné",
"no_products": "Aucun produit trouvé",
"search_products": "Rechercher des produits...",
"filter_by_category": "Filtrer par catégorie",
"filter_by_status": "Filtrer par statut",
"sort_by": "Trier par",
"sort_newest": "Plus récent",
"sort_oldest": "Plus ancien",
"sort_price_low": "Prix : croissant",
"sort_price_high": "Prix : décroissant",
"sort_name_az": "Nom : A-Z",
"sort_name_za": "Nom : Z-A"
},
"orders": {
"title": "Commandes",
"order": "Commande",
"order_id": "ID de commande",
"order_number": "Numéro de commande",
"order_date": "Date de commande",
"order_status": "Statut de la commande",
"order_details": "Détails de la commande",
"order_items": "Articles de la commande",
"order_total": "Total de la commande",
"subtotal": "Sous-total",
"shipping": "Livraison",
"tax": "Taxe",
"discount": "Remise",
"customer": "Client",
"shipping_address": "Adresse de livraison",
"billing_address": "Adresse de facturation",
"payment_method": "Mode de paiement",
"payment_status": "Statut du paiement",
"tracking": "Suivi",
"tracking_number": "Numéro de suivi",
"carrier": "Transporteur",
"no_orders": "Aucune commande trouvée",
"search_orders": "Rechercher des commandes...",
"filter_by_status": "Filtrer par statut",
"status_pending": "En attente",
"status_processing": "En cours",
"status_shipped": "Expédiée",
"status_delivered": "Livrée",
"status_cancelled": "Annulée",
"status_refunded": "Remboursée",
"status_confirmed": "Confirmée",
"status_rejected": "Rejetée",
"confirm_order": "Confirmer la commande",
"reject_order": "Rejeter la commande",
"set_tracking": "Définir le suivi",
"view_details": "Voir les détails"
},
"customers": {
"title": "Clients",
"customer": "Client",
"add_customer": "Ajouter un client",
"edit_customer": "Modifier le client",
"customer_name": "Nom du client",
"customer_email": "E-mail du client",
"customer_phone": "Téléphone du client",
"customer_number": "Numéro client",
"first_name": "Prénom",
"last_name": "Nom",
"company": "Entreprise",
"total_orders": "Total des commandes",
"total_spent": "Total dépensé",
"last_order": "Dernière commande",
"registered": "Inscrit",
"no_customers": "Aucun client trouvé",
"search_customers": "Rechercher des clients..."
},
"inventory": {
"title": "Inventaire",
"stock_level": "Niveau de stock",
"quantity": "Quantité",
"reorder_point": "Seuil de réapprovisionnement",
"adjust_stock": "Ajuster le stock",
"stock_in": "Entrée de stock",
"stock_out": "Sortie de stock",
"transfer": "Transfert",
"history": "Historique",
"low_stock_alert": "Alerte stock faible",
"out_of_stock_alert": "Alerte rupture de stock"
},
"marketplace": {
"title": "Marketplace",
"import": "Importer",
"export": "Exporter",
"sync": "Synchroniser",
"source": "Source",
"source_url": "URL source",
"import_products": "Importer des produits",
"start_import": "Démarrer l'importation",
"importing": "Importation en cours...",
"import_complete": "Importation terminée",
"import_failed": "Échec de l'importation",
"import_history": "Historique des importations",
"job_id": "ID du travail",
"started_at": "Démarré à",
"completed_at": "Terminé à",
"duration": "Durée",
"imported_count": "Importés",
"error_count": "Erreurs",
"total_processed": "Total traité",
"progress": "Progression",
"no_import_jobs": "Aucune importation pour le moment",
"start_first_import": "Lancez votre première importation avec le formulaire ci-dessus"
},
"letzshop": {
"title": "Intégration Letzshop",
"connection": "Connexion",
"credentials": "Identifiants",
"api_key": "Clé API",
"api_endpoint": "Point d'accès API",
"auto_sync": "Synchronisation automatique",
"sync_interval": "Intervalle de synchronisation",
"every_hour": "Toutes les heures",
"every_day": "Tous les jours",
"test_connection": "Tester la connexion",
"save_credentials": "Enregistrer les identifiants",
"connection_success": "Connexion réussie",
"connection_failed": "Échec de la connexion",
"last_sync": "Dernière synchronisation",
"sync_status": "Statut de synchronisation",
"import_orders": "Importer les commandes",
"export_products": "Exporter les produits",
"no_credentials": "Configurez votre clé API dans les paramètres pour commencer",
"carriers": {
"dhl": "DHL",
"ups": "UPS",
"fedex": "FedEx",
"dpd": "DPD",
"gls": "GLS",
"post_luxembourg": "Post Luxembourg",
"other": "Autre"
}
},
"team": {
"title": "Équipe",
"members": "Membres",
"add_member": "Ajouter un membre",
"invite_member": "Inviter un membre",
"remove_member": "Retirer un membre",
"role": "Rôle",
"owner": "Propriétaire",
"manager": "Gestionnaire",
"editor": "Éditeur",
"viewer": "Lecteur",
"permissions": "Permissions",
"pending_invitations": "Invitations en attente",
"invitation_sent": "Invitation envoyée",
"invitation_accepted": "Invitation acceptée"
},
"settings": {
"title": "Paramètres",
"general": "Général",
"store": "Boutique",
"store_name": "Nom de la boutique",
"store_description": "Description de la boutique",
"contact_email": "E-mail de contact",
"contact_phone": "Téléphone de contact",
"business_address": "Adresse professionnelle",
"tax_number": "Numéro de TVA",
"currency": "Devise",
"timezone": "Fuseau horaire",
"language": "Langue",
"language_settings": "Paramètres de langue",
"default_language": "Langue par défaut",
"dashboard_language": "Langue du tableau de bord",
"storefront_language": "Langue de la boutique",
"enabled_languages": "Langues activées",
"notifications": "Notifications",
"email_notifications": "Notifications par e-mail",
"integrations": "Intégrations",
"api_keys": "Clés API",
"webhooks": "Webhooks",
"save_settings": "Enregistrer les paramètres",
"settings_saved": "Paramètres enregistrés avec succès"
},
"profile": {
"title": "Profil",
"my_profile": "Mon profil",
"edit_profile": "Modifier le profil",
"personal_info": "Informations personnelles",
"first_name": "Prénom",
"last_name": "Nom",
"email": "E-mail",
"phone": "Téléphone",
"avatar": "Avatar",
"change_avatar": "Changer l'avatar",
"security": "Sécurité",
"two_factor": "Authentification à deux facteurs",
"sessions": "Sessions actives",
"preferences": "Préférences",
"language_preference": "Préférence de langue",
"save_profile": "Enregistrer le profil",
"profile_updated": "Profil mis à jour avec succès"
},
"errors": {
"generic": "Une erreur s'est produite",
"not_found": "Non trouvé",
"unauthorized": "Non autorisé",
"forbidden": "Interdit",
"bad_request": "Requête invalide",
"server_error": "Erreur serveur",
"network_error": "Erreur réseau",
"timeout": "Délai d'attente dépassé",
"validation_error": "Erreur de validation",
"field_required": "Ce champ est obligatoire",
"invalid_email": "Adresse e-mail invalide",
"invalid_phone": "Numéro de téléphone invalide",
"password_mismatch": "Les mots de passe ne correspondent pas",
"password_too_short": "Le mot de passe est trop court",
"try_again": "Veuillez réessayer",
"contact_support": "Veuillez contacter le support si le problème persiste"
},
"confirmations": {
"delete_title": "Confirmer la suppression",
"delete_message": "Êtes-vous sûr de vouloir supprimer cet élément ?",
"delete_warning": "Cette action est irréversible.",
"cancel_title": "Confirmer l'annulation",
"cancel_message": "Êtes-vous sûr de vouloir annuler ?",
"unsaved_changes": "Vous avez des modifications non enregistrées. Êtes-vous sûr de vouloir quitter ?",
"logout_title": "Confirmer la déconnexion",
"logout_message": "Êtes-vous sûr de vouloir vous déconnecter ?"
},
"notifications": {
"title": "Notifications",
"mark_read": "Marquer comme lu",
"mark_all_read": "Tout marquer comme lu",
"no_notifications": "Aucune notification",
"new_order": "Nouvelle commande",
"order_updated": "Commande mise à jour",
"low_stock": "Alerte stock faible",
"import_complete": "Importation terminée",
"import_failed": "Échec de l'importation"
},
"shop": {
"welcome": "Bienvenue dans notre boutique",
"browse_products": "Parcourir les produits",
"add_to_cart": "Ajouter au panier",
"buy_now": "Acheter maintenant",
"view_cart": "Voir le panier",
"checkout": "Paiement",
"continue_shopping": "Continuer vos achats",
"start_shopping": "Commencer vos achats",
"empty_cart": "Votre panier est vide",
"cart_total": "Total du panier",
"proceed_checkout": "Passer à la caisse",
"payment": "Paiement",
"place_order": "Passer la commande",
"order_placed": "Commande passée avec succès",
"thank_you": "Merci pour votre commande",
"order_confirmation": "Confirmation de commande"
},
"footer": {
"all_rights_reserved": "Tous droits réservés",
"powered_by": "Propulsé par"
},
"time": {
"now": "Maintenant",
"today": "Aujourd'hui",
"yesterday": "Hier",
"tomorrow": "Demain",
"this_week": "Cette semaine",
"last_week": "La semaine dernière",
"this_month": "Ce mois-ci",
"last_month": "Le mois dernier",
"this_year": "Cette année",
"ago": "il y a",
"seconds": "secondes",
"minutes": "minutes",
"hours": "heures",
"days": "jours",
"weeks": "semaines",
"months": "mois",
"years": "années"
},
"formats": {
"date": "DD/MM/YYYY",
"time": "HH:mm",
"datetime": "DD/MM/YYYY HH:mm",
"currency": "{amount} {symbol}"
}
}

475
static/locales/lb.json Normal file
View File

@@ -0,0 +1,475 @@
{
"common": {
"save": "Späicheren",
"cancel": "Ofbriechen",
"delete": "Läschen",
"edit": "Änneren",
"create": "Erstellen",
"update": "Aktualiséieren",
"add": "Derbäisetzen",
"remove": "Ewechhuelen",
"close": "Zoumaachen",
"back": "Zréck",
"next": "Weider",
"previous": "Virdrun",
"submit": "Ofschécken",
"confirm": "Bestätegen",
"yes": "Jo",
"no": "Nee",
"ok": "OK",
"done": "Fäerdeg",
"loading": "Lueden...",
"saving": "Späicheren...",
"processing": "Veraarbechten...",
"searching": "Sichen...",
"refresh": "Aktualiséieren",
"retry": "Nach eng Kéier probéieren",
"view": "Kucken",
"view_details": "Detailer kucken",
"view_all": "Alles kucken",
"show_more": "Méi weisen",
"show_less": "Manner weisen",
"search": "Sichen",
"filter": "Filteren",
"sort": "Sortéieren",
"export": "Exportéieren",
"import": "Importéieren",
"download": "Eroflueden",
"upload": "Eroplueden",
"select": "Auswielen",
"select_all": "Alles auswielen",
"deselect_all": "Alles ofwielen",
"actions": "Aktiounen",
"status": "Status",
"date": "Datum",
"time": "Zäit",
"name": "Numm",
"email": "E-Mail",
"phone": "Telefon",
"address": "Adress",
"description": "Beschreiwung",
"notes": "Notizen",
"total": "Total",
"amount": "Betrag",
"quantity": "Quantitéit",
"price": "Präis",
"items": "Artikelen",
"id": "ID",
"type": "Typ",
"category": "Kategorie",
"tags": "Tags",
"active": "Aktiv",
"inactive": "Inaktiv",
"enabled": "Aktivéiert",
"disabled": "Deaktivéiert",
"pending": "Aussteesend",
"completed": "Fäerdeg",
"failed": "Feelgeschloen",
"success": "Erfollegräich",
"error": "Feeler",
"warning": "Warnung",
"info": "Info",
"all": "Alles",
"none": "Keen",
"other": "Anerer",
"unknown": "Onbekannt",
"not_available": "N/A",
"required": "Obligatoresch",
"optional": "Optional",
"language": "Sprooch",
"settings": "Astellungen",
"help": "Hëllef",
"support": "Ënnerstëtzung",
"contact": "Kontakt",
"about": "Iwwer eis",
"privacy": "Dateschutz",
"terms": "Konditiounen",
"copyright": "Copyright"
},
"auth": {
"sign_in": "Umellen",
"sign_out": "Ofmellen",
"sign_up": "Registréieren",
"login": "Login",
"logout": "Logout",
"register": "Registréieren",
"forgot_password": "Passwuert vergiess?",
"reset_password": "Passwuert zrécksetzen",
"change_password": "Passwuert änneren",
"username": "Benotzernumm",
"password": "Passwuert",
"confirm_password": "Passwuert bestätegen",
"current_password": "Aktuellt Passwuert",
"new_password": "Neit Passwuert",
"remember_me": "Un mech erënneren",
"email_placeholder": "Gitt Är E-Mail an",
"username_placeholder": "Gitt Äre Benotzernumm an",
"password_placeholder": "Gitt Äert Passwuert an",
"login_success": "Login erfollegräich",
"login_failed": "Login feelgeschloen",
"logout_success": "Dir sidd ofgemellt",
"invalid_credentials": "Ongëltege Benotzernumm oder Passwuert",
"session_expired": "Är Sessioun ass ofgelaf. Mellt Iech w.e.g. erëm un.",
"account_locked": "Äre Kont ass gespaart",
"account_inactive": "Äre Kont ass inaktiv"
},
"nav": {
"dashboard": "Dashboard",
"products": "Produkter",
"orders": "Bestellungen",
"customers": "Clienten",
"inventory": "Inventar",
"analytics": "Analysen",
"reports": "Rapporten",
"settings": "Astellungen",
"profile": "Profil",
"team": "Team",
"marketplace": "Marchéplaz",
"integrations": "Integratiounen",
"notifications": "Notifikatiounen",
"help": "Hëllef",
"home": "Heem",
"shop": "Buttek",
"cart": "Kuerf",
"checkout": "Bezuelen",
"account": "Kont",
"wishlist": "Wonschlëscht"
},
"dashboard": {
"title": "Dashboard",
"welcome": "Wëllkomm zréck",
"overview": "Iwwersiicht",
"quick_stats": "Séier Statistiken",
"recent_activity": "Rezent Aktivitéit",
"total_products": "Produkter insgesamt",
"total_orders": "Bestellungen insgesamt",
"total_customers": "Clienten insgesamt",
"total_revenue": "Ëmsaz insgesamt",
"active_products": "Aktiv Produkter",
"pending_orders": "Aussteesend Bestellungen",
"new_customers": "Nei Clienten",
"today": "Haut",
"this_week": "Dës Woch",
"this_month": "Dëse Mount",
"this_year": "Dëst Joer",
"error_loading": "Feeler beim Lueden vum Dashboard",
"no_data": "Keng Donnéeën disponibel"
},
"products": {
"title": "Produkter",
"product": "Produkt",
"add_product": "Produkt derbäisetzen",
"edit_product": "Produkt änneren",
"delete_product": "Produkt läschen",
"product_name": "Produktnumm",
"product_code": "Produktcode",
"sku": "SKU",
"price": "Präis",
"sale_price": "Verkafspräis",
"cost": "Käschten",
"stock": "Lager",
"in_stock": "Op Lager",
"out_of_stock": "Net op Lager",
"low_stock": "Niddregen Stock",
"availability": "Disponibilitéit",
"available": "Disponibel",
"unavailable": "Net disponibel",
"brand": "Mark",
"category": "Kategorie",
"categories": "Kategorien",
"image": "Bild",
"images": "Biller",
"main_image": "Haaptbild",
"gallery": "Galerie",
"weight": "Gewiicht",
"dimensions": "Dimensiounen",
"color": "Faarf",
"size": "Gréisst",
"material": "Material",
"condition": "Zoustand",
"new": "Nei",
"used": "Gebraucht",
"refurbished": "Iwwerholl",
"no_products": "Keng Produkter fonnt",
"search_products": "Produkter sichen...",
"filter_by_category": "No Kategorie filteren",
"filter_by_status": "No Status filteren",
"sort_by": "Sortéieren no",
"sort_newest": "Neisten",
"sort_oldest": "Eelsten",
"sort_price_low": "Präis: Niddreg op Héich",
"sort_price_high": "Präis: Héich op Niddreg",
"sort_name_az": "Numm: A-Z",
"sort_name_za": "Numm: Z-A"
},
"orders": {
"title": "Bestellungen",
"order": "Bestellung",
"order_id": "Bestellungs-ID",
"order_number": "Bestellungsnummer",
"order_date": "Bestellungsdatum",
"order_status": "Bestellungsstatus",
"order_details": "Bestellungsdetailer",
"order_items": "Bestellungsartikelen",
"order_total": "Bestellungstotal",
"subtotal": "Subtotal",
"shipping": "Versand",
"tax": "Steier",
"discount": "Rabatt",
"customer": "Client",
"shipping_address": "Liwweradress",
"billing_address": "Rechnungsadress",
"payment_method": "Bezuelmethod",
"payment_status": "Bezuelstatus",
"tracking": "Tracking",
"tracking_number": "Trackingnummer",
"carrier": "Transporteur",
"no_orders": "Keng Bestellunge fonnt",
"search_orders": "Bestellunge sichen...",
"filter_by_status": "No Status filteren",
"status_pending": "Aussteesend",
"status_processing": "A Veraarbechtung",
"status_shipped": "Verschéckt",
"status_delivered": "Geliwwert",
"status_cancelled": "Annuléiert",
"status_refunded": "Rembourséiert",
"status_confirmed": "Bestätegt",
"status_rejected": "Ofgeleent",
"confirm_order": "Bestellung bestätegen",
"reject_order": "Bestellung oflehnen",
"set_tracking": "Tracking setzen",
"view_details": "Detailer kucken"
},
"customers": {
"title": "Clienten",
"customer": "Client",
"add_customer": "Client derbäisetzen",
"edit_customer": "Client änneren",
"customer_name": "Clientennumm",
"customer_email": "Client E-Mail",
"customer_phone": "Client Telefon",
"customer_number": "Clientennummer",
"first_name": "Virnumm",
"last_name": "Nonumm",
"company": "Firma",
"total_orders": "Bestellungen insgesamt",
"total_spent": "Total ausginn",
"last_order": "Lescht Bestellung",
"registered": "Registréiert",
"no_customers": "Keng Clienten fonnt",
"search_customers": "Clienten sichen..."
},
"inventory": {
"title": "Inventar",
"stock_level": "Lagerniveau",
"quantity": "Quantitéit",
"reorder_point": "Nobestellungspunkt",
"adjust_stock": "Lager upaassen",
"stock_in": "Lager eran",
"stock_out": "Lager eraus",
"transfer": "Transfer",
"history": "Geschicht",
"low_stock_alert": "Niddreg Lager Alarm",
"out_of_stock_alert": "Net op Lager Alarm"
},
"marketplace": {
"title": "Marchéplaz",
"import": "Import",
"export": "Export",
"sync": "Synchroniséieren",
"source": "Quell",
"source_url": "Quell URL",
"import_products": "Produkter importéieren",
"start_import": "Import starten",
"importing": "Importéieren...",
"import_complete": "Import fäerdeg",
"import_failed": "Import feelgeschloen",
"import_history": "Importgeschicht",
"job_id": "Job ID",
"started_at": "Ugefaang um",
"completed_at": "Fäerdeg um",
"duration": "Dauer",
"imported_count": "Importéiert",
"error_count": "Feeler",
"total_processed": "Total veraarbecht",
"progress": "Fortschrëtt",
"no_import_jobs": "Nach keng Import Jobs",
"start_first_import": "Start Ären éischten Import mat der Form uewendriwwer"
},
"letzshop": {
"title": "Letzshop Integratioun",
"connection": "Verbindung",
"credentials": "Umeldungsdaten",
"api_key": "API Schlëssel",
"api_endpoint": "API Endpunkt",
"auto_sync": "Automatesch Sync",
"sync_interval": "Sync Intervall",
"every_hour": "All Stonn",
"every_day": "All Dag",
"test_connection": "Verbindung testen",
"save_credentials": "Umeldungsdaten späicheren",
"connection_success": "Verbindung erfollegräich",
"connection_failed": "Verbindung feelgeschloen",
"last_sync": "Läschte Sync",
"sync_status": "Sync Status",
"import_orders": "Bestellungen importéieren",
"export_products": "Produkter exportéieren",
"no_credentials": "Konfiguréiert Ären API Schlëssel an den Astellungen fir unzefänken",
"carriers": {
"dhl": "DHL",
"ups": "UPS",
"fedex": "FedEx",
"dpd": "DPD",
"gls": "GLS",
"post_luxembourg": "Post Lëtzebuerg",
"other": "Anerer"
}
},
"team": {
"title": "Team",
"members": "Memberen",
"add_member": "Member derbäisetzen",
"invite_member": "Member invitéieren",
"remove_member": "Member ewechhuelen",
"role": "Roll",
"owner": "Proprietär",
"manager": "Manager",
"editor": "Editeur",
"viewer": "Betruechter",
"permissions": "Rechter",
"pending_invitations": "Aussteesend Invitatiounen",
"invitation_sent": "Invitatioun geschéckt",
"invitation_accepted": "Invitatioun ugeholl"
},
"settings": {
"title": "Astellungen",
"general": "Allgemeng",
"store": "Buttek",
"store_name": "Butteknumm",
"store_description": "Buttekbeschreiwung",
"contact_email": "Kontakt E-Mail",
"contact_phone": "Kontakt Telefon",
"business_address": "Geschäftsadress",
"tax_number": "Steiernummer",
"currency": "Wärung",
"timezone": "Zäitzon",
"language": "Sprooch",
"language_settings": "Sproochastellungen",
"default_language": "Standard Sprooch",
"dashboard_language": "Dashboard Sprooch",
"storefront_language": "Buttek Sprooch",
"enabled_languages": "Aktivéiert Sproochen",
"notifications": "Notifikatiounen",
"email_notifications": "E-Mail Notifikatiounen",
"integrations": "Integratiounen",
"api_keys": "API Schlësselen",
"webhooks": "Webhooks",
"save_settings": "Astellunge späicheren",
"settings_saved": "Astellungen erfollegräich gespäichert"
},
"profile": {
"title": "Profil",
"my_profile": "Mäi Profil",
"edit_profile": "Profil änneren",
"personal_info": "Perséinlech Informatiounen",
"first_name": "Virnumm",
"last_name": "Nonumm",
"email": "E-Mail",
"phone": "Telefon",
"avatar": "Avatar",
"change_avatar": "Avatar änneren",
"security": "Sécherheet",
"two_factor": "Zwee-Faktor Authentifikatioun",
"sessions": "Aktiv Sessiounen",
"preferences": "Astellungen",
"language_preference": "Sproochpräferenz",
"save_profile": "Profil späicheren",
"profile_updated": "Profil erfollegräich aktualiséiert"
},
"errors": {
"generic": "E Feeler ass opgetrueden",
"not_found": "Net fonnt",
"unauthorized": "Net autoriséiert",
"forbidden": "Verbueden",
"bad_request": "Ongëlteg Ufro",
"server_error": "Server Feeler",
"network_error": "Netzwierk Feeler",
"timeout": "Ufro Timeout",
"validation_error": "Validéierungsfeeler",
"field_required": "Dëst Feld ass obligatoresch",
"invalid_email": "Ongëlteg E-Mail Adress",
"invalid_phone": "Ongëlteg Telefonsnummer",
"password_mismatch": "Passwierder stëmmen net iwwereneen",
"password_too_short": "Passwuert ass ze kuerz",
"try_again": "Probéiert w.e.g. nach eng Kéier",
"contact_support": "Kontaktéiert w.e.g. den Support wann de Problem bestoe bleift"
},
"confirmations": {
"delete_title": "Läsche bestätegen",
"delete_message": "Sidd Dir sécher datt Dir dësen Artikel läsche wëllt?",
"delete_warning": "Dës Aktioun kann net réckgängeg gemaach ginn.",
"cancel_title": "Ofbriechen bestätegen",
"cancel_message": "Sidd Dir sécher datt Dir ofbrieche wëllt?",
"unsaved_changes": "Dir hutt net gespäichert Ännerungen. Sidd Dir sécher datt Dir fortfuere wëllt?",
"logout_title": "Ofmellen bestätegen",
"logout_message": "Sidd Dir sécher datt Dir Iech ofmelle wëllt?"
},
"notifications": {
"title": "Notifikatiounen",
"mark_read": "Als gelies markéieren",
"mark_all_read": "Alles als gelies markéieren",
"no_notifications": "Keng Notifikatiounen",
"new_order": "Nei Bestellung",
"order_updated": "Bestellung aktualiséiert",
"low_stock": "Niddreg Lager Alarm",
"import_complete": "Import fäerdeg",
"import_failed": "Import feelgeschloen"
},
"shop": {
"welcome": "Wëllkomm an eisem Buttek",
"browse_products": "Produkter duerchsichen",
"add_to_cart": "An de Kuerf",
"buy_now": "Elo kafen",
"view_cart": "Kuerf kucken",
"checkout": "Bezuelen",
"continue_shopping": "Weider akafen",
"start_shopping": "Ufänken mat Akafen",
"empty_cart": "Äre Kuerf ass eidel",
"cart_total": "Kuerf Total",
"proceed_checkout": "Zur Bezuelung goen",
"payment": "Bezuelung",
"place_order": "Bestellung opgi",
"order_placed": "Bestellung erfollegräich opginn",
"thank_you": "Merci fir Är Bestellung",
"order_confirmation": "Bestellungsbestätegung"
},
"footer": {
"all_rights_reserved": "All Rechter reservéiert",
"powered_by": "Ënnerstëtzt vun"
},
"time": {
"now": "Elo",
"today": "Haut",
"yesterday": "Gëschter",
"tomorrow": "Muer",
"this_week": "Dës Woch",
"last_week": "Lescht Woch",
"this_month": "Dëse Mount",
"last_month": "Läschte Mount",
"this_year": "Dëst Joer",
"ago": "hier",
"seconds": "Sekonnen",
"minutes": "Minutten",
"hours": "Stonnen",
"days": "Deeg",
"weeks": "Wochen",
"months": "Méint",
"years": "Joer"
},
"formats": {
"date": "DD.MM.YYYY",
"time": "HH:mm",
"datetime": "DD.MM.YYYY HH:mm",
"currency": "{amount} {symbol}"
}
}

View File

@@ -242,4 +242,50 @@ function shopLayoutData() {
// Make available globally
window.shopLayoutData = shopLayoutData;
/**
* Language Selector Component
* Alpine.js component for language switching
*/
function languageSelector(currentLang, enabledLanguages) {
return {
isLangOpen: false,
currentLang: currentLang || 'fr',
languages: enabledLanguages || ['fr', 'de', 'en'],
languageNames: {
'en': 'English',
'fr': 'Français',
'de': 'Deutsch',
'lb': 'Lëtzebuergesch'
},
languageFlags: {
'en': 'gb',
'fr': 'fr',
'de': 'de',
'lb': 'lu'
},
async setLanguage(lang) {
if (lang === this.currentLang) {
this.isLangOpen = false;
return;
}
try {
const response = await fetch('/api/v1/language/set', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ language: lang })
});
if (response.ok) {
this.currentLang = lang;
window.location.reload();
}
} catch (error) {
console.error('Failed to set language:', error);
}
this.isLangOpen = false;
}
};
}
window.languageSelector = languageSelector;
shopLog.info('Shop layout module loaded');

View File

@@ -118,4 +118,50 @@ function data() {
}
}
};
}
}
/**
* Language Selector Component
* Alpine.js component for language switching in vendor dashboard
*/
function languageSelector(currentLang, enabledLanguages) {
return {
isLangOpen: false,
currentLang: currentLang || 'fr',
languages: enabledLanguages || ['en', 'fr', 'de', 'lb'],
languageNames: {
'en': 'English',
'fr': 'Français',
'de': 'Deutsch',
'lb': 'Lëtzebuergesch'
},
languageFlags: {
'en': 'gb',
'fr': 'fr',
'de': 'de',
'lb': 'lu'
},
async setLanguage(lang) {
if (lang === this.currentLang) {
this.isLangOpen = false;
return;
}
try {
const response = await fetch('/api/v1/language/set', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ language: lang })
});
if (response.ok) {
this.currentLang = lang;
window.location.reload();
}
} catch (error) {
console.error('Failed to set language:', error);
}
this.isLangOpen = false;
}
};
}
window.languageSelector = languageSelector;

View File

@@ -73,6 +73,11 @@ function vendorLetzshop() {
tracking_carrier: ''
},
// Export
exportLanguage: 'fr',
exportIncludeInactive: false,
exporting: false,
async init() {
// Guard against multiple initialization
if (window._vendorLetzshopInitialized) {
@@ -410,6 +415,68 @@ function vendorLetzshop() {
if (!dateStr) return 'N/A';
const date = new Date(dateStr);
return date.toLocaleDateString() + ' ' + date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
},
/**
* Download product export CSV
*/
async downloadExport() {
this.exporting = true;
this.error = '';
try {
const params = new URLSearchParams({
language: this.exportLanguage,
include_inactive: this.exportIncludeInactive.toString()
});
// Get the token for authentication
const token = localStorage.getItem('wizamart_token');
if (!token) {
throw new Error('Not authenticated');
}
const response = await fetch(`/api/v1/vendor/letzshop/export?${params}`, {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`
}
});
if (!response.ok) {
const errorData = await response.json().catch(() => ({}));
throw new Error(errorData.detail || 'Export failed');
}
// Get filename from Content-Disposition header
const contentDisposition = response.headers.get('Content-Disposition');
let filename = `letzshop_export_${this.exportLanguage}.csv`;
if (contentDisposition) {
const match = contentDisposition.match(/filename="(.+)"/);
if (match) {
filename = match[1];
}
}
// Download the file
const blob = await response.blob();
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
this.successMessage = `Export downloaded: ${filename}`;
} catch (error) {
console.error('[VENDOR LETZSHOP] Export failed:', error);
this.error = error.message || 'Failed to export products';
} finally {
this.exporting = false;
setTimeout(() => this.successMessage = '', 5000);
}
}
};
}