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

View File

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

View File

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

View File

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

View File

@@ -71,16 +71,16 @@ defineProps({
<template #append>
<div>
<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 v-if="concert.inStock == 0 && showButton" class="text-h6">
{{ $t('soldOut') }}
{{ $t('concert.concertSoldOut') }}
</div>
<div v-else-if="showButton">
<v-btn variant="flat" color="secondary">
{{ $t('goToTheConcert') }}
{{ $t('concert.goToTheConcert') }}
</v-btn>
</div>

View File

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

View File

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

View File

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

View File

@@ -53,7 +53,7 @@ function handleSeatClick() {
width="100%"
class="d-flex justify-center align-center"
>
{{ $t('stage') }}
{{ $t('location.stage') }}
</v-sheet>
</v-col>
@@ -62,7 +62,7 @@ function handleSeatClick() {
<v-row>
<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-row>
</v-sheet>

View File

@@ -1,69 +1,129 @@
{
"allEvents": "Alle Events",
"allLocations": "Alle Veranstaltungsorte",
"topEvents": "Top Events",
"topLocations": "Top Veranstaltungsorte",
"tickets": "Ticket | Tickets",
"concert": "Konzert | Konzerte",
"resetPreferences": "Einstellungen zurücksetzen",
"resetDatabase": "Datenbank zurücksetzen",
"resetDatabaseConfirm": {
"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."
"location": {
"allLocations": "Alle Veranstaltungsorte",
"topLocations": "Top Veranstaltungsorte",
"location": "Veranstaltungsort | Veranstaltungsorte",
"noLocationsFound": "Keine Veranstaltungsorte gefunden",
"city": "Stadt | Städte",
"stage": "Bühne | Bühnen",
"seat": {
"seatRow": "Sitzreihe | Sitzreihen",
"seat": "Sitz | Sitze",
"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": {
"pageSetup": "Seiteneinstellungen",
"selectedTheme": "Ausgewähltes Theme",
"language": "Sprache",
"language": "Sprache | Sprachen",
"serverState": "Server Status",
"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": {
"product": "Produkt | Produkte",
"productName": "Produkt Name",
"brand": "Marke",
"productPrice": "Einzelpreis",
"category": "Kategorie",
"description": "Beschreibung",
"storedItemsAvailable": "{0} verfügbar",
"soldOut": "Ausverkauft",
"discount": "Rabatt",
"inStock": "Warenbestand"
"help": {
"scoreBoard": {
"exerciseGroupNr": "Aufgabengruppe {0}: ",
"exerciseNr": "Aufgabe {0}"
}
},
"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": {
"loginSuccessful": "Login erfolgreich!",
"wrongLogin": "Falscher Username oder falsches Passwort!",
@@ -73,121 +133,39 @@
"usernameInUse": "Der Accountname ist bereits vergeben!",
"accountUpdated": "Account erfolgreich aktualisiert",
"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",
"productCreateSuccessful": "Produkt hinzugefügt",
"productCreateError": "Fehler beim Erstellen des Produktes",
"productDeleteSuccessful": "Produkt erfolgreich entfernt",
"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!"
"basketTicketAdded": "Ticket zum Warenkorb hinzugefügt",
"basketTicketRemoved": "Ticket aus Warenkorb entfernt",
"exerciseSolvedNr": "Aufgabe {0}.{1} gelöst!"
},
"oclock": "Uhr",
"ordering": {
"ordering": "Bestellabschluss",
"takeOrder": "Bestellung ausführen"
},
"dialog": {
"cancel": "Abbrechen",
"confirm": "Bestätigen",
"deleteAccount": {
"title": "Account löschen?",
"description": "Soll der Account wirklich gelöscht werden? Dieser kann nicht mehr wiederhergestellt werden!"
"misc": {
"sortBy": "Sortieren nach",
"greeting": "Hallo {msg}",
"from": "ab",
"youAreHere": "Du bist hier:",
"date": "Datum | Daten",
"totalPrice": "Gesamtpreis",
"price": "Preis | Preise",
"quantity": "Anzahl",
"loading": "Lade...",
"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",
"allLocations": "All Locations",
"topEvents": "Top Events",
"topLocations": "Top Locations",
"tickets": "Ticket | Tickets",
"concert": "Concert | Concerts",
"resetPreferences": "Reset preferences",
"resetDatabase": "Reset database",
"resetDatabaseConfirm": {
"title": "Reset database?",
"description": "Do you really want to reset the server database? This can't be undone! Progress will not be deleted."
"location": {
"allLocations": "All Locations",
"topLocations": "Top Locations",
"location": "Location | Locations",
"noLocationsFound": "No Locations found",
"city": "City | Cities",
"stage": "Stage | Stages",
"seat": {
"seatRow": "Seat Row | Seat Rows",
"seat": "Seat | Seats",
"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": {
"pageSetup": "Page setup",
"selectedTheme": "Selected theme",
"language": "Language",
"systemSetup": "System setup",
"resetConfirm": "Really reset the database?"
},
"product": {
"product": "Product | Products",
"productName": "Product name",
"brand": "Brand",
"productPrice": "Unit price",
"category": "Category",
"description": "Description",
"storedItemsAvailable": "{0} items available",
"soldOut": "Sold Out",
"discount": "Discount",
"inStock": "In Stock"
},
"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!"
"selectedTheme": "Selected Theme",
"language": "Language | Languages",
"serverState": "Server Status",
"systemSetup": "System preferences",
"resetDatabase": {
"resetDatabase": "Reset database",
"dialog": {
"title": "Reset database?",
"description": "Do you really want to reset the database? This is permanent! Exercise progress will not be affected"
}
},
"resetExerciseProgress": {
"resetExerciseProgress": "Reset exercise progress",
"dialog": {
"title": "Reset exercise progress?",
"description": "Do you really want to reset the exercise progress? This is permanent!"
}
}
},
"scoreBoard": {
"exerciseGroup0": "Exercise Group 0: Getting Started",
"exerciseGroup1": "Exercise Group 1: SQL Injections",
"exerciseGroup2": "Exercise Group 2: Broken Access Control",
"exerciseGroup3": "Exercise Group 3: Cross-Site Scripting (XSS)",
"exercise": "Exercise {0}"
"help": {
"scoreBoard": {
"exerciseGroupNr": "Exercise Group {0}: ",
"exerciseNr": "Exercise {0}"
}
},
"serverState": "Server State:",
"required": "Is required",
"noDigitsAllowed": "Digits are not allowed",
"notEnoughChars": "Too short",
"passwordToShort": "Password too short",
"onlyDigitsAllowed": "Only digits are allowed",
"noOrders": "No orders found",
"noOrdersText": "There are no orders with this account until now. Go to the basket page and order something!",
"add": "Add",
"remove": "Remove",
"emailIsNotValid": "E-mail must be valid",
"emailRequired": "E-Mail is required",
"tooMuchChars": "Too long",
"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"
"bannerMessages": {
"loginSuccessful": "Login successfull!",
"wrongLogin": "Wrong username or wrong password!",
"error": "There is some error...",
"databaseResetSuccessful": "Database successfully resetted!",
"registerSuccessful": "Account successfully created!",
"usernameInUse": "The username is already in use!",
"accountUpdated": "Account successfully updated",
"logoutSuccessful": "Logout successfull",
"orderPlaceSuccessfull": "Order successfully placed",
"basketTicketAdded": "Added ticket to basket",
"basketTicketRemoved": "Removed ticket from basket",
"exerciseSolvedNr": "Exercise {0}.{1} solved!"
},
"location": "Location | Locations",
"band": "Band | Bands",
"noConcertsFound": "No Concerts found",
"from": "from",
"soldOut": "Sold Out",
"city": "City | Cities",
"seatPlan": "Seat Plan",
"stage": "Stage",
"filtering": "Filtering",
"bandMember": "Band members",
"rating": "Rating | Ratings",
"image": "Image | Images",
"seatSelection": "Select seat",
"loading": "Loading",
"orderSummary": "Order Summary",
"basket": "Basket",
"event": "Event | Events",
"hello": "Hello",
"accountManagement": "Account Management",
"accountManagementDescription": "Contact data, Addresses, Payment methods",
"orders": "Order | Orders",
"ordersDescription": "Overview about all orders",
"onePageBack": "Back to previous page",
"orderedAt": "Ordered at",
"logout": "Logout",
"logoutDescription": "Logout current account",
"login": "Login",
"seatRow": "Seat Row",
"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"
"misc": {
"sortBy": "Sort by",
"greeting": "Hello {msg}",
"from": "from",
"youAreHere": "You are here:",
"date": "Date | Dates",
"totalPrice": "Total price",
"price": "Price | Prices",
"quantity": "Quantity",
"loading": "Loading...",
"onePageBack": "Back to previous page",
"enterSomeKeywords": "Enter keywords to search for bands, concerts and locations",
"actions": {
"add": "Add",
"remove": "Remove",
"save": "Save",
"filtering": "Filter",
"cancel": "Cancel",
"more": "More",
"confirm": "Confirm"
},
"validation": {
"required": "Must not remain empty",
"noDigitsAllowed": "Numbers are not allowed",
"notEnoughChars": "Not enough characters",
"tooMuchChars": "Too much characters",
"onlyDigitsAllowed": "Only numbers are allowed",
"digitsAtStartNeeded": "Must start with a number"
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -15,7 +15,7 @@ defineProps({
<template>
<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"
>
<v-row>
@@ -23,7 +23,7 @@ defineProps({
<v-card variant="outlined" class="ml-5 pa-3">
<div class="text-h6">
<v-icon icon="mdi-home" />
{{ $t('account.address', 1) }}
{{ $t('account.userData.address', 1) }}
</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">
<div class="text-h6">
<v-icon icon="mdi-currency-usd" />
{{ $t('account.payment', 1) }}
{{ $t('account.userData.payment', 1) }}
</div>
<div class="pl-9">{{ order.payment.bankName }}</div>
<div class="pl-9">{{ order.payment.iban }}</div>

View File

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

View File

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

View File

@@ -34,7 +34,7 @@ defineProps({
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>
</v-col>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -14,10 +14,20 @@ const showOrderingDialog = ref()
<template>
<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-col>
<card-view
:title="$t('basket')"
:title="$t('basket.basket')"
v-model="showOrderingDialog"
icon="mdi-cart"
>
@@ -28,13 +38,13 @@ const showOrderingDialog = ref()
<!-- Display empty state if card is empty -->
<v-empty-state v-else
icon="mdi-basket-off"
:title="$t('emptyBasketTitle')"
:text="$t('emptyBasketText')"
:title="$t('basket.emptyBasketTitle')"
:text="$t('basket.emptyBasketText')"
/>
</template>
<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>
@@ -46,7 +56,7 @@ const showOrderingDialog = ref()
color="green"
@click="showOrderingDialog = true"
>
{{ $t('orderNow') }}
{{ $t('order.takeOrder') }}
</outlined-button>
</template>
</card-view>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -13,21 +13,21 @@ export function getStringRules() {
if (value) {
return true
} else {
return feedbackStore.i18n.t('required')
return feedbackStore.i18n.t('misc.validation.required')
}
},
value => {
if (/[^0-9]/.test(value)) {
return true
} else {
return feedbackStore.i18n.t('noDigitsAllowed')
return feedbackStore.i18n.t('misc.validation.noDigitsAllowed')
}
},
value => {
if (value?.length >= 4) {
return true
} else {
return feedbackStore.i18n.t('notEnoughChars')
return feedbackStore.i18n.t('misc.validation.notEnoughChars')
}
}
]
@@ -46,23 +46,23 @@ export function getPostalRules() {
if (value?.length == 5) {
return true
} else if (value?.length < 5) {
return feedbackStore.i18n.t('notEnoughChars')
return feedbackStore.i18n.t('misc.validation.notEnoughChars')
} else {
return feedbackStore.i18n.t('tooMuchChars')
return feedbackStore.i18n.t('misc.validation.tooMuchChars')
}
},
value => {
if (value?.length == 5) {
return true
} else {
return feedbackStore.i18n.t('notEnoughChars')
return feedbackStore.i18n.t('misc.validation.notEnoughChars')
}
},
value => {
if (/^\d+$/.test(value)) {
return true
} else {
return feedbackStore.i18n.t('onlyDigitsAllowed')
return feedbackStore.i18n.t('misc.validation.onlyDigitsAllowed')
}
}
]
@@ -81,14 +81,14 @@ export function getNumberStartRules() {
if (value) {
return true
} else {
return feedbackStore.i18n.t('required')
return feedbackStore.i18n.t('misc.validation.required')
}
},
value => {
if (/^\d/.test(value)) {
return true
} else {
return feedbackStore.i18n.t('digitsAtStartNeeded')
return feedbackStore.i18n.t('misc.validation.digitsAtStartNeeded')
}
},
]
@@ -106,12 +106,12 @@ export function getEmailRules() {
value => {
if (value) return true
return feedbackStore.i18n.t('emailRequired')
return feedbackStore.i18n.t('account.emailRequired')
},
value => {
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) {
return true
} else {
return feedbackStore.i18n.t('required')
return feedbackStore.i18n.t('misc.validation.required')
}
},
value => {
if (value?.length >= 8) {
return true
} else {
return feedbackStore.i18n.t('passwordToShort')
return feedbackStore.i18n.t('misc.validation.notEnoughChars')
}
}
]
@@ -155,14 +155,14 @@ export function getIbanRules() {
if (value) {
return true
} else {
return feedbackStore.i18n.t('required')
return feedbackStore.i18n.t('misc.validation.required')
}
},
value => {
if (/[A-Z]{2}[0-9]{2}(?:[ ]?[0-9]{4}){4}(?!(?:[ ]?[0-9]){3})(?:[ ]?[0-9]{1,2})?/.test(value)) {
return true
} 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: {
this.title = this.i18n.t('bannerMessages.basketProductAdded'); break;
this.title = this.i18n.t('bannerMessages.basketTicketAdded'); break;
}
case BannerStateEnum.BASKETPRODUCTREMOVED: {
this.title = this.i18n.t("bannerMessages.basketProductRemoved"); break;
this.title = this.i18n.t("bannerMessages.basketTicketRemoved"); break;
}
////////// Exercise feedback //////////
case BannerStateEnum.EXERCISESOLVED01: {
this.title = this.i18n.t("bannerMessages.exerciseSolved01"); break;
this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [0, 1]); break;
}
case BannerStateEnum.EXERCISESOLVED02: {
this.title = this.i18n.t("bannerMessages.exerciseSolved02"); break;
this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [0, 2]); break;
}
case BannerStateEnum.EXERCISESOLVED11: {
this.title = this.i18n.t("bannerMessages.exerciseSolved11"); break;
this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [1, 1]); break;
}
case BannerStateEnum.EXERCISESOLVED12: {
this.title = this.i18n.t("bannerMessages.exerciseSolved12"); break;
this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [1, 2]); break;
}
case BannerStateEnum.EXERCISESOLVED13: {
this.title = this.i18n.t("bannerMessages.exerciseSolved13"); break;
this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [1, 3]); break;
}
case BannerStateEnum.EXERCISESOLVED21: {
this.title = this.i18n.t("bannerMessages.exerciseSolved21"); break;
this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [2, 1]); break;
}
case BannerStateEnum.EXERCISESOLVED22: {
this.title = this.i18n.t("bannerMessages.exerciseSolved22"); break;
this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [2, 2]); break;
}
case BannerStateEnum.EXERCISESOLVED23: {
this.title = this.i18n.t("bannerMessages.exerciseSolved23"); break;
this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [2, 3]); break;
}
case BannerStateEnum.EXERCISESOLVED31: {
this.title = this.i18n.t("bannerMessages.exerciseSolved31"); break;
this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [3, 1]); break;
}
case BannerStateEnum.EXERCISESOLVED32: {
this.title = this.i18n.t("bannerMessages.exerciseSolved32"); break;
this.title = this.i18n.t("bannerMessages.exerciseSolvedNr", [3, 2]); break;
}
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: {
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;
}
}