adds remark icons, some style fixes

This commit is contained in:
Erwin Sperling 2024-12-23 21:12:52 +01:00
parent aa99247fbb
commit 31362d166c
11 changed files with 440 additions and 36 deletions

View File

@ -1,14 +1,17 @@
<template>
<div class="navbar">
<div class="locale-changer">
<select v-model="$i18n.locale">
<option v-for="locale in $i18n.availableLocales" :key="`locale-${locale}`" :value="locale">{{ locale }}</option>
</select>
<div>
<div class="locale-changer">
<v-select v-model="$i18n.locale" :items="$i18n.availableLocales" dense></v-select>
</div>
</div>
<div>
<v-tabs>
<v-tab to="/search">Search</v-tab>
</v-tabs>
</div>
<nav>
<RouterLink to="/search">Search</RouterLink>
</nav>
</div>
<hr/>
<main>
<RouterView />
</main>
@ -35,13 +38,23 @@ export default {
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
.navbar {
display:inline-flex;
background-color:grey;
width:100%;
}
.navbar>* {
padding:10px;
margin-left:10px;
position:relative;
height:80px;
width:100px;
}
.navbar>*>.locale-changer {
position:absolute;
bottom:0px;
}
.navbar>*>.v-tabs {
position:absolute;
bottom:22px;
}
</style>

View File

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="48"
height="48"
viewBox="0 0 48 48"
version="1.1"
id="svg1"
sodipodi:docname="boarding-ramp.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="12.583333"
inkscape:cx="27.97351"
inkscape:cy="21.695364"
inkscape:window-width="1368"
inkscape:window-height="842"
inkscape:window-x="-6"
inkscape:window-y="1073"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
id="grid1"
units="px"
originx="0"
originy="0"
spacingx="1"
spacingy="1"
empcolor="#3f3fff"
empopacity="0.25098039"
color="#3f3fff"
opacity="0.1254902"
empspacing="4"
dotted="false"
gridanglex="30"
gridanglez="30"
visible="true" />
</sodipodi:namedview>
<defs
id="defs1" />
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="opacity:1;fill:none;stroke:#000000;stroke-width:1.5;stroke-opacity:1;stroke-dasharray:none"
id="rect5"
width="42"
height="42"
x="3"
y="3"
rx="5"
ry="5" />
<g
id="g9"
transform="translate(4,-3.666296)">
<circle
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-dasharray:none;stroke-opacity:1"
id="path1"
cx="16"
cy="28"
r="6.6662965" />
<path
id="circle6"
style="fill:none;stroke:#000000;stroke-width:1.5"
d="m 28,33 h -3 v -5 c 0,-4.970563 -4.029437,-9 -9,-9 H 13 V 9.6662965 h -3"
sodipodi:nodetypes="cccccc" />
<path
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 13,19 v 3"
id="path6" />
<path
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 25,27 H 22.666296"
id="path7"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 28,35.666296 H 8"
id="path11"
sodipodi:nodetypes="cc" />
</g>
<path
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
d="M 32,3 V 45"
id="path8" />
<path
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 3,40 h 25 v 5"
id="path9"
sodipodi:nodetypes="ccc" />
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-dasharray:none;stroke-opacity:1"
id="rect10"
width="9"
height="16"
x="36"
y="12" />
<path
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
d="m 36,3 v 4 h 9"
id="path10" />
<path
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
d="m 28,32 4,4"
id="path2" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="48"
height="48"
viewBox="0 0 48 48"
version="1.1"
id="svg1"
sodipodi:docname="no-bicycle-conveyance.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="6.2916665"
inkscape:cx="-4.6092716"
inkscape:cy="38.304637"
inkscape:window-width="1368"
inkscape:window-height="842"
inkscape:window-x="-6"
inkscape:window-y="1073"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
id="grid1"
units="px"
originx="0"
originy="0"
spacingx="1"
spacingy="1"
empcolor="#3f3fff"
empopacity="0.25098039"
color="#3f3fff"
opacity="0.1254902"
empspacing="4"
dotted="false"
gridanglex="30"
gridanglez="30"
visible="true" />
</sodipodi:namedview>
<defs
id="defs1" />
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g5"
transform="matrix(1.3332593,0,0,1.3332593,-0.66529661,-17.998334)"
style="stroke-width:1.12506247;stroke-dasharray:none">
<circle
style="opacity:1;fill:none;stroke:#000000;stroke-width:1.12506247;stroke-opacity:1;stroke-dasharray:none"
id="path1"
cx="10"
cy="35"
r="5" />
<circle
style="opacity:1;fill:none;stroke:#000000;stroke-width:1.12506247;stroke-opacity:1;stroke-dasharray:none"
id="circle1"
cx="27"
cy="35"
r="5" />
<path
style="fill:none;stroke:#000000;stroke-width:1.12506247;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
d="m 10,35 6,-12 h 1"
id="path2"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:1.12506247;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
d="m 14,27 5,8 h 8 l -5,-8"
id="path3"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#000000;stroke-width:1.12506247;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
d="M 19,35 23,25"
id="path4" />
<path
style="fill:none;stroke:#000000;stroke-width:1.12506247;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
d="m 21,25 h 3"
id="path5" />
</g>
<rect
style="opacity:1;fill:none;stroke:#000000;stroke-width:1.5;stroke-opacity:1;stroke-dasharray:none"
id="rect5"
width="42"
height="42"
x="3"
y="3"
rx="5"
ry="5" />
<path
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 3,41 41,3.0000001"
id="path57"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 7,45 45,7"
id="path58"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 4,44 44,4.0000001"
id="path59"
sodipodi:nodetypes="cc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -5,24 +5,26 @@
<div class="leg" v-for="leg in connection.legs" :key="connection.legs.indexOf(leg)" :class="leg.walking ? 'walking' : null" :style="{backgroundColor:getTimeColor(leg.arrival), background:getGradient(leg.departure, leg.arrival)}" >
<div class="linename" >
<div class="linenameinner" :style="{backgroundColor:getLineColors(leg)[1], color:getLineColors(leg)[0]}">{{ getRouteNumber(leg) }}</div>
<div class="linenameinner" :style="{backgroundColor:getLineColors(leg)[1], color:getLineColors(leg)[0]}">{{ leg.direction }}</div>
<div class="linenameinner" v-if="isLarge" :style="{backgroundColor:getLineColors(leg)[1], color:getLineColors(leg)[0]}">{{ leg.direction }}</div>
</div>
<div class="lineinfo">
<div class="station" >{{ leg.origin.name }}<br/>{{ timeWithDelay(leg.departure, leg.departureDelay) }}<p v-if="leg.departurePlatform"> Gleis {{ leg.departurePlatform }} </p></div>
<div class="line">
<div class="line" v-if="isLarge">
<p class="zugnummer">{{ leg.line?.fahrtNr }}</p>
<p class="operator" v-if="!getOperatorLogo(leg.line?.operator)">{{ leg.line?.operator?.name }}</p>
<img class="operator-logo" :src="getOperatorLogo(leg.line?.operator)" v-if="getOperatorLogo(leg.line?.operator)">
</div>
<div class="station">{{ leg.destination.name }}<br/>{{ timeWithDelay(leg.arrival, leg.arrivalDelay) }} <p v-if="leg.arrivalPlatform">Gleis {{ leg.arrivalPlatform }}</p></div>
</div>
<div class="displaywide">
<div class="displaywide" v-if="isLarge">
<div v-for="remark in leg.remarks" :key="leg.remarks.indexOf(remark)">
<img class="remark-icon" :src="getIconForRemark(remark)" v-if="getIconForRemark(remark)" :title="$t('routing.remarks.'+remark.code)">
</div>
</div>
<div v-for="remark in leg.remarks" :key="leg.remarks.indexOf(remark)">
<p v-if="!getIconForRemark(remark)">{{remark.text}}</p>
<div v-if="isLarge">
<div v-for="remark in leg.remarks" :key="leg.remarks.indexOf(remark)">
<p v-if="!getIconForRemark(remark)">{{remark.text}}</p>
</div>
</div>
<hr/>
</div>
@ -48,6 +50,7 @@
return {
from: {name:"", id:null},
to: {name:"", id:null},
isLarge: true,
}
},
methods: {
@ -101,6 +104,7 @@
margin-left: auto;
margin-right: auto;
flex: 1;
min-width: 500px;
}
.journey > div{
margin: 40px;
@ -108,7 +112,7 @@
.station {
margin: 4px;
display: inline-block;
width:150px;
width:130px;
vertical-align: text-top;
}
.line {

View File

@ -12,8 +12,8 @@
class="inputTextField"
></v-select>
<v-text-field
v-model="date.value"
:active="date.menu"
v-model="formattedDate"
:label="$t('search.fields.date')"
prepend-icon="mdi mdi-calendar-month"
readonly
@ -73,7 +73,7 @@
transition="scale-transition"
>
<div v-if="from.menu">
<div v-for="choice in from.choices" :key="from.choices.indexOf(choice)" @click="chooseFrom(choice)">
<div class="selectItem" v-for="choice in from.choices" :key="from.choices.indexOf(choice)" @click="chooseFrom(choice)">
{{ choice.name }}
</div>
</div>
@ -94,13 +94,13 @@
transition="scale-transition"
>
<div v-if="to.menu">
<div v-for="choice in to.choices" :key="to.choices.indexOf(choice)" @click="chooseTo(choice)">
<div class="selectItem" v-for="choice in to.choices" :key="to.choices.indexOf(choice)" @click="chooseTo(choice)">
{{ choice.name }}
</div>
</div>
</v-menu>
</v-text-field>
<v-btn @click="searchConnection()">find connection</v-btn>
<v-btn @click="searchConnection()">{{$t("search.buttons.searchConnection")}}</v-btn>
</div>
<routing v-if="showRouting" :connections="connections" :isMobile="isMobile"></routing>
</template>
@ -137,7 +137,7 @@
toName : "",
connections: [],
showRouting: false,
time: {value:new Date().toLocaleTimeString("de"), menu:false},
time: {value:new Date().toLocaleTimeString("de", {hour: '2-digit', minute:'2-digit'}), menu:false},
date: {value:new Date(), menu:false},
services: services,
selectedService: services[0].id,
@ -149,10 +149,10 @@
return this.isMobile ? "displaytall" : "displaywide";
},
searchStationFrom() {
client.get("/searchStation", {params: {text: this.fromName, service:this.selectedService}}).then(res => this.from = {name: res.data.name, id: res.data.id});
client.get("/searchStation", {params: {text: this.fromName, service:this.selectedService}}).then(res => this.chooseFrom(res.data));
},
searchStationTo() {
client.get("/searchStation", {params: {text: this.toName, service:this.selectedService}}).then(res => this.to = {name: res.data.name, id: res.data.id});
client.get("/searchStation", {params: {text: this.toName, service:this.selectedService}}).then(res => this.chooseTo(res.data));
},
searchConnection() {
if (this.from.id && this.to.id){
@ -173,12 +173,9 @@
if (this.from.menu){
let time = Date.now()
this.from.update = time;
console.log("timeLoadChoicesFrom")
let timer = setInterval(() => {
if (time == this.from.update){
this.loadChoicesFrom();
} else {
console.log("nicht laden")
}
clearInterval(timer);
}, 500);
@ -192,8 +189,6 @@
let timer = setInterval(() => {
if (time == this.to.update){
this.loadChoicesTo();
} else {
console.log("nicht laden")
}
clearInterval(timer);
}, 500);
@ -219,6 +214,11 @@
alert("testAlert")
}
},
computed: {
formattedDate() {
return this.date.value.toLocaleDateString("de");
}
},
watch: {
fromName: function() {
this.timeLoadChoicesFrom();
@ -226,6 +226,11 @@
toName: function() {
this.timeLoadChoicesTo();
},
selectedService: function() {
this.searchStationFrom();
this.searchStationTo();
},
},
}
</script>
@ -257,6 +262,11 @@
margin-left: auto;
margin-right: auto;
}
.selectItem{
margin-top:10px;
background-color:white;
cursor: pointer;
}
@font-face {
font-family: "Raveo-display-bold";
src: url("../assets/Raveo Display Bold.woff2") format("opentype");

View File

@ -4,11 +4,11 @@ let remarkfunctions = {
return (null);
} else if (remark.code === "55"){
return new URL('../assets/icons/55.svg', import.meta.url);
} else if (remark.code === "wifi"){
} else if (remark.code === "wifi" || remark.code === "WF"){
return new URL('../assets/icons/wifi.svg', import.meta.url);
} else if (remark.code === "air-conditioned"){
return new URL('../assets/icons/air-conditioned.svg', import.meta.url);
} else if (remark.code === "barrier-free-vehicle"){
} else if (remark.code === "barrier-free-vehicle" || remark.code === "EA" || remark.code === "RZ" || remark.code === "OB"){
return new URL('../assets/icons/barrier-free-vehicle.svg', import.meta.url);
} else if (remark.code === "compulsory-reservation"){
return new URL('../assets/icons/compulsory-reservation.svg', import.meta.url);
@ -16,14 +16,18 @@ let remarkfunctions = {
return new URL('../assets/icons/on-board-restaurant.svg', import.meta.url);
} else if (remark.code === "power-sockets"){
return new URL('../assets/icons/power-sockets.svg', import.meta.url);
} else if (remark.code === "wheelchair-space"){
} else if (remark.code === 'wheelchairs-space' || remark.code === "RO"){
return new URL('../assets/icons/wheelchair-space.svg', import.meta.url);
} else if (remark.code === "bicycle-conveyance"){
} else if (remark.code === "bicycle-conveyance" || remark.code === "FK"){
return new URL('../assets/icons/bicycle-conveyance.svg', import.meta.url);
} else if (remark.code === "bicycle-conveyance-reservation"){
} else if (remark.code === "bicycle-conveyance-reservation" || remark.code === "FR"){
return new URL('../assets/icons/bicycle-conveyance-reservation.svg', import.meta.url);
} else if (remark.code === "2nd-class-only"){
} else if (remark.code === "2nd-class-only" || remark.code === "J2" || remark.code === "K2"){
return new URL('../assets/icons/2nd-class-only.svg', import.meta.url);
} else if (remark.code === "boarding-ramp" || remark.code === "EF"){
return new URL('../assets/icons/boarding-ramp.svg', import.meta.url);
} else if (remark.code === "no-bicycle-conveyance"){
return new URL('../assets/icons/no-bicycle-conveyance.svg', import.meta.url);
} else {
return null;

View File

@ -17,6 +17,9 @@
}
},
"routing":{
"text":{
"track":"Gleis"
},
"remarks":{
"bicycle-conveyance":"Fahrradmitnahme möglich",
"bicycle-conveyance-reservation":"Fahrradmitnahme reservierungspflichtig",
@ -29,7 +32,23 @@
"compulsary-reservation":"Reservierungspflicht",
"2nd-class-only":"Nur 2. Klasse",
"RZ":"Rollstuhlgerechter Einstieg",
"on-board-restaurant":"Boardrestaurant vorhanden"
"on-board-restaurant":"Boardrestaurant vorhanden",
"EA":"Behindertengerechte Ausstattung",
"FM": "Fahrkartenautomat im Fahrzeug",
"boarding-ramp": "Einstieghilfe im Fahrzeug",
"no-bicycle-conveyance": "Einstieghilfe im Fahrzeug",
"OB": "Niederflurfahrzeug",
"RO": "Rollstuhlstellplatz",
"OA": "Rollstuhlstellplatz, Voranmeldung unter +43 5 1717",
"EF": "Fahrzeuggebundene Einstieghilfe",
"OC": "Rollstuhltaugliches WC",
"FK": "Fahrradmitnahme möglich",
"K2": "Nur 2. Klasse",
"J2": "in Sitzwagen nur 2. Klasse",
"SB": "Zustieg nur mit gültiger Fahrkarte",
"WV": "WLAN verfügbar",
"fC": "Kleinbus, Fahrtanmeldung bei Gruppen ab 10 Personen unter gruppen.vmobil.at",
"FR":"Fahrradmitnahme reservierungspflichtig"
}
}
}

View File

@ -17,6 +17,9 @@
}
},
"routing":{
"text":{
"track":"Track"
},
"remarks":{
"bicycle-conveyance":"bicycles allowed",
"bicycle-conveyance-reservation":"bicycles need reservation",

View File

@ -0,0 +1,54 @@
{
"global":{
"option":{
"mobile": "mobile"
}
},
"search":{
"fields":{
"service":"service",
"date":"date",
"time":"heure",
"from":"de",
"to":"à"
},
"buttons":{
"searchConnection":"rechercher"
}
},
"routing":{
"text":{
"track":"voie"
},
"remarks":{
"bicycle-conveyance":"Fahrradmitnahme möglich",
"bicycle-conveyance-reservation":"Fahrradmitnahme reservierungspflichtig",
"power-sockets":"Steckdosen für Laptops vorhanden",
"barrier-free-vehicle":"Behindertengerechtes Fahrzeug",
"wheelchairs-space":"Rollstuhlplatz vorhanden",
"air-conditioned":"klimatisiertes Fahrzeug",
"55":"Rauchen verboten",
"wifi":"WLAN vorhanden",
"compulsary-reservation":"Reservierungspflicht",
"2nd-class-only":"Nur 2. Klasse",
"RZ":"Rollstuhlgerechter Einstieg",
"on-board-restaurant":"Boardrestaurant vorhanden",
"EA":"Behindertengerechte Ausstattung",
"FM": "Fahrkartenautomat im Fahrzeug",
"boarding-ramp": "Einstieghilfe im Fahrzeug",
"no-bicycle-conveyance": "Einstieghilfe im Fahrzeug",
"OB": "Niederflurfahrzeug",
"RO": "Rollstuhlstellplatz",
"OA": "Rollstuhlstellplatz, Voranmeldung unter +43 5 1717",
"EF": "Fahrzeuggebundene Einstieghilfe",
"OC": "Rollstuhltaugliches WC",
"FK": "Fahrradmitnahme möglich",
"K2": "Nur 2. Klasse",
"J2": "in Sitzwagen nur 2. Klasse",
"SB": "Zustieg nur mit gültiger Fahrkarte",
"WV": "WLAN verfügbar",
"fC": "Kleinbus, Fahrtanmeldung bei Gruppen ab 10 Personen unter gruppen.vmobil.at",
"FR":"Fahrradmitnahme reservierungspflichtig"
}
}
}

View File

@ -0,0 +1,54 @@
{
"global":{
"option":{
"mobile": "mobile"
}
},
"search":{
"fields":{
"service":"service",
"date":"дата",
"time":"час",
"from":"від",
"to":"в"
},
"buttons":{
"searchConnection":"rechercher"
}
},
"routing":{
"text":{
"track":"Gleis"
},
"remarks":{
"bicycle-conveyance":"Fahrradmitnahme möglich",
"bicycle-conveyance-reservation":"Fahrradmitnahme reservierungspflichtig",
"power-sockets":"Steckdosen für Laptops vorhanden",
"barrier-free-vehicle":"Behindertengerechtes Fahrzeug",
"wheelchairs-space":"Rollstuhlplatz vorhanden",
"air-conditioned":"klimatisiertes Fahrzeug",
"55":"Rauchen verboten",
"wifi":"WLAN vorhanden",
"compulsary-reservation":"Reservierungspflicht",
"2nd-class-only":"Nur 2. Klasse",
"RZ":"Rollstuhlgerechter Einstieg",
"on-board-restaurant":"Boardrestaurant vorhanden",
"EA":"Behindertengerechte Ausstattung",
"FM": "Fahrkartenautomat im Fahrzeug",
"boarding-ramp": "Einstieghilfe im Fahrzeug",
"no-bicycle-conveyance": "Einstieghilfe im Fahrzeug",
"OB": "Niederflurfahrzeug",
"RO": "Rollstuhlstellplatz",
"OA": "Rollstuhlstellplatz, Voranmeldung unter +43 5 1717",
"EF": "Fahrzeuggebundene Einstieghilfe",
"OC": "Rollstuhltaugliches WC",
"FK": "Fahrradmitnahme möglich",
"K2": "Nur 2. Klasse",
"J2": "in Sitzwagen nur 2. Klasse",
"SB": "Zustieg nur mit gültiger Fahrkarte",
"WV": "WLAN verfügbar",
"fC": "Kleinbus, Fahrtanmeldung bei Gruppen ab 10 Personen unter gruppen.vmobil.at",
"FR":"Fahrradmitnahme reservierungspflichtig"
}
}
}

View File

@ -12,6 +12,8 @@ import SearchBahn from './components/search.vue'
import { createI18n } from 'vue-i18n'
import de from "./locales/de.json";
import en from "./locales/en.json";
import fr from "./locales/fr.json";
import ua from "./locales/ua.json";
const app = createApp(App)
@ -31,7 +33,7 @@ const vuetify = createVuetify({
const i18n = createI18n({
locale: "en",
fallbackLocale: "en",
messages: { de, en },
messages: { de, en, fr, ua },
})
app.use(vuetify).use(router).use(i18n).mount('#app')