Restructure translation files

This commit is contained in:
2024-10-25 13:05:51 +02:00
parent 37f9f50da3
commit db72a94468
39 changed files with 526 additions and 596 deletions

View File

@@ -31,7 +31,7 @@ function confirmPressed() {
prepend-icon="mdi-close" prepend-icon="mdi-close"
color="orange" color="orange"
> >
{{ $t("dialog.cancel") }} {{ $t("misc.actions.cancel") }}
</outlined-button> </outlined-button>
<outlined-button <outlined-button
@@ -39,7 +39,7 @@ function confirmPressed() {
prepend-icon="mdi-check" prepend-icon="mdi-check"
color="red" color="red"
> >
{{ $t("dialog.confirm") }} {{ $t("misc.actions.confirm") }}
</outlined-button> </outlined-button>
</template> </template>
</action-dialog> </action-dialog>

View File

@@ -22,7 +22,7 @@ watch(() => route.path, () => {
<v-spacer /> <v-spacer />
<v-col> <v-col>
{{ $t('youAreHere') }} {{ $t('misc.youAreHere') }}
<v-breadcrumbs :items="routeItems"> <v-breadcrumbs :items="routeItems">
<template v-slot:title="{ item }"> <template v-slot:title="{ item }">
{{ item.title.charAt(0).toUpperCase() + item.title.slice(1) }} {{ item.title.charAt(0).toUpperCase() + item.title.slice(1) }}

View File

@@ -15,7 +15,7 @@
height="100%" height="100%"
:rounded="false" :rounded="false"
> >
{{ $t('allBands', 2) }} {{ $t('band.allBands', 2) }}
</v-btn> </v-btn>
<v-divider vertical /> <v-divider vertical />
@@ -26,7 +26,7 @@
height="100%" height="100%"
:rounded="false" :rounded="false"
> >
{{ $t('allConcerts', 2) }} {{ $t('concert.allConcerts', 2) }}
</v-btn> </v-btn>
<v-divider vertical /> <v-divider vertical />
@@ -38,7 +38,7 @@
height="100%" height="100%"
:rounded="false" :rounded="false"
> >
{{ $t('allLocations', 2) }} {{ $t('location.allLocations', 2) }}
</v-btn> </v-btn>
<v-divider vertical /> <v-divider vertical />

View File

@@ -52,12 +52,12 @@ defineProps({
<template #append> <template #append>
<div> <div>
<div class="text-secondary font-weight-medium text-h6 pb-1"> <div class="text-secondary font-weight-medium text-h6 pb-1">
{{ $t('from') + ' ' + lowestTicketPrice(concerts) + ' €' }} {{ $t('misc.from') + ' ' + lowestTicketPrice(concerts) + ' €' }}
</div> </div>
<div> <div>
<v-btn variant="flat" color="secondary"> <v-btn variant="flat" color="secondary">
{{ $t('more') }} {{ $t('misc.actions.more') }}
</v-btn> </v-btn>
</div> </div>
</div> </div>

View File

@@ -71,16 +71,16 @@ defineProps({
<template #append> <template #append>
<div> <div>
<div class="text-secondary font-weight-medium text-h6 pb-1"> <div class="text-secondary font-weight-medium text-h6 pb-1">
{{ $t('from') + ' ' + concert.price.toFixed(2) + ' €' }} {{ $t('misc.from') + ' ' + concert.price.toFixed(2) + ' €' }}
</div> </div>
<div v-if="concert.inStock == 0 && showButton" class="text-h6"> <div v-if="concert.inStock == 0 && showButton" class="text-h6">
{{ $t('soldOut') }} {{ $t('concert.concertSoldOut') }}
</div> </div>
<div v-else-if="showButton"> <div v-else-if="showButton">
<v-btn variant="flat" color="secondary"> <v-btn variant="flat" color="secondary">
{{ $t('goToTheConcert') }} {{ $t('concert.goToTheConcert') }}
</v-btn> </v-btn>
</div> </div>

View File

@@ -23,7 +23,7 @@ defineProps({
@click="router.push('locations/details/' + location.name.replaceAll(' ', '-').toLowerCase())" @click="router.push('locations/details/' + location.name.replaceAll(' ', '-').toLowerCase())"
> >
<div> <div>
{{ nrOfConcerts }} {{ $t('concert', nrOfConcerts) }} {{ nrOfConcerts }} {{ $t('concert.concert', nrOfConcerts) }}
</div> </div>
</card-view-top-image> </card-view-top-image>
</template> </template>

View File

@@ -48,7 +48,7 @@ defineProps({
> >
<template #content> <template #content>
<div class="text-caption"> <div class="text-caption">
{{ $t('date') }} {{ $t('misc.date') }}
</div> </div>
<div> <div>
@@ -56,7 +56,7 @@ defineProps({
</div> </div>
<div class="text-caption"> <div class="text-caption">
{{ $t('location') }} {{ $t('location.location') }}
</div> </div>
<div> <div>
@@ -64,7 +64,7 @@ defineProps({
</div> </div>
<div class="text-caption"> <div class="text-caption">
{{ $t('price') }} {{ $t('misc.price') }}
</div> </div>
<div> <div>
@@ -76,25 +76,25 @@ defineProps({
<v-row> <v-row>
<v-col> <v-col>
<card-view-one-line <card-view-one-line
:description-text="$t('seatGroup')" :description-text="$t('location.seat.seatGroup')"
:value-text="seatGroup" :value-text="seatGroup"
/> />
<div v-if="seatRow != 0"> <div v-if="seatRow != 0">
<card-view-one-line <card-view-one-line
:description-text="$t('seatRow')" :description-text="$t('location.seat.seatRow')"
:value-text="seatRow" :value-text="seatRow"
/> />
<card-view-one-line <card-view-one-line
:description-text="$t('seat')" :description-text="$t('location.seat.seat')"
:value-text="seatNr" :value-text="seatNr"
/> />
</div> </div>
<v-div v-else> <v-div v-else>
<card-view-one-line <card-view-one-line
:value-text="$t('standingArea')" :value-text="$t('location.seat.standingArea')"
/> />
</v-div> </v-div>
</v-col> </v-col>

View File

@@ -93,7 +93,7 @@ const seatGroupI = findSeatCategory("I")
width="50" width="50"
class="px-5 py-2 d-flex justify-center align-center" class="px-5 py-2 d-flex justify-center align-center"
> >
{{ $t('stage') }} {{ $t('location.stage') }}
</v-sheet> </v-sheet>
</v-col> </v-col>

View File

@@ -53,7 +53,7 @@ function handleSeatClick() {
width="100%" width="100%"
class="d-flex justify-center align-center" class="d-flex justify-center align-center"
> >
{{ $t('stage') }} {{ $t('location.stage') }}
</v-sheet> </v-sheet>
</v-col> </v-col>
@@ -62,7 +62,7 @@ function handleSeatClick() {
<v-row> <v-row>
<v-col class="text-center text-h6"> <v-col class="text-center text-h6">
{{ seatGroup.capacity - seatGroup.occupied }} {{ $t('standingPlaces') }} {{ seatGroup.capacity - seatGroup.occupied }} {{ $t('location.seat.standingPlace', 2) }}
</v-col> </v-col>
</v-row> </v-row>
</v-sheet> </v-sheet>

View File

@@ -1,69 +1,129 @@
{ {
"allEvents": "Alle Events", "location": {
"allLocations": "Alle Veranstaltungsorte", "allLocations": "Alle Veranstaltungsorte",
"topEvents": "Top Events", "topLocations": "Top Veranstaltungsorte",
"topLocations": "Top Veranstaltungsorte", "location": "Veranstaltungsort | Veranstaltungsorte",
"tickets": "Ticket | Tickets", "noLocationsFound": "Keine Veranstaltungsorte gefunden",
"concert": "Konzert | Konzerte", "city": "Stadt | Städte",
"resetPreferences": "Einstellungen zurücksetzen", "stage": "Bühne | Bühnen",
"resetDatabase": "Datenbank zurücksetzen", "seat": {
"resetDatabaseConfirm": { "seatRow": "Sitzreihe | Sitzreihen",
"title": "Datenbank zurücksetzen?", "seat": "Sitz | Sitze",
"description": "Soll die Datenbank des Servers wirklich zurückgesetzt werden? Dies kann nicht rückgänig gemacht werden! Der Bearbeitungsfortschritt der Aufgaben wird nicht gelöscht." "seatGroup": "Sitzgruppe | Sitzgruppen",
"standingPlace": "Stehplatz | Stehplätze",
"seatPlan": "Saalplan | Saalpläne",
"seatSelection": "Sitzauswahl",
"standingArea": "Stehbereich"
}
},
"concert": {
"concert": "Konzert | Konzerte",
"allConcerts": "Alle Konzerte",
"upcomingConcerts": "Nächste Konzerte",
"goToTheConcert": "Zum Konzert",
"noConcertsFound": "Keine Konzerte gefunden",
"selectedConcert": "Ausgewähltes Konzert",
"concertSoldOut": "Ausverkauft"
},
"band": {
"band": "Band | Bands",
"allBands": "Alle Bands",
"noBandFound": "Keine Band gefunden",
"rating": "Bewertung | Bewertungen",
"bandMember": "Band Mitglieder",
"image": "Foto | Fotos",
"genre": "Genre | Genres"
},
"ticket": {
"tickets": "Ticket | Tickets"
},
"account": {
"account": "Account | Accounts",
"register": "Account erstellen",
"masterData": "Stammdaten",
"noAddresses": "Keine Adressen gefunden",
"noPayments": "Keine Bezahlarten gefunden",
"wrongIban": "Falsches IBAN Format, nur deutsche IBAN-Nummern erlaubt!",
"emailIsNotValid": "Ungültige E-Mail Addresse",
"emailRequired": "E-Mail-Adresse benötigt",
"accountManagement": "Account verwalten",
"accountManagementDescription": "Persönliche Daten, Adressen, Bezahlmethoden",
"login": {
"pleaseLoginToOrder": "Bitte anmelden zum bestellen",
"backToLogin": "Zurück zum Login",
"login": "Login"
},
"logout": {
"logout": "Ausloggen",
"logoutDescription": "Aktuellen Useraccount ausloggen"
},
"userData": {
"username": "Username",
"password": "Passwort",
"address": "Adresse | Addressen",
"payment": "Bezahlart | Bezahlarten",
"email": "E-Mail-Adresse",
"firstName": "Vorname",
"lastName": "Nachname",
"street": "Straße",
"houseNumber": "Hausnummer",
"postalCode": "Postleitzahl",
"placeOfResidence": "Wohnort",
"bankName": "Name der Bank",
"iban": "IBAN"
},
"deleteAccount": {
"deleteAccount": "Account löschen",
"dialog": {
"title": "Account löschen?",
"description": "Soll der Account wirklich gelöscht werden? Dieser kann nicht mehr wiederhergestellt werden!"
}
}
},
"order": {
"orders": "Bestellung | Bestellungen",
"oclock": "Uhr",
"ordering": "Bestellabschluss",
"orderSummary": "Bestellübersicht",
"takeOrder": "Bestellung ausführen",
"noOrders": "Keine Bestellungen gefunden",
"orderedAt": "Bestellt am",
"noOrdersText": "Bisher wurden keine Bestellungen von diesem Account getätigt. Gehe zum Warenkorb und bestelle!",
"ordersDescription": "Übersicht aller getätigten Bestellungen"
},
"basket": {
"addToBasket": "Zum Warenkorb hinzufügen",
"emptyBasketTitle": "Keine Tickets im Warenkorb",
"emptyBasketText": "Gehe zu unseren Konzerten und lege Tickets in den Warenkorb",
"basket": "Warenkorb"
}, },
"preferences": { "preferences": {
"pageSetup": "Seiteneinstellungen", "pageSetup": "Seiteneinstellungen",
"selectedTheme": "Ausgewähltes Theme", "selectedTheme": "Ausgewähltes Theme",
"language": "Sprache", "language": "Sprache | Sprachen",
"serverState": "Server Status",
"systemSetup": "Systemeinstellungen", "systemSetup": "Systemeinstellungen",
"resetConfirm": "Soll die Datenbank wirklich zurückgesetzt werden?" "resetDatabase": {
"resetDatabase": "Datenbank zurücksetzen",
"dialog": {
"title": "Datenbank zurücksetzen?",
"description": "Soll die Datenbank des Servers wirklich zurückgesetzt werden? Dies kann nicht rückgänig gemacht werden! Der Bearbeitungsfortschritt der Aufgaben wird nicht gelöscht."
}
},
"resetExerciseProgress": {
"resetExerciseProgress": "Aufgabenfortschritt zurücksetzen",
"dialog": {
"title": "Übungsfortschritt zurücksetzen?",
"description": "Soll der Bearbeitungsfortschritt der Übungen wirklich zurückgesetzt werden? Dies kann nicht rückgänig gemacht werden!"
}
}
}, },
"product": { "help": {
"product": "Produkt | Produkte", "scoreBoard": {
"productName": "Produkt Name", "exerciseGroupNr": "Aufgabengruppe {0}: ",
"brand": "Marke", "exerciseNr": "Aufgabe {0}"
"productPrice": "Einzelpreis", }
"category": "Kategorie",
"description": "Beschreibung",
"storedItemsAvailable": "{0} verfügbar",
"soldOut": "Ausverkauft",
"discount": "Rabatt",
"inStock": "Warenbestand"
}, },
"offers": "Angebote",
"category": "Kategorie | Kategorien",
"sortBy": "Sortieren nach",
"quantity": "Anzahl",
"addToBasket": "Zum Warenkorb hinzufügen",
"emptyBasketTitle": "Keine Artikel im Warenkorb",
"emptyBasketText": "Gehe zu unseren Produkten und lege Artikel in den Warenkorb",
"totalPrice": "Gesamtpreis",
"orderNow": "Jetzt bestellen",
"userInfo": {
"firstName": "Vorname",
"lastName": "Nachname",
"street": "Straße",
"houseNumber": "Hausnummer",
"postalCode": "Postleitzahl",
"city": "Stadt",
"bankName": "Name der Bank",
"iban": "IBAN"
},
"account": "Account | Accounts",
"username": "Username",
"password": "Passwort",
"noAccountRegister": "Neuen Account erstellen!",
"register": "Account erstellen",
"backToLogin": "Zurück zum Login",
"delete": "Account löschen",
"managingAccount": "Account verwalten",
"address": "Adresse | Addressen",
"payment": "Bezahlart | Bezahlarten",
"masterData": "Stammdaten",
"noAddresses": "Keine Adressen gefunden",
"noPayments": "Keine Bezahlarten gefunden",
"newPayment": "New Payment",
"email": "E-Mail-Adresse",
"bannerMessages": { "bannerMessages": {
"loginSuccessful": "Login erfolgreich!", "loginSuccessful": "Login erfolgreich!",
"wrongLogin": "Falscher Username oder falsches Passwort!", "wrongLogin": "Falscher Username oder falsches Passwort!",
@@ -73,121 +133,39 @@
"usernameInUse": "Der Accountname ist bereits vergeben!", "usernameInUse": "Der Accountname ist bereits vergeben!",
"accountUpdated": "Account erfolgreich aktualisiert", "accountUpdated": "Account erfolgreich aktualisiert",
"logoutSuccessful": "Logout erfolgreich", "logoutSuccessful": "Logout erfolgreich",
"categoryCreateSuccessful": "Kategorie hinzugefügt",
"categoryDeleteSuccessful": "Kategorie gelöscht",
"categoryCreateError": "Fehler beim Erstellen der Kategorie",
"categoryDeleteError": "Fehler beim Löschen der Kategorie",
"orderPlaceSuccessfull": "Bestellung erfolgreich aufgegeben", "orderPlaceSuccessfull": "Bestellung erfolgreich aufgegeben",
"productCreateSuccessful": "Produkt hinzugefügt", "basketTicketAdded": "Ticket zum Warenkorb hinzugefügt",
"productCreateError": "Fehler beim Erstellen des Produktes", "basketTicketRemoved": "Ticket aus Warenkorb entfernt",
"productDeleteSuccessful": "Produkt erfolgreich entfernt", "exerciseSolvedNr": "Aufgabe {0}.{1} gelöst!"
"productDeleteError": "Fehler beim Entfernen des Produktes",
"basketProductAdded": "Artikel zum Warenkorb hinzugefügt",
"basketProductRemoved": "Artikel aus Warenkorb entfernt",
"exerciseSolved01": "Aufgabe 0.1 gelöst!",
"exerciseSolved02": "Aufgabe 0.2 gelöst!",
"exerciseSolved11": "Aufgabe 1.1 gelöst!",
"exerciseSolved12": "Aufgabe 1.2 gelöst!",
"exerciseSolved13": "Aufgabe 1.3 gelöst!",
"exerciseSolved21": "Aufgabe 2.1 gelöst!",
"exerciseSolved22": "Aufgabe 2.2 gelöst!",
"exerciseSolved23": "Aufgabe 2.3 gelöst!",
"exerciseSolved31": "Aufgabe 3.1 gelöst!",
"exerciseSolved32": "Aufgabe 3.2 gelöst!",
"exerciseSolved33": "Aufgabe 3.3 gelöst!"
}, },
"oclock": "Uhr", "misc": {
"ordering": { "sortBy": "Sortieren nach",
"ordering": "Bestellabschluss", "greeting": "Hallo {msg}",
"takeOrder": "Bestellung ausführen" "from": "ab",
}, "youAreHere": "Du bist hier:",
"dialog": { "date": "Datum | Daten",
"cancel": "Abbrechen", "totalPrice": "Gesamtpreis",
"confirm": "Bestätigen", "price": "Preis | Preise",
"deleteAccount": { "quantity": "Anzahl",
"title": "Account löschen?", "loading": "Lade...",
"description": "Soll der Account wirklich gelöscht werden? Dieser kann nicht mehr wiederhergestellt werden!" "onePageBack": "Zurück zur vorherigen Seite",
"enterSomeKeywords": "Füge Schlagworte ein um nach Bands, Konzerten und Veranstaltungsorten zu suchen",
"actions": {
"add": "Hinzufügen",
"remove": "Entfernen",
"save": "Speichern",
"filtering": "Filtern",
"cancel": "Abbrechen",
"more": "Mehr",
"confirm": "Bestätigen"
},
"validation": {
"required": "Darf nicht leer bleiben",
"noDigitsAllowed": "Zahlen sind nicht erlaubt",
"notEnoughChars": "Nicht wenige Zeichen",
"tooMuchChars": "Zu viele Zeichen",
"onlyDigitsAllowed": "Nur Zahlen erlaubt",
"digitsAtStartNeeded": "Muss mit einer Zahl beginnen"
} }
}, }
"scoreBoard": {
"exerciseGroup0": "Aufgabengruppe 0: Den Shop kennenlernen",
"exerciseGroup1": "Aufgabengruppe 1: SQL Injections",
"exerciseGroup2": "Aufgabengruppe 2: Broken Access Control",
"exerciseGroup3": "Aufgabengruppe 3: Cross-Site Scripting (XSS)",
"exercise": "Aufgabe {0}"
},
"serverState": "Server Status",
"required": "Darf nicht leer bleiben",
"noDigitsAllowed": "Zahlen sind nicht erlaubt",
"notEnoughChars": "Nicht lang genug",
"passwordToShort": "Passwort zu kurz",
"onlyDigitsAllowed": "Nur Zahlen erlaubt",
"noOrders": "Keine Bestellungen gefunden",
"noOrdersText": "Bisher wurden keine Bestellungen von diesem Account getätigt. Gehe zum Warenkorb und bestelle!",
"add": "Hinzufügen",
"remove": "Entfernen",
"emailIsNotValid": "Ungültige E-Mail Addresse",
"emailRequired": "E-Mail-Adresse benötigt",
"tooMuchChars": "Zu lang",
"digitsAtStartNeeded": "Muss mit einer Zahl beginnen",
"wrongIban": "Falsches IBAN Format, nur deutsche IBAN-Nummern erlaubt!",
"save": "Speichern",
"editProduct": "Produkt bearbeiten",
"brand": "Marke | Marken",
"concerts": {
"location": "Veranstaltungsort"
},
"location": "Veranstaltungsort | Veranstaltungsorte",
"band": "Band | Bands",
"noConcertsFound": "Keine Konzerte gefunden",
"from": "ab",
"soldOut": "Ausverkauft",
"city": "Stadt | Städte",
"seatPlan": "Saalplan",
"stage": "Bühne",
"filtering": "Filtern",
"bandMember": "Band Mitglieder",
"rating": "Bewertung | Bewertungen",
"image": "Foto | Fotos",
"seatSelection": "Sitzauswahl",
"loading": "Lade",
"orderSummary": "Bestellübersicht",
"basket": "Warenkorb",
"event": "Event | Events",
"hello": "Hallo",
"accountManagement": "Account verwalten",
"accountManagementDescription": "Persönliche Daten, Adressen, Bezahlmethoden",
"orders": "Bestellung | Bestellungen",
"ordersDescription": "Übersicht aller getätigten Bestellungen",
"onePageBack": "Zurück zur vorherigen Seite",
"orderedAt": "Bestellt am",
"logout": "Ausloggen",
"logoutDescription": "Aktuellen Useraccount ausloggen",
"login": "Login",
"seatRow": "Sitzreihe",
"seat": "Sitz",
"seatGroup": "Kategorie",
"date": "Datum",
"price": "Preis",
"standingArea": "Stehbereich",
"exerciseGroup": "Aufgabengruppe",
"exercise": "Aufgabe",
"resetProgress": "Aufgabenfortschritt zurücksetzen",
"youAreHere": "Du bist hier:",
"standingPlaces": "Stehplätze",
"resetExerciseProgressConfirm": {
"title": "Übungsfortschritt zurücksetzen?",
"description": "Soll der Bearbeitungsfortschritt der Übungen wirklich zurückgesetzt werden? Dies kann nicht rückgänig gemacht werden!"
},
"goToTheConcert": "Zum Konzert",
"selectedConcert": "Ausgewähltes Konzert",
"enterSomeKeywords": "Füge Schlagworte ein um nach Bands, Events, Konzerten und Veranstaltungsorten zu suchen",
"noBandFound": "Keine Band gefunden",
"noLocationsFound": "Keine Veranstaltungsorte gefunden",
"allBands": "Alle Bands",
"allConcerts": "Alle Konzerte",
"more": "Mehr",
"upcomingConcerts": "Nächste Konzerte",
"pleaseLogin": "Bitte anmelden",
"genres": "Genres"
} }

View File

@@ -1,193 +1,171 @@
{ {
"allEvents": "All Events", "location": {
"allLocations": "All Locations", "allLocations": "All Locations",
"topEvents": "Top Events", "topLocations": "Top Locations",
"topLocations": "Top Locations", "location": "Location | Locations",
"tickets": "Ticket | Tickets", "noLocationsFound": "No Locations found",
"concert": "Concert | Concerts", "city": "City | Cities",
"resetPreferences": "Reset preferences", "stage": "Stage | Stages",
"resetDatabase": "Reset database", "seat": {
"resetDatabaseConfirm": { "seatRow": "Seat Row | Seat Rows",
"title": "Reset database?", "seat": "Seat | Seats",
"description": "Do you really want to reset the server database? This can't be undone! Progress will not be deleted." "seatGroup": "Seat Group | Seat Groups",
"standingPlace": "Standing place | Standing places",
"seatPlan": "Seat plan | Seat plans",
"seatSelection": "Seat selection",
"standingArea": "Seat area"
}
},
"concert": {
"concert": "Concert | Concerts",
"allConcerts": "All Concerts",
"upcomingConcerts": "Upcoming Concerts",
"goToTheConcert": "Go to concert",
"noConcertsFound": "No Concerts found",
"selectedConcert": "Selected Concert",
"concertSoldOut": "Sold out"
},
"band": {
"band": "Band | Bands",
"allBands": "All Bands",
"noBandFound": "No Band found",
"rating": "Rating | Ratings",
"bandMember": "Band Member",
"image": "Photo | Photos",
"genre": "Genre | Genres"
},
"ticket": {
"tickets": "Ticket | Tickets"
},
"account": {
"account": "Account | Accounts",
"register": "Register",
"masterData": "Master data",
"noAddresses": "No addresses found",
"noPayments": "No payments found",
"wrongIban": "Wrong IBAN format, only German IBAN-numbers allowed!",
"emailIsNotValid": "E-Mail not valid",
"emailRequired": "E-Mail required",
"accountManagement": "Manage Account",
"accountManagementDescription": "Personal data, addresses, payments",
"login": {
"pleaseLoginToOrder": "Please login to order",
"backToLogin": "Back to Login",
"login": "Login"
},
"logout": {
"logout": "Logout",
"logoutDescription": "Logout current user account"
},
"userData": {
"username": "Username",
"password": "Password",
"address": "Adress | Addresses",
"payment": "Payment | Payments",
"email": "E-Mail address",
"firstName": "First name",
"lastName": "Last name",
"street": "Street",
"houseNumber": "House number",
"postalCode": "Postal code",
"placeOfResidence": "Place of residence",
"bankName": "Name of bank",
"iban": "IBAN"
},
"deleteAccount": {
"deleteAccount": "Delete Account",
"dialog": {
"title": "Delete Account?",
"description": "Do you really want to delete this account? This is permanent!"
}
}
},
"order": {
"orders": "Order | Orders",
"oclock": "o'clock",
"ordering": "Finish order process",
"orderSummary": "Order overview",
"takeOrder": "Execute order",
"noOrders": "No orders found",
"orderedAt": "Ordered at",
"noOrdersText": "Bisher wurden keine Bestellungen von diesem Account getätigt. Gehe zum Warenkorb und bestelle!",
"ordersDescription": "Overview of all placed orders"
},
"basket": {
"addToBasket": "Add to basket",
"emptyBasketTitle": "No tickets in basket",
"emptyBasketText": "Go to our concerts and place some ticket in the basket",
"basket": "Basket"
}, },
"preferences": { "preferences": {
"pageSetup": "Page setup", "pageSetup": "Page setup",
"selectedTheme": "Selected theme", "selectedTheme": "Selected Theme",
"language": "Language", "language": "Language | Languages",
"systemSetup": "System setup", "serverState": "Server Status",
"resetConfirm": "Really reset the database?" "systemSetup": "System preferences",
}, "resetDatabase": {
"product": { "resetDatabase": "Reset database",
"product": "Product | Products", "dialog": {
"productName": "Product name", "title": "Reset database?",
"brand": "Brand", "description": "Do you really want to reset the database? This is permanent! Exercise progress will not be affected"
"productPrice": "Unit price", }
"category": "Category", },
"description": "Description", "resetExerciseProgress": {
"storedItemsAvailable": "{0} items available", "resetExerciseProgress": "Reset exercise progress",
"soldOut": "Sold Out", "dialog": {
"discount": "Discount", "title": "Reset exercise progress?",
"inStock": "In Stock" "description": "Do you really want to reset the exercise progress? This is permanent!"
}, }
"offers": "Offers",
"category": "Category | Categories",
"sortBy": "Sort by",
"quantity": "Quantity",
"addToBasket": "Add to basket",
"emptyBasketTitle": "The basket is empty...",
"emptyBasketText": "Go to our products and add some of them to the basket",
"totalPrice": "Total price",
"orderNow": "Order now",
"userInfo": {
"firstName": "First Name",
"lastName": "Family Name",
"street": "Street",
"houseNumber": "House Number",
"postalCode": "Postal Code",
"city": "City",
"bankName": "Bank name",
"iban": "IBAN"
},
"account": "Account | Accounts",
"backToLogin": "Back to Login",
"username": "Username",
"password": "Password",
"noAccountRegister": "Create new Account!",
"register": "Create Account",
"delete": "Delete Account",
"managingAccount": "Managing Account",
"address": "Address | Addresses",
"payment": "Payment | Payments",
"masterData": "Master data",
"noAddresses": "No Addresses found",
"noPayments": "No payments found",
"newPayment": "New Payment",
"email": "E-Mail address",
"bannerMessages": {
"loginSuccessful": "Login erfolgreich!",
"wrongLogin": "Falscher Username oder falsches Passwort!",
"error": "Some error occurred...",
"databaseResetSuccessful": "Database reset successful!",
"usernameInUse": "Username always in use!",
"registerSuccessful": "Account successfully created!",
"accountUpdated": "Account successfully updated",
"logoutSuccessful": "Logout successful",
"categoryCreateSuccessful": "Category created",
"categoryDeleteSuccessful": "Category deleted",
"categoryCreateError": "Error on creating category",
"categoryDeleteError": "Error on deleting category",
"orderPlaceSuccessfull": "Order successfully placed",
"productCreateSuccessful": "Product created",
"productCreateError": "Error on product creation",
"productDeleteSuccessful": "Product successfully deleted",
"productDeleteError": "Error on product delete",
"basketProductAdded": "Add product to basket",
"basketProductRemoved": "Product removed from basket",
"exerciseSolved01": "Exercise 0.1 solved!",
"exerciseSolved02": "Exercise 0.2 solved!",
"exerciseSolved11": "Exercise 1.1 solved!",
"exerciseSolved12": "Exercise 1.2 solved!",
"exerciseSolved13": "Exercise 1.3 solved!",
"exerciseSolved21": "Exercise 2.1 solved!",
"exerciseSolved22": "Exercise 2.2 solved!",
"exerciseSolved23": "Exercise 2.3 solved!",
"exerciseSolved31": "Exercise 3.1 solved!",
"exerciseSolved32": "Exercise 3.2 solved!",
"exerciseSolved33": "Exercise 3.3 solved!"
},
"oclock": "o'clock",
"ordering": {
"ordering": "Finish order",
"takeOrder": "Do order now"
},
"dialog": {
"cancel": "Cancel",
"confirm": "Bestätigen",
"deleteAccount": {
"title": "Delete account?",
"description": "Do you really want to delete the account? This can't be undone!"
} }
}, },
"scoreBoard": { "help": {
"exerciseGroup0": "Exercise Group 0: Getting Started", "scoreBoard": {
"exerciseGroup1": "Exercise Group 1: SQL Injections", "exerciseGroupNr": "Exercise Group {0}: ",
"exerciseGroup2": "Exercise Group 2: Broken Access Control", "exerciseNr": "Exercise {0}"
"exerciseGroup3": "Exercise Group 3: Cross-Site Scripting (XSS)", }
"exercise": "Exercise {0}"
}, },
"serverState": "Server State:", "bannerMessages": {
"required": "Is required", "loginSuccessful": "Login successfull!",
"noDigitsAllowed": "Digits are not allowed", "wrongLogin": "Wrong username or wrong password!",
"notEnoughChars": "Too short", "error": "There is some error...",
"passwordToShort": "Password too short", "databaseResetSuccessful": "Database successfully resetted!",
"onlyDigitsAllowed": "Only digits are allowed", "registerSuccessful": "Account successfully created!",
"noOrders": "No orders found", "usernameInUse": "The username is already in use!",
"noOrdersText": "There are no orders with this account until now. Go to the basket page and order something!", "accountUpdated": "Account successfully updated",
"add": "Add", "logoutSuccessful": "Logout successfull",
"remove": "Remove", "orderPlaceSuccessfull": "Order successfully placed",
"emailIsNotValid": "E-mail must be valid", "basketTicketAdded": "Added ticket to basket",
"emailRequired": "E-Mail is required", "basketTicketRemoved": "Removed ticket from basket",
"tooMuchChars": "Too long", "exerciseSolvedNr": "Exercise {0}.{1} solved!"
"digitsAtStartNeeded": "Has to beginn with a number",
"wrongIban": "Wrong IBAN format, only German IBANs are allowed!",
"save": "Save",
"editProduct": "Edit product",
"brand": "Brand | Brands",
"concerts": {
"location": "Locations"
}, },
"location": "Location | Locations", "misc": {
"band": "Band | Bands", "sortBy": "Sort by",
"noConcertsFound": "No Concerts found", "greeting": "Hello {msg}",
"from": "from", "from": "from",
"soldOut": "Sold Out", "youAreHere": "You are here:",
"city": "City | Cities", "date": "Date | Dates",
"seatPlan": "Seat Plan", "totalPrice": "Total price",
"stage": "Stage", "price": "Price | Prices",
"filtering": "Filtering", "quantity": "Quantity",
"bandMember": "Band members", "loading": "Loading...",
"rating": "Rating | Ratings", "onePageBack": "Back to previous page",
"image": "Image | Images", "enterSomeKeywords": "Enter keywords to search for bands, concerts and locations",
"seatSelection": "Select seat", "actions": {
"loading": "Loading", "add": "Add",
"orderSummary": "Order Summary", "remove": "Remove",
"basket": "Basket", "save": "Save",
"event": "Event | Events", "filtering": "Filter",
"hello": "Hello", "cancel": "Cancel",
"accountManagement": "Account Management", "more": "More",
"accountManagementDescription": "Contact data, Addresses, Payment methods", "confirm": "Confirm"
"orders": "Order | Orders", },
"ordersDescription": "Overview about all orders", "validation": {
"onePageBack": "Back to previous page", "required": "Must not remain empty",
"orderedAt": "Ordered at", "noDigitsAllowed": "Numbers are not allowed",
"logout": "Logout", "notEnoughChars": "Not enough characters",
"logoutDescription": "Logout current account", "tooMuchChars": "Too much characters",
"login": "Login", "onlyDigitsAllowed": "Only numbers are allowed",
"seatRow": "Seat Row", "digitsAtStartNeeded": "Must start with a number"
"seat": "Seat", }
"seatGroup": "Category", }
"date": "Date",
"price": "Price",
"standingArea": "Standing Area",
"exerciseGroup": "Exercise group",
"exercise": "Exercise",
"resetProgress": "Reset Exercise Progress",
"youAreHere": "You are here:",
"standingPlaces": "Standing capacity",
"resetExerciseProgressConfirm": {
"title": "Reset Exercise progress?",
"description": "Do you really want to reset the exercise progress? This can't be undone!"
},
"goToTheConcert": "To the concert",
"selectedConcert": "Selected Concert",
"enterSomeKeywords": "Enter keywords to search for bands, events, concerts and locations",
"noBandFound": "No band found",
"noLocationsFound": "No location found",
"allBands": "All Bands",
"allConcerts": "All Concerts",
"more": "More",
"upcomingConcerts": "Upcoming Concerts",
"pleaseLogin": "Please login",
"genres": "Genres"
} }

View File

@@ -11,14 +11,14 @@ const passwordRules = [
if (value) { if (value) {
return true return true
} else { } else {
return feedbackStore.i18n.t('required') return feedbackStore.i18n.t('misc.validation.required')
} }
}, },
value => { value => {
if (value?.length >= 8) { if (value?.length >= 8) {
return true return true
} else { } else {
return feedbackStore.i18n.t('passwordToShort') return feedbackStore.i18n.t('misc.validation.notEnoughChars')
} }
} }
] ]
@@ -28,21 +28,21 @@ const stringRules = [
if (value) { if (value) {
return true return true
} else { } else {
return feedbackStore.i18n.t('required') return feedbackStore.i18n.t('misc.validation.required')
} }
}, },
value => { value => {
if (/[^0-9]/.test(value)) { if (/[^0-9]/.test(value)) {
return true return true
} else { } else {
return feedbackStore.i18n.t('noDigitsAllowed') return feedbackStore.i18n.t('misc.validation.noDigitsAllowed')
} }
}, },
value => { value => {
if (value?.length >= 3) { if (value?.length >= 3) {
return true return true
} else { } else {
return feedbackStore.i18n.t('notEnoughChars') return feedbackStore.i18n.t('misc.validation.notEnoughChars')
} }
} }
] ]
@@ -56,7 +56,7 @@ const stringRules = [
<v-row> <v-row>
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('account.email')" :label="$t('account.userData.email')"
v-model="accountStore.userAccount.email" v-model="accountStore.userAccount.email"
disabled disabled
/> />
@@ -65,14 +65,14 @@ const stringRules = [
<v-row> <v-row>
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('account.username')" :label="$t('account.userData.username')"
v-model="accountStore.userAccount.username" v-model="accountStore.userAccount.username"
disabled disabled
/> />
</v-col> </v-col>
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('account.password')" :label="$t('account.userData.password')"
v-model="accountStore.userAccount.password" v-model="accountStore.userAccount.password"
type="password" type="password"
:rules="passwordRules" :rules="passwordRules"
@@ -83,14 +83,14 @@ const stringRules = [
<v-row> <v-row>
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('userInfo.firstName')" :label="$t('account.userData.firstName')"
v-model="accountStore.userAccount.firstName" v-model="accountStore.userAccount.firstName"
:rules="stringRules" :rules="stringRules"
/> />
</v-col> </v-col>
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('userInfo.lastName')" :label="$t('account.userData.lastName')"
v-model="accountStore.userAccount.lastName" v-model="accountStore.userAccount.lastName"
:rules="stringRules" :rules="stringRules"
/> />

View File

@@ -11,7 +11,7 @@ const accountStore = useAccountStore()
<template> <template>
<card-view <card-view
:title="$t('account.managingAccount')" :title="$t('account.accountManagement')"
icon="mdi-account-edit" icon="mdi-account-edit"
> >
<v-row> <v-row>
@@ -22,7 +22,7 @@ const accountStore = useAccountStore()
:loading="accountStore.fetchInProgress" :loading="accountStore.fetchInProgress"
@click="showConfirmDialog = true" @click="showConfirmDialog = true"
> >
{{ $t("account.delete") }} {{ $t("account.deleteAccount.deleteAccount") }}
</outlined-button> </outlined-button>
</v-col> </v-col>
@@ -33,7 +33,7 @@ const accountStore = useAccountStore()
:loading="accountStore.fetchInProgress" :loading="accountStore.fetchInProgress"
@click="accountStore.updateAccount()" @click="accountStore.updateAccount()"
> >
{{ $t("save") }} {{ $t("misc.actions.save") }}
</outlined-button> </outlined-button>
</v-col> </v-col>
</v-row> </v-row>
@@ -41,8 +41,8 @@ const accountStore = useAccountStore()
<confirm-dialog <confirm-dialog
v-model="showConfirmDialog" v-model="showConfirmDialog"
:title="$t('dialog.deleteAccount.title')" :title="$t('account.deleteAccount.dialog.title')"
:description="$t('dialog.deleteAccount.description')" :description="$t('account.deleteAccount.dialog.description')"
/> />
<!-- todo :onConfirm="deleteAccount" --> <!-- todo :onConfirm="deleteAccount" -->
</template> </template>

View File

@@ -11,7 +11,7 @@ const accountStore = useAccountStore()
<template> <template>
<card-view <card-view
icon="mdi-home" icon="mdi-home"
:title="$t('account.address')" :title="$t('account.userData.address')"
> >
<v-expansion-panels v-if="accountStore.userAccount.addresses.length > 0"> <v-expansion-panels v-if="accountStore.userAccount.addresses.length > 0">
<v-expansion-panel <v-expansion-panel
@@ -26,7 +26,7 @@ const accountStore = useAccountStore()
<v-row class="pt-5"> <v-row class="pt-5">
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('userInfo.street')" :label="$t('account.userData.street')"
v-model="address.street" v-model="address.street"
:rules="getStringRules()" :rules="getStringRules()"
clearable clearable
@@ -34,7 +34,7 @@ const accountStore = useAccountStore()
</v-col> </v-col>
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('userInfo.houseNumber')" :label="$t('account.userData.houseNumber')"
v-model="address.houseNumber" v-model="address.houseNumber"
:rules="getNumberStartRules()" :rules="getNumberStartRules()"
clearable clearable
@@ -45,7 +45,7 @@ const accountStore = useAccountStore()
<v-row> <v-row>
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('userInfo.postalCode')" :label="$t('account.userData.postalCode')"
v-model="address.postalCode" v-model="address.postalCode"
:rules="getPostalRules()" :rules="getPostalRules()"
clearable clearable
@@ -53,7 +53,7 @@ const accountStore = useAccountStore()
</v-col> </v-col>
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('userInfo.city')" :label="$t('account.userData.placeOfResidence')"
v-model="address.city" v-model="address.city"
:rules="getStringRules()" :rules="getStringRules()"
clearable clearable
@@ -68,7 +68,7 @@ const accountStore = useAccountStore()
color="red" color="red"
prepend-icon="mdi-delete" prepend-icon="mdi-delete"
> >
{{ $t('remove') }} {{ $t('misc.actions.remove') }}
</outlined-button> </outlined-button>
</v-col> </v-col>
</v-row> </v-row>
@@ -88,7 +88,7 @@ const accountStore = useAccountStore()
prepend-icon="mdi-plus" prepend-icon="mdi-plus"
color="green" color="green"
> >
{{ $t('add') }} {{ $t('misc.actions.add') }}
</outlined-button> </outlined-button>
</template> </template>
</card-view> </card-view>

View File

@@ -14,7 +14,7 @@ const router = useRouter()
<v-row> <v-row>
<v-col> <v-col>
<outlined-button prepend-icon="mdi-arrow-left" @click="router.back()" > <outlined-button prepend-icon="mdi-arrow-left" @click="router.back()" >
{{ $t('onePageBack') }} {{ $t('misc.onePageBack') }}
</outlined-button> </outlined-button>
</v-col> </v-col>
</v-row> </v-row>

View File

@@ -12,7 +12,7 @@ const accountStore = useAccountStore()
<template> <template>
<card-view <card-view
icon="mdi-currency-usd" icon="mdi-currency-usd"
:title="$t('account.payment')" :title="$t('account.userData.payment')"
> >
<v-expansion-panels <v-expansion-panels
v-if="accountStore.userAccount.payments.length > 0" v-if="accountStore.userAccount.payments.length > 0"
@@ -28,14 +28,14 @@ const accountStore = useAccountStore()
<v-row class="pt-5"> <v-row class="pt-5">
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('userInfo.bankName')" :label="$t('account.userData.bankName')"
v-model="payment.bankName" v-model="payment.bankName"
:rules="getStringRules()" :rules="getStringRules()"
/> />
</v-col> </v-col>
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('userInfo.iban')" :label="$t('account.userData.iban')"
v-model="payment.iban" v-model="payment.iban"
:rules="getIbanRules()" :rules="getIbanRules()"
/> />
@@ -49,7 +49,7 @@ const accountStore = useAccountStore()
color="red" color="red"
prepend-icon="mdi-delete" prepend-icon="mdi-delete"
> >
{{ $t('remove') }} {{ $t('misc.actions.remove') }}
</outlined-button> </outlined-button>
</v-col> </v-col>
</v-row> </v-row>
@@ -69,7 +69,7 @@ const accountStore = useAccountStore()
prepend-icon="mdi-plus" prepend-icon="mdi-plus"
color="green" color="green"
> >
{{ $t('add') }} {{ $t('misc.actions.add') }}
</outlined-button> </outlined-button>
</template> </template>
</card-view> </card-view>

View File

@@ -12,18 +12,18 @@ const router = useRouter()
<v-row> <v-row>
<v-col> <v-col>
<card-view <card-view
:title="$t('hello') + ' ' + accountStore.userAccount.firstName + ' ' + accountStore.userAccount.lastName" :title="$t('misc.greeting', { msg: accountStore.userAccount.username })"
icon="mdi-hand-wave" icon="mdi-hand-wave"
> >
<v-container> <v-container>
<v-row> <v-row>
<v-col> <v-col>
<card-view <card-view
:title="$t('orders', 2)" :title="$t('order.orders', 2)"
icon="mdi-basket-check" icon="mdi-basket-check"
@click="router.push('/account/orders')" @click="router.push('/account/orders')"
> >
{{ $t('ordersDescription') }} {{ $t('order.ordersDescription') }}
</card-view> </card-view>
</v-col> </v-col>
</v-row> </v-row>
@@ -31,11 +31,11 @@ const router = useRouter()
<v-row> <v-row>
<v-col> <v-col>
<card-view <card-view
:title="$t('accountManagement')" :title="$t('account.accountManagement')"
icon="mdi-account" icon="mdi-account"
@click="router.push('/account/data')" @click="router.push('/account/data')"
> >
{{ $t('accountManagementDescription') }} {{ $t('account.accountManagementDescription') }}
</card-view> </card-view>
</v-col> </v-col>
</v-row> </v-row>
@@ -43,11 +43,11 @@ const router = useRouter()
<v-row> <v-row>
<v-col> <v-col>
<card-view <card-view
:title="$t('logout')" :title="$t('account.logout.logout')"
icon="mdi-logout" icon="mdi-logout"
@click="accountStore.logout(); router.push('/account/login')" @click="accountStore.logout(); router.push('/account/login')"
> >
{{ $t('logoutDescription') }} {{ $t('account.logout.logoutDescription') }}
</card-view> </card-view>
</v-col> </v-col>
</v-row> </v-row>

View File

@@ -20,14 +20,14 @@ async function startLogin() {
<template> <template>
<card-view <card-view
:title="$t('login')" :title="$t('account.login.login')"
icon="mdi-login" icon="mdi-login"
max-width="600" max-width="600"
> >
<v-row> <v-row>
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('account.username')" :label="$t('account.userData.username')"
prepend-icon="mdi-account" prepend-icon="mdi-account"
v-model="accountStore.loginData.username" v-model="accountStore.loginData.username"
clearable clearable
@@ -38,7 +38,7 @@ async function startLogin() {
<v-row> <v-row>
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('account.password')" :label="$t('account.userData.password')"
prepend-icon="mdi-key" prepend-icon="mdi-key"
type="password" type="password"
v-model="accountStore.loginData.password" v-model="accountStore.loginData.password"
@@ -53,7 +53,7 @@ async function startLogin() {
prepend-icon="mdi-plus" prepend-icon="mdi-plus"
:loading="accountStore.fetchInProgress" :loading="accountStore.fetchInProgress"
> >
{{ $t('account.noAccountRegister') }} {{ $t('account.register') }}
</outlined-button> </outlined-button>
<outlined-button <outlined-button
@@ -61,7 +61,7 @@ async function startLogin() {
@click="startLogin" @click="startLogin"
:loading="accountStore.fetchInProgress" :loading="accountStore.fetchInProgress"
> >
{{ $t('login') }} {{ $t('account.login.login') }}
</outlined-button> </outlined-button>
</template> </template>
</card-view> </card-view>

View File

@@ -27,7 +27,7 @@ async function registerAccount() {
<v-row> <v-row>
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('account.username')" :label="$t('account.userData.username')"
prepend-icon="mdi-account" prepend-icon="mdi-account"
v-model="accountStore.registerData.username" v-model="accountStore.registerData.username"
clearable clearable
@@ -39,7 +39,7 @@ async function registerAccount() {
<v-row> <v-row>
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('account.password')" :label="$t('account.userData.password')"
prepend-icon="mdi-key" prepend-icon="mdi-key"
type="password" type="password"
v-model="accountStore.registerData.password" v-model="accountStore.registerData.password"
@@ -52,7 +52,7 @@ async function registerAccount() {
<v-row> <v-row>
<v-col> <v-col>
<v-text-field <v-text-field
:label="$t('account.email')" :label="$t('account.userData.email')"
prepend-icon="mdi-mail" prepend-icon="mdi-mail"
v-model="accountStore.registerData.email" v-model="accountStore.registerData.email"
:rules="getEmailRules()" :rules="getEmailRules()"
@@ -67,7 +67,7 @@ async function registerAccount() {
@click="showRegisterCard = false" @click="showRegisterCard = false"
:disabled="accountStore.fetchInProgress" :disabled="accountStore.fetchInProgress"
> >
{{ $t('account.backToLogin') }} {{ $t('account.login.backToLogin') }}
</outlined-button> </outlined-button>
<outlined-button <outlined-button

View File

@@ -15,7 +15,7 @@ accountStore.refreshOrders()
<v-row> <v-row>
<v-col> <v-col>
<outlined-button prepend-icon="mdi-arrow-left" @click="router.back()" > <outlined-button prepend-icon="mdi-arrow-left" @click="router.back()" >
{{ $t('onePageBack') }} {{ $t('misc.onePageBack') }}
</outlined-button> </outlined-button>
</v-col> </v-col>
</v-row> </v-row>
@@ -35,8 +35,8 @@ accountStore.refreshOrders()
<v-col> <v-col>
<v-empty-state <v-empty-state
icon="mdi-basket-off" icon="mdi-basket-off"
:title="$t('noOrders')" :title="$t('order.noOrders')"
:text="$t('noOrdersText')" :text="$t('order.noOrdersText')"
/> />
</v-col> </v-col>
</v-row> </v-row>

View File

@@ -15,7 +15,7 @@ defineProps({
<template> <template>
<card-view <card-view
:title="$t('orderedAt') + ' ' + moment(order.orderedAt).format('DD.MM.YY, HH:mm') + ' ' + $t('oclock')" :title="$t('order.orderedAt') + ' ' + moment(order.orderedAt).format('DD.MM.YY, HH:mm') + ' ' + $t('order.oclock')"
variant="outlined" variant="outlined"
> >
<v-row> <v-row>
@@ -23,7 +23,7 @@ defineProps({
<v-card variant="outlined" class="ml-5 pa-3"> <v-card variant="outlined" class="ml-5 pa-3">
<div class="text-h6"> <div class="text-h6">
<v-icon icon="mdi-home" /> <v-icon icon="mdi-home" />
{{ $t('account.address', 1) }} {{ $t('account.userData.address', 1) }}
</div> </div>
<div class="pl-9">{{ order.address.street }} {{ order.address.houseNumber }}</div> <div class="pl-9">{{ order.address.street }} {{ order.address.houseNumber }}</div>
@@ -35,7 +35,7 @@ defineProps({
<v-card variant="outlined" class="mr-5 pa-3"> <v-card variant="outlined" class="mr-5 pa-3">
<div class="text-h6"> <div class="text-h6">
<v-icon icon="mdi-currency-usd" /> <v-icon icon="mdi-currency-usd" />
{{ $t('account.payment', 1) }} {{ $t('account.userData.payment', 1) }}
</div> </div>
<div class="pl-9">{{ order.payment.bankName }}</div> <div class="pl-9">{{ order.payment.bankName }}</div>
<div class="pl-9">{{ order.payment.iban }}</div> <div class="pl-9">{{ order.payment.iban }}</div>

View File

@@ -34,18 +34,18 @@ concertStore.getConcerts()
<v-row> <v-row>
<v-col> <v-col>
<card-view <card-view
:title="$t('band', 2)" :title="$t('band.band', 2)"
icon="mdi-guitar-electric" icon="mdi-guitar-electric"
> >
<div class="text-h4 text-center"> <div class="text-h4 text-center">
{{ bandStore.bands.length }} {{ $t('band', 2) }} {{ bandStore.bands.length }} {{ $t('band.band', 2) }}
</div> </div>
<template #actions> <template #actions>
<outlined-button <outlined-button
@click="router.push('/admin/bands')" @click="router.push('/admin/bands')"
> >
{{ $t('more') }} {{ $t('misc.actions.more') }}
</outlined-button> </outlined-button>
</template> </template>
</card-view> </card-view>
@@ -53,22 +53,22 @@ concertStore.getConcerts()
<v-col> <v-col>
<card-view <card-view
:title="$t('concert', 2)" :title="$t('concert.concert', 2)"
icon="mdi-ticket" icon="mdi-ticket"
> >
<div class="text-h4 text-center"> <div class="text-h4 text-center">
{{ concertStore.concerts.length }} {{ $t('concert', 2) }} {{ concertStore.concerts.length }} {{ $t('concert.concert', 2) }}
</div> </div>
<div class="text-disabled text-center"> <div class="text-disabled text-center">
{{ soldOutConcerts }} {{ $t('soldOut') }} {{ soldOutConcerts }} {{ $t('concert.concertSoldOut') }}
</div> </div>
<template #actions> <template #actions>
<outlined-button <outlined-button
@click="router.push('/admin/concerts')" @click="router.push('/admin/concerts')"
> >
{{ $t('more') }} {{ $t('misc.actions.more') }}
</outlined-button> </outlined-button>
</template> </template>
</card-view> </card-view>
@@ -77,18 +77,18 @@ concertStore.getConcerts()
<v-col> <v-col>
<card-view <card-view
:title="$t('location', 2)" :title="$t('location.location', 2)"
icon="mdi-city" icon="mdi-city"
> >
<div class="text-h4 text-center"> <div class="text-h4 text-center">
{{ locationStore.locations.length }} {{ $t('location', 2) }} {{ locationStore.locations.length }} {{ $t('location.location', 2) }}
</div> </div>
<template #actions> <template #actions>
<outlined-button <outlined-button
@click="router.push('/admin/locations')" @click="router.push('/admin/locations')"
> >
{{ $t('more') }} {{ $t('misc.actions.more') }}
</outlined-button> </outlined-button>
</template> </template>
</card-view> </card-view>
@@ -100,7 +100,7 @@ concertStore.getConcerts()
<v-row> <v-row>
<v-col> <v-col>
<card-view <card-view
:title="$t('account', 2)" :title="$t('account.account', 2)"
icon="mdi-account" icon="mdi-account"
> >
</card-view> </card-view>
@@ -108,37 +108,18 @@ concertStore.getConcerts()
<v-col> <v-col>
<card-view <card-view
:title="$t('category', 2)" :title="$t('band.genre', 2)"
icon="mdi-account" icon="mdi-account"
> >
<div class="text-h4 text-center"> <div class="text-h4 text-center">
{{ bandStore.availableGenres.length }} {{ $t('genres', 2) }} {{ bandStore.availableGenres.length }} {{ $t('band.genre', 2) }}
</div> </div>
<template #actions> <template #actions>
<outlined-button <outlined-button
@click="router.push('/admin/genres')" @click="router.push('/admin/genres')"
> >
{{ $t('more') }} {{ $t('misc.actions.more') }}
</outlined-button>
</template>
</card-view>
</v-col>
<v-col>
<card-view
:title="$t('genres', 2)"
icon="mdi-guitar-electric"
>
<div class="text-h4 text-center">
{{ bandStore.availableGenres.length }} {{ $t('genres', 2) }}
</div>
<template #actions>
<outlined-button
@click="router.push('/admin/genres')"
>
{{ $t('more') }}
</outlined-button> </outlined-button>
</template> </template>
</card-view> </card-view>

View File

@@ -31,7 +31,7 @@ bandStore.getBand(String(router.currentRoute.value.params.name).replaceAll('-',
<v-col cols="10"> <v-col cols="10">
<v-row> <v-row>
<v-col> <v-col>
<section-divider :title="$t('concert', 2)" /> <section-divider :title="$t('concert.concert', 2)" />
</v-col> </v-col>
</v-row> </v-row>
@@ -42,7 +42,7 @@ bandStore.getBand(String(router.currentRoute.value.params.name).replaceAll('-',
<v-row> <v-row>
<v-col> <v-col>
<section-divider :title="$t('bandMember')" /> <section-divider :title="$t('band.bandMember')" />
</v-col> </v-col>
</v-row> </v-row>
@@ -53,7 +53,7 @@ bandStore.getBand(String(router.currentRoute.value.params.name).replaceAll('-',
<v-row> <v-row>
<v-col> <v-col>
<section-divider :title="$t('rating', 2)" /> <section-divider :title="$t('band.rating', 2)" />
</v-col> </v-col>
</v-row> </v-row>
@@ -65,7 +65,7 @@ bandStore.getBand(String(router.currentRoute.value.params.name).replaceAll('-',
<v-row> <v-row>
<v-col> <v-col>
<section-divider :title="$t('image', 2)" /> <section-divider :title="$t('band.image', 2)" />
</v-col> </v-col>
</v-row> </v-row>

View File

@@ -34,7 +34,7 @@ defineProps({
readonly readonly
/> />
<div class="px-3 text-h6">{{ ratings.length }} {{ $t('rating', ratings.length) }}</div> <div class="px-3 text-h6">{{ ratings.length }} {{ $t('band.rating', ratings.length) }}</div>
</div> </div>
</v-col> </v-col>

View File

@@ -15,7 +15,7 @@ function itemProps(item: GenreModel) {
<template> <template>
<card-view <card-view
:title="$t('filtering')" :title="$t('misc.actions.filtering')"
icon="mdi-filter" icon="mdi-filter"
> >
<v-row> <v-row>
@@ -24,7 +24,7 @@ function itemProps(item: GenreModel) {
v-model="bandStore.filteredGenres" v-model="bandStore.filteredGenres"
:items="bandStore.availableGenres" :items="bandStore.availableGenres"
variant="outlined" variant="outlined"
:label="$t('genres')" :label="$t('band.genre', 2)"
:item-props="itemProps" :item-props="itemProps"
chips chips
clearable clearable
@@ -38,7 +38,7 @@ function itemProps(item: GenreModel) {
@click="bandStore.getBands" @click="bandStore.getBands"
height="100%" height="100%"
> >
{{ $t('filtering') }} {{ $t('misc.actions.filtering') }}
</outlined-button> </outlined-button>
</v-col> </v-col>
</v-row> </v-row>

View File

@@ -23,7 +23,7 @@ concertStore.getConcert(Number(router.currentRoute.value.params.id))
<v-col cols="10"> <v-col cols="10">
<v-row> <v-row>
<v-col> <v-col>
<section-divider :title="$t('selectedConcert')" /> <section-divider :title="$t('concert.selectedConcert')" />
</v-col> </v-col>
</v-row> </v-row>
@@ -47,7 +47,7 @@ concertStore.getConcert(Number(router.currentRoute.value.params.id))
</v-row> </v-row>
<v-row> <v-row>
<v-col> <v-col>
<section-divider :title="$t('seatSelection')" /> <section-divider :title="$t('location.seat.seatSelection')" />
</v-col> </v-col>
</v-row> </v-row>
@@ -61,7 +61,7 @@ concertStore.getConcert(Number(router.currentRoute.value.params.id))
/> />
<div class="pt-5 text-h3"> <div class="pt-5 text-h3">
{{ $t('loading') }}... {{ $t('misc.loading') }}...
</div> </div>
</v-col> </v-col>
@@ -77,7 +77,7 @@ concertStore.getConcert(Number(router.currentRoute.value.params.id))
<v-row> <v-row>
<v-col> <v-col>
<section-divider :title="$t('orderSummary')" /> <section-divider :title="$t('order.orderSummary')" />
</v-col> </v-col>
</v-row> </v-row>
@@ -108,7 +108,7 @@ concertStore.getConcert(Number(router.currentRoute.value.params.id))
:disabled="basketStore.selectedSeats.length == 0" :disabled="basketStore.selectedSeats.length == 0"
block block
> >
{{ $t('addToBasket') }} {{ $t('basket.addToBasket') }}
</outlined-button> </outlined-button>
</v-row> </v-row>
</v-col> </v-col>

View File

@@ -20,7 +20,7 @@ function itemProps(item: CityModel) {
<template> <template>
<card-view <card-view
:title="$t('filtering')" :title="$t('misc.actions.filtering')"
icon="mdi-filter" icon="mdi-filter"
> >
<v-row> <v-row>
@@ -29,7 +29,7 @@ function itemProps(item: CityModel) {
v-model="concertStore.filteredCities" v-model="concertStore.filteredCities"
:items="locationStore.cities" :items="locationStore.cities"
variant="outlined" variant="outlined"
:label="$t('city', 2)" :label="$t('location.city', 2)"
:item-props="itemProps" :item-props="itemProps"
chips chips
clearable clearable
@@ -43,7 +43,7 @@ function itemProps(item: CityModel) {
@click="concertStore.getConcerts" @click="concertStore.getConcerts"
height="100%" height="100%"
> >
{{ $t('filtering') }} {{ $t('misc.actions.filtering') }}
</outlined-button> </outlined-button>
</v-col> </v-col>
</v-row> </v-row>

View File

@@ -57,7 +57,7 @@ bandStore.getBands()
color="primary" color="primary"
@click="router.push('bands/details/' + band.name.replaceAll(' ', '-').toLowerCase())" @click="router.push('bands/details/' + band.name.replaceAll(' ', '-').toLowerCase())"
> >
{{ $t('tickets', 2) }} {{ $t('ticket.tickets', 2) }}
</outlined-button> </outlined-button>
</v-card-text> </v-card-text>
</v-card> </v-card>

View File

@@ -25,7 +25,7 @@ locationStore.getTopLocations()
<v-col cols="10"> <v-col cols="10">
<v-row> <v-row>
<v-col> <v-col>
<section-divider :title="$t('upcomingConcerts')" /> <section-divider :title="$t('concert.upcomingConcerts')" />
</v-col> </v-col>
</v-row> </v-row>
@@ -38,7 +38,7 @@ locationStore.getTopLocations()
@click="router.push('/bands/details/' + concert.band.name.replaceAll(' ', '-').toLowerCase())" @click="router.push('/bands/details/' + concert.band.name.replaceAll(' ', '-').toLowerCase())"
:loading="concertStore.fetchInProgress" :loading="concertStore.fetchInProgress"
> >
{{ $t("from") }} {{ (concert.price).toPrecision(4) }} {{ $t("misc.from") }} {{ (concert.price).toPrecision(4) }}
<!-- ab todo --> <!-- ab todo -->
</card-with-top-image> </card-with-top-image>
</v-col> </v-col>
@@ -51,14 +51,14 @@ locationStore.getTopLocations()
@click="router.push('/concerts')" @click="router.push('/concerts')"
block block
> >
{{ $t('allConcerts') }} {{ $t('concert.allConcerts') }}
</outlined-button> </outlined-button>
</v-col> </v-col>
</v-row> </v-row>
<v-row> <v-row>
<v-col> <v-col>
<section-divider :title="$t('topLocations')" /> <section-divider :title="$t('location.topLocations')" />
</v-col> </v-col>
</v-row> </v-row>
@@ -83,7 +83,7 @@ locationStore.getTopLocations()
@click="router.push('/locations')" @click="router.push('/locations')"
block block
> >
{{ $t('allLocations') }} {{ $t('location.allLocations') }}
</outlined-button> </outlined-button>
</v-col> </v-col>
</v-row> </v-row>

View File

@@ -36,7 +36,7 @@ locationStore.getLocationByName(String(router.currentRoute.value.params.name))
<v-col cols="10"> <v-col cols="10">
<v-row> <v-row>
<v-col> <v-col>
<section-divider :title="$t('concert', 2)" /> <section-divider :title="$t('concert.concert', 2)" />
</v-col> </v-col>
</v-row> </v-row>
@@ -68,7 +68,7 @@ locationStore.getLocationByName(String(router.currentRoute.value.params.name))
<v-col> <v-col>
<v-empty-state <v-empty-state
icon="mdi-magnify" icon="mdi-magnify"
:title="$t('noEventsFound')" :title="$t('concert.noConcertsFound')"
/> />
</v-col> </v-col>
</v-row> </v-row>
@@ -76,7 +76,7 @@ locationStore.getLocationByName(String(router.currentRoute.value.params.name))
<v-row> <v-row>
<v-col> <v-col>
<section-divider :title="$t('seatPlan')" /> <section-divider :title="$t('location.seat.seatPlan')" />
</v-col> </v-col>
</v-row> </v-row>

View File

@@ -14,10 +14,20 @@ const showOrderingDialog = ref()
<template> <template>
<v-container max-width="1000"> <v-container max-width="1000">
<v-row v-if="accountStore.userAccount.id == null">
<v-col>
<v-alert
color="info"
closable
>
{{ $t('account.login.pleaseLoginToOrder') }}
</v-alert>
</v-col>
</v-row>
<v-row> <v-row>
<v-col> <v-col>
<card-view <card-view
:title="$t('basket')" :title="$t('basket.basket')"
v-model="showOrderingDialog" v-model="showOrderingDialog"
icon="mdi-cart" icon="mdi-cart"
> >
@@ -28,13 +38,13 @@ const showOrderingDialog = ref()
<!-- Display empty state if card is empty --> <!-- Display empty state if card is empty -->
<v-empty-state v-else <v-empty-state v-else
icon="mdi-basket-off" icon="mdi-basket-off"
:title="$t('emptyBasketTitle')" :title="$t('basket.emptyBasketTitle')"
:text="$t('emptyBasketText')" :text="$t('basket.emptyBasketText')"
/> />
</template> </template>
<v-card-text class="text-right text-h5" v-if="basketStore.itemsInBasket.length > 0"> <v-card-text class="text-right text-h5" v-if="basketStore.itemsInBasket.length > 0">
{{ $t('totalPrice') }}: {{ (basketStore.getTotalPrice).toFixed(2) }} {{ $t('misc.totalPrice') }}: {{ (basketStore.getTotalPrice).toFixed(2) }}
</v-card-text> </v-card-text>
@@ -46,7 +56,7 @@ const showOrderingDialog = ref()
color="green" color="green"
@click="showOrderingDialog = true" @click="showOrderingDialog = true"
> >
{{ $t('orderNow') }} {{ $t('order.takeOrder') }}
</outlined-button> </outlined-button>
</template> </template>
</card-view> </card-view>

View File

@@ -36,7 +36,7 @@ async function doOrder() {
<template> <template>
<action-dialog <action-dialog
:title="$t('ordering.ordering')" :title="$t('order.ordering')"
icon="mdi-basket-check" icon="mdi-basket-check"
v-model="showDialog" v-model="showDialog"
max-width="800" max-width="800"
@@ -44,7 +44,7 @@ async function doOrder() {
> >
<v-list class="pa-0"> <v-list class="pa-0">
<v-list-subheader> <v-list-subheader>
{{ $t('account.address', accountStore.userAccount.addresses.length) }} {{ $t('account.userData.address', accountStore.userAccount.addresses.length) }}
</v-list-subheader> </v-list-subheader>
<v-list-item> <v-list-item>
@@ -62,7 +62,7 @@ async function doOrder() {
</v-list-item> </v-list-item>
<v-list-subheader> <v-list-subheader>
{{ $t('account.payment', accountStore.userAccount.payments.length) }} {{ $t('account.userData.payment', accountStore.userAccount.payments.length) }}
</v-list-subheader> </v-list-subheader>
<v-list-item> <v-list-item>
@@ -86,7 +86,7 @@ async function doOrder() {
color="orange" color="orange"
:disabled="orderingInProgress" :disabled="orderingInProgress"
> >
{{ $t('dialog.cancel') }} {{ $t('misc.actions.cancel') }}
</outlined-button> </outlined-button>
<outlined-button <outlined-button
@@ -95,7 +95,7 @@ async function doOrder() {
prepend-icon="mdi-send" prepend-icon="mdi-send"
color="green" color="green"
> >
{{ $t('ordering.takeOrder') }} {{ $t('order.takeOrder') }}
</outlined-button> </outlined-button>
</template> </template>
</action-dialog> </action-dialog>

View File

@@ -14,11 +14,11 @@ function removeFromBasket(basketItem: BasketItemModel) {
<v-table> <v-table>
<thead> <thead>
<tr> <tr>
<th>{{ $t('band') }}</th> <th>{{ $t('band.band') }}</th>
<th>{{ $t('concert') }}</th> <th>{{ $t('concert.concert') }}</th>
<th class="text-center">{{ $t('quantity') }}</th> <th class="text-center">{{ $t('misc.quantity') }}</th>
<th class="text-right">{{ $t('product.productPrice') }}</th> <th class="text-right">{{ $t('misc.price') }}</th>
<th class="text-right">{{ $t('totalPrice') }}</th> <th class="text-right">{{ $t('misc.totalPrice') }}</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>

View File

@@ -37,50 +37,52 @@ defineProps({
</v-timeline> </v-timeline>
</card-view> </card-view>
<!-- todo: English -->
<card-view <card-view
v-else v-else
:title="$t('exerciseGroup') + ' ' + exerciseGroup.groupNr + ': ' + exerciseGroup.nameDe" :title="$t('help.scoreBoard.exerciseGroupNr', [exerciseGroup.groupNr]) + exerciseGroup.nameDe"
:loading="loading" :loading="loading"
> >
<v-timeline <template #borderless>
direction="horizontal" <v-timeline
side="start" direction="horizontal"
class="pb-3" side="start"
> class="pt-3"
<v-timeline-item
v-for="exercise in exerciseGroup.exercises"
:dot-color="exercise.solved ? 'green' : 'grey'"
:icon="exercise.solved ? 'mdi-check' : 'mdi-pencil'"
> >
<v-skeleton-loader <v-timeline-item
type="text" v-for="exercise in exerciseGroup.exercises"
:loading="loading" :dot-color="exercise.solved ? 'green' : 'grey'"
:icon="exercise.solved ? 'mdi-check' : 'mdi-pencil'"
> >
<div class="text-h6">
{{ $t('exercise') }} {{ exercise.exerciseNr }}
</div>
</v-skeleton-loader>
<template #opposite>
<v-skeleton-loader <v-skeleton-loader
type="text" type="text"
:loading="loading" :loading="loading"
> >
<div class="text-center">
<div class="text-h6"> <div class="text-h6">
{{ exercise.nameDe }} {{ $t('help.scoreBoard.exerciseNr', [exercise.exerciseNr]) }}
</div> </div>
</v-skeleton-loader>
<div>
{{ exercise.descriptionDe }} <template #opposite>
<v-skeleton-loader
type="text"
:loading="loading"
>
<div class="text-center">
<div class="text-h6">
{{ exercise.nameDe }}
</div>
<div>
<!-- todo: English -->
{{ exercise.descriptionDe }}
</div>
</div> </div>
</div> </v-skeleton-loader>
</v-skeleton-loader> </template>
</template> </v-timeline-item>
</v-timeline>
</v-timeline-item> </template>
</v-timeline>
</card-view> </card-view>
</template> </template>

View File

@@ -63,7 +63,7 @@ async function resetExerciseProg() {
> >
<v-row> <v-row>
<v-col> <v-col>
{{ $t('serverState') }}: {{ $t('preferences.serverState') }}:
<span v-if="serverOnline == ServerStateEnum.ONLINE" class="text-green"> <span v-if="serverOnline == ServerStateEnum.ONLINE" class="text-green">
<v-icon icon="mdi-check" /> <v-icon icon="mdi-check" />
Online Online
@@ -95,7 +95,7 @@ async function resetExerciseProg() {
color="red" color="red"
:disabled="serverOnline != ServerStateEnum.ONLINE" :disabled="serverOnline != ServerStateEnum.ONLINE"
> >
{{ $t('resetDatabase') }} {{ $t('preferences.resetDatabase.resetDatabase') }}
</outlined-button> </outlined-button>
</v-col> </v-col>
</v-row> </v-row>
@@ -108,7 +108,7 @@ async function resetExerciseProg() {
color="red" color="red"
:disabled="serverOnline != ServerStateEnum.ONLINE" :disabled="serverOnline != ServerStateEnum.ONLINE"
> >
{{ $t('resetProgress') }} {{ $t('preferences.resetExerciseProgress.resetExerciseProgress') }}
</outlined-button> </outlined-button>
</v-col> </v-col>
</v-row> </v-row>
@@ -116,16 +116,16 @@ async function resetExerciseProg() {
<!-- Confirm delete database --> <!-- Confirm delete database -->
<confirm-dialog <confirm-dialog
:title="$t('resetDatabaseConfirm.title')" :title="$t('preferences.resetDatabase.dialog.title')"
:description="$t('resetDatabaseConfirm.description')" :description="$t('preferences.resetDatabase.dialog.description')"
v-model="showConfirmDeleteDbDialog" v-model="showConfirmDeleteDbDialog"
:onConfirm="resetDb" :onConfirm="resetDb"
/> />
<!-- Confirm delete exercise progress --> <!-- Confirm delete exercise progress -->
<confirm-dialog <confirm-dialog
:title="$t('resetExerciseProgressConfirm.title')" :title="$t('preferences.resetExerciseProgress.dialog.title')"
:description="$t('resetExerciseProgressConfirm.description')" :description="$t('preferences.resetExerciseProgress.dialog.description')"
v-model="showConfirmDeleteExerciseProgressDialog" v-model="showConfirmDeleteExerciseProgressDialog"
:onConfirm="resetExerciseProg" :onConfirm="resetExerciseProg"
/> />

View File

@@ -26,7 +26,7 @@ const searchStore = useSearchStore()
<div v-if="searchStore.alreadySearched"> <div v-if="searchStore.alreadySearched">
<v-row> <v-row>
<v-col> <v-col>
<section-divider :title="$t('band', 2)" /> <section-divider :title="$t('band.band', 2)" />
</v-col> </v-col>
</v-row> </v-row>
@@ -55,7 +55,7 @@ const searchStore = useSearchStore()
<v-row v-else > <v-row v-else >
<v-col> <v-col>
<v-empty-state <v-empty-state
:title="$t('noBandFound')" :title="$t('band.noBandFound')"
icon="mdi-guitar-electric" icon="mdi-guitar-electric"
/> />
</v-col> </v-col>
@@ -66,7 +66,7 @@ const searchStore = useSearchStore()
<!-- Section Concert results --> <!-- Section Concert results -->
<v-row> <v-row>
<v-col> <v-col>
<section-divider :title="$t('concert', 2)" /> <section-divider :title="$t('concert.concert', 2)" />
</v-col> </v-col>
</v-row> </v-row>
@@ -95,7 +95,7 @@ const searchStore = useSearchStore()
<v-row v-else > <v-row v-else >
<v-col> <v-col>
<v-empty-state <v-empty-state
:title="$t('noConcertsFound')" :title="$t('concert.noConcertsFound')"
icon="mdi-party-popper" icon="mdi-party-popper"
/> />
</v-col> </v-col>
@@ -106,7 +106,7 @@ const searchStore = useSearchStore()
<!-- Section Location results --> <!-- Section Location results -->
<v-row> <v-row>
<v-col> <v-col>
<section-divider :title="$t('location', 2)" /> <section-divider :title="$t('location.location', 2)" />
</v-col> </v-col>
</v-row> </v-row>
@@ -135,7 +135,7 @@ const searchStore = useSearchStore()
<v-row v-else > <v-row v-else >
<v-col> <v-col>
<v-empty-state <v-empty-state
:title="$t('noLocationsFound')" :title="$t('location.noLocationsFound')"
icon="mdi-city" icon="mdi-city"
/> />
</v-col> </v-col>

View File

@@ -11,7 +11,7 @@ const searchStore = useSearchStore()
variant="outlined" variant="outlined"
hide-details hide-details
v-model="searchStore.searchTerm" v-model="searchStore.searchTerm"
:placeholder="$t('enterSomeKeywords')" :placeholder="$t('misc.enterSomeKeywords')"
@keyup.enter="searchStore.startSearch" @keyup.enter="searchStore.startSearch"
> >
<template #append-inner> <template #append-inner>

View File

@@ -13,21 +13,21 @@ export function getStringRules() {
if (value) { if (value) {
return true return true
} else { } else {
return feedbackStore.i18n.t('required') return feedbackStore.i18n.t('misc.validation.required')
} }
}, },
value => { value => {
if (/[^0-9]/.test(value)) { if (/[^0-9]/.test(value)) {
return true return true
} else { } else {
return feedbackStore.i18n.t('noDigitsAllowed') return feedbackStore.i18n.t('misc.validation.noDigitsAllowed')
} }
}, },
value => { value => {
if (value?.length >= 4) { if (value?.length >= 4) {
return true return true
} else { } else {
return feedbackStore.i18n.t('notEnoughChars') return feedbackStore.i18n.t('misc.validation.notEnoughChars')
} }
} }
] ]
@@ -46,23 +46,23 @@ export function getPostalRules() {
if (value?.length == 5) { if (value?.length == 5) {
return true return true
} else if (value?.length < 5) { } else if (value?.length < 5) {
return feedbackStore.i18n.t('notEnoughChars') return feedbackStore.i18n.t('misc.validation.notEnoughChars')
} else { } else {
return feedbackStore.i18n.t('tooMuchChars') return feedbackStore.i18n.t('misc.validation.tooMuchChars')
} }
}, },
value => { value => {
if (value?.length == 5) { if (value?.length == 5) {
return true return true
} else { } else {
return feedbackStore.i18n.t('notEnoughChars') return feedbackStore.i18n.t('misc.validation.notEnoughChars')
} }
}, },
value => { value => {
if (/^\d+$/.test(value)) { if (/^\d+$/.test(value)) {
return true return true
} else { } else {
return feedbackStore.i18n.t('onlyDigitsAllowed') return feedbackStore.i18n.t('misc.validation.onlyDigitsAllowed')
} }
} }
] ]
@@ -81,14 +81,14 @@ export function getNumberStartRules() {
if (value) { if (value) {
return true return true
} else { } else {
return feedbackStore.i18n.t('required') return feedbackStore.i18n.t('misc.validation.required')
} }
}, },
value => { value => {
if (/^\d/.test(value)) { if (/^\d/.test(value)) {
return true return true
} else { } else {
return feedbackStore.i18n.t('digitsAtStartNeeded') return feedbackStore.i18n.t('misc.validation.digitsAtStartNeeded')
} }
}, },
] ]
@@ -106,12 +106,12 @@ export function getEmailRules() {
value => { value => {
if (value) return true if (value) return true
return feedbackStore.i18n.t('emailRequired') return feedbackStore.i18n.t('account.emailRequired')
}, },
value => { value => {
if (/.+@.+\..+/.test(value)) return true if (/.+@.+\..+/.test(value)) return true
return feedbackStore.i18n.t('emailIsNotValid') return feedbackStore.i18n.t('account.emailIsNotValid')
}, },
] ]
} }
@@ -129,14 +129,14 @@ export function getPasswordRules() {
if (value) { if (value) {
return true return true
} else { } else {
return feedbackStore.i18n.t('required') return feedbackStore.i18n.t('misc.validation.required')
} }
}, },
value => { value => {
if (value?.length >= 8) { if (value?.length >= 8) {
return true return true
} else { } else {
return feedbackStore.i18n.t('passwordToShort') return feedbackStore.i18n.t('misc.validation.notEnoughChars')
} }
} }
] ]
@@ -155,14 +155,14 @@ export function getIbanRules() {
if (value) { if (value) {
return true return true
} else { } else {
return feedbackStore.i18n.t('required') return feedbackStore.i18n.t('misc.validation.required')
} }
}, },
value => { value => {
if (/[A-Z]{2}[0-9]{2}(?:[ ]?[0-9]{4}){4}(?!(?:[ ]?[0-9]){3})(?:[ ]?[0-9]{1,2})?/.test(value)) { if (/[A-Z]{2}[0-9]{2}(?:[ ]?[0-9]{4}){4}(?!(?:[ ]?[0-9]){3})(?:[ ]?[0-9]{1,2})?/.test(value)) {
return true return true
} else { } else {
return feedbackStore.i18n.t('wrongIban') return feedbackStore.i18n.t('account.wrongIban')
} }
} }
] ]

View File

@@ -33,58 +33,58 @@ export const useFeedbackStore = defineStore("feedbackStore", {
} }
case BannerStateEnum.BASKETPRODUCTADDED: { case BannerStateEnum.BASKETPRODUCTADDED: {
this.title = this.i18n.t('bannerMessages.basketProductAdded'); break; this.title = this.i18n.t('bannerMessages.basketTicketAdded'); break;
} }
case BannerStateEnum.BASKETPRODUCTREMOVED: { case BannerStateEnum.BASKETPRODUCTREMOVED: {
this.title = this.i18n.t("bannerMessages.basketProductRemoved"); break; this.title = this.i18n.t("bannerMessages.basketTicketRemoved"); break;
} }
////////// Exercise feedback ////////// ////////// Exercise feedback //////////
case BannerStateEnum.EXERCISESOLVED01: { case BannerStateEnum.EXERCISESOLVED01: {
this.title = this.i18n.t("bannerMessages.exerciseSolved01"); break; this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [0, 1]); break;
} }
case BannerStateEnum.EXERCISESOLVED02: { case BannerStateEnum.EXERCISESOLVED02: {
this.title = this.i18n.t("bannerMessages.exerciseSolved02"); break; this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [0, 2]); break;
} }
case BannerStateEnum.EXERCISESOLVED11: { case BannerStateEnum.EXERCISESOLVED11: {
this.title = this.i18n.t("bannerMessages.exerciseSolved11"); break; this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [1, 1]); break;
} }
case BannerStateEnum.EXERCISESOLVED12: { case BannerStateEnum.EXERCISESOLVED12: {
this.title = this.i18n.t("bannerMessages.exerciseSolved12"); break; this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [1, 2]); break;
} }
case BannerStateEnum.EXERCISESOLVED13: { case BannerStateEnum.EXERCISESOLVED13: {
this.title = this.i18n.t("bannerMessages.exerciseSolved13"); break; this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [1, 3]); break;
} }
case BannerStateEnum.EXERCISESOLVED21: { case BannerStateEnum.EXERCISESOLVED21: {
this.title = this.i18n.t("bannerMessages.exerciseSolved21"); break; this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [2, 1]); break;
} }
case BannerStateEnum.EXERCISESOLVED22: { case BannerStateEnum.EXERCISESOLVED22: {
this.title = this.i18n.t("bannerMessages.exerciseSolved22"); break; this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [2, 2]); break;
} }
case BannerStateEnum.EXERCISESOLVED23: { case BannerStateEnum.EXERCISESOLVED23: {
this.title = this.i18n.t("bannerMessages.exerciseSolved23"); break; this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [2, 3]); break;
} }
case BannerStateEnum.EXERCISESOLVED31: { case BannerStateEnum.EXERCISESOLVED31: {
this.title = this.i18n.t("bannerMessages.exerciseSolved31"); break; this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [3, 1]); break;
} }
case BannerStateEnum.EXERCISESOLVED32: { case BannerStateEnum.EXERCISESOLVED32: {
this.title = this.i18n.t("bannerMessages.exerciseSolved32"); break; this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [3, 2]); break;
} }
case BannerStateEnum.EXERCISESOLVED33: { case BannerStateEnum.EXERCISESOLVED33: {
this.title = this.i18n.t("bannerMessages.exerciseSolved33"); break; this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [3, 3]); break;
} }
@@ -131,25 +131,6 @@ export const useFeedbackStore = defineStore("feedbackStore", {
case BannerStateEnum.ORDERPLACESUCCESSFUL: { case BannerStateEnum.ORDERPLACESUCCESSFUL: {
this.title = this.i18n.t('bannerMessages.orderPlaceSuccessfull'); break; this.title = this.i18n.t('bannerMessages.orderPlaceSuccessfull'); break;
} }
////////// API Endpoint /products //////////
case BannerStateEnum.PRODUCTCREATESUCCESSFUL: {
this.title = this.i18n.t('bannerMessages.productCreateSuccessful'); break;
}
case BannerStateEnum.PRODUCTCREATEERROR: {
this.title = this.i18n.t('bannerMessages.productCreateError'); break;
}
case BannerStateEnum.PRODUCTDELETESUCCESSFUL: {
this.title = this.i18n.t('bannerMessages.productDeleteSuccessful'); break;
}
case BannerStateEnum.PRODUCTDELETEERROR: {
this.title = this.i18n.t('bannerMessages.productDeleteError'); break;
}
} }