tłumaczenie PL/EN (wip, cz.2)

This commit is contained in:
2023-08-22 00:33:51 +02:00
parent 17882e3e6e
commit 80d6f2b85f
12 changed files with 361 additions and 170 deletions
+3 -7
View File
@@ -1,19 +1,15 @@
<template> <template>
<footer> <footer>
<i18n-t keypath="footer.disclaimer" tag="div" class="text--grayed"> <i18n-t keypath="footer.disclaimer" tag="div" class="text--grayed">
<template #href> <template #tos>
<a <a style="color: #ccc" :href="$t('footer.tos-href')" target="_blank">
style="color: #ccc"
href="https://docs.google.com/document/d/1UAAPUtN0d_RoS4RgOzEzllJZJhA0VcizzCzKW4QylbY/edit"
target="_blank"
>
{{ $t('footer.tos') }} {{ $t('footer.tos') }}
</a> </a>
</template> </template>
</i18n-t> </i18n-t>
<div class="text--grayed" v-if="store.stockData"> <div class="text--grayed" v-if="store.stockData">
Strona jest kompletna dla wersji {{ store.stockData.version }} symulatora TD2 {{ $t('footer.version-check', { version: store.stockData.version }) }}
</div> </div>
<div> <div>
+45 -6
View File
@@ -1,36 +1,75 @@
<template> <template>
<section class="logo-section" @click="navigate"> <section class="logo-section">
<img src="/images/logo.svg" alt="logo pojazdownik" /> <img src="/images/logo.svg" alt="logo pojazdownik" @click="navigate" />
<div class="actions">
<button
class="btn btn--text"
v-for="action in localeActions"
:data-selected="$i18n.locale == action.locale"
@click="chooseLocale(action.locale)"
>
{{ action.name }}
</button>
</div>
</section> </section>
</template> </template>
<script lang="ts"> <script lang="ts">
export default { export default {
setup() { data() {
return {}; return {
localeActions: [
{
name: 'POLSKI',
locale: 'pl',
},
{
name: 'ENGLISH',
locale: 'en',
},
],
};
}, },
methods: { methods: {
navigate() { navigate() {
window.location.pathname = ''; window.location.pathname = '';
}, },
chooseLocale(locale: string) {
this.$i18n.locale = locale;
},
}, },
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '../../styles/global.scss';
.logo-section { .logo-section {
grid-row: 1; grid-row: 1;
grid-column: 1; grid-column: 1;
margin-bottom: 1.5em; margin-bottom: 1.5em;
display: flex; display: flex;
justify-content: center;
align-items: center; align-items: center;
flex-direction: column;
gap: 0.5em;
cursor: pointer; cursor: pointer;
} }
.actions {
display: flex;
gap: 0.5em;
button[data-selected='true'] {
font-weight: bold;
color: $accentColor;
text-decoration: underline;
}
}
img { img {
max-width: 25em; max-width: 25em;
width: 100%; width: 100%;
+16 -27
View File
@@ -1,14 +1,14 @@
<template> <template>
<section class="train-image-section"> <section class="train-image-section">
<div class="train-image__wrapper"> <div class="train-image__wrapper">
<div class="train-image__content" :class="{'supporter': store.chosenVehicle?.supportersOnly}"> <div class="train-image__content" :class="{ supporter: store.chosenVehicle?.supportersOnly }">
<transition name="img-message-anim"> <transition name="img-message-anim">
<div class="empty-message" v-if="store.imageLoading && store.chosenVehicle?.imageSrc"> <div class="empty-message" v-if="store.imageLoading && store.chosenVehicle?.imageSrc">
ŁADOWANIE OBRAZU... {{ $t('preview.loading') }}
</div> </div>
</transition> </transition>
<div class="no-img" v-if="!store.chosenVehicle">PODGLĄD WYBRANEGO POJAZDU</div> <div class="no-img" v-if="!store.chosenVehicle">{{ $t('preview.title') }}</div>
<img <img
v-if="store.chosenVehicle" v-if="store.chosenVehicle"
@@ -23,11 +23,11 @@
<div class="train-image__info" v-if="store.chosenVehicle"> <div class="train-image__info" v-if="store.chosenVehicle">
<b class="text--accent">{{ store.chosenVehicle.type }}</b> &bull; <b class="text--accent">{{ store.chosenVehicle.type }}</b> &bull;
<b style="color: #ccc">{{ <b style="color: #ccc">
vehicleTypes[ {{
isLocomotive(store.chosenVehicle) ? store.chosenVehicle.power : store.chosenVehicle.useType || 'loco-e' $t(`preview.${isLocomotive(store.chosenVehicle) ? store.chosenVehicle.power : store.chosenVehicle.useType}`)
] }}
}}</b> </b>
<div style="color: #ccc"> <div style="color: #ccc">
<div> <div>
@@ -35,21 +35,23 @@
{{ store.chosenVehicle.maxSpeed }} km/h {{ store.chosenVehicle.maxSpeed }} km/h
</div> </div>
<div v-if="isLocomotive(store.chosenVehicle)">Typ kabiny: {{ store.chosenVehicle.cabinType }}</div> <div v-if="isLocomotive(store.chosenVehicle)">
{{ $t('preview.cabin') }} {{ store.chosenVehicle.cabinType }}
</div>
<div v-else> <div v-else>
{{ {{
store.chosenVehicle.useType == 'car-cargo' store.chosenVehicle.useType == 'car-cargo' // ? store.stockData?.usage[store.chosenVehicle.constructionType]
? store.stockData?.usage[store.chosenVehicle.constructionType] ? $t(`usage.${store.chosenVehicle.constructionType}`)
: 'Typ konstrukcji: ' + store.chosenVehicle.constructionType : `${$t('preview.construction')} ${store.chosenVehicle.constructionType}`
}} }}
</div> </div>
<b style="color: salmon;" v-if="store.chosenVehicle.supportersOnly">* TYLKO DLA SPONSORÓW</b> <b style="color: salmon" v-if="store.chosenVehicle.supportersOnly">{{ $t('preview.sponsor-only') }}</b>
</div> </div>
</div> </div>
<div class="train-image__info" v-else>Wybierz pojazd lub wagon, aby zobaczyć jego podgląd powyżej</div> <div class="train-image__info" v-else>{{ $t('preview.desc') }}</div>
</div> </div>
</section> </section>
</template> </template>
@@ -70,19 +72,6 @@ export default defineComponent({
}; };
}, },
data() {
return {
vehicleTypes: {
'loco-e': 'ELEKTROWÓZ',
'loco-s': 'SPALINOWÓZ',
'loco-ezt': 'EZT',
'loco-szt': 'SZT',
'car-passenger': 'WAGON PASAŻERSKI',
'car-cargo': 'WAGON TOWAROWY',
} as { [key: string]: string },
};
},
watch: { watch: {
chosenVehicle(vehicle: Vehicle, prevVehicle: Vehicle) { chosenVehicle(vehicle: Vehicle, prevVehicle: Vehicle) {
if (vehicle && vehicle.type != prevVehicle?.type) { if (vehicle && vehicle.type != prevVehicle?.type) {
+11 -11
View File
@@ -1,45 +1,45 @@
<template> <template>
<div class="number-generator tab"> <div class="number-generator tab">
<div class="tab_header"> <div class="tab_header">
<h2>GENERATOR NUMERU POCIĄGU</h2> <h2>{{ $t('numgen.title') }}</h2>
</div> </div>
<div class="tab_content"> <div class="tab_content">
<div class="options"> <div class="options">
<select v-model="beginRegionName" @change="randomizeTrainNumber()"> <select v-model="beginRegionName" @change="randomizeTrainNumber()">
<option :value="null" disabled>Początkowy obszar konstrukcyjny</option> <option :value="null" disabled>{{ $t('numgen.start-region') }}</option>
<option v-for="(_, name) in genData.regionNumbers" :value="name">{{ name }}</option> <option v-for="(_, name) in genData.regionNumbers" :value="name">{{ name }}</option>
</select> </select>
<select v-model="endRegionName" @change="randomizeTrainNumber()"> <select v-model="endRegionName" @change="randomizeTrainNumber()">
<option :value="null" disabled>Końcowy obszar konstrukcyjny</option> <option :value="null" disabled>{{ $t('numgen.end-region') }}</option>
<option v-for="(_, name) in genData.regionNumbers" :value="name">{{ name }}</option> <option v-for="(_, name) in genData.regionNumbers" :value="name">{{ name }}</option>
</select> </select>
<select v-model="categoryRules" @change="randomizeTrainNumber()"> <select v-model="categoryRules" @change="randomizeTrainNumber()">
<option :value="null" disabled>Kategoria pociągu</option> <option :value="null" disabled>{{ $t('numgen.train-category') }}</option>
<option v-for="(rules, category) in genData.categories" :value="rules">{{ category }}</option> <option v-for="(rules, category) in genData.categories" :value="rules">{{ $t(`numgen.categories.${category}`) }}</option>
</select> </select>
</div> </div>
<div class="generated-number" @click="copyNumber"> <div class="generated-number" @click="copyNumber">
<span v-if="trainNumber"> <span v-if="trainNumber">
Wygenerowany numer pociągu: <b class="text--accent">{{ trainNumber }}</b> {{ $t('numgen.number-info') }} <b class="text--accent">{{ trainNumber }}</b>
</span> </span>
<span v-else>Wybierz kategorię oraz obszary konstrukcyjne (opcjonalnie)</span> <span v-else>{{ $t('numgen.warning') }}</span>
</div> </div>
<div class="tab_links"> <div class="tab_links">
<a href="https://wiki.td2.info.pl/index.php?title=Zasady_numeracji_poci%C4%85g%C3%B3w" target="_blank"> <a :href="$t('numgen.td2-wiki-link')" target="_blank">
> Szczegółowe zasady numeracji (wikipedia TD2) {{ $t('numgen.td2-wiki') }}
</a> </a>
</div> </div>
<hr /> <hr />
<div class="tab_actions"> <div class="tab_actions">
<button class="btn" @click="randomizeTrainNumber(true)">LOSUJ OBSZARY</button> <button class="btn" @click="randomizeTrainNumber(true)">{{ $t('numgen.action-random-region') }}</button>
<button class="btn" @click="randomizeTrainNumber(false)">LOSUJ NUMER</button> <button class="btn" @click="randomizeTrainNumber(false)">{{ $t('numgen.action-random-number') }}</button>
</div> </div>
</div> </div>
</div> </div>
+19 -19
View File
@@ -1,62 +1,61 @@
<template> <template>
<div class="stock-generator tab"> <div class="stock-generator tab">
<div class="tab_header"> <div class="tab_header">
<h2>GENERATOR SKŁADU TOWAROWEGO</h2> <h2>{{ $t('stockgen.title') }}</h2>
</div> </div>
<div class="tab_content"> <div class="tab_content">
<div> <div>
<h2>WŁAŚCIWOŚCI SKŁADU</h2> <h2>{{ $t('stockgen.properties-title') }}</h2>
<b class="text--accent"> <b class="text--accent">
&lArr; Dodaj lokomotywę na pierwsze miejsce listy, aby uwzględnić przy losowaniu składu! {{ $t('stockgen.properties-desc') }}
</b> </b>
<div class="tab_attributes"> <div class="tab_attributes">
<label> <label>
Maksymalna masa (t) {{ $t('stockgen.input-mass') }}
<input type="number" v-model="maxMass" step="100" max="4000" min="0" /> <input type="number" v-model="maxMass" step="100" max="4000" min="0" />
</label> </label>
<label> <label>
Maks. długość (m) {{ $t('stockgen.input-length') }}
<input type="number" v-model="maxLength" step="25" max="650" min="0" /> <input type="number" v-model="maxLength" step="25" max="650" min="0" />
</label> </label>
<label> <label>
Maks. liczba wagonów {{ $t('stockgen.input-carcount') }}
<input type="number" v-model="maxCarCount" step="1" max="60" min="1" /> <input type="number" v-model="maxCarCount" step="1" max="60" min="1" />
</label> </label>
</div> </div>
</div> </div>
<div> <div>
<h2>ŁADUNEK</h2> <h2>{{ $t('stockgen.cargo-title') }}</h2>
<b>Wybierz ładunki, którymi chcesz wypełnić dostępne wagony:</b> <b>{{ $t('stockgen.cargo-desc') }}</b>
</div> </div>
<div class="generator_cargo"> <div class="generator_cargo">
<button <button
class="btn" class="btn"
:data-chosen="chosenCargoTypes.includes(k.toString())" :data-chosen="chosenCargoTypes.includes(cargoName.toString())"
v-for="(v, k) in store.stockData?.generator.cargo" v-for="(cargoArray, cargoName) in store.stockData?.generator.cargo"
@click="toggleCargoChosen(k.toString(), v)" @click="toggleCargoChosen(cargoName.toString(), cargoArray)"
> >
{{ k }} {{ $t(`cargo.${cargoName}`) }}
</button> </button>
</div> </div>
<div> <div>
<h2>WAGONY Z WYBRANYMI ŁADUNKAMI</h2> <h2>{{ $t('stockgen.chosen-title') }}</h2>
<div class="generator_warning"> <div class="generator_warning">
<span v-if="computedChosenCarTypes.size == 0"> <span v-if="computedChosenCarTypes.size == 0">
Wybierz co najmniej jeden ładunek, aby zobaczyć wagony, które go posiadają! {{ $t('stockgen.chosen-empty-warning') }}
</span> </span>
<span v-else> <span v-else>
Wagony posiadające wybrane ładunki. Najedź na nazwę, aby zobaczyć podgląd wagonu. Kliknij, aby wyłączyć z {{ $t('stockgen.chosen-warning') }}
losowania (tylko podświetlone nazwy będą uwzględnione).
</span> </span>
</div> </div>
</div> </div>
@@ -80,14 +79,15 @@
<div class="tab_actions"> <div class="tab_actions">
<button class="btn" :data-disabled="computedChosenCarTypes.size == 0" @click="generateStock()"> <button class="btn" :data-disabled="computedChosenCarTypes.size == 0" @click="generateStock()">
WYGENERUJ {{ $t('stockgen.action-generate') }}
</button> </button>
<button class="btn" :data-disabled="computedChosenCarTypes.size == 0" @click="generateStock(true)"> <button class="btn" :data-disabled="computedChosenCarTypes.size == 0" @click="generateStock(true)">
WYGENERUJ PRÓŻNE WAGONY {{ $t('stockgen.action-generate-empty') }}
</button> </button>
<button class="btn" :data-disabled="computedChosenCarTypes.size == 0" @click="resetChosenCargo"> <button class="btn" :data-disabled="computedChosenCarTypes.size == 0" @click="resetChosenCargo">
ZRESETUJ ŁADUNKI {{ $t('stockgen.action-reset') }}
</button> </button>
</div> </div>
</div> </div>
+38 -29
View File
@@ -1,8 +1,12 @@
<template> <template>
<section class="stock-list-tab"> <section class="stock-list-tab">
<div class="stock_controls" :data-disabled="store.chosenStockListIndex == -1"> <div class="stock_controls" :data-disabled="store.chosenStockListIndex == -1">
<b class="no"> <b v-if="store.chosenStockListIndex >= 0">
POJAZD NR <span class="text--accent">{{ store.chosenStockListIndex + 1 }}</span> &nbsp; {{ $t('stocklist.vehicle-no') }} <span class="text--accent">{{ store.chosenStockListIndex + 1 }}</span> &nbsp;
</b>
<b v-else>
{{ $t('stocklist.no-vehicle-chosen') }}
</b> </b>
<button <button
@@ -11,7 +15,7 @@
@click="moveUpStock(store.chosenStockListIndex)" @click="moveUpStock(store.chosenStockListIndex)"
> >
<img :src="getIconURL('higher')" alt="move up vehicle" /> <img :src="getIconURL('higher')" alt="move up vehicle" />
PRZENIEŚ WYŻEJ {{ $t('stocklist.action-move-up') }}
</button> </button>
<button <button
@@ -20,7 +24,7 @@
@click="moveDownStock(store.chosenStockListIndex)" @click="moveDownStock(store.chosenStockListIndex)"
> >
<img :src="getIconURL('lower')" alt="move down vehicle" /> <img :src="getIconURL('lower')" alt="move down vehicle" />
PRZENIEŚ NIŻEJ {{ $t('stocklist.action-move-down') }}
</button> </button>
<button <button
@@ -29,7 +33,7 @@
@click="removeStock(store.chosenStockListIndex)" @click="removeStock(store.chosenStockListIndex)"
> >
<img :src="getIconURL('remove')" alt="remove vehicle" /> <img :src="getIconURL('remove')" alt="remove vehicle" />
USUŃ {{ $t('stocklist.action-remove') }}
</button> </button>
</div> </div>
@@ -37,7 +41,7 @@
<label class="file-label"> <label class="file-label">
<div class="btn btn--image"> <div class="btn btn--image">
<img src="/images/icon-upload.svg" alt="" /> <img src="/images/icon-upload.svg" alt="" />
WCZYTAJ {{ $t('stocklist.action-upload') }}
</div> </div>
<input type="file" @change="uploadStock" ref="conFile" accept=".con,.txt" /> <input type="file" @change="uploadStock" ref="conFile" accept=".con,.txt" />
@@ -45,22 +49,22 @@
<button class="btn btn--image" :data-disabled="stockIsEmpty" :disabled="stockIsEmpty" @click="downloadStock"> <button class="btn btn--image" :data-disabled="stockIsEmpty" :disabled="stockIsEmpty" @click="downloadStock">
<img src="/images/icon-download.svg" alt="download icon" /> <img src="/images/icon-download.svg" alt="download icon" />
POBIERZ {{ $t('stocklist.action-download') }}
</button> </button>
<button class="btn btn--image" :data-disabled="stockIsEmpty" :disabled="stockIsEmpty" @click="copyToClipboard"> <button class="btn btn--image" :data-disabled="stockIsEmpty" :disabled="stockIsEmpty" @click="copyToClipboard">
<img src="/images/icon-copy.svg" alt="copy icon" /> <img src="/images/icon-copy.svg" alt="copy icon" />
SKOPIUJ {{ $t('stocklist.action-copy') }}
</button> </button>
<button class="btn btn--image" :data-disabled="stockIsEmpty" :disabled="stockIsEmpty" @click="resetStock"> <button class="btn btn--image" :data-disabled="stockIsEmpty" :disabled="stockIsEmpty" @click="resetStock">
<img src="/images/icon-reset.svg" alt="reset icon" /> <img src="/images/icon-reset.svg" alt="reset icon" />
ZRESETUJ {{ $t('stocklist.action-reset') }}
</button> </button>
<button class="btn btn--image" :data-disabled="stockIsEmpty" :disabled="stockIsEmpty" @click="shuffleCars"> <button class="btn btn--image" :data-disabled="stockIsEmpty" :disabled="stockIsEmpty" @click="shuffleCars">
<img src="/images/icon-shuffle.svg" alt="shuffle icon" /> <img src="/images/icon-shuffle.svg" alt="shuffle icon" />
PRZETASUJ {{ $t('stocklist.action-shuffle') }}
</button> </button>
</div> </div>
@@ -74,11 +78,12 @@
</b> </b>
<span> <span>
Masa: <span class="text--accent">{{ store.totalMass }}t</span> (dopuszczalna: {{ $t('stocklist.mass') }} <span class="text--accent">{{ store.totalMass }}t</span> ({{
<span class="text--accent">{{ store.acceptableMass ? store.acceptableMass + 't' : '-' }}</span $t('stocklist.mass-accepted')
>) - Długość: }}: <span class="text--accent">{{ store.acceptableMass ? store.acceptableMass + 't' : '-' }}</span
>) - {{ $t('stocklist.length') }}:
<span class="text--accent">{{ store.totalLength }}m</span> <span class="text--accent">{{ store.totalLength }}m</span>
- vMax: <span class="text--accent">{{ store.maxStockSpeed }} km/h</span> - {{ $t('stocklist.vmax') }}: <span class="text--accent">{{ store.maxStockSpeed }} km/h</span>
</span> </span>
</div> </div>
@@ -89,34 +94,38 @@
v-model="store.isColdStart" v-model="store.isColdStart"
:disabled="!locoSupportsColdStart(store.stockList[0]?.constructionType || '')" :disabled="!locoSupportsColdStart(store.stockList[0]?.constructionType || '')"
/> />
Zimny start lokomotywy czołowej (tylko elektrowozy typów 303E i 203E) {{ $t('stocklist.coldstart-info') }}
</label> </label>
</div> </div>
<div class="stock_warnings" v-if="stockHasWarnings"> <div class="stock_warnings" v-if="stockHasWarnings">
<div class="warning" v-if="locoNotSuitable"> <div class="warning" v-if="locoNotSuitable">(!) {{ $t('stocklist.warning-not-suitable') }}</div>
Lokomotywy EP07 i EP08 przeznaczone jedynie do ruchu pasażerskiego!
</div>
<div class="warning" v-if="trainTooLong && store.isTrainPassenger"> <div class="warning" v-if="trainTooLong && store.isTrainPassenger">
Maksymalna długość składów pasażerskich nie może przekraczać 350m! (!) {{ $t('stocklist.warning-passenger-too-long') }}
</div> </div>
<div class="warning" v-if="trainTooLong && !store.isTrainPassenger"> <div class="warning" v-if="trainTooLong && !store.isTrainPassenger">
Maksymalna długość składów innych niż pasażerskie nie może przekraczać 650m! (!) {{ $t('stocklist.warning-freight-too-long') }}
</div> </div>
<div class="warning" v-if="trainTooHeavy"> <div class="warning" v-if="trainTooHeavy">
Ten skład jest za ciężki! Sprawdź (!)
<a <i18n-t keypath="stocklist.warning-too-heavy">
target="_blank" <template #href>
href="https://docs.google.com/spreadsheets/d/1bFXUsHsAu4youmNz-46Q1HslZaaoklvfoBDS553TnNk/edit" <a
> target="_blank"
dopuszczalne masy składów href="https://docs.google.com/spreadsheets/d/1bFXUsHsAu4youmNz-46Q1HslZaaoklvfoBDS553TnNk/edit"
</a> >
{{ $t('stocklist.acceptable-mass-docs') }}
</a>
</template>
</i18n-t>
</div> </div>
<div class="warning" v-if="tooManyLocomotives">Ten skład posiada za dużo pojazdów trakcyjnych!</div> <div class="warning" v-if="tooManyLocomotives">
{{ $t('stocklist.warning-too-many-locos') }}
</div>
</div> </div>
<StockThumbnails :onListItemClick="onListItemClick" /> <StockThumbnails :onListItemClick="onListItemClick" />
@@ -124,7 +133,7 @@
<!-- Stock list --> <!-- Stock list -->
<ul ref="stock_list"> <ul ref="stock_list">
<li v-if="stockIsEmpty" class="list-empty"> <li v-if="stockIsEmpty" class="list-empty">
<div class="stock-info">Lista pojazdów jest pusta!</div> <div class="stock-info">{{ $t('stocklist.list-empty') }}</div>
</li> </li>
<TransitionGroup name="stock-list-anim"> <TransitionGroup name="stock-list-anim">
+26 -31
View File
@@ -1,18 +1,22 @@
<template> <template>
<section class="wiki-list tab"> <section class="wiki-list tab">
<div class="tab_header"> <div class="tab_header">
<h2>LISTA DOSTĘPNYCH POJAZDÓW</h2> <h2>{{ $t('wiki.title') }}</h2>
</div> </div>
<div class="tab_content"> <div class="tab_content">
<div class="actions-panel"> <div class="actions-panel">
<div class="actions-panel_vehicles"> <div class="actions-panel_vehicles">
<button class="btn btn--choice" @click="changeWikiMode('locomotives')">POJ. TRAKCYJNE</button> <button class="btn btn--choice" @click="changeWikiMode('locomotives')">
<button class="btn btn--choice" @click="changeWikiMode('carWagons')">WAGONY</button> {{ $t('wiki.action-vehicles') }}
</button>
<button class="btn btn--choice" @click="changeWikiMode('carWagons')">
{{ $t('wiki.action-carriages') }}
</button>
</div> </div>
<div class="actions-panel_search"> <div class="actions-panel_search">
<input type="text" placeholder="Wyszukaj pojazd..." v-model="searchedVehicleTypeName" /> <input type="text" :placeholder="$t('wiki.search')" v-model="searchedVehicleTypeName" />
</div> </div>
</div> </div>
@@ -21,7 +25,7 @@
<thead> <thead>
<tr> <tr>
<th v-for="header in wikiMode == 'locomotives' ? locoHeaders : carHeaders" @click="toggleSorter(header)"> <th v-for="header in wikiMode == 'locomotives' ? locoHeaders : carHeaders" @click="toggleSorter(header)">
{{ header.name }} {{ $t(`wiki.header.${header.id}`) }}
<span v-if="currentModeSorter.id == header.id"> <span v-if="currentModeSorter.id == header.id">
{{ currentModeSorter.direction == 1 ? `&uArr;` : `&dArr;` }} {{ currentModeSorter.direction == 1 ? `&uArr;` : `&dArr;` }}
@@ -47,7 +51,7 @@
</td> </td>
<td>{{ loco.type }}</td> <td>{{ loco.type }}</td>
<td>{{ vehicleTypes[loco.power] }}</td> <td>{{ $t(`wiki.${loco.power}`) }}</td>
<td>{{ loco.constructionType }}</td> <td>{{ loco.constructionType }}</td>
<td>{{ locoSupportsColdStart(loco.constructionType) ? `&check;` : '&cross;' }}</td> <td>{{ locoSupportsColdStart(loco.constructionType) ? `&check;` : '&cross;' }}</td>
<td>{{ loco.length }}m</td> <td>{{ loco.length }}m</td>
@@ -108,39 +112,31 @@ type SorterID =
| 'coldStart'; | 'coldStart';
interface WikiHeader { interface WikiHeader {
name: string;
id: SorterID; id: SorterID;
sortable: boolean; sortable: boolean;
} }
const locoHeaders: WikiHeader[] = [ const locoHeaders: WikiHeader[] = [
{ name: 'Zdjęcie', id: 'image', sortable: false }, { id: 'image', sortable: false },
{ name: 'Nazwa', id: 'type', sortable: true }, { id: 'type', sortable: true },
{ name: 'Rodzaj', id: 'power', sortable: true }, { id: 'power', sortable: true },
{ name: 'Konstrukcja', id: 'constructionType', sortable: true }, { id: 'constructionType', sortable: true },
{ name: 'Zimny start', id: 'coldStart', sortable: true }, { id: 'coldStart', sortable: true },
{ name: 'Długość', id: 'length', sortable: true }, { id: 'length', sortable: true },
{ name: 'Masa', id: 'mass', sortable: true }, { id: 'mass', sortable: true },
{ name: 'Prędkość', id: 'maxSpeed', sortable: true }, { id: 'maxSpeed', sortable: true },
]; ];
const carHeaders: WikiHeader[] = [ const carHeaders: WikiHeader[] = [
{ name: 'Zdjęcie', id: 'image', sortable: false }, { id: 'image', sortable: false },
{ name: 'Nazwa', id: 'type', sortable: true }, { id: 'type', sortable: true },
{ name: 'Konstrukcja', id: 'constructionType', sortable: true }, { id: 'constructionType', sortable: true },
{ name: 'Długość', id: 'length', sortable: true }, { id: 'length', sortable: true },
{ name: 'Masa', id: 'mass', sortable: true }, { id: 'mass', sortable: true },
{ name: 'Prędkość', id: 'maxSpeed', sortable: true }, { id: 'maxSpeed', sortable: true },
{ name: 'Ładunki', id: 'cargoCount', sortable: true }, { id: 'cargoCount', sortable: true },
]; ];
const vehicleTypes: { [key: string]: string } = {
'loco-ezt': 'EZT',
'loco-szt': 'SZT',
'loco-s': 'Spalinowóz',
'loco-e': 'Elektrowóz',
};
export default defineComponent({ export default defineComponent({
mixins: [stockPreviewMixin, stockMixin], mixins: [stockPreviewMixin, stockMixin],
@@ -149,7 +145,6 @@ export default defineComponent({
store: useStore(), store: useStore(),
locoHeaders, locoHeaders,
carHeaders, carHeaders,
vehicleTypes,
locosScrollTop: 0, locosScrollTop: 0,
carsScrollTop: 0, carsScrollTop: 0,
@@ -348,7 +343,7 @@ export default defineComponent({
align-items: stretch; align-items: stretch;
flex-direction: column; flex-direction: column;
} }
.actions-panel_vehicles { .actions-panel_vehicles {
display: grid; display: grid;
grid-template-columns: 1fr 1fr; grid-template-columns: 1fr 1fr;
+7 -7
View File
@@ -26,13 +26,13 @@
"Rezerwa": [89, 92, 98] "Rezerwa": [89, 92, 98]
}, },
"categories": { "categories": {
"ekspres krajowy (EI)": "2:00-99:2", "EI": "2:00-99:2",
"(między)wojewódzki pośpieszny (MP/RP)": "2:050-169:3", "MP/RP": "2:050-169:3",
"wojewódzki osobowy (RO)": "2:200-999:3", "RO": "2:200-999:3",
"próżny \"służbowy\" (PW)": "2:6;3:0-899:3", "PW": "2:6;3:0-899:3",
"towarowy do przewozów masowych (TM)": "2:4;3:0-899:3", "TM": "2:4;3:0-899:3",
"towarowy do obsługi stacji (TK)": "2:3;3:0-899:3", "TK": "2:3;3:0-899:3",
"lokomotywa luzem (LT)": "2:5;3:0-899:3" "LT": "2:5;3:0-899:3"
} }
} }
+8
View File
@@ -1,5 +1,6 @@
import localePL from './locales/pl.json'; import localePL from './locales/pl.json';
import localeEN from './locales/en.json'; import localeEN from './locales/en.json';
import { I18n } from 'vue-i18n';
export type LocaleMessageSchema = typeof localePL; export type LocaleMessageSchema = typeof localePL;
type LocaleKey = 'en' | 'pl'; type LocaleKey = 'en' | 'pl';
@@ -8,3 +9,10 @@ export const locales: { [key in LocaleKey]: LocaleMessageSchema } = {
en: localeEN, en: localeEN,
pl: localePL, pl: localePL,
}; };
export async function fetchBackendTranslations(i18n: I18n) {
const localeData = await (await fetch(`https://spythere.github.io/api/td2/data/locales.json`)).json();
i18n.global.mergeLocaleMessage('pl', localeData.pl);
i18n.global.mergeLocaleMessage('en', localeData.en);
}
+126 -1
View File
@@ -1,5 +1,130 @@
{ {
"app": { "app": {
"title": "Rolling stock editor" "title": "ROLLING STOCK EDITOR"
},
"footer": {
"disclaimer": "This site has only an informational intent. The author does not carry responsibility for creating trains not allowed by {tos}!",
"tos": "Train Driver 2 simulator rules",
"tos-href": "https://docs.google.com/document/d/1UAAPUtN0d_RoS4RgOzEzllJZJhA0VcizzCzKW4QylbY/edit#heading=h.1ldcvhomwjp9",
"version-check": "Site is complete for version {version} of Train Driver 2 simulator"
},
"inputs": {
"title": "CHOOSE A VEHICLE",
"input-vehicle": "Choose a traction unit",
"input-carwagon": "Choose a carriage",
"cargo-title": "Cargo (only selected freight cars)",
"no-cargo-available": "no cargo available",
"cargo-empty": "empty",
"loco-e": "ELECTR.",
"loco-s": "DIESEL",
"loco-ezt": "EMU",
"loco-szt": "DMU",
"car-passenger": "PASSENGER",
"car-cargo": "FREIGHT",
"action-add": "ADD NEW",
"action-swap": "SWAP WITH",
"real-stock": "REAL POLISH STOCK"
},
"preview": {
"title": "RAILWAY VEHICLE PREVIEW",
"loading": "IMAGE LOADING...",
"desc": "Choose a railway vehicle above to see its preview",
"sponsor-only": "* SPONSORS ONLY",
"loco-e": "ELECTRIC LOCO",
"loco-s": "DIESEL LOCO",
"loco-ezt": "ELECTRIC M.U.",
"loco-szt": "DIESEL M.U.",
"car-passenger": "PASSENGER CARRIAGE",
"car-cargo": "FREIGHT CAR",
"cabin": "Cabin type:",
"construction": "Construction type:"
},
"topbar": {
"stock-list": "STOCK",
"wiki-list": "VEHICLES",
"number-generator": "NUMBER GEN.",
"stock-generator": "STOCK GEN."
},
"stocklist": {
"vehicle-no": "VEHICLE NO.",
"no-vehicle-chosen": "NO VEHICLE CHOSEN",
"action-move-up": "MOVE UP",
"action-move-down": "MOVE DOWN",
"action-remove": "REMOVE",
"action-upload": "LOAD",
"action-download": "DOWNLOAD",
"action-copy": "COPY",
"action-reset": "RESET",
"action-shuffle": "SHUFFLE",
"mass": "Mass",
"mass-accepted": "accepted",
"length": "Length",
"vmax": "vMax",
"coldstart-info": "Cold start heading locomotive (only locos 303E & 203E type)",
"list-empty": "Stock list is empty!",
"warning-not-suitable": "EP07 & EP08 type locomotives are designed for passenger traffic only!",
"warning-passenger-too-long": "Maximum length of a passenger train may not be greater than 350m!",
"warning-freight-too-long": "Maximum length of a freight train may not be greater than 650m!",
"warning-too-many-locos": "This train has too many traction units!",
"warning-too-heavy": "This train is too heavy! Check {href}",
"acceptable-mass-docs": "acceptable rolling stock masses (PL)"
},
"stockgen": {
"title": "FREIGHT TRAIN GENERATOR",
"properties-title": "ROLLING STOCK PROPERTIES",
"properties-desc": "⇐ Add a locomotive in the first place of the stock list to include it in a drawing!",
"input-mass": "Max. mass (t)",
"input-length": "Max. length (m)",
"input-carcount": "Max. car count",
"cargo-title": "CARGO",
"cargo-desc": "Choose cargo you want to fill available cars with:",
"chosen-title": "CARS WITH CHOSEN CARGO",
"chosen-empty-warning": "Choose at least one cargo type to see available cars!",
"chosen-warning": "Cars containing chosen cargo are shown below. Hover over a type to see a preview of the car. Click it to include/exclude it from a drawing (only highlighted types will be included).",
"action-generate": "GENERATE",
"action-generate-empty": "GENERATE EMPTY",
"action-reset": "RESET CARGO"
},
"numgen": {
"title": "TRAIN NUMBER GENERATOR",
"start-region": "Beginning construction region",
"end-region": "Terminating construction region",
"train-category": "Train category",
"number-info": "Generated train number:",
"warning": "Choose category and construction regions (optionally)",
"td2-wiki": "> Polish rules of train numbering (TD2 wiki)",
"td2-wiki-link": "https://wiki.td2.info.pl/index.php?title=Zasady_numeracji_poci%C4%85g%C3%B3w/en",
"action-random-region": "DRAW REGIONS",
"action-random-number": "DRAW A NUMBER",
"categories": {
"EI": "domestic express (EI)",
"MP/RP": "(inter)voivodeship bullet (MP/RP)",
"RO": "regional passenger (RO)",
"PW": "empty passenger (PW)",
"TM": "mass transport freight (TM)",
"TK": "non-mass transport freight (TK)",
"LT": "locomotive alone (LT)"
}
},
"wiki": {
"title": "LIST OF AVAILABLE VEHICLES",
"action-vehicles": "TRACTION UNITS",
"action-carriages": "CARRIAGES",
"search": "Search for a vehicle...",
"header": {
"image": "Image",
"type": "Name",
"power": "Type",
"constructionType": "Construction",
"coldStart": "Cold start",
"length": "Length",
"mass": "Mass",
"maxSpeed": "Speed",
"cargoCount": "Cargo count"
},
"loco-ezt": "EMU",
"loco-szt": "DMU",
"loco-s": "Diesel locomotive",
"loco-e": "Electric locomotive"
} }
} }
+58 -30
View File
@@ -3,12 +3,13 @@
"title": "EDYTOR SKŁADÓW ONLINE" "title": "EDYTOR SKŁADÓW ONLINE"
}, },
"footer": { "footer": {
"disclaimer": "Ta strona ma charakter informacyjny. Autor nie ponosi odpowiedzialności za tworzenie pociągów niezgodnych z {href}!", "disclaimer": "Ta strona ma charakter informacyjny. Autor nie ponosi odpowiedzialności za tworzenie pociągów niezgodnych z {tos}!",
"tos": "regulaminem symulatora Train Driver 2", "tos": "regulaminem symulatora Train Driver 2",
"tos-href": "https://docs.google.com/document/d/1UAAPUtN0d_RoS4RgOzEzllJZJhA0VcizzCzKW4QylbY/edit",
"version-check": "Strona jest kompletna dla wersji {version} symulatora TD2" "version-check": "Strona jest kompletna dla wersji {version} symulatora TD2"
}, },
"inputs": { "inputs": {
"title": "WYBIERZ POJAZDY / WAGONY", "title": "WYBIERZ POJAZD SZYNOWY",
"input-vehicle": "Wybierz pojazd trakcyjny", "input-vehicle": "Wybierz pojazd trakcyjny",
"input-carwagon": "Wybierz wagon", "input-carwagon": "Wybierz wagon",
"cargo-title": "Ładunek (tylko wybrane towarowe)", "cargo-title": "Ładunek (tylko wybrane towarowe)",
@@ -26,13 +27,17 @@
}, },
"preview": { "preview": {
"title": "PODGLĄD WYBRANEGO POJAZDU", "title": "PODGLĄD WYBRANEGO POJAZDU",
"loading": "ŁADOWANIE OBRAZU...",
"desc": "Wybierz pojazd lub wagon, aby zobaczyć jego podgląd powyżej", "desc": "Wybierz pojazd lub wagon, aby zobaczyć jego podgląd powyżej",
"sponsor-only": "* TYLKO DLA SPONSORÓW",
"loco-e": "ELEKTROWÓZ", "loco-e": "ELEKTROWÓZ",
"loco-s": "SPALINOWÓZ", "loco-s": "SPALINOWÓZ",
"loco-ezt": "EZT", "loco-ezt": "EZT",
"loco-szt": "SZT", "loco-szt": "SZT",
"car-passenger": "WAGON PASAŻERSKI", "car-passenger": "WAGON PASAŻERSKI",
"car-cargo": "WAGON TOWAROWY" "car-cargo": "WAGON TOWAROWY",
"cabin": "Typ kabiny:",
"construction": "Typ konstrukcji:"
}, },
"topbar": { "topbar": {
"stock-list": "SKŁAD", "stock-list": "SKŁAD",
@@ -42,6 +47,7 @@
}, },
"stocklist": { "stocklist": {
"vehicle-no": "POJAZD NR", "vehicle-no": "POJAZD NR",
"no-vehicle-chosen": "NIE WYBRANO POJAZDU",
"action-move-up": "PRZENIEŚ WYŻEJ", "action-move-up": "PRZENIEŚ WYŻEJ",
"action-move-down": "PRZENIEŚ NIŻEJ", "action-move-down": "PRZENIEŚ NIŻEJ",
"action-remove": "USUŃ", "action-remove": "USUŃ",
@@ -51,11 +57,17 @@
"action-reset": "ZRESETUJ", "action-reset": "ZRESETUJ",
"action-shuffle": "PRZETASUJ", "action-shuffle": "PRZETASUJ",
"mass": "Masa", "mass": "Masa",
"mass-accepted": "Masa dopuszczalna", "mass-accepted": "dopuszczalna",
"length": "Długość", "length": "Długość",
"vmax": "vMax", "vmax": "vMax",
"coldstart-info": "Zimny start lokomotywy czołowej (tylko elektrowozy typów 303E i 203E)", "coldstart-info": "Zimny start lokomotywy czołowej (tylko elektrowozy typów 303E i 203E)",
"list-empty-warning": "Lista pojazdów jest pusta!" "list-empty": "Lista pojazdów jest pusta!",
"warning-not-suitable": "Lokomotywy EP07 i EP08 są przeznaczone jedynie do ruchu pasażerskiego!",
"warning-passenger-too-long": "Maksymalna długość składów pasażerskich nie może przekraczać 350m!",
"warning-freight-too-long": "Maksymalna długość składów innych niż pasażerskie nie może przekraczać 650m!",
"warning-too-many-locos": "Ten skład posiada za dużo pojazdów trakcyjnych!",
"warning-too-heavy": "Ten skład jest za ciężki! Sprawdź {href}",
"acceptable-mass-docs": "dopuszczalne masy składów"
}, },
"stockgen": { "stockgen": {
"title": "GENERATOR SKŁADU TOWAROWEGO", "title": "GENERATOR SKŁADU TOWAROWEGO",
@@ -73,30 +85,46 @@
"action-generate-empty": "WYGENERUJ PRÓŻNE WAGONY", "action-generate-empty": "WYGENERUJ PRÓŻNE WAGONY",
"action-reset": "ZRESETUJ ŁADUNKI" "action-reset": "ZRESETUJ ŁADUNKI"
}, },
"cargo": { "numgen": {
"kontenery": "kontenery", "title": "GENERATOR NUMERU POCIĄGU",
"chłodnia": "chłodnia", "start-region": "Początkowy obszar konstrukcyjny",
"drobnica": "drobnica", "end-region": "Końcowy obszar konstrukcyjny",
"węgiel": "węgiel", "train-category": "Kategoria pociągu",
"ruda": "ruda", "number-info": "Wygenerowany numer pociągu:",
"piasek": "piasek", "warning": "Wybierz kategorię oraz obszary konstrukcyjne (opcjonalnie)",
"kreda": "kreda", "td2-wiki": "> Szczegółowe zasady numeracji (wikipedia TD2)",
"kamień": "kamień", "td2-wiki-link": "https://wiki.td2.info.pl/index.php?title=Zasady_numeracji_poci%C4%85g%C3%B3w",
"złom": "złom", "action-random-region": "LOSUJ OBSZARY",
"paliwo": "paliwo", "action-random-number": "LOSUJ NUMER",
"melasa": "melasa", "categories": {
"żwir": "żwir", "EI": "ekspres krajowy (EI)",
"koła": "koła", "MP/RP": "(między)wojewódzki pośpieszny (MP/RP)",
"drewno": "drewno", "RO": "wojewódzki osobowy (RO)",
"szyny": "szyny", "PW": "próżny \"służbowy\" (PW)",
"kable": "kable", "TM": "towarowy do przewozów masowych (TM)",
"kruszywo": "kruszywo", "TK": "towarowy do obsługi stacji (TK)",
"techniczne": "techniczne", "LT": "lokomotywa luzem (LT)"
"poczta": "poczta", }
"cement": "cement", },
"wapno": "wapno", "wiki": {
"soda": "soda", "title": "LISTA DOSTĘPNYCH POJAZDÓW",
"pszenica": "pszenica", "action-vehicles": "POJ. TRAKCYJNE",
"kukurydza": "kukurydza" "action-carriages": "WAGONY",
"search": "Wyszukaj pojazd...",
"header": {
"image": "Zdjęcie",
"type": "Nazwa",
"power": "Rodzaj",
"constructionType": "Konstrukcja",
"coldStart": "Zimny start",
"length": "Długość",
"mass": "Masa",
"maxSpeed": "Prędkość",
"cargoCount": "Ładunki"
},
"loco-ezt": "EZT",
"loco-szt": "SZT",
"loco-s": "Spalinowóz",
"loco-e": "Elektrowóz"
} }
} }
+4 -2
View File
@@ -4,18 +4,20 @@ import { registerSW } from 'virtual:pwa-register';
import { createI18n } from 'vue-i18n'; import { createI18n } from 'vue-i18n';
import App from './App.vue'; import App from './App.vue';
import { LocaleMessageSchema, locales } from './i18n'; import { LocaleMessageSchema, fetchBackendTranslations, locales } from './i18n';
const pinia = createPinia(); const pinia = createPinia();
const i18n = createI18n<[LocaleMessageSchema], 'en' | 'pl'>({ const i18n = createI18n<[LocaleMessageSchema], 'en' | 'pl'>({
locale: 'pl', locale: 'en',
fallbackLocale: 'pl', fallbackLocale: 'pl',
legacy: false, legacy: false,
globalInjection: true, globalInjection: true,
messages: locales, messages: locales,
}); });
fetchBackendTranslations(i18n);
registerSW({ registerSW({
immediate: true, immediate: true,
}); });