Update all views
This commit is contained in:
parent
3a46cb140d
commit
2934f0b407
File diff suppressed because it is too large
Load Diff
|
@ -101,7 +101,7 @@ const markAllAsRead = async () => {
|
|||
class="ui container"
|
||||
>
|
||||
<h1 class="ui header">
|
||||
{{ $t('views.Notifications.messagesHeader') }}
|
||||
{{ $t('views.Notifications.header.messages') }}
|
||||
</h1>
|
||||
<div class="ui two column stackable grid">
|
||||
<div
|
||||
|
@ -110,7 +110,7 @@ const markAllAsRead = async () => {
|
|||
>
|
||||
<div class="ui attached info message">
|
||||
<h4 class="header">
|
||||
{{ $t('views.Notifications.instanceSupportHeader') }}
|
||||
{{ $t('views.Notifications.header.instanceSupport') }}
|
||||
</h4>
|
||||
<sanitized-html :html="supportMessage" />
|
||||
</div>
|
||||
|
@ -121,30 +121,30 @@ const markAllAsRead = async () => {
|
|||
>
|
||||
<div class="inline field">
|
||||
<label for="instance-reminder-delay">
|
||||
{{ $t('views.Notifications.instanceReminderDelay') }}
|
||||
{{ $t('views.Notifications.label.reminder') }}
|
||||
</label>
|
||||
<select
|
||||
id="instance-reminder-delay"
|
||||
v-model="instanceSupportMessageDelay"
|
||||
>
|
||||
<option :value="30">
|
||||
{{ $t('views.Notifications.instanceReminder30') }}
|
||||
{{ $t('views.Notifications.option.delay.30') }}
|
||||
</option>
|
||||
<option :value="60">
|
||||
{{ $t('views.Notifications.instanceReminder60') }}
|
||||
{{ $t('views.Notifications.option.delay.60') }}
|
||||
</option>
|
||||
<option :value="90">
|
||||
{{ $t('views.Notifications.instanceReminder90') }}
|
||||
{{ $t('views.Notifications.option.delay.90') }}
|
||||
</option>
|
||||
<option :value="null">
|
||||
{{ $t('views.Notifications.instanceReminderNever') }}
|
||||
{{ $t('views.Notifications.option.delay.never') }}
|
||||
</option>
|
||||
</select>
|
||||
<button
|
||||
type="submit"
|
||||
class="ui right floated basic button"
|
||||
>
|
||||
{{ $t('views.Notifications.instanceReminderSubmitButton') }}
|
||||
{{ $t('views.Notifications.button.submit') }}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
@ -156,10 +156,10 @@ const markAllAsRead = async () => {
|
|||
>
|
||||
<div class="ui info attached message">
|
||||
<h4 class="header">
|
||||
{{ $t('views.Notifications.funkwhaleSupportHeader') }}
|
||||
{{ $t('views.Notifications.header.funkwhaleSupport') }}
|
||||
</h4>
|
||||
<p>
|
||||
{{ $t('views.Notifications.funkwhaleSupportMessage') }}
|
||||
{{ $t('views.Notifications.message.funkwhaleSupport') }}
|
||||
</p>
|
||||
<a
|
||||
href="https://funkwhale.audio/support-us"
|
||||
|
@ -167,7 +167,7 @@ const markAllAsRead = async () => {
|
|||
rel="noopener"
|
||||
class="ui primary inverted button"
|
||||
>
|
||||
{{ $t('views.Notifications.funkwhaleSupportDonateLink') }}
|
||||
{{ $t('views.Notifications.link.donate') }}
|
||||
</a>
|
||||
<a
|
||||
href="https://contribute.funkwhale.audio"
|
||||
|
@ -175,7 +175,7 @@ const markAllAsRead = async () => {
|
|||
rel="noopener"
|
||||
class="ui secondary inverted button"
|
||||
>
|
||||
{{ $t('views.Notifications.funkwhaleSupportHelpLink') }}
|
||||
{{ $t('views.Notifications.link.help') }}
|
||||
</a>
|
||||
</div>
|
||||
<div class="ui bottom attached segment">
|
||||
|
@ -185,30 +185,30 @@ const markAllAsRead = async () => {
|
|||
>
|
||||
<div class="inline field">
|
||||
<label for="funkwhale-reminder-delay">
|
||||
{{ $t('views.Notifications.funkwhaleReminderDelay') }}
|
||||
{{ $t('views.Notifications.label.reminder') }}
|
||||
</label>
|
||||
<select
|
||||
id="funkwhale-reminder-delay"
|
||||
v-model="funkwhaleSupportMessageDelay"
|
||||
>
|
||||
<option :value="30">
|
||||
{{ $t('views.Notifications.funkwhaleReminder30') }}
|
||||
{{ $t('views.Notifications.option.delay.30') }}
|
||||
</option>
|
||||
<option :value="60">
|
||||
{{ $t('views.Notifications.funkwhaleReminder60') }}
|
||||
{{ $t('views.Notifications.option.delay.60') }}
|
||||
</option>
|
||||
<option :value="90">
|
||||
{{ $t('views.Notifications.funkwhaleReminder90') }}
|
||||
{{ $t('views.Notifications.option.delay.90') }}
|
||||
</option>
|
||||
<option :value="null">
|
||||
{{ $t('views.Notifications.funkwhaleReminderNever') }}
|
||||
{{ $t('views.Notifications.option.delay.never') }}
|
||||
</option>
|
||||
</select>
|
||||
<button
|
||||
type="submit"
|
||||
class="ui right floated basic button"
|
||||
>
|
||||
{{ $t('views.Notifications.funkwhaleReminderSubmitButton') }}
|
||||
{{ $t('views.Notifications.button.submit') }}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
@ -217,7 +217,7 @@ const markAllAsRead = async () => {
|
|||
</div>
|
||||
</div>
|
||||
<h1 class="ui header">
|
||||
{{ $t('views.Notifications.notificationsHeader') }}
|
||||
{{ $t('views.Notifications.header.notifications') }}
|
||||
</h1>
|
||||
<div class="ui toggle checkbox">
|
||||
<input
|
||||
|
@ -225,7 +225,7 @@ const markAllAsRead = async () => {
|
|||
v-model="filters.is_read"
|
||||
type="checkbox"
|
||||
>
|
||||
<label for="show-read-notifications">{{ $t('views.Notifications.showReadNotificationsCheckbox') }}</label>
|
||||
<label for="show-read-notifications">{{ $t('views.Notifications.label.showRead') }}</label>
|
||||
</div>
|
||||
<button
|
||||
v-if="filters.is_read === false && notifications.count > 0"
|
||||
|
@ -233,7 +233,7 @@ const markAllAsRead = async () => {
|
|||
@click.prevent="markAllAsRead"
|
||||
>
|
||||
<i class="ui check icon" />
|
||||
{{ $t('views.Notifications.markAllReadButton') }}
|
||||
{{ $t('views.Notifications.button.read') }}
|
||||
</button>
|
||||
<div class="ui hidden divider" />
|
||||
|
||||
|
@ -242,7 +242,7 @@ const markAllAsRead = async () => {
|
|||
:class="['ui', {'active': isLoading}, 'inverted', 'dimmer']"
|
||||
>
|
||||
<div class="ui text loader">
|
||||
{{ $t('views.Notifications.loadingNotifications') }}
|
||||
{{ $t('views.Notifications.loading.notifications') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -259,7 +259,7 @@ const markAllAsRead = async () => {
|
|||
</tbody>
|
||||
</table>
|
||||
<p v-else-if="additionalNotifications === 0">
|
||||
{{ $t('views.Notifications.noNotifications') }}
|
||||
{{ $t('views.Notifications.empty.notifications') }}
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
|
|
@ -65,43 +65,43 @@ interface SearchType {
|
|||
const types = computed(() => [
|
||||
{
|
||||
id: 'artists',
|
||||
label: t('views.Search.artistsLabel'),
|
||||
label: t('views.Search.label.artists'),
|
||||
includeChannels: true,
|
||||
contentCategory: 'music'
|
||||
},
|
||||
{
|
||||
id: 'albums',
|
||||
label: t('views.Search.albumsLabel'),
|
||||
label: t('views.Search.label.albums'),
|
||||
includeChannels: true,
|
||||
contentCategory: 'music'
|
||||
},
|
||||
{
|
||||
id: 'tracks',
|
||||
label: t('views.Search.tracksLabel')
|
||||
label: t('views.Search.label.tracks')
|
||||
},
|
||||
{
|
||||
id: 'playlists',
|
||||
label: t('views.Search.playlistsLabel')
|
||||
label: t('views.Search.label.playlists')
|
||||
},
|
||||
{
|
||||
id: 'radios',
|
||||
label: t('views.Search.radiosLabel'),
|
||||
label: t('views.Search.label.radios'),
|
||||
endpoint: 'radios/radios'
|
||||
},
|
||||
{
|
||||
id: 'tags',
|
||||
label: t('views.Search.tagsLabel')
|
||||
label: t('views.Search.label.tags')
|
||||
},
|
||||
{
|
||||
id: 'podcasts',
|
||||
label: t('views.Search.podcastsLabel'),
|
||||
label: t('views.Search.label.podcasts'),
|
||||
endpoint: '/artists',
|
||||
contentCategory: 'podcast',
|
||||
includeChannels: true
|
||||
},
|
||||
{
|
||||
id: 'series',
|
||||
label: t('views.Search.seriesLabel'),
|
||||
label: t('views.Search.label.series'),
|
||||
endpoint: '/albums',
|
||||
includeChannels: true,
|
||||
contentCategory: 'podcast'
|
||||
|
@ -181,11 +181,11 @@ const labels = computed(() => ({
|
|||
title: id.value
|
||||
? (
|
||||
type.value === 'rss'
|
||||
? t('views.Search.rssTitle')
|
||||
: t('views.Search.remoteTitle')
|
||||
? t('views.Search.header.rss')
|
||||
: t('views.Search.header.remote')
|
||||
)
|
||||
: t('views.Search.searchTitle'),
|
||||
submitSearch: t('views.Search.submitSearchLabel')
|
||||
: t('views.Search.header.search'),
|
||||
submitSearch: t('views.Search.button.submit')
|
||||
}))
|
||||
|
||||
const radioConfig = computed(() => {
|
||||
|
@ -236,7 +236,7 @@ const radioConfig = computed(() => {
|
|||
>
|
||||
<h2>
|
||||
<label for="query">
|
||||
{{ $t('views.Search.searchHeader') }}
|
||||
{{ $t('views.Search.header.search') }}
|
||||
</label>
|
||||
</h2>
|
||||
<div class="ui two column doubling stackable grid container">
|
||||
|
|
|
@ -21,7 +21,7 @@ const { t } = useI18n()
|
|||
const router = useRouter()
|
||||
|
||||
const labels = computed(() => ({
|
||||
statsWarning: t('views.admin.ChannelDetail.statsWarning')
|
||||
statsWarning: t('views.admin.ChannelDetail.warning.stats')
|
||||
}))
|
||||
|
||||
const isLoading = ref(false)
|
||||
|
@ -106,7 +106,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<template v-if="object.artist.is_local">
|
||||
<span class="ui tiny accent label">
|
||||
<i class="home icon" />
|
||||
{{ $t('views.admin.ChannelDetail.localLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.label.local') }}
|
||||
</span>
|
||||
|
||||
</template>
|
||||
|
@ -129,7 +129,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
:to="{name: 'channels.detail', params: {id: object.uuid }}"
|
||||
>
|
||||
<i class="info icon" />
|
||||
{{ $t('views.admin.ChannelDetail.localProfileLink') }}
|
||||
{{ $t('views.admin.ChannelDetail.link.localProfile') }}
|
||||
</router-link>
|
||||
<button
|
||||
v-dropdown
|
||||
|
@ -145,7 +145,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.admin.ChannelDetail.djangoLink') }}
|
||||
{{ $t('views.admin.ChannelDetail.link.django') }}
|
||||
</a>
|
||||
<fetch-button
|
||||
v-if="!object.actor.is_local"
|
||||
|
@ -154,7 +154,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
@refresh="fetchData"
|
||||
>
|
||||
<i class="refresh icon" />
|
||||
{{ $t('views.admin.ChannelDetail.refreshButton') }}
|
||||
{{ $t('views.admin.ChannelDetail.button.refresh') }}
|
||||
</fetch-button>
|
||||
<a
|
||||
class="basic item"
|
||||
|
@ -163,7 +163,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="external icon" />
|
||||
{{ $t('views.admin.ChannelDetail.openRemoteButton') }}
|
||||
{{ $t('views.admin.ChannelDetail.button.openRemote') }}
|
||||
</a>
|
||||
</div>
|
||||
</button>
|
||||
|
@ -173,22 +173,22 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
:class="['ui', {loading: isLoading}, 'basic danger button']"
|
||||
:action="remove"
|
||||
>
|
||||
{{ $t('views.admin.ChannelDetail.deleteButton') }}
|
||||
{{ $t('views.admin.ChannelDetail.button.delete') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.admin.ChannelDetail.deleteModalHeader') }}
|
||||
{{ $t('views.admin.ChannelDetail.modal.delete.header') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<div>
|
||||
<p>
|
||||
{{ $t('views.admin.ChannelDetail.deleteModalMessage') }}
|
||||
{{ $t('views.admin.ChannelDetail.modal.delete.content.warning') }}
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<p>
|
||||
{{ $t('views.admin.ChannelDetail.deleteButton') }}
|
||||
{{ $t('views.admin.ChannelDetail.button.delete') }}
|
||||
</p>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
@ -205,14 +205,14 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="info icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.ChannelDetail.channelDataHeader') }}
|
||||
{{ $t('views.admin.ChannelDetail.header.channelData') }}
|
||||
</div>
|
||||
</h3>
|
||||
<table class="ui very basic table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.ChannelDetail.nameLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.channelData.name') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ object.artist.name }}
|
||||
|
@ -221,7 +221,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.channels', query: {q: getQuery('category', object.artist.content_category) }}">
|
||||
{{ $t('views.admin.ChannelDetail.categoryLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.channelData.category') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -231,7 +231,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.accounts.detail', params: {id: object.attributed_to.full_username }}">
|
||||
{{ $t('views.admin.ChannelDetail.accountLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.channelData.account') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -241,7 +241,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr v-if="!object.actor.is_local">
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.actor.domain }}">
|
||||
{{ $t('views.admin.ChannelDetail.domainLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.channelData.domain') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -250,7 +250,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr v-if="object.artist.description">
|
||||
<td>
|
||||
{{ $t('views.admin.ChannelDetail.descriptionLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.channelData.description') }}
|
||||
</td>
|
||||
<sanitized-html
|
||||
tag="td"
|
||||
|
@ -259,7 +259,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr v-if="object.actor.url">
|
||||
<td>
|
||||
{{ $t('views.admin.ChannelDetail.urlLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.channelData.url') }}
|
||||
</td>
|
||||
<td>
|
||||
<a
|
||||
|
@ -271,7 +271,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr v-if="object.rss_url">
|
||||
<td>
|
||||
{{ $t('views.admin.ChannelDetail.rssLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.channelData.rss') }}
|
||||
</td>
|
||||
<td>
|
||||
<a
|
||||
|
@ -290,7 +290,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="feed icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.ChannelDetail.activityHeader') }}
|
||||
{{ $t('views.admin.ChannelDetail.header.activity') }}
|
||||
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
|
||||
</div>
|
||||
</h3>
|
||||
|
@ -310,7 +310,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.ChannelDetail.firstSeenLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.activity.firstSeen') }}
|
||||
</td>
|
||||
<td>
|
||||
<human-date :date="object.creation_date" />
|
||||
|
@ -318,7 +318,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.ChannelDetail.listeningsLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.activity.listenings') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.listenings }}
|
||||
|
@ -326,7 +326,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.ChannelDetail.favoritedLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.activity.favorited') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.track_favorites }}
|
||||
|
@ -334,7 +334,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.ChannelDetail.playlistsLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.activity.playlists') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.playlists }}
|
||||
|
@ -343,7 +343,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `channel:${object.uuid}`) }}">
|
||||
{{ $t('views.admin.ChannelDetail.linkedReportsLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.activity.linkedReports') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -353,7 +353,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.edits', query: {q: getQuery('target', 'artist ' + object.artist.id)}}">
|
||||
{{ $t('views.admin.ChannelDetail.editsLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.activity.edits') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -369,7 +369,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="music icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.ChannelDetail.audioContentHeader') }}
|
||||
{{ $t('views.admin.ChannelDetail.header.audioContent') }}
|
||||
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
|
||||
</div>
|
||||
</h3>
|
||||
|
@ -389,7 +389,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.ChannelDetail.cachedSizeLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.audioContent.cachedSize') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(stats.media_downloaded_size) }}
|
||||
|
@ -397,7 +397,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.ChannelDetail.totalSizeLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.audioContent.totalSize') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(stats.media_total_size) }}
|
||||
|
@ -406,7 +406,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('channel_id', object.uuid) }}">
|
||||
{{ $t('views.admin.ChannelDetail.uploadsLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.audioContent.uploads') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -416,7 +416,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.albums', query: {q: getQuery('channel_id', object.uuid) }}">
|
||||
{{ $t('views.admin.ChannelDetail.albumsLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.audioContent.albums') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -426,7 +426,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('channel_id', object.uuid) }}">
|
||||
{{ $t('views.admin.ChannelDetail.tracksLabel') }}
|
||||
{{ $t('views.admin.ChannelDetail.table.audioContent.tracks') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
|
|
@ -27,16 +27,16 @@ const props = withDefaults(defineProps<Props>(), {
|
|||
|
||||
const { t } = useI18n()
|
||||
const labels = computed(() => ({
|
||||
accounts: t('views.admin.CommonList.accountsLabel'),
|
||||
albums: t('views.admin.CommonList.albumsLabel'),
|
||||
artists: t('views.admin.CommonList.artistsLabel'),
|
||||
channels: t('views.admin.CommonList.channelsLabel'),
|
||||
invitations: t('views.admin.CommonList.invitationsLabel'),
|
||||
libraries: t('views.admin.CommonList.librariesLabel'),
|
||||
tags: t('views.admin.CommonList.tagsLabel'),
|
||||
tracks: t('views.admin.CommonList.tracksLabel'),
|
||||
uploads: t('views.admin.CommonList.uploadsLabel'),
|
||||
users: t('views.admin.CommonList.usersLabel')
|
||||
accounts: t('views.admin.CommonList.title.accounts'),
|
||||
albums: t('views.admin.CommonList.title.albums'),
|
||||
artists: t('views.admin.CommonList.title.artists'),
|
||||
channels: t('views.admin.CommonList.title.channels'),
|
||||
invitations: t('views.admin.CommonList.title.invitations'),
|
||||
libraries: t('views.admin.CommonList.title.libraries'),
|
||||
tags: t('views.admin.CommonList.title.tags'),
|
||||
tracks: t('views.admin.CommonList.title.tracks'),
|
||||
uploads: t('views.admin.CommonList.title.uploads'),
|
||||
users: t('views.admin.CommonList.title.users')
|
||||
}))
|
||||
|
||||
const title = computed(() => labels.value[props.type])
|
||||
|
|
|
@ -20,7 +20,7 @@ const { t } = useI18n()
|
|||
|
||||
const groups = computed(() => [
|
||||
{
|
||||
label: t('views.admin.Settings.instanceInfoLabel'),
|
||||
label: t('views.admin.Settings.header.instanceInfo'),
|
||||
id: 'instance',
|
||||
settings: [
|
||||
{ name: 'instance__name' },
|
||||
|
@ -34,7 +34,7 @@ const groups = computed(() => [
|
|||
]
|
||||
},
|
||||
{
|
||||
label: t('views.admin.Settings.signupsLabel'),
|
||||
label: t('views.admin.Settings.header.signups'),
|
||||
id: 'signup',
|
||||
settings: [
|
||||
{ name: 'users__registration_enabled' },
|
||||
|
@ -43,7 +43,7 @@ const groups = computed(() => [
|
|||
]
|
||||
},
|
||||
{
|
||||
label: t('views.admin.Settings.securityLabel'),
|
||||
label: t('views.admin.Settings.header.security'),
|
||||
id: 'security',
|
||||
settings: [
|
||||
{ name: 'common__api_authentication_required' },
|
||||
|
@ -52,7 +52,7 @@ const groups = computed(() => [
|
|||
]
|
||||
},
|
||||
{
|
||||
label: t('views.admin.Settings.musicLabel'),
|
||||
label: t('views.admin.Settings.header.music'),
|
||||
id: 'music',
|
||||
settings: [
|
||||
{ name: 'music__transcoding_enabled' },
|
||||
|
@ -60,7 +60,7 @@ const groups = computed(() => [
|
|||
]
|
||||
},
|
||||
{
|
||||
label: t('views.admin.Settings.channelsLabel'),
|
||||
label: t('views.admin.Settings.header.channels'),
|
||||
id: 'channels',
|
||||
settings: [
|
||||
{ name: 'audio__channels_enabled' },
|
||||
|
@ -68,14 +68,14 @@ const groups = computed(() => [
|
|||
]
|
||||
},
|
||||
{
|
||||
label: t('views.admin.Settings.playlistsLabel'),
|
||||
label: t('views.admin.Settings.header.playlists'),
|
||||
id: 'playlists',
|
||||
settings: [
|
||||
{ name: 'playlists__max_tracks' }
|
||||
]
|
||||
},
|
||||
{
|
||||
label: t('views.admin.Settings.moderationLabel'),
|
||||
label: t('views.admin.Settings.header.moderation'),
|
||||
id: 'moderation',
|
||||
settings: [
|
||||
{ name: 'moderation__allow_list_enabled' },
|
||||
|
@ -84,7 +84,7 @@ const groups = computed(() => [
|
|||
]
|
||||
},
|
||||
{
|
||||
label: t('views.admin.Settings.federationLabel'),
|
||||
label: t('views.admin.Settings.header.federation'),
|
||||
id: 'federation',
|
||||
settings: [
|
||||
{ name: 'federation__enabled' },
|
||||
|
@ -95,14 +95,14 @@ const groups = computed(() => [
|
|||
]
|
||||
},
|
||||
{
|
||||
label: t('views.admin.Settings.subsonicLabel'),
|
||||
label: t('views.admin.Settings.header.subsonic'),
|
||||
id: 'subsonic',
|
||||
settings: [
|
||||
{ name: 'subsonic__enabled' }
|
||||
]
|
||||
},
|
||||
{
|
||||
label: t('views.admin.Settings.statsLabel'),
|
||||
label: t('views.admin.Settings.header.stats'),
|
||||
id: 'ui',
|
||||
settings: [
|
||||
{ name: 'ui__custom_css' },
|
||||
|
@ -110,7 +110,7 @@ const groups = computed(() => [
|
|||
]
|
||||
},
|
||||
{
|
||||
label: t('views.admin.Settings.uiLabel'),
|
||||
label: t('views.admin.Settings.header.ui'),
|
||||
id: 'statistics',
|
||||
settings: [
|
||||
{ name: 'instance__nodeinfo_stats_enabled' },
|
||||
|
@ -120,7 +120,7 @@ const groups = computed(() => [
|
|||
] as SettingsGroupType[])
|
||||
|
||||
const labels = computed(() => ({
|
||||
settings: t('views.admin.Settings.settingsLabel')
|
||||
settings: t('views.admin.Settings.header.settings')
|
||||
}))
|
||||
|
||||
const scrollTo = (id: string) => {
|
||||
|
@ -186,7 +186,7 @@ await nextTick()
|
|||
<div class="four wide column">
|
||||
<div class="ui sticky vertical secondary menu">
|
||||
<div class="header item">
|
||||
{{ $t('views.admin.Settings.sectionsHeader') }}
|
||||
{{ $t('views.admin.Settings.header.sections') }}
|
||||
</div>
|
||||
<a
|
||||
v-for="(group, key) in groups"
|
||||
|
|
|
@ -21,7 +21,7 @@ const { t } = useI18n()
|
|||
const router = useRouter()
|
||||
|
||||
const labels = computed(() => ({
|
||||
statsWarning: t('views.admin.library.AlbumDetail.statsWarning')
|
||||
statsWarning: t('views.admin.library.AlbumDetail.warning.stats')
|
||||
}))
|
||||
|
||||
const isLoading = ref(false)
|
||||
|
@ -106,7 +106,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<template v-if="object.is_local">
|
||||
<span class="ui tiny accent label">
|
||||
<i class="home icon" />
|
||||
{{ $t('views.admin.library.AlbumDetail.localLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.header.local') }}
|
||||
</span>
|
||||
|
||||
</template>
|
||||
|
@ -130,7 +130,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
:to="{name: 'library.albums.detail', params: {id: object.id }}"
|
||||
>
|
||||
<i class="info icon" />
|
||||
{{ $t('views.admin.library.AlbumDetail.localProfileLink') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.link.localProfile') }}
|
||||
</router-link>
|
||||
<button
|
||||
v-dropdown
|
||||
|
@ -146,7 +146,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.admin.library.AlbumDetail.djangoLink') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.link.django') }}
|
||||
</a>
|
||||
<a
|
||||
v-if="object.mbid"
|
||||
|
@ -156,7 +156,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="external icon" />
|
||||
{{ $t('views.admin.library.AlbumDetail.musicbrainzLink') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.link.musicbrainz') }}
|
||||
</a>
|
||||
<fetch-button
|
||||
v-if="!object.is_local"
|
||||
|
@ -165,7 +165,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
@refresh="fetchData"
|
||||
>
|
||||
<i class="refresh icon" />
|
||||
{{ $t('views.admin.library.AlbumDetail.remoteRefreshButton') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.button.remoteRefresh') }}
|
||||
</fetch-button>
|
||||
<a
|
||||
class="basic item"
|
||||
|
@ -174,7 +174,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="external icon" />
|
||||
{{ $t('views.admin.library.AlbumDetail.remoteProfileLink') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.link.remoteProfile') }}
|
||||
</a>
|
||||
</div>
|
||||
</button>
|
||||
|
@ -186,7 +186,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
class="ui labeled icon button"
|
||||
>
|
||||
<i class="edit icon" />
|
||||
{{ $t('views.admin.library.AlbumDetail.editButton') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.button.edit') }}
|
||||
</router-link>
|
||||
</div>
|
||||
<div class="ui buttons">
|
||||
|
@ -194,22 +194,22 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
:class="['ui', {loading: isLoading}, 'basic danger button']"
|
||||
:action="remove"
|
||||
>
|
||||
{{ $t('views.admin.library.AlbumDetail.deleteButton') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.button.delete') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.admin.library.AlbumDetail.deleteModalHeader') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.modal.delete.header') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<div>
|
||||
<p>
|
||||
{{ $t('views.admin.library.AlbumDetail.deleteModalMessage') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.modal.delete.content.warning') }}
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<p>
|
||||
{{ $t('views.admin.library.AlbumDetail.deleteButton') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.button.delete') }}
|
||||
</p>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
@ -226,14 +226,14 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="info icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.AlbumDetail.albumDataHeader') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.header.albumData') }}
|
||||
</div>
|
||||
</h3>
|
||||
<table class="ui very basic table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.AlbumDetail.titleLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.table.album.title') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ object.title }}
|
||||
|
@ -242,7 +242,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.artists.detail', params: {id: object.artist.id }}">
|
||||
{{ $t('views.admin.library.AlbumDetail.artistLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.link.artist') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -252,7 +252,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr v-if="!object.is_local">
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}">
|
||||
{{ $t('views.admin.library.AlbumDetail.domainLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.link.domain') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -261,7 +261,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr v-if="object.description">
|
||||
<td>
|
||||
{{ $t('views.admin.library.AlbumDetail.descriptionLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.table.album.description') }}
|
||||
</td>
|
||||
<sanitized-html
|
||||
tag="td"
|
||||
|
@ -277,7 +277,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="feed icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.AlbumDetail.activityHeader') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.header.activity') }}
|
||||
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
|
||||
</div>
|
||||
</h3>
|
||||
|
@ -297,7 +297,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.AlbumDetail.firstSeenLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.table.activity.firstSeen') }}
|
||||
</td>
|
||||
<td>
|
||||
<human-date :date="object.creation_date" />
|
||||
|
@ -305,7 +305,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.AlbumDetail.listeningsLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.table.activity.listenings') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.listenings }}
|
||||
|
@ -313,7 +313,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.AlbumDetail.favoritedLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.table.activity.favorited') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.track_favorites }}
|
||||
|
@ -321,7 +321,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.AlbumDetail.playlistsLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.table.activity.playlists') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.playlists }}
|
||||
|
@ -330,7 +330,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `album:${object.id}`) }}">
|
||||
{{ $t('views.admin.library.AlbumDetail.linkedReportsLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.link.reports') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -340,7 +340,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.edits', query: {q: getQuery('target', 'album ' + object.id)}}">
|
||||
{{ $t('views.admin.library.AlbumDetail.editsLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.link.edits') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -356,7 +356,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="music icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.AlbumDetail.audioContentHeader') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.header.audioContent') }}
|
||||
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
|
||||
</div>
|
||||
</h3>
|
||||
|
@ -376,7 +376,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.AlbumDetail.cachedSizeLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.table.audioContent.cachedSize') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(stats.media_downloaded_size) }}
|
||||
|
@ -384,7 +384,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.AlbumDetail.totalSizeLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.table.audioContent.totalSize') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(stats.media_total_size) }}
|
||||
|
@ -394,7 +394,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('album_id', object.id) }}">
|
||||
{{ $t('views.admin.library.AlbumDetail.librariesLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.link.libraries') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -404,7 +404,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('album_id', object.id) }}">
|
||||
{{ $t('views.admin.library.AlbumDetail.uploadsLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.link.uploads') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -414,7 +414,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('album_id', object.id) }}">
|
||||
{{ $t('views.admin.library.AlbumDetail.tracksLabel') }}
|
||||
{{ $t('views.admin.library.AlbumDetail.link.tracks') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
|
|
@ -21,7 +21,7 @@ const { t } = useI18n()
|
|||
const router = useRouter()
|
||||
|
||||
const labels = computed(() => ({
|
||||
statsWarning: t('views.admin.library.ArtistDetail.statsWarning')
|
||||
statsWarning: t('views.admin.library.ArtistDetail.warning.stats')
|
||||
}))
|
||||
|
||||
const isLoading = ref(false)
|
||||
|
@ -106,7 +106,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<template v-if="object.is_local">
|
||||
<span class="ui tiny accent label">
|
||||
<i class="home icon" />
|
||||
{{ $t('views.admin.library.ArtistDetail.localLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.header.local') }}
|
||||
</span>
|
||||
|
||||
</template>
|
||||
|
@ -129,7 +129,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
:to="{name: 'library.artists.detail', params: {id: object.id }}"
|
||||
>
|
||||
<i class="info icon" />
|
||||
{{ $t('views.admin.library.ArtistDetail.localProfileLink') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.link.localProfile') }}
|
||||
</router-link>
|
||||
<button
|
||||
v-dropdown
|
||||
|
@ -145,7 +145,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.admin.library.ArtistDetail.djangoLink') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.link.django') }}
|
||||
</a>
|
||||
<a
|
||||
v-if="object.mbid"
|
||||
|
@ -155,7 +155,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="external icon" />
|
||||
{{ $t('views.admin.library.ArtistDetail.musicbrainzLink') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.link.musicbrainz') }}
|
||||
</a>
|
||||
<fetch-button
|
||||
v-if="!object.is_local"
|
||||
|
@ -164,7 +164,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
@refresh="fetchData"
|
||||
>
|
||||
<i class="refresh icon" />
|
||||
{{ $t('views.admin.library.ArtistDetail.remoteRefreshButton') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.button.remoteRefresh') }}
|
||||
</fetch-button>
|
||||
<a
|
||||
class="basic item"
|
||||
|
@ -173,7 +173,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="external icon" />
|
||||
{{ $t('views.admin.library.ArtistDetail.remoteProfileLink') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.link.remoteProfile') }}
|
||||
</a>
|
||||
</div>
|
||||
</button>
|
||||
|
@ -185,7 +185,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
class="ui labeled icon button"
|
||||
>
|
||||
<i class="edit icon" />
|
||||
{{ $t('views.admin.library.ArtistDetail.editButton') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.button.edit') }}
|
||||
</router-link>
|
||||
</div>
|
||||
<div class="ui buttons">
|
||||
|
@ -193,22 +193,22 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
:class="['ui', {loading: isLoading}, 'basic danger button']"
|
||||
:action="remove"
|
||||
>
|
||||
{{ $t('views.admin.library.ArtistDetail.deleteButton') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.button.delete') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.admin.library.ArtistDetail.deleteModalHeader') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.modal.delete.header') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<div>
|
||||
<p>
|
||||
{{ $t('views.admin.library.ArtistDetail.deleteModalMessage') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.modal.delete.content.warning') }}
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<p>
|
||||
{{ $t('views.admin.library.ArtistDetail.deleteButton') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.button.delete') }}
|
||||
</p>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
@ -225,14 +225,14 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="info icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.ArtistDetail.artistDataHeader') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.header.artistData') }}
|
||||
</div>
|
||||
</h3>
|
||||
<table class="ui very basic table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.ArtistDetail.nameLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.table.artist.name') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ object.name }}
|
||||
|
@ -241,7 +241,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.artists', query: {q: getQuery('category', object.content_category) }}">
|
||||
{{ $t('views.admin.library.ArtistDetail.categoryLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.link.category') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -251,7 +251,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr v-if="!object.is_local">
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}">
|
||||
{{ $t('views.admin.library.ArtistDetail.domainLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.link.domain') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -260,7 +260,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr v-if="object.description">
|
||||
<td>
|
||||
{{ $t('views.admin.library.ArtistDetail.descriptionLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.table.artist.description') }}
|
||||
</td>
|
||||
<sanitized-html
|
||||
tag="td"
|
||||
|
@ -276,7 +276,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="feed icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.ArtistDetail.activityHeader') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.header.activity') }}
|
||||
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
|
||||
</div>
|
||||
</h3>
|
||||
|
@ -296,7 +296,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.ArtistDetail.firstSeenLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.table.activity.firstSeen') }}
|
||||
</td>
|
||||
<td>
|
||||
<human-date :date="object.creation_date" />
|
||||
|
@ -304,7 +304,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.ArtistDetail.listeningsLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.table.activity.listenings') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.listenings }}
|
||||
|
@ -312,7 +312,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.ArtistDetail.favoritedLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.table.activity.favorited') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.track_favorites }}
|
||||
|
@ -320,7 +320,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.ArtistDetail.playlistsLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.table.activity.playlists') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.playlists }}
|
||||
|
@ -329,7 +329,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `artist:${object.id}`) }}">
|
||||
{{ $t('views.admin.library.ArtistDetail.linkedReportsLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.link.reports') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -339,7 +339,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.edits', query: {q: getQuery('target', 'artist ' + object.id)}}">
|
||||
{{ $t('views.admin.library.ArtistDetail.editsLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.link.edits') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -355,7 +355,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="music icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.ArtistDetail.audioContentHeader') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.header.audioContent') }}
|
||||
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
|
||||
</div>
|
||||
</h3>
|
||||
|
@ -375,7 +375,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.ArtistDetail.cachedSizeLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.table.audioContent.cachedSize') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(stats.media_downloaded_size) }}
|
||||
|
@ -383,7 +383,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.ArtistDetail.totalSizeLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.table.audioContent.totalSize') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(stats.media_total_size) }}
|
||||
|
@ -393,7 +393,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('artist_id', object.id) }}">
|
||||
{{ $t('views.admin.library.ArtistDetail.librariesLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.link.libraries') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -403,7 +403,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('artist_id', object.id) }}">
|
||||
{{ $t('views.admin.library.ArtistDetail.uploadsLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.link.uploads') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -413,7 +413,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.albums', query: {q: getQuery('artist_id', object.id) }}">
|
||||
{{ $t('views.admin.library.ArtistDetail.albumsLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.link.albums') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -423,7 +423,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('artist_id', object.id) }}">
|
||||
{{ $t('views.admin.library.ArtistDetail.tracksLabel') }}
|
||||
{{ $t('views.admin.library.ArtistDetail.link.tracks') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
|
|
@ -5,7 +5,7 @@ import { useI18n } from 'vue-i18n'
|
|||
const { t } = useI18n()
|
||||
const labels = computed(() => ({
|
||||
title: t('views.admin.library.Base.title'),
|
||||
secondaryMenu: t('views.admin.library.Base.secondaryMenu')
|
||||
secondaryMenu: t('views.admin.library.Base.menu.secondary')
|
||||
}))
|
||||
</script>
|
||||
|
||||
|
@ -23,49 +23,49 @@ const labels = computed(() => ({
|
|||
class="ui item"
|
||||
:to="{name: 'manage.library.edits'}"
|
||||
>
|
||||
{{ $t('views.admin.library.Base.editsLink') }}
|
||||
{{ $t('views.admin.library.Base.link.edits') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
class="ui item"
|
||||
:to="{name: 'manage.channels'}"
|
||||
>
|
||||
{{ $t('views.admin.library.Base.channelsLink') }}
|
||||
{{ $t('views.admin.library.Base.link.channels') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
class="ui item"
|
||||
:to="{name: 'manage.library.artists'}"
|
||||
>
|
||||
{{ $t('views.admin.library.Base.artistsLink') }}
|
||||
{{ $t('views.admin.library.Base.link.artists') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
class="ui item"
|
||||
:to="{name: 'manage.library.albums'}"
|
||||
>
|
||||
{{ $t('views.admin.library.Base.albumsLink') }}
|
||||
{{ $t('views.admin.library.Base.link.albums') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
class="ui item"
|
||||
:to="{name: 'manage.library.tracks'}"
|
||||
>
|
||||
{{ $t('views.admin.library.Base.tracksLink') }}
|
||||
{{ $t('views.admin.library.Base.link.tracks') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
class="ui item"
|
||||
:to="{name: 'manage.library.libraries'}"
|
||||
>
|
||||
{{ $t('views.admin.library.Base.librariesLink') }}
|
||||
{{ $t('views.admin.library.Base.link.libraries') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
class="ui item"
|
||||
:to="{name: 'manage.library.uploads'}"
|
||||
>
|
||||
{{ $t('views.admin.library.Base.uploadsLink') }}
|
||||
{{ $t('views.admin.library.Base.link.uploads') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
class="ui item"
|
||||
:to="{name: 'manage.library.tags'}"
|
||||
>
|
||||
{{ $t('views.admin.library.Base.tagsLink') }}
|
||||
{{ $t('views.admin.library.Base.link.tags') }}
|
||||
</router-link>
|
||||
</nav>
|
||||
<router-view :key="$route.fullPath" />
|
||||
|
|
|
@ -26,7 +26,7 @@ const labels = computed(() => ({
|
|||
:default-query="defaultQuery"
|
||||
>
|
||||
<h2 class="ui header">
|
||||
{{ $t('views.admin.library.EditsList.libraryEditsHeader') }}
|
||||
{{ $t('views.admin.library.EditsList.header.edits') }}
|
||||
</h2>
|
||||
</edits-card-list>
|
||||
</section>
|
||||
|
|
|
@ -27,7 +27,7 @@ const router = useRouter()
|
|||
const logger = useLogger()
|
||||
|
||||
const labels = computed(() => ({
|
||||
statsWarning: t('views.admin.library.LibraryDetail.statsWarning')
|
||||
statsWarning: t('views.admin.library.LibraryDetail.warning.stats')
|
||||
}))
|
||||
|
||||
const isLoading = ref(false)
|
||||
|
@ -117,7 +117,7 @@ const updateObj = async (attr: string) => {
|
|||
<template v-if="object.is_local">
|
||||
<span class="ui tiny accent label">
|
||||
<i class="home icon" />
|
||||
{{ $t('views.admin.library.LibraryDetail.localLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.header.local') }}
|
||||
</span>
|
||||
|
||||
</template>
|
||||
|
@ -134,7 +134,7 @@ const updateObj = async (attr: string) => {
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.admin.library.LibraryDetail.djangoLink') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.link.django') }}
|
||||
</a>
|
||||
<button
|
||||
v-dropdown
|
||||
|
@ -150,7 +150,7 @@ const updateObj = async (attr: string) => {
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.admin.library.LibraryDetail.djangoLink') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.link.django') }}
|
||||
</a>
|
||||
<a
|
||||
class="basic item"
|
||||
|
@ -159,7 +159,7 @@ const updateObj = async (attr: string) => {
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="external icon" />
|
||||
{{ $t('views.admin.library.LibraryDetail.remoteProfileLink') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.link.remoteProfile') }}
|
||||
</a>
|
||||
</div>
|
||||
</button>
|
||||
|
@ -169,22 +169,22 @@ const updateObj = async (attr: string) => {
|
|||
:class="['ui', {loading: isLoading}, 'basic danger button']"
|
||||
:action="remove"
|
||||
>
|
||||
{{ $t('views.admin.library.LibraryDetail.deleteButton') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.button.delete') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.admin.library.LibraryDetail.deleteModalHeader') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.modal.delete.header') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<div>
|
||||
<p>
|
||||
{{ $t('views.admin.library.LibraryDetail.deleteModalMessage') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.modal.delete.content.warning') }}
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<p>
|
||||
{{ $t('views.admin.library.LibraryDetail.deleteButton') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.button.delete') }}
|
||||
</p>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
@ -201,14 +201,14 @@ const updateObj = async (attr: string) => {
|
|||
<h3 class="ui header">
|
||||
<i class="info icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.LibraryDetail.libraryDataHeader') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.header.libraryData') }}
|
||||
</div>
|
||||
</h3>
|
||||
<table class="ui very basic table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.LibraryDetail.nameLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.table.library.name') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ object.name }}
|
||||
|
@ -217,7 +217,7 @@ const updateObj = async (attr: string) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('privacy_level', object.privacy_level) }}">
|
||||
{{ $t('views.admin.library.LibraryDetail.visibilityLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.link.visibility') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -244,7 +244,7 @@ const updateObj = async (attr: string) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.accounts.detail', params: {id: object.actor.full_username }}">
|
||||
{{ $t('views.admin.library.LibraryDetail.accountLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.link.account') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -254,7 +254,7 @@ const updateObj = async (attr: string) => {
|
|||
<tr v-if="!object.is_local">
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}">
|
||||
{{ $t('views.admin.library.LibraryDetail.domainLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.link.domain') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -263,7 +263,7 @@ const updateObj = async (attr: string) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.LibraryDetail.descriptionLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.table.library.description') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ object.description }}
|
||||
|
@ -278,7 +278,7 @@ const updateObj = async (attr: string) => {
|
|||
<h3 class="ui header">
|
||||
<i class="feed icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.LibraryDetail.activityHeader') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.header.activity') }}
|
||||
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
|
||||
</div>
|
||||
</h3>
|
||||
|
@ -298,7 +298,7 @@ const updateObj = async (attr: string) => {
|
|||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.LibraryDetail.firstSeenLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.table.activity.firstSeen') }}
|
||||
</td>
|
||||
<td>
|
||||
<human-date :date="object.creation_date" />
|
||||
|
@ -306,7 +306,7 @@ const updateObj = async (attr: string) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.LibraryDetail.followersLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.table.activity.followers') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.followers }}
|
||||
|
@ -315,7 +315,7 @@ const updateObj = async (attr: string) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `library:${object.uuid}`) }}">
|
||||
{{ $t('views.admin.library.LibraryDetail.linkedReportsLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.link.reports') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -331,7 +331,7 @@ const updateObj = async (attr: string) => {
|
|||
<h3 class="ui header">
|
||||
<i class="music icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.LibraryDetail.audioContentHeader') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.header.audioContent') }}
|
||||
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
|
||||
</div>
|
||||
</h3>
|
||||
|
@ -351,7 +351,7 @@ const updateObj = async (attr: string) => {
|
|||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.LibraryDetail.cachedSizeLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.table.audioContent.cachedSize') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(stats.media_downloaded_size) }}
|
||||
|
@ -359,7 +359,7 @@ const updateObj = async (attr: string) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.LibraryDetail.totalSizeLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.table.audioContent.totalSize') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(stats.media_total_size) }}
|
||||
|
@ -368,7 +368,7 @@ const updateObj = async (attr: string) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.artists', query: {q: getQuery('library_id', object.id) }}">
|
||||
{{ $t('views.admin.library.LibraryDetail.artistsLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.link.artists') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -378,7 +378,7 @@ const updateObj = async (attr: string) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.albums', query: {q: getQuery('library_id', object.id) }}">
|
||||
{{ $t('views.admin.library.LibraryDetail.albumsLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.link.albums') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -388,7 +388,7 @@ const updateObj = async (attr: string) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('library_id', object.id) }}">
|
||||
{{ $t('views.admin.library.LibraryDetail.tracksLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.link.tracks') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -398,7 +398,7 @@ const updateObj = async (attr: string) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('library_id', object.id) }}">
|
||||
{{ $t('views.admin.library.LibraryDetail.uploadsLabel') }}
|
||||
{{ $t('views.admin.library.LibraryDetail.link.uploads') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
|
|
@ -77,7 +77,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
:to="{name: 'library.tags.detail', params: {id: object.name }}"
|
||||
>
|
||||
<i class="info icon" />
|
||||
{{ $t('views.admin.library.TagDetail.localProfileLink') }}
|
||||
{{ $t('views.admin.library.TagDetail.link.localProfile') }}
|
||||
</router-link>
|
||||
<button
|
||||
v-dropdown
|
||||
|
@ -93,7 +93,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.admin.library.TagDetail.djangoLink') }}
|
||||
{{ $t('views.admin.library.TagDetail.link.django') }}
|
||||
</a>
|
||||
</div>
|
||||
</button>
|
||||
|
@ -103,22 +103,22 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
:class="['ui', {loading: isLoading}, 'basic danger button']"
|
||||
:action="remove"
|
||||
>
|
||||
{{ $t('views.admin.library.TagDetail.deleteButton') }}
|
||||
{{ $t('views.admin.library.TagDetail.button.delete') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.admin.library.TagDetail.deleteModalHeader') }}
|
||||
{{ $t('views.admin.library.TagDetail.modal.delete.header') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<div>
|
||||
<p>
|
||||
{{ $t('views.admin.library.TagDetail.deleteModalMessage') }}
|
||||
{{ $t('views.admin.library.TagDetail.modal.delete.content.warning') }}
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<p>
|
||||
{{ $t('views.admin.library.TagDetail.deleteButton') }}
|
||||
{{ $t('views.admin.library.TagDetail.button.delete') }}
|
||||
</p>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
@ -135,14 +135,14 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="info icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.TagDetail.tagDataHeader') }}
|
||||
{{ $t('views.admin.library.TagDetail.header.tagData') }}
|
||||
</div>
|
||||
</h3>
|
||||
<table class="ui very basic table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.TagDetail.nameLabel') }}
|
||||
{{ $t('views.admin.library.TagDetail.table.tag.name') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ object.name }}
|
||||
|
@ -157,14 +157,14 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="feed icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.TagDetail.activityHeader') }}
|
||||
{{ $t('views.admin.library.TagDetail.header.activity') }}
|
||||
</div>
|
||||
</h3>
|
||||
<table class="ui very basic table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.TagDetail.firstSeenLabel') }}
|
||||
{{ $t('views.admin.library.TagDetail.table.activity.firstSeen') }}
|
||||
</td>
|
||||
<td>
|
||||
<human-date :date="object.creation_date" />
|
||||
|
@ -179,7 +179,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="music icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.TagDetail.audioContentHeader') }}
|
||||
{{ $t('views.admin.library.TagDetail.header.audioContent') }}
|
||||
</div>
|
||||
</h3>
|
||||
<table class="ui very basic table">
|
||||
|
@ -187,7 +187,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.artists', query: {q: getQuery('tag', object.name) }}">
|
||||
{{ $t('views.admin.library.TagDetail.artistsLabel') }}
|
||||
{{ $t('views.admin.library.TagDetail.link.artists') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -197,7 +197,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.albums', query: {q: getQuery('tag', object.name) }}">
|
||||
{{ $t('views.admin.library.TagDetail.albumsLabel') }}
|
||||
{{ $t('views.admin.library.TagDetail.link.albums') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -207,7 +207,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('tag', object.name) }}">
|
||||
{{ $t('views.admin.library.TagDetail.tracksLabel') }}
|
||||
{{ $t('views.admin.library.TagDetail.link.tracks') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
|
|
@ -19,7 +19,7 @@ const props = defineProps<Props>()
|
|||
|
||||
const { t } = useI18n()
|
||||
const labels = computed(() => ({
|
||||
statsWarning: t('views.admin.library.TrackDetail.statsWarning')
|
||||
statsWarning: t('views.admin.library.TrackDetail.warning.stats')
|
||||
}))
|
||||
|
||||
const track = ref()
|
||||
|
@ -105,7 +105,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<template v-if="track.is_local">
|
||||
<span class="ui tiny accent label">
|
||||
<i class="home icon" />
|
||||
{{ $t('views.admin.library.TrackDetail.localLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.header.local') }}
|
||||
</span>
|
||||
|
||||
</template>
|
||||
|
@ -129,7 +129,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
:to="{name: 'library.tracks.detail', params: {id: track.id }}"
|
||||
>
|
||||
<i class="info icon" />
|
||||
{{ $t('views.admin.library.TrackDetail.localProfileLink') }}
|
||||
{{ $t('views.admin.library.TrackDetail.link.localProfile') }}
|
||||
</router-link>
|
||||
<button
|
||||
v-dropdown
|
||||
|
@ -145,7 +145,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.admin.library.TrackDetail.djangoLink') }}
|
||||
{{ $t('views.admin.library.TrackDetail.link.django') }}
|
||||
</a>
|
||||
<a
|
||||
v-if="track.mbid"
|
||||
|
@ -155,7 +155,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="external icon" />
|
||||
{{ $t('views.admin.library.TrackDetail.musicbrainzLink') }}
|
||||
{{ $t('views.admin.library.TrackDetail.link.musicbrainz') }}
|
||||
</a>
|
||||
<fetch-button
|
||||
v-if="!track.is_local"
|
||||
|
@ -164,7 +164,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
@refresh="fetchData"
|
||||
>
|
||||
<i class="refresh icon" />
|
||||
{{ $t('views.admin.library.TrackDetail.remoteRefreshButton') }}
|
||||
{{ $t('views.admin.library.TrackDetail.button.remoteRefresh') }}
|
||||
</fetch-button>
|
||||
<a
|
||||
class="basic item"
|
||||
|
@ -173,7 +173,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="external icon" />
|
||||
{{ $t('views.admin.library.TrackDetail.remoteProfileLink') }}
|
||||
{{ $t('views.admin.library.TrackDetail.link.remoteProfile') }}
|
||||
</a>
|
||||
</div>
|
||||
</button>
|
||||
|
@ -185,7 +185,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
class="ui labeled icon button"
|
||||
>
|
||||
<i class="edit icon" />
|
||||
{{ $t('views.admin.library.TrackDetail.editButton') }}
|
||||
{{ $t('views.admin.library.TrackDetail.button.edit') }}
|
||||
</router-link>
|
||||
</div>
|
||||
<div class="ui buttons">
|
||||
|
@ -193,22 +193,22 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
:class="['ui', {loading: isLoading}, 'basic danger button']"
|
||||
:action="remove"
|
||||
>
|
||||
{{ $t('views.admin.library.TrackDetail.deleteButton') }}
|
||||
{{ $t('views.admin.library.TrackDetail.button.delete') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.admin.library.TrackDetail.deleteModalHeader') }}
|
||||
{{ $t('views.admin.library.TrackDetail.modal.delete.header') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<div>
|
||||
<p>
|
||||
{{ $t('views.admin.library.TrackDetail.deleteModalMessage') }}
|
||||
{{ $t('views.admin.library.TrackDetail.modal.delete.content.warning') }}
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<p>
|
||||
{{ $t('views.admin.library.TrackDetail.deleteButton') }}
|
||||
{{ $t('views.admin.library.TrackDetail.button.delete') }}
|
||||
</p>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
@ -225,14 +225,14 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="info icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.TrackDetail.trackDataHeader') }}
|
||||
{{ $t('views.admin.library.TrackDetail.header.trackData') }}
|
||||
</div>
|
||||
</h3>
|
||||
<table class="ui very basic table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.TrackDetail.titleLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.table.track.title') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ track.title }}
|
||||
|
@ -241,7 +241,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr v-if="track.album">
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.albums.detail', params: {id: track.album.id }}">
|
||||
{{ $t('views.admin.library.TrackDetail.albumLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.link.album') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -252,7 +252,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.artists.detail', params: {id: track.artist.id }}">
|
||||
{{ $t('views.admin.library.TrackDetail.artistLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.link.artist') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -262,7 +262,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr v-if="track.album">
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.artists.detail', params: {id: track.album.artist.id }}">
|
||||
{{ $t('views.admin.library.TrackDetail.albumArtistLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.link.albumArtist') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -271,7 +271,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.TrackDetail.positionLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.table.track.position') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ track.position }}
|
||||
|
@ -279,7 +279,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr v-if="track.disc_number">
|
||||
<td>
|
||||
{{ $t('views.admin.library.TrackDetail.discNumberLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.table.track.discNumber') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ track.disc_number }}
|
||||
|
@ -287,13 +287,13 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr v-if="track.copyright">
|
||||
<td>
|
||||
{{ $t('views.admin.library.TrackDetail.copyrightLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.table.track.copyright') }}
|
||||
</td>
|
||||
<td>{{ track.copyright }}</td>
|
||||
</tr>
|
||||
<tr v-if="track.license">
|
||||
<td>
|
||||
{{ $t('views.admin.library.TrackDetail.licenseLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.table.track.license') }}
|
||||
</td>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('license', track.license)}}">
|
||||
|
@ -304,7 +304,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr v-if="!track.is_local">
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.domains.detail', params: {id: track.domain }}">
|
||||
{{ $t('views.admin.library.TrackDetail.domainLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.link.domain') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -313,7 +313,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr v-if="track.description">
|
||||
<td>
|
||||
{{ $t('views.admin.library.TrackDetail.descriptionLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.table.track.description') }}
|
||||
</td>
|
||||
<sanitized-html
|
||||
tag="td"
|
||||
|
@ -329,7 +329,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="feed icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.TrackDetail.activityHeader') }}
|
||||
{{ $t('views.admin.library.TrackDetail.header.activity') }}
|
||||
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
|
||||
</div>
|
||||
</h3>
|
||||
|
@ -349,7 +349,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.TrackDetail.firstSeenLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.table.activity.firstSeen') }}
|
||||
</td>
|
||||
<td>
|
||||
<human-date :date="track.creation_date" />
|
||||
|
@ -357,7 +357,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.TrackDetail.listeningsLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.table.activity.listenings') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.listenings }}
|
||||
|
@ -365,7 +365,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.TrackDetail.favoritedLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.table.activity.favorited') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.track_favorites }}
|
||||
|
@ -373,7 +373,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.TrackDetail.playlistsLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.table.activity.playlists') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.playlists }}
|
||||
|
@ -382,7 +382,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `track:${track.id}`) }}">
|
||||
{{ $t('views.admin.library.TrackDetail.linkedReportsLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.link.reports') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -392,7 +392,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.edits', query: {q: getQuery('target', 'track ' + track.id)}}">
|
||||
{{ $t('views.admin.library.TrackDetail.editsLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.link.edits') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -408,7 +408,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<h3 class="ui header">
|
||||
<i class="music icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.TrackDetail.trackDataHeader') }}
|
||||
{{ $t('views.admin.library.TrackDetail.header.trackData') }}
|
||||
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
|
||||
</div>
|
||||
</h3>
|
||||
|
@ -428,7 +428,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.TrackDetail.cachedSizeLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.table.trackData.cachedSize') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(stats.media_downloaded_size) }}
|
||||
|
@ -436,7 +436,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.TrackDetail.totalSizeLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.table.trackData.totalSize') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(stats.media_total_size) }}
|
||||
|
@ -446,7 +446,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('track_id', track.id) }}">
|
||||
{{ $t('views.admin.library.TrackDetail.librariesLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.link.libraries') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -456,7 +456,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('track_id', track.id) }}">
|
||||
{{ $t('views.admin.library.TrackDetail.uploadsLabel') }}
|
||||
{{ $t('views.admin.library.TrackDetail.link.uploads') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
|
|
@ -89,7 +89,7 @@ const showUploadDetailModal = ref(false)
|
|||
<template v-if="object.is_local">
|
||||
<span class="ui tiny accent label">
|
||||
<i class="home icon" />
|
||||
{{ $t('views.admin.library.UploadDetail.localLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.header.local') }}
|
||||
</span>
|
||||
|
||||
</template>
|
||||
|
@ -106,7 +106,7 @@ const showUploadDetailModal = ref(false)
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.admin.library.UploadDetail.djangoLink') }}
|
||||
{{ $t('views.admin.library.UploadDetail.link.django') }}
|
||||
</a>
|
||||
<button
|
||||
v-dropdown
|
||||
|
@ -122,7 +122,7 @@ const showUploadDetailModal = ref(false)
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.admin.library.UploadDetail.djangoLink') }}
|
||||
{{ $t('views.admin.library.UploadDetail.link.django') }}
|
||||
</a>
|
||||
<a
|
||||
class="basic item"
|
||||
|
@ -131,7 +131,7 @@ const showUploadDetailModal = ref(false)
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="external icon" />
|
||||
{{ $t('views.admin.library.UploadDetail.remoteProfileLink') }}
|
||||
{{ $t('views.admin.library.UploadDetail.link.remoteProfile') }}
|
||||
</a>
|
||||
</div>
|
||||
</button>
|
||||
|
@ -145,7 +145,7 @@ const showUploadDetailModal = ref(false)
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="download icon" />
|
||||
{{ $t('views.admin.library.UploadDetail.downloadButton') }}
|
||||
{{ $t('views.admin.library.UploadDetail.button.download') }}
|
||||
</a>
|
||||
</div>
|
||||
<div class="ui buttons">
|
||||
|
@ -153,22 +153,22 @@ const showUploadDetailModal = ref(false)
|
|||
:class="['ui', {loading: isLoading}, 'basic danger button']"
|
||||
:action="remove"
|
||||
>
|
||||
{{ $t('views.admin.library.UploadDetail.deleteButton') }}
|
||||
{{ $t('views.admin.library.UploadDetail.button.delete') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.admin.library.UploadDetail.deleteModalHeader') }}
|
||||
{{ $t('views.admin.library.UploadDetail.modal.delete.header') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<div>
|
||||
<p>
|
||||
{{ $t('views.admin.library.UploadDetail.deleteModalMessage') }}
|
||||
{{ $t('views.admin.library.UploadDetail.modal.delete.content.warning') }}
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<p>
|
||||
{{ $t('views.admin.library.UploadDetail.deleteButton') }}
|
||||
{{ $t('views.admin.library.UploadDetail.button.delete') }}
|
||||
</p>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
@ -185,14 +185,14 @@ const showUploadDetailModal = ref(false)
|
|||
<h3 class="ui header">
|
||||
<i class="info icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.UploadDetail.uploadDataHeader') }}
|
||||
{{ $t('views.admin.library.UploadDetail.header.uploadData') }}
|
||||
</div>
|
||||
</h3>
|
||||
<table class="ui very basic table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.UploadDetail.nameLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.table.upload.name') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ displayName(object) }}
|
||||
|
@ -201,7 +201,7 @@ const showUploadDetailModal = ref(false)
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('privacy_level', object.library.privacy_level) }}">
|
||||
{{ $t('views.admin.library.UploadDetail.visibilityLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.link.visibility') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -211,7 +211,7 @@ const showUploadDetailModal = ref(false)
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.accounts.detail', params: {id: object.library.actor.full_username }}">
|
||||
{{ $t('views.admin.library.UploadDetail.accountLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.link.account') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -221,7 +221,7 @@ const showUploadDetailModal = ref(false)
|
|||
<tr v-if="!object.is_local">
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}">
|
||||
{{ $t('views.admin.library.UploadDetail.domainLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.link.domain') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -231,7 +231,7 @@ const showUploadDetailModal = ref(false)
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('status', object.import_status) }}">
|
||||
{{ $t('views.admin.library.UploadDetail.importStatusLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.link.importStatus') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -248,7 +248,7 @@ const showUploadDetailModal = ref(false)
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.libraries.detail', params: {id: object.library.uuid }}">
|
||||
{{ $t('views.admin.library.UploadDetail.libraryLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.link.library') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -264,14 +264,14 @@ const showUploadDetailModal = ref(false)
|
|||
<h3 class="ui header">
|
||||
<i class="feed icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.UploadDetail.activityHeader') }}
|
||||
{{ $t('views.admin.library.UploadDetail.header.activity') }}
|
||||
</div>
|
||||
</h3>
|
||||
<table class="ui very basic table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.UploadDetail.firstSeenLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.table.activity.firstSeen') }}
|
||||
</td>
|
||||
<td>
|
||||
<human-date :date="object.creation_date" />
|
||||
|
@ -279,7 +279,7 @@ const showUploadDetailModal = ref(false)
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.UploadDetail.accessedDateLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.table.activity.accessedDate') }}
|
||||
</td>
|
||||
<td>
|
||||
<human-date
|
||||
|
@ -302,7 +302,7 @@ const showUploadDetailModal = ref(false)
|
|||
<h3 class="ui header">
|
||||
<i class="music icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.library.UploadDetail.audioContentHeader') }}
|
||||
{{ $t('views.admin.library.UploadDetail.header.audioContent') }}
|
||||
</div>
|
||||
</h3>
|
||||
<table class="ui very basic table">
|
||||
|
@ -310,7 +310,7 @@ const showUploadDetailModal = ref(false)
|
|||
<tr v-if="object.track">
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.tracks.detail', params: {id: object.track.id }}">
|
||||
{{ $t('views.admin.library.UploadDetail.trackLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.table.audioContent.track') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -319,7 +319,7 @@ const showUploadDetailModal = ref(false)
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.UploadDetail.cachedSizeLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.table.audioContent.cachedSize') }}
|
||||
</td>
|
||||
<td>
|
||||
<template v-if="object.audio_file">
|
||||
|
@ -334,7 +334,7 @@ const showUploadDetailModal = ref(false)
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.UploadDetail.sizeLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.table.audioContent.size') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(object.size) }}
|
||||
|
@ -342,11 +342,11 @@ const showUploadDetailModal = ref(false)
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.UploadDetail.bitrateLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.table.audioContent.bitrate.label') }}
|
||||
</td>
|
||||
<td>
|
||||
<template v-if="object.bitrate">
|
||||
{{ $t('views.admin.library.UploadDetail.bitrateValue', {bitrate: humanSize(object.bitrate)}) }}
|
||||
{{ $t('views.admin.library.UploadDetail.table.audioContent.bitrate.value', {bitrate: humanSize(object.bitrate)}) }}
|
||||
</template>
|
||||
<span
|
||||
v-else
|
||||
|
@ -357,7 +357,7 @@ const showUploadDetailModal = ref(false)
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.library.UploadDetail.durationLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.table.audioContent.duration') }}
|
||||
</td>
|
||||
<td>
|
||||
<template v-if="object.duration">
|
||||
|
@ -373,7 +373,7 @@ const showUploadDetailModal = ref(false)
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('type', object.mimetype) }}">
|
||||
{{ $t('views.admin.library.UploadDetail.typeLabel') }}
|
||||
{{ $t('views.admin.library.UploadDetail.link.type') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
|
|
@ -26,14 +26,14 @@ const { t } = useI18n()
|
|||
const logger = useLogger()
|
||||
|
||||
const labels = computed(() => ({
|
||||
statsWarning: t('views.admin.moderation.AccountsDetail.statsWarning'),
|
||||
uploadQuota: t('views.admin.moderation.AccountsDetail.uploadQuota')
|
||||
statsWarning: t('views.admin.moderation.AccountsDetail.warning.stats'),
|
||||
uploadQuota: t('views.admin.moderation.AccountsDetail.tooltip.uploadQuota')
|
||||
}))
|
||||
|
||||
const allPermissions = computed(() => [
|
||||
{ code: 'library', label: t('views.admin.moderation.AccountsDetail.libraryPermission') },
|
||||
{ code: 'moderation', label: t('views.admin.moderation.AccountsDetail.moderationPermission') },
|
||||
{ code: 'settings', label: t('views.admin.moderation.AccountsDetail.settingsPermission') }
|
||||
{ code: 'library', label: t('views.admin.moderation.AccountsDetail.option.permission.library') },
|
||||
{ code: 'moderation', label: t('views.admin.moderation.AccountsDetail.option.permission.moderation') },
|
||||
{ code: 'settings', label: t('views.admin.moderation.AccountsDetail.option.permission.settings') }
|
||||
])
|
||||
|
||||
const isLoadingPolicy = ref(false)
|
||||
|
@ -167,7 +167,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
<template v-if="object.user">
|
||||
<span class="ui tiny accent label">
|
||||
<i class="home icon" />
|
||||
{{ $t('views.admin.moderation.AccountsDetail.localAccountLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.header.localAccount') }}
|
||||
</span>
|
||||
|
||||
</template>
|
||||
|
@ -176,7 +176,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.openProfileLink') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.link.openProfile') }}
|
||||
<i class="external icon" />
|
||||
</a>
|
||||
</div>
|
||||
|
@ -192,7 +192,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.admin.moderation.AccountsDetail.djangoLink') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.link.django') }}
|
||||
</a>
|
||||
<a
|
||||
v-else-if="$store.state.auth.profile && $store.state.auth.profile.is_superuser"
|
||||
|
@ -202,7 +202,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.admin.moderation.AccountsDetail.djangoLink') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.link.django') }}
|
||||
</a>
|
||||
<button
|
||||
v-dropdown
|
||||
|
@ -217,7 +217,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="external icon" />
|
||||
{{ $t('views.admin.moderation.AccountsDetail.remoteProfileLink') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.link.remoteProfile') }}
|
||||
</a>
|
||||
</div>
|
||||
</button>
|
||||
|
@ -243,17 +243,17 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
<header class="ui header">
|
||||
<h3>
|
||||
<i class="shield icon" />
|
||||
{{ $t('views.admin.moderation.AccountsDetail.noPolicyHeader') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.header.noPolicy') }}
|
||||
</h3>
|
||||
</header>
|
||||
<p>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.policyDescription') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.description.policy') }}
|
||||
</p>
|
||||
<button
|
||||
class="ui primary button"
|
||||
@click="showPolicyForm = true"
|
||||
>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.addPolicyButton') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.button.addPolicy') }}
|
||||
</button>
|
||||
</template>
|
||||
<instance-policy-card
|
||||
|
@ -263,7 +263,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
>
|
||||
<header class="ui header">
|
||||
<h3>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.activePolicyHeader') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.header.activePolicy') }}
|
||||
</h3>
|
||||
</header>
|
||||
</instance-policy-card>
|
||||
|
@ -287,14 +287,14 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
<h3 class="ui header">
|
||||
<i class="info icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.moderation.AccountsDetail.accountDataHeader') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.header.accountData') }}
|
||||
</div>
|
||||
</h3>
|
||||
<table class="ui very basic table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.usernameLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.accountData.username') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ object.preferred_username }}
|
||||
|
@ -303,7 +303,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
<tr v-if="!object.user">
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}">
|
||||
{{ $t('views.admin.moderation.AccountsDetail.domainLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.link.domain') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -312,7 +312,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.displayNameLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.accountData.displayName') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ object.name }}
|
||||
|
@ -320,7 +320,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr v-if="object.user">
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.emailLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.accountData.email') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ object.user.email }}
|
||||
|
@ -328,7 +328,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr v-if="object.user">
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.loginStatusLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.accountData.loginStatus.label') }}
|
||||
</td>
|
||||
<td>
|
||||
<div
|
||||
|
@ -344,27 +344,27 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
<label for="is-active">
|
||||
<span
|
||||
v-if="object.user.is_active"
|
||||
>{{ $t('views.admin.moderation.AccountsDetail.enabledStatus') }}</span>
|
||||
>{{ $t('views.admin.moderation.AccountsDetail.table.accountData.loginStatus.enabled') }}</span>
|
||||
<span
|
||||
v-else
|
||||
>{{ $t('views.admin.moderation.AccountsDetail.disabledStatus') }}</span>
|
||||
>{{ $t('views.admin.moderation.AccountsDetail.table.accountData.loginStatus.disabled') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
<span
|
||||
v-else-if="object.user.is_active"
|
||||
>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.enabledStatus') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.accountData.loginStatus.enabled') }}
|
||||
</span>
|
||||
<span
|
||||
v-else
|
||||
>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.disabledStatus') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.accountData.loginStatus.disabled') }}
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr v-if="object.user">
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.permissionsLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.accountData.permissions') }}
|
||||
</td>
|
||||
<td>
|
||||
<select
|
||||
|
@ -386,7 +386,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.userTypeLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.accountData.userType') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ object.type }}
|
||||
|
@ -394,7 +394,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr v-if="!object.user">
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.lastCheckedLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.accountData.lastChecked') }}
|
||||
</td>
|
||||
<td>
|
||||
<human-date
|
||||
|
@ -410,7 +410,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr v-if="object.user">
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.signupDateLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.accountData.signupDate') }}
|
||||
</td>
|
||||
<td>
|
||||
<human-date :date="object.user.date_joined" />
|
||||
|
@ -418,7 +418,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr v-if="object.user">
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.lastActivityLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.accountData.lastActivity') }}
|
||||
</td>
|
||||
<td>
|
||||
<human-date :date="object.user.last_activity" />
|
||||
|
@ -433,7 +433,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
<h3 class="ui header">
|
||||
<i class="feed icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.moderation.AccountsDetail.activityHeader') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.header.activity') }}
|
||||
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
|
||||
</div>
|
||||
</h3>
|
||||
|
@ -453,7 +453,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
<tbody>
|
||||
<tr v-if="!object.user">
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.firstSeenLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.activity.firstSeen') }}
|
||||
</td>
|
||||
<td>
|
||||
<human-date :date="object.creation_date" />
|
||||
|
@ -461,7 +461,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.emittedMessagesLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.activity.emittedMessages') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.outbox_activities }}
|
||||
|
@ -469,7 +469,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.receivedFollowsLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.activity.receivedFollows') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.received_library_follows }}
|
||||
|
@ -477,7 +477,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.emittedFollowsLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.activity.emittedFollows') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.emitted_library_follows }}
|
||||
|
@ -486,7 +486,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `account:${object.full_username}`) }}">
|
||||
{{ $t('views.admin.moderation.AccountsDetail.linkedReportsLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.link.linkedReports') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -496,7 +496,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.moderation.requests.list', query: {q: getQuery('submitter', `${object.full_username}`) }}">
|
||||
{{ $t('views.admin.moderation.AccountsDetail.requestsLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.link.requests') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -512,7 +512,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
<h3 class="ui header">
|
||||
<i class="music icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.moderation.AccountsDetail.audioContentHeader') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.header.audioContent') }}
|
||||
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
|
||||
</div>
|
||||
</h3>
|
||||
|
@ -532,7 +532,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
<tbody>
|
||||
<tr v-if="!object.user">
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.cachedSizeLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.audioContent.cachedSize') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(stats.media_downloaded_size) }}
|
||||
|
@ -540,7 +540,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr v-if="object.user">
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.uploadQuotaLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.audioContent.uploadQuota') }}
|
||||
<span :data-tooltip="labels.uploadQuota"><i class="question circle icon" /></span>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -553,7 +553,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
@change="updateUser('upload_quota', true)"
|
||||
>
|
||||
<div class="ui basic label">
|
||||
{{ $t('views.admin.moderation.AccountsDetail.megabyteLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.audioContent.megabyte') }}
|
||||
</div>
|
||||
<action-feedback
|
||||
class="ui basic label"
|
||||
|
@ -565,7 +565,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.totalSizeLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.table.audioContent.totalSize') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(stats.media_total_size) }}
|
||||
|
@ -574,7 +574,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.channels', query: {q: getQuery('account', object.full_username) }}">
|
||||
{{ $t('views.admin.moderation.AccountsDetail.channelsLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.link.channels') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -584,7 +584,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('account', object.full_username) }}">
|
||||
{{ $t('views.admin.moderation.AccountsDetail.librariesLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.link.libraries') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -594,7 +594,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('account', object.full_username) }}">
|
||||
{{ $t('views.admin.moderation.AccountsDetail.uploadsLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.link.uploads') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -603,7 +603,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.artistsLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.link.artists') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.artists }}
|
||||
|
@ -611,7 +611,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.albumsLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.link.albums') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.albums }}
|
||||
|
@ -619,7 +619,7 @@ const updatePolicy = (newPolicy: InstancePolicy) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.AccountsDetail.tracksLabel') }}
|
||||
{{ $t('views.admin.moderation.AccountsDetail.link.tracks') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.tracks }}
|
||||
|
|
|
@ -9,8 +9,8 @@ const { t } = useI18n()
|
|||
|
||||
const allowListEnabled = ref(false)
|
||||
const labels = computed(() => ({
|
||||
moderation: t('views.admin.moderation.Base.moderation'),
|
||||
secondaryMenu: t('views.admin.moderation.Base.secondaryMenu')
|
||||
moderation: t('views.admin.moderation.Base.title'),
|
||||
secondaryMenu: t('views.admin.moderation.Base.menu.secondary')
|
||||
}))
|
||||
|
||||
const fetchNodeInfo = async () => {
|
||||
|
@ -35,7 +35,7 @@ fetchNodeInfo()
|
|||
class="ui item"
|
||||
:to="{name: 'manage.moderation.reports.list', query: {q: 'resolved:no'}}"
|
||||
>
|
||||
{{ $t('views.admin.moderation.Base.reportsLink') }}
|
||||
{{ $t('views.admin.moderation.Base.link.reports') }}
|
||||
<div
|
||||
v-if="$store.state.ui.notifications.pendingReviewReports > 0"
|
||||
:class="['ui', 'circular', 'mini', 'right floated', 'accent', 'label']"
|
||||
|
@ -47,7 +47,7 @@ fetchNodeInfo()
|
|||
class="ui item"
|
||||
:to="{name: 'manage.moderation.requests.list', query: {q: 'status:pending'}}"
|
||||
>
|
||||
{{ $t('views.admin.moderation.Base.userRequestsLink') }}
|
||||
{{ $t('views.admin.moderation.Base.link.userRequests') }}
|
||||
<div
|
||||
v-if="$store.state.ui.notifications.pendingReviewRequests > 0"
|
||||
:class="['ui', 'circular', 'mini', 'right floated', 'accent', 'label']"
|
||||
|
@ -59,13 +59,13 @@ fetchNodeInfo()
|
|||
class="ui item"
|
||||
:to="{name: 'manage.moderation.domains.list'}"
|
||||
>
|
||||
{{ $t('views.admin.moderation.Base.domainsLink') }}
|
||||
{{ $t('views.admin.moderation.Base.link.domains') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
class="ui item"
|
||||
:to="{name: 'manage.moderation.accounts.list'}"
|
||||
>
|
||||
{{ $t('views.admin.moderation.Base.accountsLink') }}
|
||||
{{ $t('views.admin.moderation.Base.link.accounts') }}
|
||||
</router-link>
|
||||
</nav>
|
||||
<router-view
|
||||
|
|
|
@ -23,7 +23,7 @@ const props = defineProps<Props>()
|
|||
const { t } = useI18n()
|
||||
|
||||
const labels = computed(() => ({
|
||||
statsWarning: t('views.admin.moderation.DomainsDetail.statsWarning')
|
||||
statsWarning: t('views.admin.moderation.DomainsDetail.warning.stats')
|
||||
}))
|
||||
|
||||
const isLoadingPolicy = ref(false)
|
||||
|
@ -133,7 +133,7 @@ const setAllowList = async (value: boolean) => {
|
|||
rel="noopener noreferrer"
|
||||
class="logo-wrapper"
|
||||
>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.websiteLink') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.link.website') }}
|
||||
<i class="external icon" />
|
||||
</a>
|
||||
</div>
|
||||
|
@ -149,7 +149,7 @@ const setAllowList = async (value: boolean) => {
|
|||
rel="noopener noreferrer"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.admin.moderation.DomainsDetail.djangoLink') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.link.django') }}
|
||||
</a>
|
||||
</div>
|
||||
<div
|
||||
|
@ -162,7 +162,7 @@ const setAllowList = async (value: boolean) => {
|
|||
@click.prevent="setAllowList(false)"
|
||||
>
|
||||
<i class="x icon" />
|
||||
{{ $t('views.admin.moderation.DomainsDetail.removeFromAllowList') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.button.removeFromAllowList') }}
|
||||
</button>
|
||||
<button
|
||||
v-else
|
||||
|
@ -170,7 +170,7 @@ const setAllowList = async (value: boolean) => {
|
|||
@click.prevent="setAllowList(true)"
|
||||
>
|
||||
<i class="check icon" />
|
||||
{{ $t('views.admin.moderation.DomainsDetail.addToAllowList') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.button.addToAllowList') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -191,17 +191,17 @@ const setAllowList = async (value: boolean) => {
|
|||
<header class="ui header">
|
||||
<h3>
|
||||
<i class="shield icon" />
|
||||
{{ $t('views.admin.moderation.DomainsDetail.noPolicyHeader') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.header.noPolicy') }}
|
||||
</h3>
|
||||
</header>
|
||||
<p>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.policyDescription') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.description.policy') }}
|
||||
</p>
|
||||
<button
|
||||
class="ui primary button"
|
||||
@click="showPolicyForm = true"
|
||||
>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.addPolicyButton') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.button.addPolicy') }}
|
||||
</button>
|
||||
</template>
|
||||
<instance-policy-card
|
||||
|
@ -211,7 +211,7 @@ const setAllowList = async (value: boolean) => {
|
|||
>
|
||||
<header class="ui header">
|
||||
<h3>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.activePolicyHeader') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.header.activePolicy') }}
|
||||
</h3>
|
||||
</header>
|
||||
</instance-policy-card>
|
||||
|
@ -235,31 +235,31 @@ const setAllowList = async (value: boolean) => {
|
|||
<h3 class="ui header">
|
||||
<i class="info icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.moderation.DomainsDetail.instanceDataHeader') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.header.instanceData') }}
|
||||
</div>
|
||||
</h3>
|
||||
<table class="ui very basic table">
|
||||
<tbody>
|
||||
<tr v-if="allowListEnabled">
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.inAllowListLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.instanceData.inAllowList.label') }}
|
||||
</td>
|
||||
<td>
|
||||
<span
|
||||
v-if="object.allowed"
|
||||
>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.inAllowListTrue') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.instanceData.inAllowList.true') }}
|
||||
</span>
|
||||
<span
|
||||
v-else
|
||||
>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.inAllowListFalse') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.instanceData.inAllowList.false') }}
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.lastCheckedLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.instanceData.lastChecked') }}
|
||||
</td>
|
||||
<td>
|
||||
<human-date
|
||||
|
@ -277,15 +277,15 @@ const setAllowList = async (value: boolean) => {
|
|||
<template v-if="object.nodeinfo && object.nodeinfo.status === 'ok'">
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.softwareLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.instanceData.software.label') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.softwareValue', {name: get(object, 'nodeinfo.payload.software.name', t('views.admin.moderation.DomainsDetail.notApplicable')), version: get(object, 'nodeinfo.payload.software.version', t('views.admin.moderation.DomainsDetail.notApplicable'))}) }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.instanceData.software.value', {name: get(object, 'nodeinfo.payload.software.name', t('views.admin.moderation.DomainsDetail.notApplicable')), version: get(object, 'nodeinfo.payload.software.version', t('views.admin.moderation.DomainsDetail.notApplicable'))}) }}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.domainNameLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.instanceData.domainName') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ get(object, 'nodeinfo.payload.metadata.nodeName', t('views.admin.moderation.DomainsDetail.notApplicable')) }}
|
||||
|
@ -293,7 +293,7 @@ const setAllowList = async (value: boolean) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.totalUsersLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.instanceData.totalUsers') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ get(object, 'nodeinfo.payload.usage.users.total', t('views.admin.moderation.DomainsDetail.notApplicable')) }}
|
||||
|
@ -303,10 +303,10 @@ const setAllowList = async (value: boolean) => {
|
|||
<template v-if="object.nodeinfo && object.nodeinfo.status === 'error'">
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.nodeInfoStatusLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.instanceData.nodeInfoStatus.label') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.nodeInfoFailureMessage') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.instanceData.nodeInfoStatus.value') }}
|
||||
|
||||
<span :data-tooltip="object.nodeinfo.error"><i class="question circle icon" /></span>
|
||||
</td>
|
||||
|
@ -319,7 +319,7 @@ const setAllowList = async (value: boolean) => {
|
|||
:url="'manage/federation/domains/' + object.name + '/nodeinfo/'"
|
||||
@action-done="refreshNodeInfo"
|
||||
>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.refreshNodeInfoButton') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.button.refreshNodeInfo') }}
|
||||
</ajax-button>
|
||||
</section>
|
||||
</div>
|
||||
|
@ -328,7 +328,7 @@ const setAllowList = async (value: boolean) => {
|
|||
<h3 class="ui header">
|
||||
<i class="feed icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.moderation.DomainsDetail.activityHeader') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.header.activity') }}
|
||||
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
|
||||
</div>
|
||||
</h3>
|
||||
|
@ -348,7 +348,7 @@ const setAllowList = async (value: boolean) => {
|
|||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.firstSeenLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.activity.firstSeen') }}
|
||||
</td>
|
||||
<td>
|
||||
<human-date :date="object.creation_date" />
|
||||
|
@ -359,7 +359,7 @@ const setAllowList = async (value: boolean) => {
|
|||
<router-link
|
||||
:to="{name: 'manage.moderation.accounts.list', query: {q: 'domain:' + object.name }}"
|
||||
>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.knownAccountsLink') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.link.knownAccounts') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -368,7 +368,7 @@ const setAllowList = async (value: boolean) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.emittedMessagesLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.activity.emittedMessages') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.outbox_activities }}
|
||||
|
@ -376,7 +376,7 @@ const setAllowList = async (value: boolean) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.receivedFollowsLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.activity.receivedFollows') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.received_library_follows }}
|
||||
|
@ -384,7 +384,7 @@ const setAllowList = async (value: boolean) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.emittedFollowsLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.activity.emittedFollows') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ stats.emitted_library_follows }}
|
||||
|
@ -399,7 +399,7 @@ const setAllowList = async (value: boolean) => {
|
|||
<h3 class="ui header">
|
||||
<i class="music icon" />
|
||||
<div class="content">
|
||||
{{ $t('views.admin.moderation.DomainsDetail.audioContentHeader') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.header.audioContent') }}
|
||||
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
|
||||
</div>
|
||||
</h3>
|
||||
|
@ -419,7 +419,7 @@ const setAllowList = async (value: boolean) => {
|
|||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.cachedSizeLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.audioContent.cachedSize') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(stats.media_downloaded_size) }}
|
||||
|
@ -427,7 +427,7 @@ const setAllowList = async (value: boolean) => {
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $t('views.admin.moderation.DomainsDetail.totalSizeLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.table.audioContent.totalSize') }}
|
||||
</td>
|
||||
<td>
|
||||
{{ humanSize(stats.media_total_size) }}
|
||||
|
@ -436,7 +436,7 @@ const setAllowList = async (value: boolean) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.channels', query: {q: getQuery('domain', object.name) }}">
|
||||
{{ $t('views.admin.moderation.DomainsDetail.channelsLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.link.channels') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -446,7 +446,7 @@ const setAllowList = async (value: boolean) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('domain', object.name) }}">
|
||||
{{ $t('views.admin.moderation.DomainsDetail.librariesLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.link.libraries') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -456,7 +456,7 @@ const setAllowList = async (value: boolean) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('domain', object.name) }}">
|
||||
{{ $t('views.admin.moderation.DomainsDetail.uploadsLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.link.uploads') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -466,7 +466,7 @@ const setAllowList = async (value: boolean) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.artists', query: {q: getQuery('domain', object.name) }}">
|
||||
{{ $t('views.admin.moderation.DomainsDetail.artistsLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.link.artists') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -476,7 +476,7 @@ const setAllowList = async (value: boolean) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.albums', query: {q: getQuery('domain', object.name) }}">
|
||||
{{ $t('views.admin.moderation.DomainsDetail.albumsLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.link.albums') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -486,7 +486,7 @@ const setAllowList = async (value: boolean) => {
|
|||
<tr>
|
||||
<td>
|
||||
<router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('domain', object.name) }}">
|
||||
{{ $t('views.admin.moderation.DomainsDetail.tracksLabel') }}
|
||||
{{ $t('views.admin.moderation.DomainsDetail.link.tracks') }}
|
||||
</router-link>
|
||||
</td>
|
||||
<td>
|
||||
|
|
|
@ -50,7 +50,7 @@ const createDomain = async () => {
|
|||
<main v-title="labels.domains">
|
||||
<section class="ui vertical stripe segment">
|
||||
<h2 class="ui left floated header">
|
||||
{{ $t('views.admin.moderation.DomainsList.title') }}
|
||||
{{ $t('views.admin.moderation.DomainsList.header.domains') }}
|
||||
</h2>
|
||||
<form
|
||||
class="ui right floated form"
|
||||
|
@ -62,7 +62,7 @@ const createDomain = async () => {
|
|||
class="ui negative message"
|
||||
>
|
||||
<h4 class="header">
|
||||
{{ $t('views.admin.moderation.DomainsList.failureHeader') }}
|
||||
{{ $t('views.admin.moderation.DomainsList.header.failure') }}
|
||||
</h4>
|
||||
<ul class="list">
|
||||
<li
|
||||
|
@ -75,7 +75,7 @@ const createDomain = async () => {
|
|||
</div>
|
||||
<div class="inline fields">
|
||||
<div class="field">
|
||||
<label for="add-domain">{{ $t('views.admin.moderation.DomainsList.addDomainLabel') }}</label>
|
||||
<label for="add-domain">{{ $t('views.admin.moderation.DomainsList.label.addDomain') }}</label>
|
||||
<input
|
||||
id="add-domain"
|
||||
v-model="domainName"
|
||||
|
@ -93,7 +93,7 @@ const createDomain = async () => {
|
|||
type="checkbox"
|
||||
name="allowed"
|
||||
>
|
||||
<label for="allowed">{{ $t('views.admin.moderation.DomainsList.addToAllowListLabel') }}</label>
|
||||
<label for="allowed">{{ $t('views.admin.moderation.DomainsList.label.addToAllowList') }}</label>
|
||||
</div>
|
||||
<div class="field">
|
||||
<button
|
||||
|
@ -101,7 +101,7 @@ const createDomain = async () => {
|
|||
type="submit"
|
||||
:disabled="isCreating"
|
||||
>
|
||||
{{ $t('views.admin.moderation.DomainsList.addButton') }}
|
||||
{{ $t('views.admin.moderation.DomainsList.button.add') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -90,7 +90,7 @@ fetchData()
|
|||
const { t } = useI18n()
|
||||
const sharedLabels = useSharedLabels()
|
||||
const labels = computed(() => ({
|
||||
searchPlaceholder: t('views.admin.moderation.ReportsList.searchPlaceholder'),
|
||||
searchPlaceholder: t('views.admin.moderation.ReportsList.placeholder.search'),
|
||||
reports: t('views.admin.moderation.ReportsList.title')
|
||||
}))
|
||||
</script>
|
||||
|
@ -99,13 +99,13 @@ const labels = computed(() => ({
|
|||
<main v-title="labels.reports">
|
||||
<section class="ui vertical stripe segment">
|
||||
<h2 class="ui header">
|
||||
{{ $t('views.admin.moderation.ReportsList.title') }}
|
||||
{{ $t('views.admin.moderation.ReportsList.header.reports') }}
|
||||
</h2>
|
||||
<div class="ui hidden divider" />
|
||||
<div class="ui inline form">
|
||||
<div class="fields">
|
||||
<div class="ui field">
|
||||
<label for="reports-search">{{ $t('views.admin.moderation.ReportsList.searchLabel') }}</label>
|
||||
<label for="reports-search">{{ $t('views.admin.moderation.ReportsList.label.search') }}</label>
|
||||
<form @submit.prevent="query = search.value">
|
||||
<input
|
||||
id="reports-search"
|
||||
|
@ -118,7 +118,7 @@ const labels = computed(() => ({
|
|||
</form>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="reports-status">{{ $t('views.admin.moderation.ReportsList.statusLabel') }}</label>
|
||||
<label for="reports-status">{{ $t('views.admin.moderation.ReportsList.label.status') }}</label>
|
||||
<select
|
||||
id="reports-status"
|
||||
class="ui dropdown"
|
||||
|
@ -126,13 +126,13 @@ const labels = computed(() => ({
|
|||
@change="addSearchToken('resolved', ($event.target as HTMLSelectElement).value)"
|
||||
>
|
||||
<option value="">
|
||||
{{ $t('views.admin.moderation.ReportsList.allOption') }}
|
||||
{{ $t('views.admin.moderation.ReportsList.option.status.all') }}
|
||||
</option>
|
||||
<option value="yes">
|
||||
{{ $t('views.admin.moderation.ReportsList.resolvedStatus') }}
|
||||
{{ $t('views.admin.moderation.ReportsList.option.status.resolved') }}
|
||||
</option>
|
||||
<option value="no">
|
||||
{{ $t('views.admin.moderation.ReportsList.unresolvedStatus') }}
|
||||
{{ $t('views.admin.moderation.ReportsList.option.status.unresolved') }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
@ -144,7 +144,7 @@ const labels = computed(() => ({
|
|||
@update:model-value="addSearchToken('category', $event)"
|
||||
/>
|
||||
<div class="field">
|
||||
<label for="reports-ordering">{{ $t('views.admin.moderation.ReportsList.orderingLabel') }}</label>
|
||||
<label for="reports-ordering">{{ $t('views.admin.moderation.ReportsList.ordering.label') }}</label>
|
||||
<select
|
||||
id="reports-ordering"
|
||||
v-model="ordering"
|
||||
|
@ -160,17 +160,17 @@ const labels = computed(() => ({
|
|||
</select>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="reports-ordering-direction">{{ $t('views.admin.moderation.ReportsList.orderingDirectionLabel') }}</label>
|
||||
<label for="reports-ordering-direction">{{ $t('views.admin.moderation.ReportsList.ordering.direction.label') }}</label>
|
||||
<select
|
||||
id="reports-ordering-direction"
|
||||
v-model="orderingDirection"
|
||||
class="ui dropdown"
|
||||
>
|
||||
<option value="+">
|
||||
{{ $t('views.admin.moderation.ReportsList.ascendingOrdering') }}
|
||||
{{ $t('views.admin.moderation.ReportsList.ordering.direction.ascending') }}
|
||||
</option>
|
||||
<option value="-">
|
||||
{{ $t('views.admin.moderation.ReportsList.descendingOrdering') }}
|
||||
{{ $t('views.admin.moderation.ReportsList.ordering.direction.descending') }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
|
|
@ -86,7 +86,7 @@ fetchData()
|
|||
const { t } = useI18n()
|
||||
const sharedLabels = useSharedLabels()
|
||||
const labels = computed(() => ({
|
||||
searchPlaceholder: t('views.admin.moderation.RequestsList.searchPlaceholder'),
|
||||
searchPlaceholder: t('views.admin.moderation.RequestsList.placeholder.search'),
|
||||
reports: t('views.admin.moderation.RequestsList.title')
|
||||
}))
|
||||
</script>
|
||||
|
@ -95,13 +95,13 @@ const labels = computed(() => ({
|
|||
<main v-title="labels.reports">
|
||||
<section class="ui vertical stripe segment">
|
||||
<h2 class="ui header">
|
||||
{{ $t('views.admin.moderation.RequestsList.title') }}
|
||||
{{ $t('views.admin.moderation.RequestsList.header.userRequests') }}
|
||||
</h2>
|
||||
<div class="ui hidden divider" />
|
||||
<div class="ui inline form">
|
||||
<div class="fields">
|
||||
<div class="ui field">
|
||||
<label for="requests-search">{{ $t('views.admin.moderation.RequestsList.searchLabel') }}</label>
|
||||
<label for="requests-search">{{ $t('views.admin.moderation.RequestsList.label.search') }}</label>
|
||||
<form @submit.prevent="query = search.value">
|
||||
<input
|
||||
id="requests-search"
|
||||
|
@ -114,7 +114,7 @@ const labels = computed(() => ({
|
|||
</form>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="requests-status">{{ $t('views.admin.moderation.RequestsList.statusLabel') }}</label>
|
||||
<label for="requests-status">{{ $t('views.admin.moderation.RequestsList.label.status') }}</label>
|
||||
<select
|
||||
id="requests-status"
|
||||
class="ui dropdown"
|
||||
|
@ -122,21 +122,21 @@ const labels = computed(() => ({
|
|||
@change="addSearchToken('status', ($event.target as HTMLSelectElement).value)"
|
||||
>
|
||||
<option value="">
|
||||
{{ $t('views.admin.moderation.RequestsList.allOption') }}
|
||||
{{ $t('views.admin.moderation.RequestsList.option.status.all') }}
|
||||
</option>
|
||||
<option value="pending">
|
||||
{{ $t('views.admin.moderation.RequestsList.pendingStatus') }}
|
||||
{{ $t('views.admin.moderation.RequestsList.option.status.pending') }}
|
||||
</option>
|
||||
<option value="approved">
|
||||
{{ $t('views.admin.moderation.RequestsList.approvedStatus') }}
|
||||
{{ $t('views.admin.moderation.RequestsList.option.status.approved') }}
|
||||
</option>
|
||||
<option value="refused">
|
||||
{{ $t('views.admin.moderation.RequestsList.refusedStatus') }}
|
||||
{{ $t('views.admin.moderation.RequestsList.option.status.refused') }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="requests-ordering">{{ $t('views.admin.moderation.RequestsList.orderingLabel') }}</label>
|
||||
<label for="requests-ordering">{{ $t('views.admin.moderation.RequestsList.ordering.label') }}</label>
|
||||
<select
|
||||
id="requests-ordering"
|
||||
v-model="ordering"
|
||||
|
@ -152,17 +152,17 @@ const labels = computed(() => ({
|
|||
</select>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="requests-ordering-direction">{{ $t('views.admin.moderation.RequestsList.orderingDirectionLabel') }}</label>
|
||||
<label for="requests-ordering-direction">{{ $t('views.admin.moderation.RequestsList.ordering.direction.label') }}</label>
|
||||
<select
|
||||
id="requests-ordering-direction"
|
||||
v-model="orderingDirection"
|
||||
class="ui dropdown"
|
||||
>
|
||||
<option value="+">
|
||||
{{ $t('views.admin.moderation.RequestsList.ascendingOrdering') }}
|
||||
{{ $t('views.admin.moderation.RequestsList.ordering.direction.ascending') }}
|
||||
</option>
|
||||
<option value="-">
|
||||
{{ $t('views.admin.moderation.RequestsList.descendingOrdering') }}
|
||||
{{ $t('views.admin.moderation.RequestsList.ordering.direction.descending') }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
|
|
@ -6,7 +6,7 @@ const { t } = useI18n()
|
|||
|
||||
const labels = computed(() => ({
|
||||
manageUsers: t('views.admin.users.Base.title'),
|
||||
secondaryMenu: t('views.admin.users.Base.secondaryMenu')
|
||||
secondaryMenu: t('views.admin.users.Base.menu.secondary')
|
||||
}))
|
||||
</script>
|
||||
|
||||
|
@ -24,13 +24,13 @@ const labels = computed(() => ({
|
|||
class="ui item"
|
||||
:to="{name: 'manage.users.users.list'}"
|
||||
>
|
||||
{{ $t('views.admin.users.Base.usersLink') }}
|
||||
{{ $t('views.admin.users.Base.link.users') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
class="ui item"
|
||||
:to="{name: 'manage.users.invitations.list'}"
|
||||
>
|
||||
{{ $t('views.admin.users.Base.invitationsLink') }}
|
||||
{{ $t('views.admin.users.Base.link.invitations') }}
|
||||
</router-link>
|
||||
</nav>
|
||||
<router-view :key="$route.fullPath" />
|
||||
|
|
|
@ -27,7 +27,7 @@ onMounted(async () => {
|
|||
<div class="ui active inverted dimmer">
|
||||
<div class="ui text loader">
|
||||
<h2>
|
||||
{{ $t('views.auth.Callback.loggingInHeader') }}
|
||||
{{ $t('views.auth.Callback.header.loggingIn') }}
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -15,7 +15,7 @@ const props = defineProps<Props>()
|
|||
const { t } = useI18n()
|
||||
|
||||
const labels = computed(() => ({
|
||||
confirm: t('views.auth.EmailConfirm.confirm')
|
||||
confirm: t('views.auth.EmailConfirm.title')
|
||||
}))
|
||||
|
||||
const errors = ref([] as string[])
|
||||
|
@ -60,7 +60,7 @@ onMounted(() => {
|
|||
class="ui negative message"
|
||||
>
|
||||
<h4 class="header">
|
||||
{{ $t('views.auth.EmailConfirm.confirmFailureHeader') }}
|
||||
{{ $t('views.auth.EmailConfirm.header.failure') }}
|
||||
</h4>
|
||||
<ul class="list">
|
||||
<li
|
||||
|
@ -72,7 +72,7 @@ onMounted(() => {
|
|||
</ul>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="confirmation-code">{{ $t('views.auth.EmailConfirm.confirmationCodeLabel') }}</label>
|
||||
<label for="confirmation-code">{{ $t('views.auth.EmailConfirm.label.confirmationCode') }}</label>
|
||||
<input
|
||||
id="confirmation-code"
|
||||
v-model="key"
|
||||
|
@ -82,7 +82,7 @@ onMounted(() => {
|
|||
>
|
||||
</div>
|
||||
<router-link :to="{path: '/login'}">
|
||||
{{ $t('views.auth.EmailConfirm.backToLoginLink') }}
|
||||
{{ $t('views.auth.EmailConfirm.link.back') }}
|
||||
</router-link>
|
||||
<button
|
||||
:class="['ui', {'loading': isLoading}, 'right', 'floated', 'success', 'button']"
|
||||
|
@ -96,13 +96,13 @@ onMounted(() => {
|
|||
class="ui positive message"
|
||||
>
|
||||
<h4 class="header">
|
||||
{{ $t('views.auth.EmailConfirm.confirmSuccessHeader') }}
|
||||
{{ $t('views.auth.EmailConfirm.header.success') }}
|
||||
</h4>
|
||||
<p>
|
||||
{{ $t('views.auth.EmailConfirm.confirmSuccessMessage') }}
|
||||
{{ $t('views.auth.EmailConfirm.message.success') }}
|
||||
</p>
|
||||
<router-link :to="{name: 'login'}">
|
||||
{{ $t('views.auth.EmailConfirm.goToLoginLink') }}
|
||||
{{ $t('views.auth.EmailConfirm.link.login') }}
|
||||
</router-link>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -37,7 +37,7 @@ whenever(() => store.state.auth.authenticated, () => {
|
|||
<section class="ui vertical stripe segment">
|
||||
<div class="ui small text container">
|
||||
<h2>
|
||||
{{ $t('views.auth.Login.loginHeader') }}
|
||||
{{ $t('views.auth.Login.header.login') }}
|
||||
</h2>
|
||||
<login-form :next="next" />
|
||||
</div>
|
||||
|
|
|
@ -18,7 +18,7 @@ const { t } = useI18n()
|
|||
const router = useRouter()
|
||||
|
||||
const labels = computed(() => ({
|
||||
placeholder: t('views.auth.PasswordReset.placeholder'),
|
||||
placeholder: t('views.auth.PasswordReset.placeholder.email'),
|
||||
reset: t('views.auth.PasswordReset.title')
|
||||
}))
|
||||
|
||||
|
@ -51,7 +51,7 @@ onMounted(() => emailInput.value.focus())
|
|||
<section class="ui vertical stripe segment">
|
||||
<div class="ui small text container">
|
||||
<h2>
|
||||
{{ $t('views.auth.PasswordReset.title') }}
|
||||
{{ $t('views.auth.PasswordReset.header.reset') }}
|
||||
</h2>
|
||||
<form
|
||||
class="ui form"
|
||||
|
@ -63,7 +63,7 @@ onMounted(() => emailInput.value.focus())
|
|||
class="ui negative message"
|
||||
>
|
||||
<h4 class="header">
|
||||
{{ $t('views.auth.PasswordReset.resetFailureHeader') }}
|
||||
{{ $t('views.auth.PasswordReset.header.failure') }}
|
||||
</h4>
|
||||
<ul class="list">
|
||||
<li
|
||||
|
@ -75,10 +75,10 @@ onMounted(() => emailInput.value.focus())
|
|||
</ul>
|
||||
</div>
|
||||
<p>
|
||||
{{ $t('views.auth.PasswordReset.resetFormDescription') }}
|
||||
{{ $t('views.auth.PasswordReset.help.form') }}
|
||||
</p>
|
||||
<div class="field">
|
||||
<label for="account-email">{{ $t('views.auth.PasswordReset.emailLabel') }}</label>
|
||||
<label for="account-email">{{ $t('views.auth.PasswordReset.label.email') }}</label>
|
||||
<input
|
||||
id="account-email"
|
||||
ref="emailInput"
|
||||
|
@ -91,13 +91,13 @@ onMounted(() => emailInput.value.focus())
|
|||
>
|
||||
</div>
|
||||
<router-link :to="{path: '/login'}">
|
||||
{{ $t('views.auth.PasswordReset.backToLoginLink') }}
|
||||
{{ $t('views.auth.PasswordReset.link.back') }}
|
||||
</router-link>
|
||||
<button
|
||||
:class="['ui', {'loading': isLoading}, 'right', 'floated', 'success', 'button']"
|
||||
type="submit"
|
||||
>
|
||||
{{ $t('views.auth.PasswordReset.requestResetButton') }}
|
||||
{{ $t('views.auth.PasswordReset.button.requestReset') }}
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
|
|
|
@ -68,7 +68,7 @@ const submit = async () => {
|
|||
class="ui negative message"
|
||||
>
|
||||
<h4 class="header">
|
||||
{{ $t('views.auth.PasswordResetConfirm.changeFailureHeader') }}
|
||||
{{ $t('views.auth.PasswordResetConfirm.header.failure') }}
|
||||
</h4>
|
||||
<ul class="list">
|
||||
<li
|
||||
|
@ -81,25 +81,25 @@ const submit = async () => {
|
|||
</div>
|
||||
<template v-if="token && uid">
|
||||
<div class="field">
|
||||
<label for="password-field">{{ $t('views.auth.PasswordResetConfirm.newPasswordLabel') }}</label>
|
||||
<label for="password-field">{{ $t('views.auth.PasswordResetConfirm.label.newPassword') }}</label>
|
||||
<password-input
|
||||
v-model="newPassword"
|
||||
field-id="password-field"
|
||||
/>
|
||||
</div>
|
||||
<router-link :to="{path: '/login'}">
|
||||
{{ $t('views.auth.PasswordResetConfirm.backToLoginLink') }}
|
||||
{{ $t('views.auth.PasswordResetConfirm.link.back') }}
|
||||
</router-link>
|
||||
<button
|
||||
:class="['ui', {'loading': isLoading}, 'right', 'floated', 'success', 'button']"
|
||||
type="submit"
|
||||
>
|
||||
{{ $t('views.auth.PasswordResetConfirm.updatePasswordButton') }}
|
||||
{{ $t('views.auth.PasswordResetConfirm.button.update') }}
|
||||
</button>
|
||||
</template>
|
||||
<template v-else>
|
||||
<p>
|
||||
{{ $t('views.auth.PasswordResetConfirm.requestSentMessage') }}
|
||||
{{ $t('views.auth.PasswordResetConfirm.message.requestSent') }}
|
||||
</p>
|
||||
</template>
|
||||
</form>
|
||||
|
@ -108,13 +108,13 @@ const submit = async () => {
|
|||
class="ui positive message"
|
||||
>
|
||||
<h4 class="header">
|
||||
{{ $t('views.auth.PasswordResetConfirm.changeSuccessHeader') }}
|
||||
{{ $t('views.auth.PasswordResetConfirm.header.success') }}
|
||||
</h4>
|
||||
<p>
|
||||
{{ $t('views.auth.PasswordResetConfirm.changeSuccessMessage') }}
|
||||
{{ $t('views.auth.PasswordResetConfirm.message.success') }}
|
||||
</p>
|
||||
<router-link :to="{name: 'login'}">
|
||||
{{ $t('views.auth.PasswordResetConfirm.goToLoginLink') }}
|
||||
{{ $t('views.auth.PasswordResetConfirm.link.login') }}
|
||||
</router-link>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -27,7 +27,7 @@ const recentActivity = ref(0)
|
|||
:client-only="true"
|
||||
/>
|
||||
<h2 class="ui header">
|
||||
{{ $t('views.auth.ProfileActivity.recentlyListened') }}
|
||||
{{ $t('views.auth.ProfileActivity.header.recentlyListened') }}
|
||||
</h2>
|
||||
<div class="ui divider" />
|
||||
<track-widget
|
||||
|
@ -39,7 +39,7 @@ const recentActivity = ref(0)
|
|||
<div class="ui hidden divider" />
|
||||
<div>
|
||||
<h2 class="ui header">
|
||||
{{ $t('views.auth.ProfileActivity.recentlyFavorited') }}
|
||||
{{ $t('views.auth.ProfileActivity.header.recentlyFavorited') }}
|
||||
</h2>
|
||||
<div class="ui divider" />
|
||||
<track-widget
|
||||
|
@ -50,7 +50,7 @@ const recentActivity = ref(0)
|
|||
<div class="ui hidden divider" />
|
||||
<div>
|
||||
<h2 class="ui header">
|
||||
{{ $t('views.auth.ProfileActivity.playlistsHeader') }}
|
||||
{{ $t('views.auth.ProfileActivity.header.playlists') }}
|
||||
</h2>
|
||||
<div class="ui divider" />
|
||||
<playlist-widget
|
||||
|
|
|
@ -100,7 +100,7 @@ watch(props, fetchData, { immediate: true })
|
|||
class="basic item"
|
||||
>
|
||||
<i class="external icon" />
|
||||
{{ $t('views.auth.ProfileBase.domainViewLink', {domain: object.domain}) }}
|
||||
{{ $t('views.auth.ProfileBase.link.domainView', {domain: object.domain}) }}
|
||||
</a>
|
||||
<div
|
||||
v-for="obj in getReportableObjects({account: object})"
|
||||
|
@ -119,7 +119,7 @@ watch(props, fetchData, { immediate: true })
|
|||
:to="{name: 'manage.moderation.accounts.detail', params: {id: object.full_username}}"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.auth.ProfileBase.moderationLink') }}
|
||||
{{ $t('views.auth.ProfileBase.link.moderation') }}
|
||||
</router-link>
|
||||
</div>
|
||||
</button>
|
||||
|
@ -148,7 +148,7 @@ watch(props, fetchData, { immediate: true })
|
|||
<template v-if="object.full_username === $store.state.auth.fullUsername">
|
||||
<div class="ui very small hidden divider" />
|
||||
<div class="ui basic success label">
|
||||
{{ $t('views.auth.ProfileBase.ownUserLabel') }}
|
||||
{{ $t('views.auth.ProfileBase.label.self') }}
|
||||
</div>
|
||||
</template>
|
||||
</h1>
|
||||
|
@ -171,13 +171,13 @@ watch(props, fetchData, { immediate: true })
|
|||
class="item"
|
||||
:to="{name: 'profile.overview', params: routerParams}"
|
||||
>
|
||||
{{ $t('views.auth.ProfileBase.overviewLink') }}
|
||||
{{ $t('views.auth.ProfileBase.link.overview') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
class="item"
|
||||
:to="{name: 'profile.activity', params: routerParams}"
|
||||
>
|
||||
{{ $t('views.auth.ProfileBase.activityLink') }}
|
||||
{{ $t('views.auth.ProfileBase.link.activity') }}
|
||||
</router-link>
|
||||
</div>
|
||||
<div class="ui hidden divider" />
|
||||
|
|
|
@ -42,7 +42,7 @@ const createForm = ref()
|
|||
</div>
|
||||
<div>
|
||||
<h2 class="ui with-actions header">
|
||||
{{ $t('views.auth.ProfileOverview.channelsHeader') }}
|
||||
{{ $t('views.auth.ProfileOverview.header.channels') }}
|
||||
<div
|
||||
v-if="$store.state.auth.authenticated && object.full_username === $store.state.auth.fullUsername"
|
||||
class="actions"
|
||||
|
@ -52,26 +52,26 @@ const createForm = ref()
|
|||
@click.stop.prevent="showCreateModal = true"
|
||||
>
|
||||
<i class="plus icon" />
|
||||
{{ $t('views.auth.ProfileOverview.addNewLink') }}
|
||||
{{ $t('views.auth.ProfileOverview.link.addNew') }}
|
||||
</a>
|
||||
</div>
|
||||
</h2>
|
||||
<channels-widget :filters="{scope: `actor:${object.full_username}`}" />
|
||||
<h2 class="ui with-actions header">
|
||||
{{ $t('views.auth.ProfileOverview.librariesHeader') }}
|
||||
{{ $t('views.auth.ProfileOverview.header.libraries') }}
|
||||
<div
|
||||
v-if="$store.state.auth.authenticated && object.full_username === $store.state.auth.fullUsername"
|
||||
class="actions"
|
||||
>
|
||||
<router-link :to="{name: 'content.libraries.index'}">
|
||||
<i class="plus icon" />
|
||||
{{ $t('views.auth.ProfileOverview.addNewLink') }}
|
||||
{{ $t('views.auth.ProfileOverview.link.addNew') }}
|
||||
</router-link>
|
||||
</div>
|
||||
</h2>
|
||||
<library-widget :url="`federation/actors/${object.full_username}/libraries/`">
|
||||
<template #title>
|
||||
{{ $t('views.auth.ProfileOverview.sharedLibraries') }}
|
||||
{{ $t('views.auth.ProfileOverview.header.sharedLibraries') }}
|
||||
</template>
|
||||
</library-widget>
|
||||
</div>
|
||||
|
@ -81,17 +81,17 @@ const createForm = ref()
|
|||
<span
|
||||
v-if="step === 1"
|
||||
>
|
||||
{{ $t('views.auth.ProfileOverview.createChannelModalHeader') }}
|
||||
{{ $t('views.auth.ProfileOverview.modal.createChannel.header') }}
|
||||
</span>
|
||||
<span
|
||||
v-else-if="category === 'podcast'"
|
||||
>
|
||||
{{ $t('views.auth.ProfileOverview.podcastChannelHeader') }}
|
||||
{{ $t('views.auth.ProfileOverview.modal.createChannel.podcast.header') }}
|
||||
</span>
|
||||
<span
|
||||
v-else
|
||||
>
|
||||
{{ $t('views.auth.ProfileOverview.artistChannelHeader') }}
|
||||
{{ $t('views.auth.ProfileOverview.modal.createChannel.artist.header') }}
|
||||
</span>
|
||||
</h4>
|
||||
<div
|
||||
|
@ -115,21 +115,21 @@ const createForm = ref()
|
|||
v-if="step === 1"
|
||||
class="ui basic deny button"
|
||||
>
|
||||
{{ $t('views.auth.ProfileOverview.cancelButton') }}
|
||||
{{ $t('views.auth.ProfileOverview.button.cancel') }}
|
||||
</button>
|
||||
<button
|
||||
v-if="step > 1"
|
||||
class="ui basic button"
|
||||
@click.stop.prevent="step -= 1"
|
||||
>
|
||||
{{ $t('views.auth.ProfileOverview.previousButton') }}
|
||||
{{ $t('views.auth.ProfileOverview.button.previous') }}
|
||||
</button>
|
||||
<button
|
||||
v-if="step === 1"
|
||||
class="ui primary button"
|
||||
@click.stop.prevent="step += 1"
|
||||
>
|
||||
{{ $t('views.auth.ProfileOverview.nextButton') }}
|
||||
{{ $t('views.auth.ProfileOverview.button.next') }}
|
||||
</button>
|
||||
<button
|
||||
v-if="step === 2"
|
||||
|
@ -138,7 +138,7 @@ const createForm = ref()
|
|||
:disabled="!submittable && !loading"
|
||||
@click.prevent.stop="createForm.submit"
|
||||
>
|
||||
{{ $t('views.auth.ProfileOverview.createChannelButton') }}
|
||||
{{ $t('views.auth.ProfileOverview.button.createChannel') }}
|
||||
</button>
|
||||
</div>
|
||||
</semantic-modal>
|
||||
|
|
|
@ -31,7 +31,7 @@ const labels = computed(() => ({
|
|||
<section class="ui vertical stripe segment">
|
||||
<div class="ui small text container">
|
||||
<h2>
|
||||
{{ $t('views.auth.Signup.createAccountHeader') }}
|
||||
{{ $t('views.auth.Signup.header.createAccount') }}
|
||||
</h2>
|
||||
<signup-form
|
||||
:default-invitation="defaultInvitation"
|
||||
|
|
|
@ -170,19 +170,19 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
<span
|
||||
v-if="object.artist?.content_category === 'podcast'"
|
||||
>
|
||||
{{ $t('views.channels.DetailBase.episodeCount', {count: totalTracks}) }}
|
||||
{{ $t('views.channels.DetailBase.meta.episodes', {count: totalTracks}) }}
|
||||
</span>
|
||||
<span
|
||||
v-else
|
||||
>
|
||||
{{ $t('views.channels.DetailBase.trackCount', {count: totalTracks}) }}
|
||||
{{ $t('views.channels.DetailBase.meta.tracks', {count: totalTracks}) }}
|
||||
</span>
|
||||
</template>
|
||||
<template v-if="object.attributed_to.full_username === $store.state.auth.fullUsername || $store.getters['channels/isSubscribed'](object.uuid)">
|
||||
<br>
|
||||
{{ $t('views.channels.DetailBase.subscriberCount', {count: object?.subscriptions_count}) }}
|
||||
{{ $t('views.channels.DetailBase.meta.subscribers', {count: object?.subscriptions_count}) }}
|
||||
<br>
|
||||
{{ $t('views.channels.DetailBase.listeningsCount', {count: object?.downloads_count}) }}
|
||||
{{ $t('views.channels.DetailBase.meta.listenings', {count: object?.downloads_count}) }}
|
||||
</template>
|
||||
<div class="ui hidden small divider" />
|
||||
<a
|
||||
|
@ -196,14 +196,14 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
class="tiny"
|
||||
>
|
||||
<h4 class="header">
|
||||
{{ $t('views.channels.DetailBase.subscribeModalHeader') }}
|
||||
{{ $t('views.channels.DetailBase.modal.subscribe.header') }}
|
||||
</h4>
|
||||
<div class="scrollable content">
|
||||
<div class="description">
|
||||
<template v-if="$store.state.auth.authenticated">
|
||||
<h3>
|
||||
<i class="user icon" />
|
||||
{{ $t('views.channels.DetailBase.subscribeOnFunkwhale') }}
|
||||
{{ $t('views.channels.DetailBase.modal.subscribe.funkwhale.header') }}
|
||||
</h3>
|
||||
<subscribe-button
|
||||
:channel="object"
|
||||
|
@ -214,20 +214,20 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
<template v-if="object.rss_url">
|
||||
<h3>
|
||||
<i class="feed icon" />
|
||||
{{ $t('views.channels.DetailBase.subscribeRss') }}
|
||||
{{ $t('views.channels.DetailBase.modal.subscribe.rss.header') }}
|
||||
</h3>
|
||||
<p>
|
||||
{{ $t('views.channels.DetailBase.copyUrl') }}
|
||||
{{ $t('views.channels.DetailBase.modal.subscribe.rss.content.help') }}
|
||||
</p>
|
||||
<copy-input :value="object.rss_url" />
|
||||
</template>
|
||||
<template v-if="object.actor">
|
||||
<h3>
|
||||
<i class="bell icon" />
|
||||
{{ $t('views.channels.DetailBase.subscribeOnFediverse') }}
|
||||
{{ $t('views.channels.DetailBase.modal.subscribe.fediverse.header') }}
|
||||
</h3>
|
||||
<p>
|
||||
{{ $t('views.channels.DetailBase.subscribeOnFediverseDescription') }}
|
||||
{{ $t('views.channels.DetailBase.modal.subscribe.fediverse.content.help') }}
|
||||
</p>
|
||||
<copy-input
|
||||
id="copy-tag"
|
||||
|
@ -238,7 +238,7 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
</div>
|
||||
<div class="actions">
|
||||
<button class="ui basic deny button">
|
||||
{{ $t('views.channels.DetailBase.cancelButton') }}
|
||||
{{ $t('views.channels.DetailBase.button.cancel') }}
|
||||
</button>
|
||||
</div>
|
||||
</semantic-modal>
|
||||
|
@ -256,7 +256,7 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
@click.prevent="showEmbedModal = !showEmbedModal"
|
||||
>
|
||||
<i class="code icon" />
|
||||
{{ $t('views.channels.DetailBase.embedButton') }}
|
||||
{{ $t('views.channels.DetailBase.button.embed') }}
|
||||
</a>
|
||||
<a
|
||||
v-if="object.actor && object.actor.domain != $store.getters['instance/domain']"
|
||||
|
@ -265,7 +265,7 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
class="basic item"
|
||||
>
|
||||
<i class="external icon" />
|
||||
{{ $t('views.channels.DetailBase.domainViewLink', {domain: object.actor.domain}) }}
|
||||
{{ $t('views.channels.DetailBase.link.domainView', {domain: object.actor.domain}) }}
|
||||
</a>
|
||||
<div class="divider" />
|
||||
<a
|
||||
|
@ -286,7 +286,7 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
@click.stop.prevent="showEditModal = true"
|
||||
>
|
||||
<i class="edit icon" />
|
||||
{{ $t('views.channels.DetailBase.editButton') }}
|
||||
{{ $t('views.channels.DetailBase.button.edit') }}
|
||||
</a>
|
||||
<dangerous-button
|
||||
v-if="object"
|
||||
|
@ -294,22 +294,22 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
@confirm="remove()"
|
||||
>
|
||||
<i class="ui trash icon" />
|
||||
{{ $t('views.channels.DetailBase.deleteButton') }}
|
||||
{{ $t('views.channels.DetailBase.button.delete') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.channels.DetailBase.deleteModalHeader') }}
|
||||
{{ $t('views.channels.DetailBase.modal.delete.header') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<div>
|
||||
<p>
|
||||
{{ $t('views.channels.DetailBase.deleteModalMessage') }}
|
||||
{{ $t('views.channels.DetailBase.modal.delete.content.warning') }}
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<p>
|
||||
{{ $t('views.channels.DetailBase.deleteModalConfirm') }}
|
||||
{{ $t('views.channels.DetailBase.button.confirm') }}
|
||||
</p>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
@ -321,7 +321,7 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
:to="{name: 'manage.channels.detail', params: {id: object.uuid}}"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.channels.DetailBase.moderationLink') }}
|
||||
{{ $t('views.channels.DetailBase.link.moderation') }}
|
||||
</router-link>
|
||||
</template>
|
||||
</div>
|
||||
|
@ -352,7 +352,7 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
target="_blank"
|
||||
>
|
||||
<i class="external link icon" />
|
||||
{{ $t('views.channels.DetailBase.mirroredLink', {domain: externalDomain}) }}
|
||||
{{ $t('views.channels.DetailBase.link.mirrored', {domain: externalDomain}) }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -367,7 +367,7 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
@click.prevent.stop="$store.commit('channels/showUploadModal', {show: true, config: {channel: object}})"
|
||||
>
|
||||
<i class="upload icon" />
|
||||
{{ $t('views.channels.DetailBase.uploadButton') }}
|
||||
{{ $t('views.channels.DetailBase.button.upload') }}
|
||||
</button>
|
||||
</div>
|
||||
<div class="ui buttons">
|
||||
|
@ -376,7 +376,7 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
class="vibrant"
|
||||
:artist="object.artist"
|
||||
>
|
||||
{{ $t('views.channels.DetailBase.playButton') }}
|
||||
{{ $t('views.channels.DetailBase.button.play') }}
|
||||
</play-button>
|
||||
</div>
|
||||
<div class="ui buttons">
|
||||
|
@ -392,7 +392,7 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
v-model:show="showEmbedModal"
|
||||
>
|
||||
<h4 class="header">
|
||||
{{ $t('views.channels.DetailBase.embedModalHeader') }}
|
||||
{{ $t('views.channels.DetailBase.modal.embed.header') }}
|
||||
</h4>
|
||||
<div class="scrolling content">
|
||||
<div class="description">
|
||||
|
@ -404,7 +404,7 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
</div>
|
||||
<div class="actions">
|
||||
<button class="ui basic deny button">
|
||||
{{ $t('views.channels.DetailBase.cancelButton') }}
|
||||
{{ $t('views.channels.DetailBase.button.cancel') }}
|
||||
</button>
|
||||
</div>
|
||||
</semantic-modal>
|
||||
|
@ -416,12 +416,12 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
<span
|
||||
v-if="object.artist?.content_category === 'podcast'"
|
||||
>
|
||||
{{ $t('views.channels.DetailBase.podcastChannelHeader') }}
|
||||
{{ $t('views.channels.DetailBase.header.podcastChannel') }}
|
||||
</span>
|
||||
<span
|
||||
v-else
|
||||
>
|
||||
{{ $t('views.channels.DetailBase.artistChannelHeader') }}
|
||||
{{ $t('views.channels.DetailBase.header.artistChannel') }}
|
||||
</span>
|
||||
</h4>
|
||||
<div class="scrolling content">
|
||||
|
@ -436,14 +436,14 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
</div>
|
||||
<div class="actions">
|
||||
<button class="ui left floated basic deny button">
|
||||
{{ $t('views.channels.DetailBase.cancelButton') }}
|
||||
{{ $t('views.channels.DetailBase.button.cancel') }}
|
||||
</button>
|
||||
<button
|
||||
:class="['ui', 'primary', 'confirm', {loading: edit.loading}, 'button']"
|
||||
:disabled="!edit.submittable"
|
||||
@click.stop="editForm?.submit"
|
||||
>
|
||||
{{ $t('views.channels.DetailBase.updateChannelButton') }}
|
||||
{{ $t('views.channels.DetailBase.button.updateChannel') }}
|
||||
</button>
|
||||
</div>
|
||||
</semantic-modal>
|
||||
|
@ -464,7 +464,7 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
|
||||
:to="{name: 'channels.detail', params: {id: id}}"
|
||||
>
|
||||
{{ $t('views.channels.DetailBase.channelOverview') }}
|
||||
{{ $t('views.channels.DetailBase.link.channelOverview') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
class="item"
|
||||
|
@ -474,12 +474,12 @@ const updateSubscriptionCount = (delta: number) => {
|
|||
<span
|
||||
v-if="isPodcast"
|
||||
>
|
||||
{{ $t('views.channels.DetailBase.channelEpisodes') }}
|
||||
{{ $t('views.channels.DetailBase.link.channelEpisodes') }}
|
||||
</span>
|
||||
<span
|
||||
v-else
|
||||
>
|
||||
{{ $t('views.channels.DetailBase.channelTracks') }}
|
||||
{{ $t('views.channels.DetailBase.link.channelTracks') }}
|
||||
</span>
|
||||
</router-link>
|
||||
</div>
|
||||
|
|
|
@ -101,15 +101,15 @@ const albumModal = ref()
|
|||
@click="pendingUploads.length = 0"
|
||||
/>
|
||||
<h3 class="ui header">
|
||||
{{ $t('views.channels.DetailOverview.uploadsSuccessHeader') }}
|
||||
{{ $t('views.channels.DetailOverview.header.uploadsSuccess') }}
|
||||
</h3>
|
||||
<p>
|
||||
{{ $t('views.channels.DetailOverview.uploadsProgress', {finished: processedUploads.length, total: pendingUploads.length}) }}
|
||||
{{ $t('views.channels.DetailOverview.meta.progress', {finished: processedUploads.length, total: pendingUploads.length}) }}
|
||||
</p>
|
||||
</template>
|
||||
<template v-else-if="isOver">
|
||||
<h3 class="ui header">
|
||||
{{ $t('views.channels.DetailOverview.uploadsFailureHeader') }}
|
||||
{{ $t('views.channels.DetailOverview.header.uploadsFailure') }}
|
||||
</h3>
|
||||
<div class="ui hidden divider" />
|
||||
<router-link
|
||||
|
@ -117,26 +117,26 @@ const albumModal = ref()
|
|||
class="ui basic button"
|
||||
:to="{name: 'content.libraries.files', query: {q: 'status:skipped'}}"
|
||||
>
|
||||
{{ $t('views.channels.DetailOverview.skippedUploadsLink') }}
|
||||
{{ $t('views.channels.DetailOverview.link.skippedUploads') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
v-if="erroredUploads.length > 0"
|
||||
class="ui basic button"
|
||||
:to="{name: 'content.libraries.files', query: {q: 'status:errored'}}"
|
||||
>
|
||||
{{ $t('views.channels.DetailOverview.erroredUploadsLink') }}
|
||||
{{ $t('views.channels.DetailOverview.link.erroredUploads') }}
|
||||
</router-link>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="ui inline right floated active loader" />
|
||||
<h3 class="ui header">
|
||||
{{ $t('views.channels.DetailOverview.uploadsProcessingHeader') }}
|
||||
{{ $t('views.channels.DetailOverview.header.uploadsProcessing') }}
|
||||
</h3>
|
||||
<p>
|
||||
{{ $t('views.channels.DetailOverview.uploadsProcessingMessage') }}
|
||||
{{ $t('views.channels.DetailOverview.message.processing') }}
|
||||
</p>
|
||||
<p>
|
||||
{{ $t('views.channels.DetailOverview.uploadsProgress', {finished: processedUploads.length, total: pendingUploads.length}) }}
|
||||
{{ $t('views.channels.DetailOverview.meta.progress', {finished: processedUploads.length, total: pendingUploads.length}) }}
|
||||
</p>
|
||||
</template>
|
||||
</div>
|
||||
|
@ -159,12 +159,12 @@ const albumModal = ref()
|
|||
<span
|
||||
v-if="isPodcast"
|
||||
>
|
||||
{{ $t('views.channels.DetailOverview.latestEpisodes') }}
|
||||
{{ $t('views.channels.DetailOverview.header.latestEpisodes') }}
|
||||
</span>
|
||||
<span
|
||||
v-else
|
||||
>
|
||||
{{ $t('views.channels.DetailOverview.latestTracks') }}
|
||||
{{ $t('views.channels.DetailOverview.header.latestTracks') }}
|
||||
</span>
|
||||
</h2>
|
||||
</channel-entries>
|
||||
|
@ -178,12 +178,12 @@ const albumModal = ref()
|
|||
<span
|
||||
v-if="isPodcast"
|
||||
>
|
||||
{{ $t('views.channels.DetailOverview.seriesHeader') }}
|
||||
{{ $t('views.channels.DetailOverview.header.series') }}
|
||||
</span>
|
||||
<span
|
||||
v-else
|
||||
>
|
||||
{{ $t('views.channels.DetailOverview.albumsHeader') }}
|
||||
{{ $t('views.channels.DetailOverview.header.albums') }}
|
||||
</span>
|
||||
<div
|
||||
v-if="isOwner"
|
||||
|
@ -191,7 +191,7 @@ const albumModal = ref()
|
|||
>
|
||||
<a @click.stop.prevent="albumModal.show = true">
|
||||
<i class="plus icon" />
|
||||
{{ $t('views.channels.DetailOverview.addAlbumLink') }}
|
||||
{{ $t('views.channels.DetailOverview.link.addAlbum') }}
|
||||
</a>
|
||||
</div>
|
||||
</h2>
|
||||
|
|
|
@ -26,7 +26,7 @@ const widgetKey = ref(new Date().toLocaleString())
|
|||
const { t } = useI18n()
|
||||
const labels = computed(() => ({
|
||||
title: t('views.channels.SubscriptionsList.title'),
|
||||
searchPlaceholder: t('views.channels.SubscriptionsList.searchPlaceholder')
|
||||
searchPlaceholder: t('views.channels.SubscriptionsList.placeholder.search')
|
||||
}))
|
||||
|
||||
const previousPage = ref()
|
||||
|
@ -66,7 +66,7 @@ const showSubscribeModal = ref(false)
|
|||
<div class="actions">
|
||||
<a @click.stop.prevent="showSubscribeModal = true">
|
||||
<i class="plus icon" />
|
||||
{{ $t('views.channels.SubscriptionsList.addNewLink') }}
|
||||
{{ $t('views.channels.SubscriptionsList.link.addNew') }}
|
||||
</a>
|
||||
</div>
|
||||
</h1>
|
||||
|
@ -76,7 +76,7 @@ const showSubscribeModal = ref(false)
|
|||
:fullscreen="false"
|
||||
>
|
||||
<h2 class="header">
|
||||
{{ $t('views.channels.SubscriptionsList.subscriptionModalHeader') }}
|
||||
{{ $t('views.channels.SubscriptionsList.modal.subscription.header') }}
|
||||
</h2>
|
||||
<div
|
||||
ref="modalContent"
|
||||
|
@ -92,7 +92,7 @@ const showSubscribeModal = ref(false)
|
|||
</div>
|
||||
<div class="actions">
|
||||
<button class="ui basic deny button">
|
||||
{{ $t('views.channels.SubscriptionsList.cancelButton') }}
|
||||
{{ $t('views.channels.SubscriptionsList.button.cancel') }}
|
||||
</button>
|
||||
<button
|
||||
form="remote-search"
|
||||
|
@ -100,7 +100,7 @@ const showSubscribeModal = ref(false)
|
|||
class="ui primary button"
|
||||
>
|
||||
<i class="bookmark icon" />
|
||||
{{ $t('views.channels.SubscriptionsList.subscribeButton') }}
|
||||
{{ $t('views.channels.SubscriptionsList.button.subscribe') }}
|
||||
</button>
|
||||
</div>
|
||||
</semantic-modal>
|
||||
|
|
|
@ -5,7 +5,7 @@ import { computed } from 'vue'
|
|||
const { t } = useI18n()
|
||||
|
||||
const labels = computed(() => ({
|
||||
secondaryMenu: t('views.content.Base.secondaryMenu'),
|
||||
secondaryMenu: t('views.content.Base.menu.secondary'),
|
||||
title: t('views.content.Base.title')
|
||||
}))
|
||||
</script>
|
||||
|
@ -24,13 +24,13 @@ const labels = computed(() => ({
|
|||
class="ui item"
|
||||
:to="{name: 'content.libraries.index'}"
|
||||
>
|
||||
{{ $t('views.content.Base.librariesLink') }}
|
||||
{{ $t('views.content.Base.link.libraries') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
class="ui item"
|
||||
:to="{name: 'content.libraries.files'}"
|
||||
>
|
||||
{{ $t('views.content.Base.tracksLink') }}
|
||||
{{ $t('views.content.Base.link.tracks') }}
|
||||
</router-link>
|
||||
</nav>
|
||||
<router-view :key="$route.fullPath" />
|
||||
|
|
|
@ -23,51 +23,51 @@ const defaultQuota = computed(() => humanSize(quota.value * 1e6))
|
|||
<div class="ui text container">
|
||||
<h1>{{ labels.title }}</h1>
|
||||
<p>
|
||||
<strong>{{ $t('views.content.Home.uploadQuota', { quota: defaultQuota }) }}</strong>
|
||||
<strong>{{ $t('views.content.Home.help.uploadQuota', { quota: defaultQuota }) }}</strong>
|
||||
</p>
|
||||
<div class="ui segment">
|
||||
<h2>
|
||||
<i class="feed icon" />
|
||||
{{ $t('views.content.Home.channelHeader') }}
|
||||
{{ $t('views.content.Home.header.channel') }}
|
||||
</h2>
|
||||
<p>
|
||||
{{ $t('views.content.Home.channelDescription') }} {{ $t('views.content.Home.channelDescriptionContinued') }}
|
||||
{{ $t('views.content.Home.description.channel.1') }} {{ $t('views.content.Home.description.channel.2') }}
|
||||
</p>
|
||||
<router-link
|
||||
:to="{name: 'profile.overview', params: {username: store.state.auth.username}, hash: '#channels'}"
|
||||
class="ui primary button"
|
||||
>
|
||||
{{ $t('views.content.Home.getStartedButton') }}
|
||||
{{ $t('views.content.Home.button.start') }}
|
||||
</router-link>
|
||||
</div>
|
||||
<div class="ui segment">
|
||||
<h2>
|
||||
<i class="cloud icon" />
|
||||
{{ $t('views.content.Home.libraryUploadHeader') }}
|
||||
{{ $t('views.content.Home.header.upload') }}
|
||||
</h2>
|
||||
<p>
|
||||
{{ $t('views.content.Home.libraryUploadDescription') }}
|
||||
{{ $t('views.content.Home.description.upload') }}
|
||||
</p>
|
||||
<router-link
|
||||
:to="{name: 'content.libraries.index'}"
|
||||
class="ui primary button"
|
||||
>
|
||||
{{ $t('views.content.Home.getStartedButton') }}
|
||||
{{ $t('views.content.Home.button.start') }}
|
||||
</router-link>
|
||||
</div>
|
||||
<div class="ui segment">
|
||||
<h2>
|
||||
<i class="download icon" />
|
||||
{{ $t('views.content.Home.followLibrariesHeader') }}
|
||||
{{ $t('views.content.Home.header.follow') }}
|
||||
</h2>
|
||||
<p>
|
||||
{{ $t('views.content.Home.followLibrariesDescription') }}
|
||||
{{ $t('views.content.Home.description.follow') }}
|
||||
</p>
|
||||
<router-link
|
||||
:to="{name: 'content.remote.index'}"
|
||||
class="ui primary button"
|
||||
>
|
||||
{{ $t('views.content.Home.getStartedButton') }}
|
||||
{{ $t('views.content.Home.button.start') }}
|
||||
</router-link>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -17,7 +17,7 @@ const { t } = useI18n()
|
|||
|
||||
const sharedLabels = useSharedLabels()
|
||||
|
||||
const sizeLabel = computed(() => t('views.content.libraries.Card.sizeLabel'))
|
||||
const sizeLabel = computed(() => t('views.content.libraries.Card.label.size'))
|
||||
|
||||
const privacyTooltips = (level: PrivacyLevel) => `Visibility: ${sharedLabels.fields.privacy_level.choices[level].toLowerCase()}`
|
||||
</script>
|
||||
|
@ -69,7 +69,7 @@ const privacyTooltips = (level: PrivacyLevel) => `Visibility: ${sharedLabels.fie
|
|||
{{ humanSize(library.size) }}
|
||||
</span>
|
||||
<i class="music icon" />
|
||||
{{ $t('views.content.libraries.Card.trackCount') }}
|
||||
{{ $t('views.content.libraries.Card.meta.tracks') }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="ui bottom basic attached buttons">
|
||||
|
@ -77,13 +77,13 @@ const privacyTooltips = (level: PrivacyLevel) => `Visibility: ${sharedLabels.fie
|
|||
:to="{name: 'library.detail.upload', params: {id: library.uuid}}"
|
||||
class="ui button"
|
||||
>
|
||||
{{ $t('views.content.libraries.Card.uploadButton') }}
|
||||
{{ $t('views.content.libraries.Card.button.upload') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
:to="{name: 'library.detail', params: {id: library.uuid}}"
|
||||
class="ui button"
|
||||
>
|
||||
{{ $t('views.content.libraries.Card.detailsLink') }}
|
||||
{{ $t('views.content.libraries.Card.link.details') }}
|
||||
</router-link>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -70,14 +70,14 @@ const actionFilters = computed(() => ({ q: query.value, ...props.filters }))
|
|||
const actions = computed(() => [
|
||||
{
|
||||
name: 'delete',
|
||||
label: t('views.content.libraries.FilesTable.deleteLabel'),
|
||||
label: t('views.content.libraries.FilesTable.action.delete'),
|
||||
isDangerous: true,
|
||||
allowAll: true,
|
||||
confirmColor: 'danger'
|
||||
},
|
||||
{
|
||||
name: 'relaunch_import',
|
||||
label: t('views.content.libraries.FilesTable.restartImportLabel'),
|
||||
label: t('views.content.libraries.FilesTable.action.restartImport'),
|
||||
isDangerous: true,
|
||||
allowAll: true,
|
||||
filterCheckable: (filter: { import_status: ImportStatus }) => {
|
||||
|
@ -120,8 +120,8 @@ fetchData()
|
|||
|
||||
const sharedLabels = useSharedLabels()
|
||||
const labels = computed(() => ({
|
||||
searchPlaceholder: t('views.content.libraries.FilesTable.searchPlaceholder'),
|
||||
showStatus: t('views.content.libraries.FilesTable.showStatus')
|
||||
searchPlaceholder: t('views.content.libraries.FilesTable.placeholder.search'),
|
||||
showStatus: t('views.content.libraries.FilesTable.button.showStatus')
|
||||
}))
|
||||
|
||||
const detailedUpload = ref()
|
||||
|
@ -138,7 +138,7 @@ const getImportStatusChoice = (importStatus: ImportStatus) => {
|
|||
<div class="fields">
|
||||
<div class="ui six wide field">
|
||||
<label for="files-search">
|
||||
{{ $t('views.content.libraries.FilesTable.searchLabel') }}
|
||||
{{ $t('views.content.libraries.FilesTable.label.search') }}
|
||||
</label>
|
||||
<form @submit.prevent="query = search.value">
|
||||
<input
|
||||
|
@ -153,7 +153,7 @@ const getImportStatusChoice = (importStatus: ImportStatus) => {
|
|||
</div>
|
||||
<div class="field">
|
||||
<label for="import-status">
|
||||
{{ $t('views.content.libraries.FilesTable.importStatusLabel') }}
|
||||
{{ $t('views.content.libraries.FilesTable.label.importStatus') }}
|
||||
</label>
|
||||
<select
|
||||
id="import-status"
|
||||
|
@ -162,28 +162,28 @@ const getImportStatusChoice = (importStatus: ImportStatus) => {
|
|||
@change="addSearchToken('status', ($event.target as HTMLSelectElement).value)"
|
||||
>
|
||||
<option value>
|
||||
{{ $t('views.content.libraries.FilesTable.allOption') }}
|
||||
{{ $t('views.content.libraries.FilesTable.option.status.all') }}
|
||||
</option>
|
||||
<option value="draft">
|
||||
{{ $t('views.content.libraries.FilesTable.draftStatus') }}
|
||||
{{ $t('views.content.libraries.FilesTable.option.status.draft') }}
|
||||
</option>
|
||||
<option value="pending">
|
||||
{{ $t('views.content.libraries.FilesTable.pendingStatus') }}
|
||||
{{ $t('views.content.libraries.FilesTable.option.status.pending') }}
|
||||
</option>
|
||||
<option value="skipped">
|
||||
{{ $t('views.content.libraries.FilesTable.skippedStatus') }}
|
||||
{{ $t('views.content.libraries.FilesTable.option.status.skipped') }}
|
||||
</option>
|
||||
<option value="errored">
|
||||
{{ $t('views.content.libraries.FilesTable.failedStatus') }}
|
||||
{{ $t('views.content.libraries.FilesTable.option.status.failed') }}
|
||||
</option>
|
||||
<option value="finished">
|
||||
{{ $t('views.content.libraries.FilesTable.finishedStatus') }}
|
||||
{{ $t('views.content.libraries.FilesTable.option.status.finished') }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="ordering-select">
|
||||
{{ $t('views.content.libraries.FilesTable.orderingLabel') }}
|
||||
{{ $t('views.content.libraries.FilesTable.ordering.label') }}
|
||||
</label>
|
||||
<select
|
||||
id="ordering-select"
|
||||
|
@ -201,7 +201,7 @@ const getImportStatusChoice = (importStatus: ImportStatus) => {
|
|||
</div>
|
||||
<div class="field">
|
||||
<label for="ordering-direction">
|
||||
{{ $t('views.content.libraries.FilesTable.orderingDirectionLabel') }}
|
||||
{{ $t('views.content.libraries.FilesTable.ordering.direction.label') }}
|
||||
</label>
|
||||
<select
|
||||
id="ordering-direction"
|
||||
|
@ -209,10 +209,10 @@ const getImportStatusChoice = (importStatus: ImportStatus) => {
|
|||
class="ui dropdown"
|
||||
>
|
||||
<option value="+">
|
||||
{{ $t('views.content.libraries.FilesTable.ascendingOrdering') }}
|
||||
{{ $t('views.content.libraries.FilesTable.ordering.direction.ascending') }}
|
||||
</option>
|
||||
<option value="-">
|
||||
{{ $t('views.content.libraries.FilesTable.descendingOrdering') }}
|
||||
{{ $t('views.content.libraries.FilesTable.ordering.direction.descending') }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
@ -236,7 +236,7 @@ const getImportStatusChoice = (importStatus: ImportStatus) => {
|
|||
>
|
||||
<div class="ui icon header">
|
||||
<i class="upload icon" />
|
||||
{{ $t('views.content.libraries.FilesTable.emptyState') }}
|
||||
{{ $t('views.content.libraries.FilesTable.empty.noTracks') }}
|
||||
</div>
|
||||
</div>
|
||||
<action-table
|
||||
|
@ -254,25 +254,25 @@ const getImportStatusChoice = (importStatus: ImportStatus) => {
|
|||
>
|
||||
<template #header-cells>
|
||||
<th>
|
||||
{{ $t('views.content.libraries.FilesTable.titleTableHeader') }}
|
||||
{{ $t('views.content.libraries.FilesTable.table.file.header.title') }}
|
||||
</th>
|
||||
<th>
|
||||
{{ $t('views.content.libraries.FilesTable.artistTableHeader') }}
|
||||
{{ $t('views.content.libraries.FilesTable.table.file.header.artist') }}
|
||||
</th>
|
||||
<th>
|
||||
{{ $t('views.content.libraries.FilesTable.albumTableHeader') }}
|
||||
{{ $t('views.content.libraries.FilesTable.table.file.header.album') }}
|
||||
</th>
|
||||
<th>
|
||||
{{ $t('views.content.libraries.FilesTable.uploadDateTableHeader') }}
|
||||
{{ $t('views.content.libraries.FilesTable.table.file.header.uploadDate') }}
|
||||
</th>
|
||||
<th>
|
||||
{{ $t('views.content.libraries.FilesTable.importStatusTableHeader') }}
|
||||
{{ $t('views.content.libraries.FilesTable.table.file.header.importStatus') }}
|
||||
</th>
|
||||
<th>
|
||||
{{ $t('views.content.libraries.FilesTable.durationTableHeader') }}
|
||||
{{ $t('views.content.libraries.FilesTable.table.file.header.duration') }}
|
||||
</th>
|
||||
<th>
|
||||
{{ $t('views.content.libraries.FilesTable.sizeTableHeader') }}
|
||||
{{ $t('views.content.libraries.FilesTable.table.file.header.size') }}
|
||||
</th>
|
||||
</template>
|
||||
<template
|
||||
|
@ -351,7 +351,7 @@ const getImportStatusChoice = (importStatus: ImportStatus) => {
|
|||
/>
|
||||
|
||||
<span v-if="result && result.results.length > 0">
|
||||
{{ $t('views.content.libraries.FilesTable.resultsDisplay', {start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}) }}
|
||||
{{ $t('views.content.libraries.FilesTable.pagination.results', {start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}) }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -30,8 +30,8 @@ const sharedLabels = useSharedLabels()
|
|||
const store = useStore()
|
||||
|
||||
const labels = computed(() => ({
|
||||
descriptionPlaceholder: t('views.content.libraries.Form.descriptionPlaceholder'),
|
||||
namePlaceholder: t('views.content.libraries.Form.namePlaceholder')
|
||||
descriptionPlaceholder: t('views.content.libraries.Form.placeholder.description'),
|
||||
namePlaceholder: t('views.content.libraries.Form.placeholder.name')
|
||||
}))
|
||||
|
||||
const currentVisibilityLevel = ref(props.library?.privacy_level ?? 'me')
|
||||
|
@ -59,8 +59,8 @@ const submit = async () => {
|
|||
|
||||
store.commit('ui/addMessage', {
|
||||
content: props.library
|
||||
? t('views.content.libraries.Form.libraryUpdateMessage')
|
||||
: t('views.content.libraries.Form.libraryCreateMessage'),
|
||||
? t('views.content.libraries.Form.message.libraryUpdated')
|
||||
: t('views.content.libraries.Form.message.libraryCreated'),
|
||||
date: new Date()
|
||||
})
|
||||
} catch (error) {
|
||||
|
@ -77,7 +77,7 @@ const remove = async () => {
|
|||
await axios.delete(`libraries/${props.library?.uuid}/`)
|
||||
emit('deleted')
|
||||
store.commit('ui/addMessage', {
|
||||
content: t('views.content.libraries.Form.libraryDeleteMessage'),
|
||||
content: t('views.content.libraries.Form.message.libraryDeleted'),
|
||||
date: new Date()
|
||||
})
|
||||
} catch (error) {
|
||||
|
@ -94,7 +94,7 @@ const remove = async () => {
|
|||
@submit.prevent="submit"
|
||||
>
|
||||
<p v-if="!library">
|
||||
{{ $t('views.content.libraries.Form.libraryHelp') }}
|
||||
{{ $t('views.content.libraries.Form.description.library') }}
|
||||
</p>
|
||||
<div
|
||||
v-if="errors.length > 0"
|
||||
|
@ -102,7 +102,7 @@ const remove = async () => {
|
|||
class="ui negative message"
|
||||
>
|
||||
<h4 class="header">
|
||||
{{ $t('views.content.libraries.Form.failureHeader') }}
|
||||
{{ $t('views.content.libraries.Form.header.failure') }}
|
||||
</h4>
|
||||
<ul class="list">
|
||||
<li
|
||||
|
@ -114,7 +114,7 @@ const remove = async () => {
|
|||
</ul>
|
||||
</div>
|
||||
<div class="required field">
|
||||
<label for="current-name">{{ $t('views.content.libraries.Form.nameLabel') }}</label>
|
||||
<label for="current-name">{{ $t('views.content.libraries.Form.label.name') }}</label>
|
||||
<input
|
||||
id="current-name"
|
||||
v-model="currentName"
|
||||
|
@ -125,7 +125,7 @@ const remove = async () => {
|
|||
>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="current-description">{{ $t('views.content.libraries.Form.descriptionLabel') }}</label>
|
||||
<label for="current-description">{{ $t('views.content.libraries.Form.label.description') }}</label>
|
||||
<textarea
|
||||
id="current-description"
|
||||
v-model="currentDescription"
|
||||
|
@ -134,9 +134,9 @@ const remove = async () => {
|
|||
/>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="visibility-level">{{ $t('views.content.libraries.Form.visibilityLabel') }}</label>
|
||||
<label for="visibility-level">{{ $t('views.content.libraries.Form.label.visibility') }}</label>
|
||||
<p>
|
||||
{{ $t('views.content.libraries.Form.visibilityDescription') }}
|
||||
{{ $t('views.content.libraries.Form.description.visibility') }}
|
||||
</p>
|
||||
<select
|
||||
id="visibility-level"
|
||||
|
@ -159,12 +159,12 @@ const remove = async () => {
|
|||
<span
|
||||
v-if="library"
|
||||
>
|
||||
{{ $t('views.content.libraries.Form.updateButton') }}
|
||||
{{ $t('views.content.libraries.Form.button.update') }}
|
||||
</span>
|
||||
<span
|
||||
v-else
|
||||
>
|
||||
{{ $t('views.content.libraries.Form.createButton') }}
|
||||
{{ $t('views.content.libraries.Form.button.create') }}
|
||||
</span>
|
||||
</button>
|
||||
<dangerous-button
|
||||
|
@ -173,20 +173,20 @@ const remove = async () => {
|
|||
class="ui right floated basic danger button"
|
||||
@confirm="remove"
|
||||
>
|
||||
{{ $t('views.content.libraries.Form.deleteButton') }}
|
||||
{{ $t('views.content.libraries.Form.button.delete') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.content.libraries.Form.deleteModalHeader') }}
|
||||
{{ $t('views.content.libraries.Form.modal.delete.header') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<p>
|
||||
{{ $t('views.content.libraries.Form.deleteModalMessage') }}
|
||||
{{ $t('views.content.libraries.Form.modal.delete.content.warning') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<div>
|
||||
{{ $t('views.content.libraries.Form.deleteModalConfirm') }}
|
||||
{{ $t('views.content.libraries.Form.button.confirm') }}
|
||||
</div>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
|
|
@ -46,7 +46,7 @@ const libraryCreated = (library: Library) => {
|
|||
:class="['ui', {'active': isLoading}, 'inverted', 'dimmer']"
|
||||
>
|
||||
<div class="ui text loader">
|
||||
{{ $t('views.content.libraries.Home.loadingLibraries') }}
|
||||
{{ $t('views.content.libraries.Home.loading.libraries') }}
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
|
@ -54,11 +54,11 @@ const libraryCreated = (library: Library) => {
|
|||
class="ui text container"
|
||||
>
|
||||
<h1 class="ui header">
|
||||
{{ $t('views.content.libraries.Home.ownLibrariesHeader') }}
|
||||
{{ $t('views.content.libraries.Home.header.libraries') }}
|
||||
</h1>
|
||||
|
||||
<p v-if="libraries.length == 0">
|
||||
{{ $t('views.content.libraries.Home.emptyState') }}
|
||||
{{ $t('views.content.libraries.Home.empty.noLibrary') }}
|
||||
</p>
|
||||
<a
|
||||
:aria-expanded="!hiddenForm"
|
||||
|
@ -73,7 +73,7 @@ const libraryCreated = (library: Library) => {
|
|||
v-else
|
||||
class="minus icon"
|
||||
/>
|
||||
{{ $t('views.content.libraries.Home.createLibraryLink') }}
|
||||
{{ $t('views.content.libraries.Home.link.createLibrary') }}
|
||||
</a>
|
||||
<library-form
|
||||
v-if="!hiddenForm"
|
||||
|
|
|
@ -53,14 +53,14 @@ const purgeErroredFiles = () => purge('errored')
|
|||
<template>
|
||||
<div class="ui segment">
|
||||
<h3 class="ui header">
|
||||
{{ $t('views.content.libraries.Quota.currentUsageHeader') }}
|
||||
{{ $t('views.content.libraries.Quota.header.currentUsage') }}
|
||||
</h3>
|
||||
<div
|
||||
v-if="isLoading"
|
||||
:class="['ui', {'active': isLoading}, 'inverted', 'dimmer']"
|
||||
>
|
||||
<div class="ui text loader">
|
||||
{{ $t('views.content.libraries.Quota.loadingMessage') }}
|
||||
{{ $t('views.content.libraries.Quota.loading.currentUsage') }}
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
|
@ -72,14 +72,14 @@ const purgeErroredFiles = () => purge('errored')
|
|||
:style="{width: `${progress}%`}"
|
||||
>
|
||||
<div class="progress">
|
||||
{{ $t('views.content.libraries.Quota.percentUsed', {progress: progress}) }}
|
||||
{{ $t('views.content.libraries.Quota.label.percentUsed', {progress: progress}) }}
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="quotaStatus"
|
||||
class="label"
|
||||
>
|
||||
{{ $t('views.content.libraries.Quota.currentUsage', {max: humanSize(quotaStatus.max * 1000 * 1000), current: humanSize(quotaStatus.current * 1000 * 1000)}) }}
|
||||
{{ $t('views.content.libraries.Quota.label.currentUsage', {max: humanSize(quotaStatus.max * 1000 * 1000), current: humanSize(quotaStatus.current * 1000 * 1000)}) }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="ui hidden divider" />
|
||||
|
@ -96,7 +96,7 @@ const purgeErroredFiles = () => purge('errored')
|
|||
{{ humanSize(quotaStatus.pending * 1000 * 1000) }}
|
||||
</div>
|
||||
<div class="label">
|
||||
{{ $t('views.content.libraries.Quota.pendingLabel') }}
|
||||
{{ $t('views.content.libraries.Quota.label.pending') }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
|
@ -104,27 +104,27 @@ const purgeErroredFiles = () => purge('errored')
|
|||
class="ui basic primary tiny button"
|
||||
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'pending'}])}}"
|
||||
>
|
||||
{{ $t('views.content.libraries.Quota.viewFilesLink') }}
|
||||
{{ $t('views.content.libraries.Quota.link.viewFiles') }}
|
||||
</router-link>
|
||||
|
||||
<dangerous-button
|
||||
class="ui basic tiny button"
|
||||
:action="purgePendingFiles"
|
||||
>
|
||||
{{ $t('views.content.libraries.Quota.purgeButton') }}
|
||||
{{ $t('views.content.libraries.Quota.button.purge') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.content.libraries.Quota.purgePendingModalHeader') }}
|
||||
{{ $t('views.content.libraries.Quota.modal.purgePending.header') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<p>
|
||||
{{ $t('views.content.libraries.Quota.purgePendingModalMessage') }}
|
||||
{{ $t('views.content.libraries.Quota.modal.purgePending.content.description') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<div>
|
||||
{{ $t('views.content.libraries.Quota.purgeButton') }}
|
||||
{{ $t('views.content.libraries.Quota.button.purge') }}
|
||||
</div>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
@ -139,7 +139,7 @@ const purgeErroredFiles = () => purge('errored')
|
|||
{{ humanSize(quotaStatus.skipped * 1000 * 1000) }}
|
||||
</div>
|
||||
<div class="label">
|
||||
{{ $t('views.content.libraries.Quota.skippedLabel') }}
|
||||
{{ $t('views.content.libraries.Quota.label.skipped') }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
|
@ -147,26 +147,26 @@ const purgeErroredFiles = () => purge('errored')
|
|||
class="ui basic primary tiny button"
|
||||
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'skipped'}])}}"
|
||||
>
|
||||
{{ $t('views.content.libraries.Quota.viewFilesLink') }}
|
||||
{{ $t('views.content.libraries.Quota.link.viewFiles') }}
|
||||
</router-link>
|
||||
<dangerous-button
|
||||
class="ui basic tiny button"
|
||||
:action="purgeSkippedFiles"
|
||||
>
|
||||
{{ $t('views.content.libraries.Quota.purgeButton') }}
|
||||
{{ $t('views.content.libraries.Quota.button.purge') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.content.libraries.Quota.purgeSkippedModalHeader') }}
|
||||
{{ $t('views.content.libraries.Quota.modal.purgeSkipped.header') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<p>
|
||||
{{ $t('views.content.libraries.Quota.purgeSkippedModalMessage') }}
|
||||
{{ $t('views.content.libraries.Quota.modal.purgeSkipped.content.description') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<div>
|
||||
{{ $t('views.content.libraries.Quota.purgeButton') }}
|
||||
{{ $t('views.content.libraries.Quota.button.purge') }}
|
||||
</div>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
@ -181,7 +181,7 @@ const purgeErroredFiles = () => purge('errored')
|
|||
{{ humanSize(quotaStatus.errored * 1000 * 1000) }}
|
||||
</div>
|
||||
<div class="label">
|
||||
{{ $t('views.content.libraries.Quota.erroredLabel') }}
|
||||
{{ $t('views.content.libraries.Quota.label.errored') }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
|
@ -189,26 +189,26 @@ const purgeErroredFiles = () => purge('errored')
|
|||
class="ui basic primary tiny button"
|
||||
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'errored'}])}}"
|
||||
>
|
||||
{{ $t('views.content.libraries.Quota.viewFilesLink') }}
|
||||
{{ $t('views.content.libraries.Quota.link.viewFiles') }}
|
||||
</router-link>
|
||||
<dangerous-button
|
||||
class="ui basic tiny button"
|
||||
:action="purgeErroredFiles"
|
||||
>
|
||||
{{ $t('views.content.libraries.Quota.purgeButton') }}
|
||||
{{ $t('views.content.libraries.Quota.button.purge') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.content.libraries.Quota.purgeErroredModalHeader') }}
|
||||
{{ $t('views.content.libraries.Quota.modal.purgeErrored.header') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<p>
|
||||
{{ $t('views.content.libraries.Quota.purgeErroredModalMessage') }}
|
||||
{{ $t('views.content.libraries.Quota.modal.purgeErrored.content.description') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<div>
|
||||
{{ $t('views.content.libraries.Quota.purgeButton') }}
|
||||
{{ $t('views.content.libraries.Quota.button.purge') }}
|
||||
</div>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
|
|
@ -50,8 +50,8 @@ const radioPlayable = computed(() => (
|
|||
const { t } = useI18n()
|
||||
const labels = computed(() => ({
|
||||
tooltips: {
|
||||
me: t('views.content.remote.Card.privateTooltip'),
|
||||
everyone: t('views.content.remote.Card.publicTooltip')
|
||||
me: t('views.content.remote.Card.tooltip.private'),
|
||||
everyone: t('views.content.remote.Card.tooltip.public')
|
||||
}
|
||||
}))
|
||||
|
||||
|
@ -65,8 +65,8 @@ const launchScan = async () => {
|
|||
store.commit('ui/addMessage', {
|
||||
date: new Date(),
|
||||
content: response.data.status === 'skipped'
|
||||
? t('views.content.remote.Card.scanSkipped')
|
||||
: t('views.content.remote.Card.scanLaunched')
|
||||
? t('views.content.remote.Card.message.scanSkipped')
|
||||
: t('views.content.remote.Card.message.scanLaunched')
|
||||
})
|
||||
} catch (error) {
|
||||
useErrorHandler(error as Error)
|
||||
|
@ -82,7 +82,7 @@ const follow = async () => {
|
|||
} catch (error) {
|
||||
console.error(error)
|
||||
store.commit('ui/addMessage', {
|
||||
content: t('views.content.remote.Card.followError', { error }),
|
||||
content: t('views.content.remote.Card.error.follow', { error }),
|
||||
date: new Date()
|
||||
})
|
||||
}
|
||||
|
@ -99,7 +99,7 @@ const unfollow = async () => {
|
|||
}
|
||||
} catch (error) {
|
||||
store.commit('ui/addMessage', {
|
||||
content: t('views.content.remote.Card.unfollowError', { error }),
|
||||
content: t('views.content.remote.Card.error.unfollow', { error }),
|
||||
date: new Date()
|
||||
})
|
||||
}
|
||||
|
@ -191,7 +191,7 @@ watch(showScan, (shouldShow) => {
|
|||
</div>
|
||||
<div class="meta">
|
||||
<i class="music icon" />
|
||||
{{ $t('views.content.remote.Card.trackCount', {count: library.uploads_count}) }}
|
||||
{{ $t('views.content.remote.Card.meta.tracks', {count: library.uploads_count}) }}
|
||||
</div>
|
||||
<div
|
||||
v-if="displayScan && latestScan"
|
||||
|
@ -199,30 +199,30 @@ watch(showScan, (shouldShow) => {
|
|||
>
|
||||
<template v-if="latestScan.status === 'pending'">
|
||||
<i class="hourglass icon" />
|
||||
{{ $t('views.content.remote.Card.scanPending') }}
|
||||
{{ $t('views.content.remote.Card.label.scanPending') }}
|
||||
</template>
|
||||
<template v-if="latestScan.status === 'scanning'">
|
||||
<i class="loading spinner icon" />
|
||||
{{ $t('views.content.remote.Card.scanProgress', {progress: scanProgress}) }}
|
||||
{{ $t('views.content.remote.Card.label.scanProgress', {progress: scanProgress}) }}
|
||||
</template>
|
||||
<template v-else-if="latestScan.status === 'errored'">
|
||||
<i class="dangerdownload icon" />
|
||||
{{ $t('views.content.remote.Card.scanFailure') }}
|
||||
{{ $t('views.content.remote.Card.label.scanFailure') }}
|
||||
</template>
|
||||
<template v-else-if="latestScan.status === 'finished' && latestScan.errored_files === 0">
|
||||
<i class="success download icon" />
|
||||
{{ $t('views.content.remote.Card.scanSuccess') }}
|
||||
{{ $t('views.content.remote.Card.label.scanSuccess') }}
|
||||
</template>
|
||||
<template v-else-if="latestScan.status === 'finished' && latestScan.errored_files > 0">
|
||||
<i class="warning download icon" />
|
||||
{{ $t('views.content.remote.Card.scanPartialSuccess') }}
|
||||
{{ $t('views.content.remote.Card.label.scanPartialSuccess') }}
|
||||
</template>
|
||||
<a
|
||||
href=""
|
||||
class="link right floated"
|
||||
@click.prevent="showScan = !showScan"
|
||||
>
|
||||
{{ $t('views.content.remote.Card.scanDetails') }}
|
||||
{{ $t('views.content.remote.Card.link.scanDetails') }}
|
||||
<i
|
||||
v-if="showScan"
|
||||
class="angle down icon"
|
||||
|
@ -234,9 +234,9 @@ watch(showScan, (shouldShow) => {
|
|||
</a>
|
||||
<div v-if="showScan">
|
||||
<template v-if="latestScan.modification_date">
|
||||
{{ $t('views.content.remote.Card.lastUpdate') }}<human-date :date="latestScan.modification_date" /><br>
|
||||
{{ $t('views.content.remote.Card.meta.lastUpdate') }}<human-date :date="latestScan.modification_date" /><br>
|
||||
</template>
|
||||
{{ $t('views.content.remote.Card.failedTracks', {tracks: latestScan.errored_files}) }}
|
||||
{{ $t('views.content.remote.Card.meta.failedTracks', {tracks: latestScan.errored_files}) }}
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
|
@ -248,7 +248,7 @@ watch(showScan, (shouldShow) => {
|
|||
class="right floated link"
|
||||
@click.prevent="launchScan"
|
||||
>
|
||||
{{ $t('views.content.remote.Card.scanNowButton') }}<i class="paper plane icon" />
|
||||
{{ $t('views.content.remote.Card.link.scan') }}<i class="paper plane icon" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -264,7 +264,7 @@ watch(showScan, (shouldShow) => {
|
|||
>
|
||||
<div class="ui form">
|
||||
<div class="field">
|
||||
<label :for="library.fid">{{ $t('views.content.remote.Card.sharingLinkLabel') }}</label>
|
||||
<label :for="library.fid">{{ $t('views.content.remote.Card.label.sharingLink') }}</label>
|
||||
<copy-input
|
||||
:id="library.fid"
|
||||
:button-classes="'basic'"
|
||||
|
@ -288,20 +288,20 @@ watch(showScan, (shouldShow) => {
|
|||
:class="['ui', 'success', {'loading': isLoadingFollow}, 'button']"
|
||||
@click="follow()"
|
||||
>
|
||||
{{ $t('views.content.remote.Card.followButton') }}
|
||||
{{ $t('views.content.remote.Card.button.follow') }}
|
||||
</button>
|
||||
<template v-else-if="!library.follow.approved">
|
||||
<button
|
||||
class="ui disabled button"
|
||||
>
|
||||
<i class="hourglass icon" />
|
||||
{{ $t('views.content.remote.Card.pendingApprovalButton') }}
|
||||
{{ $t('views.content.remote.Card.button.pending') }}
|
||||
</button>
|
||||
<button
|
||||
class="ui button"
|
||||
@click="unfollow"
|
||||
>
|
||||
{{ $t('views.content.remote.Card.cancelFollowButton') }}
|
||||
{{ $t('views.content.remote.Card.button.cancel') }}
|
||||
</button>
|
||||
</template>
|
||||
<template v-else-if="library.follow.approved">
|
||||
|
@ -309,22 +309,22 @@ watch(showScan, (shouldShow) => {
|
|||
:class="['ui', 'button']"
|
||||
:action="unfollow"
|
||||
>
|
||||
{{ $t('views.content.remote.Card.unfollowButton') }}
|
||||
{{ $t('views.content.remote.Card.button.unfollow') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.content.remote.Card.unfollowModalHeader') }}
|
||||
{{ $t('views.content.remote.Card.modal.unfollow.header') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<div>
|
||||
<p>
|
||||
{{ $t('views.content.remote.Card.unfollowModalMessage') }}
|
||||
{{ $t('views.content.remote.Card.modal.unfollow.content.warning') }}
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<div>
|
||||
{{ $t('views.content.remote.Card.unfollowButton') }}
|
||||
{{ $t('views.content.remote.Card.button.unfollow') }}
|
||||
</div>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
|
|
@ -47,7 +47,7 @@ const scanResult = ref()
|
|||
:class="['ui', {'active': isLoading}, 'inverted', 'dimmer']"
|
||||
>
|
||||
<div class="ui text loader">
|
||||
{{ $t('views.content.remote.Home.loadingMessage') }}
|
||||
{{ $t('views.content.remote.Home.loading.remoteLibraries') }}
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
|
@ -55,10 +55,10 @@ const scanResult = ref()
|
|||
class="ui text container"
|
||||
>
|
||||
<h1 class="ui header">
|
||||
{{ $t('views.content.remote.Home.remoteLibrariesHeader') }}
|
||||
{{ $t('views.content.remote.Home.header.remoteLibraries') }}
|
||||
</h1>
|
||||
<p>
|
||||
{{ $t('views.content.remote.Home.remoteLibrariesDescription') }}
|
||||
{{ $t('views.content.remote.Home.description.remoteLibraries') }}
|
||||
</p>
|
||||
<scan-form @scanned="scanResult = $event" />
|
||||
<div class="ui hidden divider" />
|
||||
|
@ -74,7 +74,7 @@ const scanResult = ref()
|
|||
</div>
|
||||
<template v-if="existingFollows && existingFollows.count > 0">
|
||||
<h2>
|
||||
{{ $t('views.content.remote.Home.knownLibrariesHeader') }}
|
||||
{{ $t('views.content.remote.Home.header.knownLibraries') }}
|
||||
</h2>
|
||||
<a
|
||||
href=""
|
||||
|
@ -82,7 +82,7 @@ const scanResult = ref()
|
|||
@click.prevent="fetchData"
|
||||
>
|
||||
<i :class="['ui', 'circular', 'refresh', 'icon']" />
|
||||
{{ $t('views.content.remote.Home.refreshButton') }}
|
||||
{{ $t('views.content.remote.Home.button.refresh') }}
|
||||
</a>
|
||||
<div class="ui hidden divider" />
|
||||
<div class="ui two cards">
|
||||
|
|
|
@ -15,8 +15,8 @@ const emit = defineEmits<Events>()
|
|||
const { t } = useI18n()
|
||||
|
||||
const labels = computed(() => ({
|
||||
placeholder: t('views.content.remote.ScanForm.placeholder'),
|
||||
submitLibrarySearch: t('views.content.remote.ScanForm.submitLibrarySearch')
|
||||
placeholder: t('views.content.remote.ScanForm.placeholder.url'),
|
||||
submitLibrarySearch: t('views.content.remote.ScanForm.button.submit')
|
||||
}))
|
||||
|
||||
const errors = ref([] as string[])
|
||||
|
@ -49,7 +49,7 @@ const scan = async () => {
|
|||
class="ui negative message"
|
||||
>
|
||||
<h4 class="header">
|
||||
{{ $t('views.content.remote.ScanForm.failureHeader') }}
|
||||
{{ $t('views.content.remote.ScanForm.header.failure') }}
|
||||
</h4>
|
||||
<ul class="list">
|
||||
<li
|
||||
|
@ -61,7 +61,7 @@ const scan = async () => {
|
|||
</ul>
|
||||
</div>
|
||||
<div class="ui field">
|
||||
<label for="library-search">{{ $t('views.content.remote.ScanForm.searchLabel') }}</label>
|
||||
<label for="library-search">{{ $t('views.content.remote.ScanForm.label.search') }}</label>
|
||||
<div :class="['ui', 'action', {loading: isLoading}, 'input']">
|
||||
<input
|
||||
id="library-search"
|
||||
|
|
|
@ -26,12 +26,12 @@ defineProps<Props>()
|
|||
<span
|
||||
v-if="isOwner"
|
||||
>
|
||||
{{ $t('views.library.DetailAlbums.ownerEmptyState') }}
|
||||
{{ $t('views.library.DetailAlbums.empty.upload') }}
|
||||
</span>
|
||||
<span
|
||||
v-else
|
||||
>
|
||||
{{ $t('views.library.DetailAlbums.viewerEmptyState') }}
|
||||
{{ $t('views.library.DetailAlbums.empty.follow') }}
|
||||
</span>
|
||||
</p>
|
||||
</empty-state>
|
||||
|
|
|
@ -35,12 +35,12 @@ defineProps<Props>()
|
|||
<span
|
||||
v-if="isOwner"
|
||||
>
|
||||
{{ $t('views.library.DetailOverview.ownerEmptyState') }}
|
||||
{{ $t('views.library.DetailOverview.empty.upload') }}
|
||||
</span>
|
||||
<span
|
||||
v-else
|
||||
>
|
||||
{{ $t('views.library.DetailOverview.viewerEmptyState') }}
|
||||
{{ $t('views.library.DetailOverview.empty.follow') }}
|
||||
</span>
|
||||
</p>
|
||||
</empty-state>
|
||||
|
|
|
@ -25,12 +25,12 @@ defineProps<Props>()
|
|||
<span
|
||||
v-if="isOwner"
|
||||
>
|
||||
{{ $t('views.library.DetailTracks.ownerEmptyState') }}
|
||||
{{ $t('views.library.DetailTracks.empty.upload') }}
|
||||
</span>
|
||||
<span
|
||||
v-else
|
||||
>
|
||||
{{ $t('views.library.DetailTracks.viewerEmptyState') }}
|
||||
{{ $t('views.library.DetailTracks.empty.follow') }}
|
||||
</span>
|
||||
</p>
|
||||
</empty-state>
|
||||
|
|
|
@ -59,20 +59,20 @@ const updateApproved = async (follow: LibraryFollow, approved: boolean) => {
|
|||
/>
|
||||
<div class="ui hidden divider" />
|
||||
<h2 class="ui header">
|
||||
{{ $t('views.library.Edit.libraryContentsHeader') }}
|
||||
{{ $t('views.library.Edit.header.libraryContents') }}
|
||||
</h2>
|
||||
<library-files-table :filters="{ library: object.uuid }" />
|
||||
|
||||
<div class="ui hidden divider" />
|
||||
<h2 class="ui header">
|
||||
{{ $t('views.library.Edit.followersHeader') }}
|
||||
{{ $t('views.library.Edit.header.followers') }}
|
||||
</h2>
|
||||
<div
|
||||
v-if="isLoading"
|
||||
:class="['ui', {'active': isLoading}, 'inverted', 'dimmer']"
|
||||
>
|
||||
<div class="ui text loader">
|
||||
{{ $t('views.library.Edit.loadingFollowers') }}
|
||||
{{ $t('views.library.Edit.loading.followers') }}
|
||||
</div>
|
||||
</div>
|
||||
<table
|
||||
|
@ -82,16 +82,16 @@ const updateApproved = async (follow: LibraryFollow, approved: boolean) => {
|
|||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
{{ $t('views.library.Edit.userTableHeader') }}
|
||||
{{ $t('views.library.Edit.table.action.header.user') }}
|
||||
</th>
|
||||
<th>
|
||||
{{ $t('views.library.Edit.dateTableHeader') }}
|
||||
{{ $t('views.library.Edit.table.action.header.date') }}
|
||||
</th>
|
||||
<th>
|
||||
{{ $t('views.library.Edit.statusTableHeader') }}
|
||||
{{ $t('views.library.Edit.table.action.header.status') }}
|
||||
</th>
|
||||
<th>
|
||||
{{ $t('views.library.Edit.actionTableHeader') }}
|
||||
{{ $t('views.library.Edit.table.action.header.action') }}
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
@ -106,19 +106,19 @@ const updateApproved = async (follow: LibraryFollow, approved: boolean) => {
|
|||
v-if="follow.approved === null"
|
||||
:class="['ui', 'warning', 'basic', 'label']"
|
||||
>
|
||||
{{ $t('views.library.Edit.pendingStatus') }}
|
||||
{{ $t('views.library.Edit.table.action.status.pending') }}
|
||||
</span>
|
||||
<span
|
||||
v-else-if="follow.approved === true"
|
||||
:class="['ui', 'success', 'basic', 'label']"
|
||||
>
|
||||
{{ $t('views.library.Edit.acceptedStatus') }}
|
||||
{{ $t('views.library.Edit.table.action.status.accepted') }}
|
||||
</span>
|
||||
<span
|
||||
v-else-if="follow.approved === false"
|
||||
:class="['ui', 'danger', 'basic', 'label']"
|
||||
>
|
||||
{{ $t('views.library.Edit.rejectedStatus') }}
|
||||
{{ $t('views.library.Edit.table.action.status.rejected') }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
|
@ -128,7 +128,7 @@ const updateApproved = async (follow: LibraryFollow, approved: boolean) => {
|
|||
@click="updateApproved(follow, true)"
|
||||
>
|
||||
<i class="ui check icon" />
|
||||
{{ $t('views.library.Edit.acceptButton') }}
|
||||
{{ $t('views.library.Edit.button.accept') }}
|
||||
</button>
|
||||
<button
|
||||
v-if="follow.approved === null || follow.approved === true"
|
||||
|
@ -136,13 +136,13 @@ const updateApproved = async (follow: LibraryFollow, approved: boolean) => {
|
|||
@click="updateApproved(follow, false)"
|
||||
>
|
||||
<i class="ui x icon" />
|
||||
{{ $t('views.library.Edit.rejectButton') }}
|
||||
{{ $t('views.library.Edit.button.reject') }}
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p v-else>
|
||||
{{ $t('views.library.Edit.noFollowers') }}
|
||||
{{ $t('views.library.Edit.empty.noFollowers') }}
|
||||
</p>
|
||||
</section>
|
||||
</template>
|
||||
|
|
|
@ -38,14 +38,14 @@ const { t } = useI18n()
|
|||
const labels = computed(() => ({
|
||||
title: t('views.library.LibraryBase.title'),
|
||||
visibility: {
|
||||
me: t('views.library.LibraryBase.privateVisibility'),
|
||||
instance: t('views.library.LibraryBase.instanceVisibility'),
|
||||
everyone: t('views.library.LibraryBase.publicVisibility')
|
||||
me: t('views.library.LibraryBase.label.private'),
|
||||
instance: t('views.library.LibraryBase.label.instance'),
|
||||
everyone: t('views.library.LibraryBase.label.public')
|
||||
},
|
||||
tooltips: {
|
||||
me: t('views.library.LibraryBase.privateTooltip'),
|
||||
instance: t('views.library.LibraryBase.instanceTooltip'),
|
||||
everyone: t('views.library.LibraryBase.publicTooltip')
|
||||
me: t('views.library.LibraryBase.tooltip.private'),
|
||||
instance: t('views.library.LibraryBase.tooltip.instance'),
|
||||
everyone: t('views.library.LibraryBase.tooltip.public')
|
||||
}
|
||||
}))
|
||||
|
||||
|
@ -110,7 +110,7 @@ const updateUploads = (count: number) => {
|
|||
class="basic item"
|
||||
>
|
||||
<i class="external icon" />
|
||||
{{ $t('views.library.LibraryBase.domainViewLink', {domain: object.actor.domain}) }}
|
||||
{{ $t('views.library.LibraryBase.link.domain', {domain: object.actor.domain}) }}
|
||||
</a>
|
||||
<div
|
||||
v-for="obj in getReportableObjects({library: object})"
|
||||
|
@ -129,7 +129,7 @@ const updateUploads = (count: number) => {
|
|||
:to="{name: 'manage.library.libraries.detail', params: {id: object.uuid}}"
|
||||
>
|
||||
<i class="wrench icon" />
|
||||
{{ $t('views.library.LibraryBase.moderationLink') }}
|
||||
{{ $t('views.library.LibraryBase.link.moderation') }}
|
||||
</router-link>
|
||||
</div>
|
||||
</button>
|
||||
|
@ -148,7 +148,7 @@ const updateUploads = (count: number) => {
|
|||
:actor="object.actor"
|
||||
:truncate-length="0"
|
||||
>
|
||||
{{ $t('views.library.LibraryBase.ownerLink', {username: object.actor.full_username}) }}
|
||||
{{ $t('views.library.LibraryBase.link.owner', {username: object.actor.full_username}) }}
|
||||
</actor-link>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -178,7 +178,7 @@ const updateUploads = (count: number) => {
|
|||
</span>
|
||||
<span class="middledot icon">
|
||||
<i class="music icon" />
|
||||
{{ $t('views.library.LibraryBase.trackCount', {count: object.uploads_count}) }}
|
||||
{{ $t('views.library.LibraryBase.meta.tracks', {count: object.uploads_count}) }}
|
||||
</span>
|
||||
<span v-if="object.size">
|
||||
<i class="database icon" />
|
||||
|
@ -216,10 +216,10 @@ const updateUploads = (count: number) => {
|
|||
<div class="ui form">
|
||||
<div class="field">
|
||||
<label for="copy-input">
|
||||
{{ $t('views.library.LibraryBase.sharingLinkLabel') }}
|
||||
{{ $t('views.library.LibraryBase.label.sharingLink') }}
|
||||
</label>
|
||||
<p>
|
||||
{{ $t('views.library.LibraryBase.sharingLinkDescription') }}
|
||||
{{ $t('views.library.LibraryBase.description.sharingLink') }}
|
||||
</p>
|
||||
<copy-input :value="object.fid" />
|
||||
</div>
|
||||
|
@ -234,21 +234,21 @@ const updateUploads = (count: number) => {
|
|||
|
||||
:to="{name: 'library.detail'}"
|
||||
>
|
||||
{{ $t('views.library.LibraryBase.artistsLink') }}
|
||||
{{ $t('views.library.LibraryBase.link.artists') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
class="item"
|
||||
|
||||
:to="{name: 'library.detail.albums'}"
|
||||
>
|
||||
{{ $t('views.library.LibraryBase.albumsLink') }}
|
||||
{{ $t('views.library.LibraryBase.link.albums') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
class="item"
|
||||
|
||||
:to="{name: 'library.detail.tracks'}"
|
||||
>
|
||||
{{ $t('views.library.LibraryBase.tracksLink') }}
|
||||
{{ $t('views.library.LibraryBase.link.tracks') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
v-if="isOwner"
|
||||
|
@ -257,7 +257,7 @@ const updateUploads = (count: number) => {
|
|||
:to="{name: 'library.detail.upload'}"
|
||||
>
|
||||
<i class="upload icon" />
|
||||
{{ $t('views.library.LibraryBase.uploadButton') }}
|
||||
{{ $t('views.library.LibraryBase.button.upload') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
v-if="isOwner"
|
||||
|
@ -266,7 +266,7 @@ const updateUploads = (count: number) => {
|
|||
:to="{name: 'library.detail.edit'}"
|
||||
>
|
||||
<i class="pencil icon" />
|
||||
{{ $t('views.library.LibraryBase.editButton') }}
|
||||
{{ $t('views.library.LibraryBase.button.edit') }}
|
||||
</router-link>
|
||||
</div>
|
||||
<div class="ui hidden divider" />
|
||||
|
|
|
@ -93,7 +93,7 @@ const deletePlaylist = async () => {
|
|||
<div class="content">
|
||||
{{ playlist.name }}
|
||||
<div class="sub header">
|
||||
{{ $t('views.playlists.Detail.trackCount', {count: tracks_count, username: playlist.user.username}) }}
|
||||
{{ $t('views.playlists.Detail.meta.tracks', {count: tracks_count, username: playlist.user.username}) }}
|
||||
<br>
|
||||
<duration :seconds="playlist.duration" />
|
||||
</div>
|
||||
|
@ -107,7 +107,7 @@ const deletePlaylist = async () => {
|
|||
:is-playable="playlist.is_playable"
|
||||
:tracks="tracks"
|
||||
>
|
||||
{{ $t('views.playlists.Detail.playAllButton') }}
|
||||
{{ $t('views.playlists.Detail.button.playAll') }}
|
||||
</play-button>
|
||||
</div>
|
||||
<div class="ui buttons">
|
||||
|
@ -118,10 +118,10 @@ const deletePlaylist = async () => {
|
|||
>
|
||||
<i class="pencil icon" />
|
||||
<template v-if="edit">
|
||||
{{ $t('views.playlists.Detail.stopEditButton') }}
|
||||
{{ $t('views.playlists.Detail.button.stopEdit') }}
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ $t('views.playlists.Detail.editButton') }}
|
||||
{{ $t('views.playlists.Detail.button.edit') }}
|
||||
</template>
|
||||
</button>
|
||||
</div>
|
||||
|
@ -132,7 +132,7 @@ const deletePlaylist = async () => {
|
|||
@click="showEmbedModal = !showEmbedModal"
|
||||
>
|
||||
<i class="code icon" />
|
||||
{{ $t('views.playlists.Detail.embedButton') }}
|
||||
{{ $t('views.playlists.Detail.button.embed') }}
|
||||
</button>
|
||||
<dangerous-button
|
||||
v-if="$store.state.auth.profile && playlist.user.id === $store.state.auth.profile.id"
|
||||
|
@ -140,20 +140,20 @@ const deletePlaylist = async () => {
|
|||
:action="deletePlaylist"
|
||||
>
|
||||
<i class="trash icon" />
|
||||
{{ $t('views.playlists.Detail.deleteButton') }}
|
||||
{{ $t('views.playlists.Detail.button.delete') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.playlists.Detail.deleteModalHeader', {playlist: playlist.name}) }}
|
||||
{{ $t('views.playlists.Detail.modal.delete.header', {playlist: playlist.name}) }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<p>
|
||||
{{ $t('views.playlists.Detail.deleteModalMessage') }}
|
||||
{{ $t('views.playlists.Detail.modal.delete.content.warning') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<div>
|
||||
{{ $t('views.playlists.Detail.deleteModalConfirm') }}
|
||||
{{ $t('views.playlists.Detail.button.confirm') }}
|
||||
</div>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
@ -164,7 +164,7 @@ const deletePlaylist = async () => {
|
|||
v-model:show="showEmbedModal"
|
||||
>
|
||||
<h4 class="header">
|
||||
{{ $t('views.playlists.Detail.embedModalHeader') }}
|
||||
{{ $t('views.playlists.Detail.modal.embed.header') }}
|
||||
</h4>
|
||||
<div class="scrolling content">
|
||||
<div class="description">
|
||||
|
@ -176,7 +176,7 @@ const deletePlaylist = async () => {
|
|||
</div>
|
||||
<div class="actions">
|
||||
<button class="ui basic deny button">
|
||||
{{ $t('views.playlists.Detail.cancelButton') }}
|
||||
{{ $t('views.playlists.Detail.button.cancel') }}
|
||||
</button>
|
||||
</div>
|
||||
</semantic-modal>
|
||||
|
@ -191,7 +191,7 @@ const deletePlaylist = async () => {
|
|||
</template>
|
||||
<template v-else-if="tracks.length > 0">
|
||||
<h2>
|
||||
{{ $t('views.playlists.Detail.tracksHeader') }}
|
||||
{{ $t('views.playlists.Detail.header.tracks') }}
|
||||
</h2>
|
||||
<track-table
|
||||
:display-position="true"
|
||||
|
@ -205,14 +205,14 @@ const deletePlaylist = async () => {
|
|||
>
|
||||
<div class="ui icon header">
|
||||
<i class="list icon" />
|
||||
{{ $t('views.playlists.Detail.emptyState') }}
|
||||
{{ $t('views.playlists.Detail.empty.noTracks') }}
|
||||
</div>
|
||||
<button
|
||||
class="ui success icon labeled button"
|
||||
@click="edit = !edit"
|
||||
>
|
||||
<i class="pencil icon" />
|
||||
{{ $t('views.playlists.Detail.editButton') }}
|
||||
{{ $t('views.playlists.Detail.button.edit') }}
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
|
|
|
@ -97,8 +97,8 @@ onMounted(() => $('.ui.dropdown').dropdown())
|
|||
|
||||
const { t } = useI18n()
|
||||
const labels = computed(() => ({
|
||||
playlists: t('views.playlists.List.playlistsHeader'),
|
||||
searchPlaceholder: t('views.playlists.List.searchPlaceholder')
|
||||
playlists: t('views.playlists.List.header.playlists'),
|
||||
searchPlaceholder: t('views.playlists.List.placeholder.search')
|
||||
}))
|
||||
|
||||
const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value].sort((a, b) => a - b)))
|
||||
|
@ -108,14 +108,14 @@ const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value]
|
|||
<main v-title="labels.playlists">
|
||||
<section class="ui vertical stripe segment">
|
||||
<h2 class="ui header">
|
||||
{{ $t('views.playlists.List.browsePlaylistsHeader') }}
|
||||
{{ $t('views.playlists.List.header.browse') }}
|
||||
</h2>
|
||||
<template v-if="$store.state.auth.authenticated">
|
||||
<button
|
||||
class="ui success button"
|
||||
@click="$store.commit('playlists/showModal', true)"
|
||||
>
|
||||
{{ $t('views.playlists.List.manageButton') }}
|
||||
{{ $t('views.playlists.List.button.manage') }}
|
||||
</button>
|
||||
<div class="ui hidden divider" />
|
||||
</template>
|
||||
|
@ -125,7 +125,7 @@ const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value]
|
|||
>
|
||||
<div class="fields">
|
||||
<div class="field">
|
||||
<label for="playlists-search">{{ $t('views.playlists.List.searchLabel') }}</label>
|
||||
<label for="playlists-search">{{ $t('views.playlists.List.label.search') }}</label>
|
||||
<div class="ui action input">
|
||||
<input
|
||||
id="playlists-search"
|
||||
|
@ -137,14 +137,14 @@ const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value]
|
|||
<button
|
||||
class="ui icon button"
|
||||
type="submit"
|
||||
:aria-label="t('views.playlists.List.searchLabel')"
|
||||
:aria-label="t('views.playlists.List.button.search')"
|
||||
>
|
||||
<i class="search icon" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="playlists-ordering">{{ $t('views.playlists.List.orderingLabel') }}</label>
|
||||
<label for="playlists-ordering">{{ $t('views.playlists.List.ordering.label') }}</label>
|
||||
<select
|
||||
id="playlists-ordering"
|
||||
v-model="ordering"
|
||||
|
@ -160,22 +160,22 @@ const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value]
|
|||
</select>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="playlists-ordering-direction">{{ $t('views.playlists.List.orderingDirectionLabel') }}</label>
|
||||
<label for="playlists-ordering-direction">{{ $t('views.playlists.List.ordering.direction.label') }}</label>
|
||||
<select
|
||||
id="playlists-ordering-direction"
|
||||
v-model="orderingDirection"
|
||||
class="ui dropdown"
|
||||
>
|
||||
<option value="+">
|
||||
{{ $t('views.playlists.List.ascendingOrdering') }}
|
||||
{{ $t('views.playlists.List.ordering.direction.ascending') }}
|
||||
</option>
|
||||
<option value="-">
|
||||
{{ $t('views.playlists.List.descendingOrdering') }}
|
||||
{{ $t('views.playlists.List.ordering.direction.descending') }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="playlists-results">{{ $t('views.playlists.List.resultsPerPage') }}</label>
|
||||
<label for="playlists-results">{{ $t('views.playlists.List.pagination.results') }}</label>
|
||||
<select
|
||||
id="playlists-results"
|
||||
v-model="paginateBy"
|
||||
|
@ -204,7 +204,7 @@ const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value]
|
|||
>
|
||||
<div class="ui icon header">
|
||||
<i class="list icon" />
|
||||
{{ $t('views.playlists.List.emptyState') }}
|
||||
{{ $t('views.playlists.List.empty.noResults') }}
|
||||
</div>
|
||||
<button
|
||||
v-if="$store.state.auth.authenticated"
|
||||
|
@ -212,7 +212,7 @@ const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value]
|
|||
@click="$store.commit('playlists/chooseTrack', null)"
|
||||
>
|
||||
<i class="list icon" />
|
||||
{{ $t('views.playlists.List.createPlaylistButton') }}
|
||||
{{ $t('views.playlists.List.button.create') }}
|
||||
</button>
|
||||
</div>
|
||||
<div class="ui center aligned basic segment">
|
||||
|
|
|
@ -82,7 +82,7 @@ const deleteRadio = async () => {
|
|||
<div class="content">
|
||||
{{ radio.name }}
|
||||
<div class="sub header">
|
||||
{{ $t('views.radios.Detail.radioSubheader', {tracks: totalTracks}) }}<username :username="radio.user.username" />
|
||||
{{ $t('views.radios.Detail.header.radio', {tracks: totalTracks}) }}<username :username="radio.user.username" />
|
||||
</div>
|
||||
</div>
|
||||
</h2>
|
||||
|
@ -97,26 +97,26 @@ const deleteRadio = async () => {
|
|||
:to="{name: 'library.radios.edit', params: {id: radio.id}}"
|
||||
>
|
||||
<i class="pencil icon" />
|
||||
{{ $t('views.radios.Detail.editButton') }}
|
||||
{{ $t('views.radios.Detail.button.edit') }}
|
||||
</router-link>
|
||||
<dangerous-button
|
||||
class="ui labeled danger icon button"
|
||||
:action="deleteRadio"
|
||||
>
|
||||
<i class="trash icon" /> {{ $t('views.radios.Detail.deleteButton') }}
|
||||
<i class="trash icon" /> {{ $t('views.radios.Detail.button.delete') }}
|
||||
<template #modal-header>
|
||||
<p>
|
||||
{{ $t('views.radios.Detail.deleteModalHeader', {radio: radio.name}) }}
|
||||
{{ $t('views.radios.Detail.modal.delete.header', {radio: radio.name}) }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-content>
|
||||
<p>
|
||||
{{ $t('views.radios.Detail.deleteModalMessage') }}
|
||||
{{ $t('views.radios.Detail.modal.delete.content.warning') }}
|
||||
</p>
|
||||
</template>
|
||||
<template #modal-confirm>
|
||||
<p>
|
||||
{{ $t('views.radios.Detail.deleteModalConfirm') }}
|
||||
{{ $t('views.radios.Detail.button.confirm') }}
|
||||
</p>
|
||||
</template>
|
||||
</dangerous-button>
|
||||
|
@ -128,7 +128,7 @@ const deleteRadio = async () => {
|
|||
class="ui vertical stripe segment"
|
||||
>
|
||||
<h2>
|
||||
{{ $t('views.radios.Detail.tracksHeader') }}
|
||||
{{ $t('views.radios.Detail.header.tracks') }}
|
||||
</h2>
|
||||
<track-table :tracks="tracks" />
|
||||
<div class="ui center aligned basic segment">
|
||||
|
@ -146,7 +146,7 @@ const deleteRadio = async () => {
|
|||
>
|
||||
<div class="ui icon header">
|
||||
<i class="rss icon" />
|
||||
{{ $t('views.radios.Detail.emptyState') }}
|
||||
{{ $t('views.radios.Detail.empty.noTracks') }}
|
||||
</div>
|
||||
<router-link
|
||||
v-if="$store.state.auth.username === radio?.user.username"
|
||||
|
@ -154,7 +154,7 @@ const deleteRadio = async () => {
|
|||
:to="{name: 'library.radios.edit', params: { id: radio?.id }}"
|
||||
>
|
||||
<i class="pencil icon" />
|
||||
{{ $t('views.radios.Detail.editButton') }}
|
||||
{{ $t('views.radios.Detail.button.edit') }}
|
||||
</router-link>
|
||||
</div>
|
||||
</main>
|
||||
|
|
Loading…
Reference in New Issue