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

Translate entire app to German

parent 73e82e4f
......@@ -5,7 +5,7 @@
v-if="!selectedShow"
class="tw-text-center tw-my-8"
>
Lädt...
{{ $t('loading') }}
</div>
<b-container
......@@ -14,23 +14,24 @@
>
<h1>
<template v-if="id">
Playliste {{ playlistEditor.id }} für Sendung '{{ selectedShow.name }}' bearbeiten
{{ $t('playlistEditor.titleExisting', { id: playlistEditor.id, show: selectedShow.name }) }}
</template>
<template v-else>
Neue Playliste für Sendung '{{ selectedShow.name }}' hinzufügen
{{ $t('playlistEditor.titleNew', { show: selectedShow.name } ) }}
</template>
</h1>
<b-row class="tw-my-8 tw-items-center">
<b-col cols="2">
Beschreibung:
{{ $t('showMeta.description') }}:
</b-col>
<b-col>
<b-form-input
v-model="playlistEditor.description"
type="text"
placeholder="Beschreibung eingeben..."
:placeholder="$t('showMeta.descriptionPlaceholder')"
/>
</b-col>
</b-row>
......@@ -41,7 +42,7 @@
v-if="playlistEditor.entries.length === 0"
align="center"
>
Noch keine Einträge vorhanden. Füge doch welche hinzu!
{{ $t('playlistEditor.noEntriesAvailable') }}
</div>
<!-- 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 -->
......@@ -69,25 +70,25 @@
v-if="data.item.file"
variant="success"
>
Datei
{{ $t('playlistEditor.types.file') }}
</b-badge>
<b-badge
v-else-if="data.item.uri.startsWith('line://')"
variant="info"
>
Line-in
{{ $t('playlistEditor.types.lineIn') }}
</b-badge>
<b-badge
v-else-if="data.item.uri.startsWith('http://') || data.item.uri.startsWith('https://')"
variant="light"
>
Stream
{{ $t('playlistEditor.types.stream') }}
</b-badge>
<b-badge
v-else
variant="dark"
>
Andere
{{ $t('playlistEditor.types.other') }}
</b-badge>
</template>
......@@ -140,7 +141,7 @@
class="tw-text-gray-700 tw-underline hover:tw-no-underline tw-cursor-pointer"
@click="toggleDurationField(data.index)"
>
(Unbekannt)
{{ $t('playlistEditor.unknownDuration') }}
</span>
</span>
</template>
......@@ -168,7 +169,7 @@
variant="danger"
@click="deletePlaylistItem(data.index)"
>
Delete
{{ $t('delete') }}
</b-button>
</b-button-group>
</template>
......@@ -177,8 +178,8 @@
<hr>
<p class="d-flex justify-content-between border-t">
<span class="font-weight-bold">Playlisteinträge</span>
<span>Dauer: {{ playlistDuration }}</span>
<span class="font-weight-bold">{{ $t('playlistTable.entries') }}</span>
<span>{{ $t('playlistTable.duration') }}: {{ playlistDuration }}</span>
</p>
<hr>
......@@ -187,11 +188,7 @@
v-if="playlistExceedsAllowedUnknowns"
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
Dauer
in der Tabelle klickst und manuell eine einträgst. Es darf maximal ein Eintrag mit unbekannter Dauer
vorhanden
sein.
{{ $t('playlistEditor.tooManyUnknowns') }}
</div>
</div>
......@@ -204,20 +201,20 @@
-->
<b-modal
id="modal-edit-playlist-add-stream"
title="Add stream to the playlist"
:title="$t('playlistEditor.addStream')"
:cancel-title="$t('cancel')"
@ok="addPlaylistItemStream('save')"
>
<b-input
v-model="playlistEditor.newStreamURL"
type="url"
>
...
</b-input>
</b-modal>
<div class="tw-flex tw-justify-between">
<b-button-group>
<b-dropdown text="Datei">
<b-dropdown :text="$t('playlistEditor.types.file')">
<b-dropdown-item
v-for="(file, index) in files"
:key="index"
......@@ -227,23 +224,23 @@
prettyNanoseconds(file.duration) }}, {{ prettyFileSize(file.size) }}, {{ file.source.uri }})
</b-dropdown-item>
</b-dropdown>
<b-dropdown text="Line-in">
<b-dropdown :text="$t('playlistEditor.types.lineIn')">
<b-dropdown-item @click="addPlaylistItemLine('0')">
Studio 1
{{ $t('playlistEditor.lineIns.studio1') }}
</b-dropdown-item>
<b-dropdown-item @click="addPlaylistItemLine('1')">
Preprod
{{ $t('playlistEditor.lineIns.preProd') }}
</b-dropdown-item>
<b-dropdown-item @click="addPlaylistItemLine('2')">
Line 2
{{ $t('playlistEditor.lineIns.line2') }}
</b-dropdown-item>
</b-dropdown>
<b-button
@click="addPlaylistItemStream('openModal')"
>
Stream
{{ $t('playlistEditor.types.stream') }}
</b-button>
</b-button-group>
......@@ -252,7 +249,7 @@
:disabled="playlistExceedsAllowedUnknowns"
@click="storePlaylist"
>
Speichern
{{ $t('save') }}
</b-button>
</div>
</b-container>
......@@ -286,19 +283,21 @@
durationField: false,
newDuration: ""
},
}
},
computed: {
// 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'},
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'},
]
}
},
computed: {
loaded() {
return {
playlists: this.$store.state.playlists.loaded.playlists,
......@@ -378,7 +377,7 @@
}
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();
return;
}
......
<template>
<b-container>
<h1>Credits</h1>
<h1>{{ $t('credits.title') }}</h1>
<p>
AURA is developed under the GNU Affero General Public License v3. Current and former developers are:<br>
{{ $t('credits.intro') }}<br>
</p>
<ul>
<li>
......@@ -63,24 +63,19 @@
</li>
</ul>
<p>
<b>Graphics &amp; Icons</b><br>
<b>{{ $t('credits.graphicsIcons') }}</b><br>
</p>
<ul>
<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>
all other Icons:
<a href="http://tango.freedesktop.org/">Tango Project</a> (Public Domain)
and <a href="https://bootstrap-vue.org/docs/icons">BootstrapVue</a> (MIT).
{{ $t('credits.otherIcons') }}:
<a href="http://tango.freedesktop.org/">Tango Project</a> (Public Domain),
<a href="https://bootstrap-vue.org/docs/icons">BootstrapVue</a> (MIT).
</li>
</ul>
<p>
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>
<p v-html="$t('credits.moreInfo')" />
</b-container>
</template>
......@@ -98,6 +93,6 @@ animated loading icon: <a href="https://loading.io/spinner">spinner by loading.i
}
a {
color: #c09;
color: #c09 !important;
}
</style>
......@@ -10,64 +10,72 @@
<hr>
<b-alert
variant="danger"
:variant="conflictCount > 0 ? 'danger' : 'success'"
:show="conflictMode"
>
<div
v-if="conflictMode"
align="center"
>
<h4>Conflict Resolution</h4>
<p>
for new schedule
from <b>{{ resolveData.schedule.dstart }}, {{ resolveData.schedule.tstart }}</b>
to <b>{{ resolveData.schedule.tend }}</b>.
</p>
<p v-if="resolveData.schedule.rrule !== 1">
This is a recurring event: <b>{{ rruleRender(resolveData.schedule.rrule) }}</b>,
until: <b>{{ resolveData.schedule.until }}</b>.
</p>
<h4>{{ $t('conflictResolution.title') }}</h4>
<p
:class="{
'tw-mb-4': resolveData.schedule.rrule === 1,
'tw-mb-0': resolveData.schedule.rrule !== 1
}"
v-html="$t('conflictResolution.newSchedule', {
dstart: this.prettyDate(resolveData.schedule.dstart),
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">
<b-row>
<b-col align="center">
<img
src="/assets/radio.gif"
alt="submitting resolve data"
:alt="$t('loading')"
>
</b-col>
</b-row>
</div>
<div v-else>
<p v-if="conflictCount > 0">
Conflicts left to resolve:
<b-badge variant="danger">
{{ conflictCount }}
</b-badge>
&nbsp;
<div v-if="conflictCount > 0">
<p>{{ $t('conflictResolution.leftToResolve', { smart_count: conflictCount }) }}</p>
<b-button
variant="danger"
size="sm"
@click="resolveCancel"
>
Cancel
{{ $t('cancel') }}
</b-button>
</p>
<p v-else>
</div>
<div v-else>
<p>{{ $t('conflictResolution.noneLeftToResolve') }}</p>
<b-button
variant="success"
@click="resolveSubmit"
>
0 conflicts left! Submit this solution.
{{ $t('conflictResolution.applySolution') }}
</b-button>
&nbsp;
<b-button
variant="danger"
@click="resolveCancel"
>
Cancel
{{ $t('cancel') }}
</b-button>
</p>
</div>
</div>
</div>
</b-alert>
......@@ -115,6 +123,7 @@
import modalEmissionManagerEdit from '@/components/emissions/ModalEdit.vue'
import AuthWall from '@/components/AuthWall.vue'
import rrules from '@/mixins/rrules'
import prettyDate from "../mixins/prettyDate";
export default {
components: {
......@@ -126,7 +135,7 @@
'app-modalEmissionManagerEdit': modalEmissionManagerEdit,
},
mixins: [rrules],
mixins: [rrules, prettyDate],
data() {
return {
......@@ -143,12 +152,29 @@
resolveData: null,
conflictCount: 0,
conflictSolutions: [],
}
},
computed: {
loaded() {
return {
shows: this.$store.state.shows.loaded['shows'],
timeslots: this.$store.state.shows.loaded['timeslots'],
}
},
// this is the whole configuration for our schedule calendar, including
// simple event handlers that do not need the whole components scope
calendarConfig: {
calendarConfig() {
return {
locale: this.$activeLocale(),
height: 600,
firstDay: 1,
buttonText: {
today: this.$t('calendar.today')
},
header: {
left: 'title',
center: '',
......@@ -168,15 +194,6 @@
eventRender: function (event, element) {
element.attr('title', event.title);
},
},
}
},
computed: {
loaded() {
return {
shows: this.$store.state.shows.loaded['shows'],
timeslots: this.$store.state.shows.loaded['timeslots'],
}
},
......@@ -557,7 +574,7 @@
},
notYetImplemented: function () {
alert('By the mighty witchcraftry of the mother of time!\n\nThis feature is not implemented yet.')
alert(this.$t('unimplemented'))
},
},
}
......
......@@ -3,7 +3,7 @@
<template v-if="selectedShow">
<show-selector
ref="showSelector"
title="Files &amp; playlists"
:title="$t('filePlaylistManager.title')"
:callback="showHasSwitched"
/>
<hr>
......
......@@ -4,8 +4,7 @@
<br><br>
<div style="border: 5px dotted #5c3566;">
<br><br>
<p><b>By the mighty witchcraftry of the mother of time!</b></p>
<p>This feature is not implemented yet.</p>
{{ $t('unimplemented') }}
<p>
For the general AuRa documentation go to
<a href="https://gitlab.servus.at/aura/meta">https://gitlab.servus.at/aura/meta</a>
......
......@@ -3,7 +3,7 @@
<div v-if="user.logged_in === true && user.steeringUser">
<div align="center">
<h1>{{ $t('home.welcome') }}</h1>
<p>Here are some infos for you on how to use this interface...</p>
<p>{{ $t('home.introduction') }}</p>
<br>
</div>
......@@ -28,13 +28,13 @@
v-else
align="center"
>
<p>You are not logged in yet.</p>
<p>{{ $t('home.notLoggedIn') }}</p>
<b-button
size="lg"
variant="outline-secondary"
@click="$parent.signIn"
>
Log in
{{ $t('auth.signIn') }}
</b-button>
</div>
</b-container>
......
......@@ -5,8 +5,7 @@
<br><br>
<div style="border: 5px dotted #5c3566;">
<br><br>
<p><b>By the mighty witchcraftry of the mother of time!</b></p>
<p>This feature is not implemented yet.</p>
{{ $t('unimplemented') }}
<br><br>
</div>
</b-container>
......
......@@ -4,7 +4,7 @@
<template v-if="selectedShow">
<show-selector
ref="showSelector"
title="Radio shows"
:title="$t('showManager.title')"
:callback="showHasSwitched"
/>
<hr>
......@@ -19,7 +19,7 @@
<hr>
<h2>General settings for the radio show:</h2>
<h2>{{ $t('showManager.generalSettings') }}</h2>
<show-metaSimpleTypes />
<show-metaArrays />
<show-metaOwners />
......
......@@ -3,7 +3,7 @@
<b-container>
<b-row>
<b-col>
aura/<b>dashboard v{{ version }}</b>
aura/<b>dashboard</b> v{{ version }}
<span
v-for="mod in modules.footer"
:key="mod.slug"
......
......@@ -7,8 +7,9 @@
type="dark"
class="tw-text-white tw-flex"
>
<span class="d-none d-sm-inline d-lg-none menu-context-info">For more options tap the menu button on the right:</span>
<span class="d-sm-none menu-context-info">Hit menu button for more:</span>
<span class="d-none d-sm-inline d-lg-none menu-context-info">{{ $t('header.showMoreDesktop') }}:</span>
<span class="d-sm-none menu-context-info">{{ $t('header.showMoreMobile') }}: </span>
<b-navbar-toggle target="nav_collapse" />
<b-collapse
id="nav_collapse"
......
......@@ -7,7 +7,7 @@
v-if="shows.length > 10"
align="right"
>
<b-input-group prepend="Select show:">
<b-input-group :prepend="$t('showSelector.selectShowMany')">
<b-form-input
v-model="inputSelector"
list="list-of-shows"
......@@ -46,7 +46,7 @@
>
<b-dropdown
id="ddshows"
text="Select a radio show"
:text="$t('showSelector.selectShow')"
variant="info"
>
<b-dropdown-item
......@@ -61,7 +61,7 @@
&nbsp;
<b-button
v-if="isSuperuser"
v-b-popover.hover.top="'Add a new show'"
v-b-popover.hover.top="$t('showCreator.title')"
variant="info"
@click="$refs.addShowModal.openModal()"
>
......@@ -88,7 +88,7 @@
},
props: {
title: {type: String, default: 'Unlabeled component title'},
title: {type: String, default: 'Unbetitelt' },
callback: {type: Function, default: null}
},
......
......@@ -2,75 +2,67 @@
<div>
<b-modal
ref="modalEmissionManagerCreate"
title="Create a new schedule"
:title="$t('scheduleEditor.titleCreate', { show: selectedShow.name })"
:cancel-title="$t('cancel')"
size="lg"
@ok="create"
>
<b-row>
<b-col cols="3">
Creating schedule for:
</b-col>
<b-col cols="9">
<b v-if="loaded.shows">
{{ selectedShow.name }}
</b>!
</b-col>
</b-row>
<b-alert
variant="warning"
:show="pastEventWarning"
>
Past events will be ignored. Start date was set to today!<br>
Try again or change the start date to something in the future.
<span v-html="$t('scheduleEditor.pastEventWarning')" />
</b-alert>
<div v-if="loaded.modal && !submitting">
<b-row>
<b-col cols="2">
Start:
<b-col cols="12">
<label class="tw-w-full tw-font-bold">
<span class="tw-inline-block tw-pb-2">{{ $t('rrule.rrule')}}</span>
<b-form-select
v-model="valuePick.rrule"
:options="rruleOptions"
/>
</label>
</b-col>
</b-row>