Commit c2ef9afc authored by Richard Blechinger's avatar Richard Blechinger
Browse files

Translate entire app to German

parent 73e82e4f
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
v-if="!selectedShow" v-if="!selectedShow"
class="tw-text-center tw-my-8" class="tw-text-center tw-my-8"
> >
Lädt... {{ $t('loading') }}
</div> </div>
<b-container <b-container
...@@ -14,23 +14,24 @@ ...@@ -14,23 +14,24 @@
> >
<h1> <h1>
<template v-if="id"> <template v-if="id">
Playliste {{ playlistEditor.id }} für Sendung '{{ selectedShow.name }}' bearbeiten {{ $t('playlistEditor.titleExisting', { id: playlistEditor.id, show: selectedShow.name }) }}
</template> </template>
<template v-else> <template v-else>
Neue Playliste für Sendung '{{ selectedShow.name }}' hinzufügen {{ $t('playlistEditor.titleNew', { show: selectedShow.name } ) }}
</template> </template>
</h1> </h1>
<b-row class="tw-my-8 tw-items-center"> <b-row class="tw-my-8 tw-items-center">
<b-col cols="2"> <b-col cols="2">
Beschreibung: {{ $t('showMeta.description') }}:
</b-col> </b-col>
<b-col> <b-col>
<b-form-input <b-form-input
v-model="playlistEditor.description" v-model="playlistEditor.description"
type="text" type="text"
placeholder="Beschreibung eingeben..." :placeholder="$t('showMeta.descriptionPlaceholder')"
/> />
</b-col> </b-col>
</b-row> </b-row>
...@@ -41,7 +42,7 @@ ...@@ -41,7 +42,7 @@
v-if="playlistEditor.entries.length === 0" v-if="playlistEditor.entries.length === 0"
align="center" align="center"
> >
Noch keine Einträge vorhanden. Füge doch welche hinzu! {{ $t('playlistEditor.noEntriesAvailable') }}
</div> </div>
<!-- As soon as we have at least one entry in our temporary playlist <!-- As soon as we have at least one entry in our temporary playlist
we can display a table with all the info and action buttons --> we can display a table with all the info and action buttons -->
...@@ -69,25 +70,25 @@ ...@@ -69,25 +70,25 @@
v-if="data.item.file" v-if="data.item.file"
variant="success" variant="success"
> >
Datei {{ $t('playlistEditor.types.file') }}
</b-badge> </b-badge>
<b-badge <b-badge
v-else-if="data.item.uri.startsWith('line://')" v-else-if="data.item.uri.startsWith('line://')"
variant="info" variant="info"
> >
Line-in {{ $t('playlistEditor.types.lineIn') }}
</b-badge> </b-badge>
<b-badge <b-badge
v-else-if="data.item.uri.startsWith('http://') || data.item.uri.startsWith('https://')" v-else-if="data.item.uri.startsWith('http://') || data.item.uri.startsWith('https://')"
variant="light" variant="light"
> >
Stream {{ $t('playlistEditor.types.stream') }}
</b-badge> </b-badge>
<b-badge <b-badge
v-else v-else
variant="dark" variant="dark"
> >
Andere {{ $t('playlistEditor.types.other') }}
</b-badge> </b-badge>
</template> </template>
...@@ -95,54 +96,54 @@ ...@@ -95,54 +96,54 @@
Here we display where this playlist entry is coming from Here we display where this playlist entry is coming from
--> -->
<template v-slot:cell(source)="data"> <template v-slot:cell(source)="data">
<span v-if="data.item.file"> <span v-if="data.item.file">
<span class="tw-font-bold">{{ getFileTitleForPlaylist(data.item.file.show, data.item.file.id) }}</span><br> <span class="tw-font-bold">{{ getFileTitleForPlaylist(data.item.file.show, data.item.file.id) }}</span><br>
<span class="tw-text-gray-700">(file://{{ data.item.file.show }}/{{ data.item.file.id }})</span> <span class="tw-text-gray-700">(file://{{ data.item.file.show }}/{{ data.item.file.id }})</span>
</span> </span>
<span v-else> <span v-else>
{{ data.item.uri }} {{ data.item.uri }}
</span> </span>
</template> </template>
<!-- Column: Duration <!-- Column: Duration
Here we give the user the ability to edit the duration of an entry. Here we give the user the ability to edit the duration of an entry.
--> -->
<template v-slot:cell(duration)="data"> <template v-slot:cell(duration)="data">
<span v-if="playlistEditor.durationField === data.index"> <span v-if="playlistEditor.durationField === data.index">
<input <input
ref="durationField" ref="durationField"
v-model="playlistEditor.newDuration" v-model="playlistEditor.newDuration"
type="text" type="text"
class="tw-w-24" class="tw-w-24"
placeholder="hh:mm:ss" placeholder="hh:mm:ss"
pattern="\d{2}:\d{2}(:\d{2})?" pattern="\d{2}:\d{2}(:\d{2})?"
@blur="checkAndUpdateDuration" @blur="checkAndUpdateDuration"
> >
</span> </span>
<span v-else-if="data.item.file"> <span v-else-if="data.item.file">
{{ prettyNanoseconds(getFileById(data.item.file.id).duration) }} {{ prettyNanoseconds(getFileById(data.item.file.id).duration) }}
</span> </span>
<span <span
v-else-if="data.item.duration" v-else-if="data.item.duration"
v-b-tooltip="'Klicken um zu bearbeiten'" v-b-tooltip="'Klicken um zu bearbeiten'"
class="tw-underline hover:tw-no-underline tw-cursor-pointer" class="tw-underline hover:tw-no-underline tw-cursor-pointer"
@click="toggleDurationField(data.index)" @click="toggleDurationField(data.index)"
> >
{{ prettyNanoseconds(data.item.duration) }} {{ prettyNanoseconds(data.item.duration) }}
</span> </span>
<span v-else> <span v-else>
<span <span
v-b-tooltip="'Klicken um zu bearbeiten'" v-b-tooltip="'Klicken um zu bearbeiten'"
class="tw-text-gray-700 tw-underline hover:tw-no-underline tw-cursor-pointer" class="tw-text-gray-700 tw-underline hover:tw-no-underline tw-cursor-pointer"
@click="toggleDurationField(data.index)" @click="toggleDurationField(data.index)"
> >
(Unbekannt) {{ $t('playlistEditor.unknownDuration') }}
</span> </span>
</span> </span>
</template> </template>
...@@ -168,7 +169,7 @@ ...@@ -168,7 +169,7 @@
variant="danger" variant="danger"
@click="deletePlaylistItem(data.index)" @click="deletePlaylistItem(data.index)"
> >
Delete {{ $t('delete') }}
</b-button> </b-button>
</b-button-group> </b-button-group>
</template> </template>
...@@ -177,8 +178,8 @@ ...@@ -177,8 +178,8 @@
<hr> <hr>
<p class="d-flex justify-content-between border-t"> <p class="d-flex justify-content-between border-t">
<span class="font-weight-bold">Playlisteinträge</span> <span class="font-weight-bold">{{ $t('playlistTable.entries') }}</span>
<span>Dauer: {{ playlistDuration }}</span> <span>{{ $t('playlistTable.duration') }}: {{ playlistDuration }}</span>
</p> </p>
<hr> <hr>
...@@ -187,11 +188,7 @@ ...@@ -187,11 +188,7 @@
v-if="playlistExceedsAllowedUnknowns" v-if="playlistExceedsAllowedUnknowns"
class="tw-text-red-600 tw-my-4" class="tw-text-red-600 tw-my-4"
> >
Es gibt 2 oder mehr Einträge die eine unbekannte Dauer haben. Bitte korrigiere das, indem du auf die {{ $t('playlistEditor.tooManyUnknowns') }}
Dauer
in der Tabelle klickst und manuell eine einträgst. Es darf maximal ein Eintrag mit unbekannter Dauer
vorhanden
sein.
</div> </div>
</div> </div>
...@@ -204,20 +201,20 @@ ...@@ -204,20 +201,20 @@
--> -->
<b-modal <b-modal
id="modal-edit-playlist-add-stream" id="modal-edit-playlist-add-stream"
title="Add stream to the playlist" :title="$t('playlistEditor.addStream')"
:cancel-title="$t('cancel')"
@ok="addPlaylistItemStream('save')" @ok="addPlaylistItemStream('save')"
> >
<b-input <b-input
v-model="playlistEditor.newStreamURL" v-model="playlistEditor.newStreamURL"
type="url" type="url"
> >
...
</b-input> </b-input>
</b-modal> </b-modal>
<div class="tw-flex tw-justify-between"> <div class="tw-flex tw-justify-between">
<b-button-group> <b-button-group>
<b-dropdown text="Datei"> <b-dropdown :text="$t('playlistEditor.types.file')">
<b-dropdown-item <b-dropdown-item
v-for="(file, index) in files" v-for="(file, index) in files"
:key="index" :key="index"
...@@ -227,23 +224,23 @@ ...@@ -227,23 +224,23 @@
prettyNanoseconds(file.duration) }}, {{ prettyFileSize(file.size) }}, {{ file.source.uri }}) prettyNanoseconds(file.duration) }}, {{ prettyFileSize(file.size) }}, {{ file.source.uri }})
</b-dropdown-item> </b-dropdown-item>
</b-dropdown> </b-dropdown>
<b-dropdown text="Line-in"> <b-dropdown :text="$t('playlistEditor.types.lineIn')">
<b-dropdown-item @click="addPlaylistItemLine('0')"> <b-dropdown-item @click="addPlaylistItemLine('0')">
Studio 1 {{ $t('playlistEditor.lineIns.studio1') }}
</b-dropdown-item> </b-dropdown-item>
<b-dropdown-item @click="addPlaylistItemLine('1')"> <b-dropdown-item @click="addPlaylistItemLine('1')">
Preprod {{ $t('playlistEditor.lineIns.preProd') }}
</b-dropdown-item> </b-dropdown-item>
<b-dropdown-item @click="addPlaylistItemLine('2')"> <b-dropdown-item @click="addPlaylistItemLine('2')">
Line 2 {{ $t('playlistEditor.lineIns.line2') }}
</b-dropdown-item> </b-dropdown-item>
</b-dropdown> </b-dropdown>
<b-button <b-button
@click="addPlaylistItemStream('openModal')" @click="addPlaylistItemStream('openModal')"
> >
Stream {{ $t('playlistEditor.types.stream') }}
</b-button> </b-button>
</b-button-group> </b-button-group>
...@@ -252,7 +249,7 @@ ...@@ -252,7 +249,7 @@
:disabled="playlistExceedsAllowedUnknowns" :disabled="playlistExceedsAllowedUnknowns"
@click="storePlaylist" @click="storePlaylist"
> >
Speichern {{ $t('save') }}
</b-button> </b-button>
</div> </div>
</b-container> </b-container>
...@@ -286,19 +283,21 @@ ...@@ -286,19 +283,21 @@
durationField: false, durationField: false,
newDuration: "" newDuration: ""
}, },
// configuration of the playlists entries table
playlistEditTableFields: [
{key: 'id', label: 'Index', class: 'align-middle'},
{key: 'type', label: 'Typ', class: 'align-middle'},
{key: 'source', label: 'Quelle', class: 'align-middle'},
{key: 'duration', label: 'Dauer', class: 'align-middle'},
{key: 'actions', label: 'Aktionen', class: 'text-right align-middle'},
]
} }
}, },
computed: { computed: {
// configuration of the playlists entries table
playlistEditTableFields() {
return [
{key: 'id', label: this.$t('playlistTable.index'), class: 'align-middle'},
{key: 'type', label: this.$t('playlistTable.type'), class: 'align-middle'},
{key: 'source', label: this.$t('playlistTable.source'), class: 'align-middle'},
{key: 'duration', label: this.$t('playlistTable.duration'), class: 'align-middle'},
{key: 'actions', label: this.$t('playlistTable.actions'), class: 'text-right align-middle'},
]
},
loaded() { loaded() {
return { return {
playlists: this.$store.state.playlists.loaded.playlists, playlists: this.$store.state.playlists.loaded.playlists,
...@@ -378,7 +377,7 @@ ...@@ -378,7 +377,7 @@
} }
if (!this.$refs.durationField.checkValidity()) { if (!this.$refs.durationField.checkValidity()) {
this.$refs.durationField.setCustomValidity('Bitte gib eine Dauer im Format mm:ss oder hh:mm:ss an.'); this.$refs.durationField.setCustomValidity(this.$t('playlistEditor.invalidDurationFormat'));
this.$refs.durationField.reportValidity(); this.$refs.durationField.reportValidity();
return; return;
} }
......
<template> <template>
<b-container> <b-container>
<h1>Credits</h1> <h1>{{ $t('credits.title') }}</h1>
<p> <p>
AURA is developed under the GNU Affero General Public License v3. Current and former developers are:<br> {{ $t('credits.intro') }}<br>
</p> </p>
<ul> <ul>
<li> <li>
...@@ -63,24 +63,19 @@ ...@@ -63,24 +63,19 @@
</li> </li>
</ul> </ul>
<p> <p>
<b>Graphics &amp; Icons</b><br> <b>{{ $t('credits.graphicsIcons') }}</b><br>
</p> </p>
<ul> <ul>
<li> <li>
animated loading icon: <a href="https://loading.io/spinner">spinner by loading.io</a> (CC-BY License). {{ $t('credits.loadingIcon') }}: <a href="https://loading.io/spinner">spinner by loading.io</a> (CC-BY License).
</li> </li>
<li> <li>
all other Icons: {{ $t('credits.otherIcons') }}:
<a href="http://tango.freedesktop.org/">Tango Project</a> (Public Domain) <a href="http://tango.freedesktop.org/">Tango Project</a> (Public Domain),
and <a href="https://bootstrap-vue.org/docs/icons">BootstrapVue</a> (MIT). <a href="https://bootstrap-vue.org/docs/icons">BootstrapVue</a> (MIT).
</li> </li>
</ul> </ul>
<p> <p v-html="$t('credits.moreInfo')" />
For more infos visit the <a href="https://gitlab.servus.at/aura/dashboard">dashboard repository</a>.
To get the big picture of the whole AURA architecture, visit the
<a href="https://gitlab.servus.at/aura/meta">AURA meta repo</a>.
All AURA repos can be found at <a href="https://gitlab.servus.at/aura">https://gitlab.servus.at/aura</a>.
</p>
</b-container> </b-container>
</template> </template>
...@@ -98,6 +93,6 @@ animated loading icon: <a href="https://loading.io/spinner">spinner by loading.i ...@@ -98,6 +93,6 @@ animated loading icon: <a href="https://loading.io/spinner">spinner by loading.i
} }
a { a {
color: #c09; color: #c09 !important;
} }
</style> </style>
...@@ -10,64 +10,72 @@ ...@@ -10,64 +10,72 @@
<hr> <hr>
<b-alert <b-alert
variant="danger" :variant="conflictCount > 0 ? 'danger' : 'success'"
:show="conflictMode" :show="conflictMode"
> >
<div <div
v-if="conflictMode" v-if="conflictMode"
align="center"
> >
<h4>Conflict Resolution</h4> <h4>{{ $t('conflictResolution.title') }}</h4>
<p> <p
for new schedule :class="{
from <b>{{ resolveData.schedule.dstart }}, {{ resolveData.schedule.tstart }}</b> 'tw-mb-4': resolveData.schedule.rrule === 1,
to <b>{{ resolveData.schedule.tend }}</b>. 'tw-mb-0': resolveData.schedule.rrule !== 1
</p> }"
<p v-if="resolveData.schedule.rrule !== 1">
This is a recurring event: <b>{{ rruleRender(resolveData.schedule.rrule) }}</b>, v-html="$t('conflictResolution.newSchedule', {
until: <b>{{ resolveData.schedule.until }}</b>. dstart: this.prettyDate(resolveData.schedule.dstart),
</p> tstart: resolveData.schedule.tstart,
tend: resolveData.schedule.tend,
})"
/>
<p
v-if="resolveData.schedule.rrule !== 1"
v-html="$t('conflictResolution.recurringSchedule', {
rrule: this.rruleRender(resolveData.schedule.rrule),
until: this.prettyDate(resolveData.schedule.until)
})"
/>
<div v-if="submitting"> <div v-if="submitting">
<b-row> <b-row>
<b-col align="center"> <b-col align="center">
<img <img
src="/assets/radio.gif" src="/assets/radio.gif"
alt="submitting resolve data" :alt="$t('loading')"
> >
</b-col> </b-col>
</b-row> </b-row>
</div> </div>
<div v-else> <div v-else>
<p v-if="conflictCount > 0"> <div v-if="conflictCount > 0">
Conflicts left to resolve: <p>{{ $t('conflictResolution.leftToResolve', { smart_count: conflictCount }) }}</p>
<b-badge variant="danger">
{{ conflictCount }}
</b-badge>
&nbsp;
<b-button <b-button
variant="danger" variant="danger"
size="sm" size="sm"
@click="resolveCancel" @click="resolveCancel"
> >
Cancel {{ $t('cancel') }}
</b-button> </b-button>
</p> </div>
<p v-else> <div v-else>
<p>{{ $t('conflictResolution.noneLeftToResolve') }}</p>
<b-button <b-button
variant="success" variant="success"
@click="resolveSubmit" @click="resolveSubmit"
> >
0 conflicts left! Submit this solution. {{ $t('conflictResolution.applySolution') }}
</b-button> </b-button>
&nbsp; &nbsp;
<b-button <b-button
variant="danger" variant="danger"
@click="resolveCancel" @click="resolveCancel"
> >
Cancel {{ $t('cancel') }}
</b-button> </b-button>
</p> </div>
</div> </div>
</div> </div>
</b-alert> </b-alert>
...@@ -115,6 +123,7 @@ ...@@ -115,6 +123,7 @@
import modalEmissionManagerEdit from '@/components/emissions/ModalEdit.vue' import modalEmissionManagerEdit from '@/components/emissions/ModalEdit.vue'
import AuthWall from '@/components/AuthWall.vue' import AuthWall from '@/components/AuthWall.vue'