The merchant team page was read-only. Now merchant owners can invite, edit roles, and remove team members across all their stores from a single hub view. Architecture: No new models — delegates to existing store_team_service. Members are deduplicated across stores with per-store role badges. New: - 5 API endpoints: GET team (member-centric), GET store roles, POST invite (multi-store), PUT update role, DELETE remove member - merchant-team.js Alpine component with invite/edit/remove modals - Full CRUD template with stats cards, store filter, member table - 7 Pydantic schemas for merchant team request/response - 2 service methods: validate_store_ownership, get_merchant_team_members - 25 new i18n keys across 4 tenancy locales + 1 core common key Tests: 434 tenancy tests passing, arch-check green. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
235 lines
7.6 KiB
JSON
235 lines
7.6 KiB
JSON
{
|
|
"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...",
|
|
"sending": "Gëtt geschéckt",
|
|
"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",
|
|
"signing_in": "Umellen...",
|
|
"sending": "Gëtt geschéckt...",
|
|
"send_reset_link": "Link fir zréckzesetzen schécken",
|
|
"reset_password_desc": "Gitt Är E-Mail-Adress an a mir schécken Iech e Link fir Äert Passwuert zréckzesetzen.",
|
|
"back_to_login": "Zréck zum Login",
|
|
"back_to_platform": "Zréck zur Plattform",
|
|
"no_account": "Kee Kont?",
|
|
"visit_platform": "Besicht eis Plattform",
|
|
"already_have_account": "Hutt Dir schonn e Kont?",
|
|
"create_account": "E Kont erstellen",
|
|
"continue_shopping": "Weider akafen",
|
|
"admin_login": "Admin Login",
|
|
"merchant_login": "Händler Login",
|
|
"store_login": "Buttek-Portal Login",
|
|
"customer_login": "Client Login",
|
|
"create_account_title": "Kont erstellen",
|
|
"creating_account": "Kont gëtt erstallt...",
|
|
"sign_in_instead": "Aloggen amplaz",
|
|
"first_name": "Virnumm",
|
|
"last_name": "Nonumm",
|
|
"phone_number": "Telefonsnummer",
|
|
"marketing_consent": "Ech wëll Neiegkeeten an Spezialangebotter kréien",
|
|
"password_requirements": "Muss mindestens 8 Zeechen, ee Buschtaf an eng Zuel enthalen",
|
|
"check_email": "Kuckt Är E-Mail",
|
|
"reset_link_sent": "Mir hunn e Link fir d'Passwuert zréckzesetzen op Är E-Mail-Adress geschéckt. Kuckt w.e.g. Ären Posteingang a klickt op de Link.",
|
|
"didnt_receive_email": "E-Mail net kritt? Kuckt Ären Spam-Dossier oder",
|
|
"try_again": "probéiert et nach eng Kéier",
|
|
"remember_password": "Passwuert erëm agefall?"
|
|
},
|
|
"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"
|
|
},
|
|
"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?"
|
|
},
|
|
"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}"
|
|
},
|
|
"clipboard": {
|
|
"copied": "An d'Zwëschenoflag kopéiert",
|
|
"failed": "Kopéiere feelgeschloen"
|
|
},
|
|
"onboarding": {
|
|
"banner": {
|
|
"title": "Ufänken",
|
|
"dismiss": "Verstoppen"
|
|
}
|
|
}
|
|
}
|