Wsparcie języka angielskiego (beta)

This commit is contained in:
2021-03-06 20:10:24 +01:00
parent ce04b9112e
commit dc22e82c84
12 changed files with 295 additions and 36 deletions
+5
View File
@@ -10157,6 +10157,11 @@
"integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==",
"dev": true "dev": true
}, },
"vue-i18n": {
"version": "8.23.0",
"resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.23.0.tgz",
"integrity": "sha512-mXgniaumwca8tKdp55fmvqIcW658vQQXq0zEyRHp8sgZ6t+Md+Whhu6CCPg9/erVNlvpKzsGsucGjt2N8GrFCA=="
},
"vue-loader": { "vue-loader": {
"version": "15.9.3", "version": "15.9.3",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.3.tgz", "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.3.tgz",
+1
View File
@@ -14,6 +14,7 @@
"howler": "^2.2.1", "howler": "^2.2.1",
"vue": "^2.6.11", "vue": "^2.6.11",
"vue-class-component": "^7.2.5", "vue-class-component": "^7.2.5",
"vue-i18n": "^8.23.0",
"vue-property-decorator": "^8.4.2", "vue-property-decorator": "^8.4.2",
"vue-router": "^3.4.3", "vue-router": "^3.4.3",
"vuex": "^3.4.0" "vuex": "^3.4.0"
+23 -5
View File
@@ -27,13 +27,19 @@
<span class="header_links"> <span class="header_links">
<router-link class="route" active-class="route-active" to="/" exact <router-link class="route" active-class="route-active" to="/" exact
>SCENERIE</router-link >{{ $t("app.sceneries") }} </router-link
>/ >/
<router-link class="route" active-class="route-active" to="/trains" <router-link
>POCIĄGI</router-link class="route"
active-class="route-active"
to="/trains"
>{{ $t("app.trains") }}</router-link
>/ >/
<router-link class="route" active-class="route-active" to="/history" <router-link
>DZIENNIK</router-link class="route"
active-class="route-active"
to="/history"
>{{ $t("app.journal") }}</router-link
> >
</span> </span>
</div> </div>
@@ -82,6 +88,18 @@ export default class App extends Vue {
mounted() { mounted() {
this.synchronizeData(); this.synchronizeData();
if (window.navigator.language) {
switch (window.navigator.language) {
case "pl-PL":
this.$i18n.locale = "pl";
break;
case "en-EN":
default:
this.$i18n.locale = "en";
break;
}
}
if (StorageManager.getStringValue("version") != this.VERSION) { if (StorageManager.getStringValue("version") != this.VERSION) {
StorageManager.setStringValue("version", this.VERSION); StorageManager.setStringValue("version", this.VERSION);
+9 -5
View File
@@ -21,7 +21,7 @@
<span <span
class="option-content" class="option-content"
:class="option.section + (option.value ? ' checked' : '')" :class="option.section + (option.value ? ' checked' : '')"
>{{ option.content }}</span >{{ $t(`filters.${option.id}`) }}</span
> >
</label> </label>
</div> </div>
@@ -42,7 +42,9 @@
<span class="slider-value">{{ slider.value }}</span> <span class="slider-value">{{ slider.value }}</span>
<div class="slider-content">{{ slider.content }}</div> <div class="slider-content">
{{ $t(`filters.sliders.${slider.id}`) }}
</div>
</div> </div>
</div> </div>
@@ -51,15 +53,17 @@
<label> <label>
<input type="checkbox" v-model="saveOptions" @change="saveFilters" /> <input type="checkbox" v-model="saveOptions" @change="saveFilters" />
<span class="save" :class="{ checked: saveOptions }"> <span class="save" :class="{ checked: saveOptions }">
ZAPISZ FILTRY {{ $t("filters.save") }}
</span> </span>
</label> </label>
</div> </div>
</div> </div>
<div class="card-actions flex"> <div class="card-actions flex">
<button class="button" @click="resetFilters">RESET FILTRÓW</button> <button class="button" @click="resetFilters">
<button class="button" @click="exit">ZAMKNIJ FILTRY</button> {{ $t("filters.reset") }}
</button>
<button class="button" @click="exit">{{ $t("filters.close") }}</button>
</div> </div>
</section> </section>
</template> </template>
+62 -2
View File
@@ -4,7 +4,56 @@
<table> <table>
<thead> <thead>
<tr> <tr>
<!-- <th v-html="$t('sceneries.station')"></th>
<th v-html="$t('sceneries.min-lvl')"></th>
<th v-html="$t('sceneries.status')"></th>
<th v-html="$t('sceneries.dispatcher')"></th>
<th v-html="$t('sceneries.dispatcher-lvl')"></th>
<th v-html="$t('sceneries.routes')"></th>
<th v-html="$t('sceneries.general')"></th>
<th v-html="$t('sceneries.drivers-online')"></th>
<th v-html="$t('sceneries.spawns')"></th>
<th v-html="$t('sceneries.timetables')"></th> -->
<th <th
v-for="(id, i) in headIds"
:key="id"
@click="() => changeSorter(i)"
>
<span class="header_wrapper">
<div v-html="$t(`sceneries.${id}`)"></div>
<img
class="sort-icon"
v-if="sorterActive.index == i"
:src="sorterActive.dir == 1 ? ascIcon : descIcon"
alt
/>
</span>
</th>
<th
v-for="(id, i) in headIconsIds"
:key="id"
@click="() => changeSorter(i + 7)"
>
<span class="header_wrapper">
<img
:src="require(`@/assets/icon-${id}.svg`)"
:alt="id"
:title="$t(`sceneries.${id}s`)"
/>
<img
class="sort-icon"
v-if="sorterActive.index == i + 7"
:src="sorterActive.dir == 1 ? ascIcon : descIcon"
alt
/>
</span>
</th>
<!-- <th
v-for="(head, i) in headTitles" v-for="(head, i) in headTitles"
:key="i" :key="i"
@click="() => changeSorter(i)" @click="() => changeSorter(i)"
@@ -28,7 +77,7 @@
alt alt
/> />
</span> </span>
</th> </th> -->
</tr> </tr>
</thead> </thead>
@@ -204,7 +253,6 @@
import { Component, Prop } from "vue-property-decorator"; import { Component, Prop } from "vue-property-decorator";
import Station from "@/scripts/interfaces/Station"; import Station from "@/scripts/interfaces/Station";
import styleMixin from "@/mixins/styleMixin"; import styleMixin from "@/mixins/styleMixin";
import Options from "@/components/StationsView/Options.vue"; import Options from "@/components/StationsView/Options.vue";
@@ -228,6 +276,18 @@ export default class StationTable extends styleMixin {
ascIcon: string = require("@/assets/icon-arrow-asc.svg"); ascIcon: string = require("@/assets/icon-arrow-asc.svg");
descIcon: string = require("@/assets/icon-arrow-desc.svg"); descIcon: string = require("@/assets/icon-arrow-desc.svg");
headIds = [
"station",
"min-lvl",
"status",
"dispatcher",
"dispatcher-lvl",
"routes",
"general",
];
headIconsIds = ["user", "spawn", "timetable"];
headTitles: string[][] = [ headTitles: string[][] = [
["Stacja"], ["Stacja"],
["Min. poziom", "dyżurnego"], ["Min. poziom", "dyżurnego"],
+8 -5
View File
@@ -16,7 +16,9 @@
@click="() => chooseOption(option)" @click="() => chooseOption(option)"
> >
<input type="radio" name="sort" :id="option.id" /> <input type="radio" name="sort" :id="option.id" />
<label :for="option.id">{{ option.content }}</label> <label :for="option.id">
{{ $t(`trains.option-${option.id}`) }}
</label>
</li> </li>
</ul> </ul>
</div> </div>
@@ -27,7 +29,7 @@
<div class="search-box"> <div class="search-box">
<input <input
class="search-input" class="search-input"
placeholder="Szukaj nr pociągu..." :placeholder="$t('trains.search-no')"
v-model="searchedTrain" v-model="searchedTrain"
/> />
<img <img
@@ -43,7 +45,7 @@
<div class="search-box"> <div class="search-box">
<input <input
class="search-input" class="search-input"
placeholder="Szukaj maszynisty..." :placeholder="$t('trains.search-driver')"
v-model="searchedDriver" v-model="searchedDriver"
/> />
<img <img
@@ -70,7 +72,7 @@ export default class TrainOptions extends Vue {
clickEventListener!: EventListener; clickEventListener!: EventListener;
sorterOptionsOpen = false; sorterOptionsOpen = false;
currentSorterOption = "kilometraż"; currentSorterOption = this.$t("trains.option-distance");
searchedTrain = ""; searchedTrain = "";
searchedDriver = ""; searchedDriver = "";
@@ -112,7 +114,8 @@ export default class TrainOptions extends Vue {
chooseOption(option: { id: string; content: string }) { chooseOption(option: { id: string; content: string }) {
this.$emit("changeSorter", { id: option.id, dir: -1 }); this.$emit("changeSorter", { id: option.id, dir: -1 });
this.currentSorterOption = option.content;
this.currentSorterOption = this.$t(`trains.option-${option.id}`);
this.closeSorterOptions(); this.closeSorterOptions();
} }
+14 -8
View File
@@ -6,17 +6,17 @@
@click="toggleStats" @click="toggleStats"
v-if="trains.length > 0" v-if="trains.length > 0"
> >
STATYSTYKI RUCHU {{ $t("trains.stats") }}
</button> </button>
</div> </div>
<transition name="stats-anim"> <transition name="stats-anim">
<div class="stats-body" v-if="statsOpen"> <div class="stats-body" v-if="statsOpen">
<h2 class="stats-header">STATYSTYKI RUCHU</h2> <h2 class="stats-header">{{ $t("trains.stats") }}</h2>
<div class="stats-speed"> <div class="stats-speed">
<div class="title stats-title"> <div class="title stats-title">
PRĘDKOŚCI POCIĄGÓW (MIN | ŚR | MAX) [km/h] {{ $t("trains.stats-speed") }}
</div> </div>
<div class="stats-content"> <div class="stats-content">
{{ speedStats.min }} | {{ speedStats.avg }} | {{ speedStats.max }} {{ speedStats.min }} | {{ speedStats.avg }} | {{ speedStats.max }}
@@ -25,7 +25,7 @@
<div class="stats-length"> <div class="stats-length">
<div class="title stats-title"> <div class="title stats-title">
DŁUGOŚCI ROZKŁADÓW (MIN | ŚR | MAX) [km] {{ $t("trains.stats-length") }}
</div> </div>
<div class="stats-content"> <div class="stats-content">
{{ timetableStats.min }} | {{ timetableStats.avg }} | {{ timetableStats.min }} | {{ timetableStats.avg }} |
@@ -34,7 +34,9 @@
</div> </div>
<div class="stats-categories"> <div class="stats-categories">
<div class="title stats-title">KATEGORIE RJ</div> <div class="title stats-title">
{{ $t("trains.stats-categories") }}
</div>
<div class="category-list"> <div class="category-list">
<span <span
@@ -49,19 +51,23 @@
<div class="special-list"> <div class="special-list">
<span class="special twr"> <span class="special twr">
<span class="special-type">WYSOKIEGO RYZYKA</span> <span class="special-type">{{
$t("trains.stats-special-twr")
}}</span>
<span class="special-count">{{ specialTrainCount[0] }}</span> <span class="special-count">{{ specialTrainCount[0] }}</span>
</span> </span>
<span class="special skr"> <span class="special skr">
<span class="special-type">PRZEKROCZONA SKRAJNIA</span> <span class="special-type">{{
$t("trains.stats-special-skr")
}}</span>
<span class="special-count">{{ specialTrainCount[1] }}</span> <span class="special-count">{{ specialTrainCount[1] }}</span>
</span> </span>
</div> </div>
</div> </div>
<div class="stats-locos"> <div class="stats-locos">
<div class="title stats-title">NAJCZĘSTSZE JEDNOSTKI</div> <div class="title stats-title">{{ $t("trains.stats-locos") }}</div>
<div class="loco-list stats-content"> <div class="loco-list stats-content">
<div class="loco-item" v-for="(loco, i) in locoList" :key="i"> <div class="loco-item" v-for="(loco, i) in locoList" :key="i">
+9 -9
View File
@@ -56,7 +56,7 @@
"content": "SCS" "content": "SCS"
}, },
{ {
"id": "by-hand", "id": "manual",
"name": "ręczne", "name": "ręczne",
"iconName": "ręczne", "iconName": "ręczne",
"section": "control", "section": "control",
@@ -65,7 +65,7 @@
"content": "RĘCZNE" "content": "RĘCZNE"
}, },
{ {
"id": "levers", "id": "mechanical",
"name": "mechaniczne", "name": "mechaniczne",
"iconName": "mechaniczne", "iconName": "mechaniczne",
"section": "control", "section": "control",
@@ -84,7 +84,7 @@
"content": "WSPÓŁCZESNA" "content": "WSPÓŁCZESNA"
}, },
{ {
"id": "semaphore", "id": "semaphores",
"name": "kształtowa", "name": "kształtowa",
"iconName": "kształtowa", "iconName": "kształtowa",
"section": "signals", "section": "signals",
@@ -102,7 +102,7 @@
"content": "MIESZANA" "content": "MIESZANA"
}, },
{ {
"id": "historic", "id": "historical",
"name": "historyczna", "name": "historyczna",
"iconName": "historyczna", "iconName": "historyczna",
"section": "signals", "section": "signals",
@@ -134,7 +134,7 @@
], ],
"sliders": [ "sliders": [
{ {
"id": "min-level", "id": "min-lvl",
"name": "minLevel", "name": "minLevel",
"minRange": 0, "minRange": 0,
"maxRange": 20, "maxRange": 20,
@@ -143,7 +143,7 @@
"content": "MINIMALNY WYMAGANY POZIOM DYŻURNEGO" "content": "MINIMALNY WYMAGANY POZIOM DYŻURNEGO"
}, },
{ {
"id": "min-oneway-e", "id": "routes-1t-cat",
"name": "minOneWayCatenary", "name": "minOneWayCatenary",
"minRange": 0, "minRange": 0,
"maxRange": 5, "maxRange": 5,
@@ -152,7 +152,7 @@
"content": "SZLAKI JEDNOTOROWE ZELEKTR. (MINIMUM)" "content": "SZLAKI JEDNOTOROWE ZELEKTR. (MINIMUM)"
}, },
{ {
"id": "min-oneway-ne", "id": "routes-1t-other",
"name": "minOneWay", "name": "minOneWay",
"minRange": 0, "minRange": 0,
"maxRange": 5, "maxRange": 5,
@@ -161,7 +161,7 @@
"content": "SZLAKI JEDNOTOROWE NIEZELEKTR. (MINIMUM)" "content": "SZLAKI JEDNOTOROWE NIEZELEKTR. (MINIMUM)"
}, },
{ {
"id": "min-twoway-e", "id": "routes-2t-cat",
"name": "minTwoWayCatenary", "name": "minTwoWayCatenary",
"minRange": 0, "minRange": 0,
"maxRange": 5, "maxRange": 5,
@@ -170,7 +170,7 @@
"content": "SZLAKI DWUTOROWE ZELEKTR. (MINIMUM)" "content": "SZLAKI DWUTOROWE ZELEKTR. (MINIMUM)"
}, },
{ {
"id": "min-twoway-ne", "id": "routes-2t-other",
"name": "minTwoWay", "name": "minTwoWay",
"minRange": 0, "minRange": 0,
"maxRange": 5, "maxRange": 5,
+73
View File
@@ -0,0 +1,73 @@
{
"app": {
"sceneries": "SCENERIES",
"trains": "TRAINS",
"journal": "JOURNAL"
},
"options": {
"filters": "FILTERS",
"donate": "DONATE"
},
"filters": {
"title": "STATION FILTER",
"default": "DEFAULT",
"not-default": "OTHER",
"real": "REAL",
"fictional": "FICTIONAL",
"SPK": "SPK",
"SCS": "SCS",
"manual": "MANUAL",
"mechanical": "MECHANICAL",
"modern": "MODERN",
"semaphores": "SEMAPHORES",
"mixed": "MIXED",
"historical": "HISTORICAL",
"free": "FREE",
"occupied": "OCCUPIED",
"sliders": {
"min-lvl": "MINIMUM REQUIRED DISPATCHER LEVEL",
"routes-1t-cat": "MINIMUM CATENARY SINGLE TRACK ROUTES",
"routes-1t-other": "MINIMUM OTHER SINGLE TRACK ROUTES",
"routes-2t-cat": "MINIMUM CATENARY DOUBLE TRACK ROUTES",
"routes-2t-other": "MINIMUM OTHER DOUBLE TRACK ROUTES"
},
"save": "SAVE FILTERS",
"reset": "RESET FILTERS",
"close": "CLOSE FILTERS"
},
"sceneries": {
"station": "Station",
"min-lvl": "Min. dispatcher <br> level",
"status": "Status",
"dispatcher": "Dispatcher",
"dispatcher-lvl": "Dispatcher <br> level",
"routes": "Routes <br> double | single",
"general": "General info",
"users": "Drivers online",
"spawns": "Spawns online",
"timetables": "Active timetables"
},
"trains": {
"stats": "TRAFFIC STATISTICS",
"stats-speed": "TRAINS SPEED (MIN | AVG | MAX) [km/h]",
"stats-length": "TIMETABLES LENGTH (MIN | AVG | MAX) [km]",
"stats-categories": "TIMETABLE CATEGORIES",
"stats-special-twr": "HIGH RISK",
"stats-special-skr": "EXCEEDED STRUCT. GAUGE",
"stats-locos": "MOST COMMON UNITS",
"option-mass": "mass",
"option-speed": "speed",
"option-length": "length",
"option-distance": "distance",
"option-timetable": "train no.",
"search-no": "Search for train no...",
"search-driver": "Search for driver...",
"detailed-timetable": "Detailed timetable for train no. "
},
"journal": {
"title": "SCENERY ACTIVITY JOURNAL",
"subtitle": "Shows all recent dispatchers on a selected scenery",
"disclaimer": "<b>This functionality is unfinished!</b> <br> Information shown here could be false or incorrect!",
"select": "Select a scenery"
}
}
+73
View File
@@ -0,0 +1,73 @@
{
"app": {
"sceneries": "SCENERIE",
"trains": "POCIĄGI",
"journal": "DZIENNIK"
},
"options": {
"filters": "FILTRY",
"donate": "WESPRZYJ"
},
"filters": {
"title": "FILTRUJ STACJE",
"default": "DOMYŚLNA",
"not-default": "POZA PACZKĄ",
"real": "REALNA",
"fictional": "FIKCYJNA",
"SPK": "SPK",
"SCS": "SCS",
"manual": "RĘCZNE",
"mechanical": "MECHANICZNE",
"modern": "WSPÓŁCZESNA",
"semaphores": "KSZTAŁTOWA",
"mixed": "MIESZANA",
"historical": "HISTORYCZNA",
"free": "WOLNA",
"occupied": "ZAJĘTA",
"sliders": {
"min-lvl": "MINIMALNY WYMAGANY POZIOM DYŻURNEGO",
"routes-1t-cat": "SZLAKI JEDNOTOROWE ZELEKTR. (MINIMUM)",
"routes-1t-other": "SZLAKI JEDNOTOROWE NIEZELEKTR. (MINIMUM)",
"routes-2t-cat": "SZLAKI DWUTOROWE ZELEKTR. (MINIMUM)",
"routes-2t-other": "SZLAKI DWUTOROWE NIEZELEKTR. (MINIMUM)"
},
"save": "ZAPISZ FILTRY",
"reset": "RESETUJ FILTRY",
"close": "ZAMKNIJ FILTRY"
},
"sceneries": {
"station": "Stacja",
"min-lvl": "Min. poziom <br/> dyżurnego",
"status": "Status",
"dispatcher": "Dyżurny",
"dispatcher-lvl": "Poziom <br> dyżurnego",
"routes": "Szlaki <br> 2tor | 1tor",
"general": "Informacje <br> ogólne",
"users": "Maszyniści online",
"spawns": "Otwarte spawny",
"timetables": "Aktywne rozkłady jazdy"
},
"trains": {
"stats": "STATYSTYKI RUCHU",
"stats-speed": "PRĘDKOŚCI POCIĄGÓW (MIN | ŚR | MAX) [km/h]",
"stats-length": "DŁUGOŚCI ROZKŁADÓW (MIN | ŚR | MAX) [km]",
"stats-categories": "KATEGORIE RJ",
"stats-special-twr": "WYSOKIEGO RYZYKA",
"stats-special-skr": "PRZEKROCZONA SKRAJNIA",
"stats-locos": "NAJCZĘSTSZE JEDNOSTKI",
"option-mass": "masa",
"option-speed": "prędkość",
"option-length": "długość",
"option-distance": "kilometraż",
"option-timetable": "numer pociagu",
"search-no": "Szukaj nr pociągu...",
"search-driver": "Szukaj maszynisty...",
"detailed-timetable": "Szczegółowy rozkład jazdy pociągu "
},
"journal": {
"title": "DZIENNIK AKTYWNOŚCI SCENERII",
"subtitle": "Pokazuje dyżurnych, którzy ostatnio byli aktywni na wybranej scenerii",
"disclaimer": "<b>Ta funkcjonalność jest w testach beta!</b> <br> Informacje pokazywane na ekranie mogą znikać, a ich zawartość może być fałszywa!",
"select": "Wybierz scenerię"
}
}
+16
View File
@@ -2,11 +2,27 @@ import Vue from 'vue';
import App from './App.vue'; import App from './App.vue';
import router from './router'; import router from './router';
import store from './store'; import store from './store';
import VueI18n from 'vue-i18n';
import enLang from '@/lang/en.json';
import plLang from '@/lang/pl.json';
Vue.use(VueI18n);
const i18n = new VueI18n({
locale: 'pl',
fallbackLocale: 'pl',
messages: {
en: enLang,
pl: plLang,
},
});
Vue.config.productionTip = false; Vue.config.productionTip = false;
new Vue({ new Vue({
router, router,
store, store,
i18n,
render: h => h(App), render: h => h(App),
}).$mount('#app'); }).$mount('#app');
+2 -2
View File
@@ -15,13 +15,13 @@
:src="require('@/assets/icon-filter2.svg')" :src="require('@/assets/icon-filter2.svg')"
alt="icon-filter" alt="icon-filter"
/> />
<p>FILTRY</p> <p>{{ $t("options.filters") }}</p>
</button> </button>
<button class="action-btn" @click="toggleModal"> <button class="action-btn" @click="toggleModal">
<img :src="dolarIcon" alt="icon-dolar" /> <img :src="dolarIcon" alt="icon-dolar" />
<p>WESPRZYJ</p> <p>{{ $t("options.donate") }}</p>
</button> </button>
</div> </div>