Update all library admin views

This commit is contained in:
Ciarán Ainsworth 2022-09-18 13:05:26 +00:00 committed by Kasper Seweryn
parent ef757e1854
commit 5e1e260606
12 changed files with 490 additions and 237 deletions

View File

@ -1659,6 +1659,17 @@
} }
} }
}, },
"embed": {
"EmbedFrame": {
"badResource": "idget improperly configured (bad resource type {type}).",
"missingResourceId": "Widget improperly configured (missing resource id).",
"trackNotFound": "Track not found.",
"unauthenticated": "You need to login to access this resource.",
"unknownServerError": "An unknown error occurred while loading track data from server.",
"trackUnavailable": "This track is unavailable.",
"unknownTrackError": "An unknown error occurred while loading track data."
}
},
"views": { "views": {
"Notifications": { "Notifications": {
"title": "Notifications", "title": "Notifications",
@ -1701,9 +1712,251 @@
"submitSearchLabel": "Submit Search Query", "submitSearchLabel": "Submit Search Query",
"searchHeader": "Search" "searchHeader": "Search"
}, },
"library": { "admin": {
"LibraryBase": { "ChannelDetail": {
"statsWarning": "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object",
"localLabel": "Local",
"localProfileLink": "Open local profile",
"djangoLink": "View in Django's admin",
"refreshButton": "Refresh from remote server",
"openRemoteButton": "Open remote profile",
"deleteButton": "Delete",
"deleteModalHeader": "Delete this channel?",
"deleteModalMessage": "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible.",
"channelDataHeader": "Channel data",
"nameLabel": "Name",
"categoryLabel": "Category",
"accountLabel": "Account",
"domainLabel": "Domain",
"descriptionLabel": "Description",
"urlLabel": "URL",
"rssLabel": "RSS feed",
"activityHeader": "Activity ",
"firstSeenLabel": "First seen",
"listeningsLabel": "Listenings",
"favoritedLabel": "Favorited tracks",
"playlistsLabel": "Playlists",
"linkedReportsLabel": "Linked reports",
"editsLabel": "Edits",
"audioContentHeader": "Audio content ",
"cachedSizeLabel": "Cached size",
"totalSizeLabel": "Total size",
"uploadsLabel": "Uploads",
"albumsLabel": "Albums",
"tracksLabel": "Tracks"
},
"CommonList": {
"accountsLabel": "Accounts",
"albumsLabel": "Albums",
"artistsLabel": "Artists",
"channelsLabel": "Channels",
"invitationsLabel": "Invitations",
"librariesLabel": "Libraries",
"tagsLabel": "Tags",
"tracksLabel": "Tracks",
"uploadsLabel": "Uploads",
"usersLabel": "Users"
},
"Settings": {
"settingsLabel": "Instance Settings",
"instanceInfoLabel": "Instance Information",
"signupsLabel": "Sign-ups",
"securityLabel": "Security",
"musicLabel": "Music",
"channelsLabel": "Channels",
"playlistsLabel": "Playlists",
"moderationLabel": "Moderation",
"federationLabel": "Federation",
"subsonicLabel": "Subsonic",
"statsLabel": "Statistics",
"uiLabel": "User Interface",
"sectionsHeader": "Sections"
},
"library": {
"AlbumDetail": {
"statsWarning": "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object",
"localLabel": "Local",
"localProfileLink": "Open local profile",
"djangoLink": "View in Django's admin",
"musicbrainzLink": "Open on MusicBrainz",
"remoteRefreshButton": "Refresh from remote server",
"remoteProfileLink": "Open remote profile",
"editButton": "Edit",
"deleteButton": "Delete",
"deleteModalHeader": "Delete this album?",
"deleteModalMessage": "The album will be deleted, as well as associated uploads, tracks, favorites and listening history. This action is irreversible.",
"albumDataHeader": "Album data",
"titleLabel": "Title",
"artistLabel": "Artist",
"domainLabel": "Domain",
"descriptionLabel": "Description",
"activityHeader": "Activity ",
"firstSeenLabel": "First seen",
"listeningsLabel": "Listenings",
"favoritedLabel": "Favorited tracks",
"playlistsLabel": "Playlists",
"linkedReportsLabel": "Linked reports",
"editsLabel": "Edits",
"audioContentHeader": "Audio content ",
"cachedSizeLabel": "Cached size",
"totalSizeLabel": "Total size",
"librariesLabel": "Libraries",
"uploadsLabel": "Uploads",
"tracksLabel": "Tracks"
},
"ArtistDetail": {
"statsWarning":"Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object",
"localLabel": "Local",
"localProfileLink": "Open local profile",
"djangoLink": "View in Django's admin",
"musicbrainzLink": "Open on MusicBrainz",
"remoteRefreshButton": "Refresh from remote server",
"remoteProfileLink": "Open remote profile",
"editButton": "Edit",
"deleteButton": "Delete",
"deleteModalHeader": "Delete this artist?",
"deleteModalMessage": "The artist will be deleted, as well as associated uploads, tracks, favorites and listening history. This action is irreversible.",
"artistDataHeader": "Artist data",
"nameLabel": "Name",
"categoryLabel": "Category",
"domainLabel": "Domain",
"descriptionLabel": "Description",
"activityHeader": "Activity ",
"firstSeenLabel": "First seen",
"listeningsLabel": "Listenings",
"favoritedLabel": "Favorited tracks",
"playlistsLabel": "Playlists",
"linkedReportsLabel": "Linked reports",
"editsLabel": "Edits",
"audioContentHeader": "Audio content ",
"cachedSizeLabel": "Cached size",
"totalSizeLabel": "Total size",
"librariesLabel": "Libraries",
"uploadsLabel": "Uploads",
"albumsLabel": "Albums",
"tracksLabel": "Tracks"
},
"Base": {
"title": "Manage Library",
"secondaryMenu": "Secondary menu",
"editsLink": "Edits",
"channelsLink": "Channels",
"artistsLink": "Artists",
"albumsLink": "Albums",
"tracksLink": "Tracks",
"librariesLink": "Libraries",
"uploadsLink": "Uploads",
"tagsLink": "Tags"
},
"EditsList": {
"title": "Edits",
"libraryEditsHeader": "Library edits"
},
"LibraryDetail": {
"statsWarning": "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object",
"localLabel": "Local",
"djangoLink": "View in Django's admin",
"remoteProfileLink": "Open remote profile",
"deleteButton": "Delete",
"deleteModalHeader": "Delete this library?",
"deleteModalMessage": "The library will be deleted, as well as associated uploads, tracks, favorites and listening history. This action is irreversible.",
"libraryDataHeader": "Library data",
"nameLabel": "Name",
"visibilityLabel": "Visibility",
"accountLabel": "Account",
"domainLabel": "Domain",
"descriptionLabel": "Description",
"activityHeader": "Activity ",
"firstSeenLabel": "First seen",
"followersLabel": "Followers",
"linkedReportsLabel": "Linked reports",
"audioContentHeader": "Audio content ",
"cachedSizeLabel": "Cached size",
"totalSizeLabel": "Total size",
"artistsLabel": "Artists",
"albumsLabel": "Albums",
"tracksLabel": "Tracks",
"uploadsLabel": "Uploads"
},
"TagDetail": {
"localProfileLink": "Open local profile",
"djangoLink": "View in Django's admin",
"deleteButton": "Delete",
"deleteModalHeader": "Delete this tag?",
"deleteModalMessage": "The tag will be removed and unlinked from any existing entity. This action is irreversible.",
"tagDataHeader": "Tag data",
"nameLabel": "Name",
"activityHeader": "Activity ",
"firstSeenLabel": "First seen",
"audioContentHeader": "Audio content ",
"artistsLabel": "Artists",
"albumsLabel": "Albums",
"tracksLabel": "Tracks"
},
"TrackDetail": {
"statsWarning": "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object",
"localLabel": "Local",
"localProfileLink": "Open local profile",
"djangoLink": "View in Django's admin",
"musicbrainzLink": "Open on MusicBrainz",
"remoteRefreshButton": "Refresh from remote server",
"remoteProfileLink": "Open remote profile",
"editButton": "Edit",
"deleteButton": "Delete",
"deleteModalHeader": "Delete this track?",
"deleteModalMessage": "The track will be deleted, as well as associated uploads, favorites and listening history. This action is irreversible.",
"trackDataHeader": "Track data",
"titleLabel": "Title",
"albumLabel": "Album",
"artistLabel": "Artist",
"albumArtistLabel": "Album artist",
"positionLabel": "Position",
"discNumberLabel": "Disc number",
"copyrightLabel": "Copyright",
"licenseLabel": "License",
"domainLabel": "Domain",
"descriptionLabel": "Description",
"activityHeader": "Activity ",
"firstSeenLabel": "First seen",
"listeningsLabel": "Listenings",
"favoritedLabel": "Favorited tracks",
"playlistsLabel": "Playlists",
"linkedReportsLabel": "Linked reports",
"editsLabel": "Edits",
"audioContentHeader": "Audio content ",
"cachedSizeLabel": "Cached size",
"totalSizeLabel": "Total size",
"librariesLabel": "Libraries",
"uploadsLabel": "Uploads"
},
"UploadDetail": {
"localLabel": "Local",
"djangoLink": "View in Django's admin",
"remoteProfileLink": "Open remote profile",
"downloadButton": "Download",
"deleteButton": "Delete",
"deleteModalHeader": "Delete this upload?",
"deleteModalMessage": "The upload will be removed. This action is irreversible.",
"uploadDataHeader": "Upload data",
"nameLabel": "Name",
"visibilityLabel": "Visibility",
"accountLabel": "Account",
"domainLabel": "Domain",
"importStatusLabel": "Import status",
"libraryLabel": "Library",
"activityHeader": "Activity ",
"firstSeenLabel": "First seen",
"accessedDateLabel": "Accessed date",
"notApplicable": "N/A",
"audioContentHeader": "Audio content ",
"trackLabel": "Track",
"cachedSizeLabel": "Cached size",
"sizeLabel": "Size",
"bitrateLabel": "Bitrate",
"bitrateValue": "{bitrate}/s",
"durationLabel": "Duration",
"typeLabel": "Type"
}
} }
} }
} }

View File

@ -21,7 +21,7 @@ const { t } = useI18n()
const router = useRouter() const router = useRouter()
const labels = computed(() => ({ const labels = computed(() => ({
statsWarning: t('Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object') statsWarning: t('views.admin.ChannelDetail.statsWarning')
})) }))
const isLoading = ref(false) const isLoading = ref(false)
@ -106,7 +106,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<template v-if="object.artist.is_local"> <template v-if="object.artist.is_local">
<span class="ui tiny accent label"> <span class="ui tiny accent label">
<i class="home icon" /> <i class="home icon" />
Local {{ $t('views.admin.ChannelDetail.localLabel') }}
</span> </span>
&nbsp; &nbsp;
</template> </template>
@ -129,7 +129,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
:to="{name: 'channels.detail', params: {id: object.uuid }}" :to="{name: 'channels.detail', params: {id: object.uuid }}"
> >
<i class="info icon" /> <i class="info icon" />
Open local profile&nbsp; {{ $t('views.admin.ChannelDetail.localProfileLink') }}
</router-link> </router-link>
<button <button
v-dropdown v-dropdown
@ -145,7 +145,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="wrench icon" /> <i class="wrench icon" />
View in Django's admin&nbsp; {{ $t('views.admin.ChannelDetail.djangoLink') }}
</a> </a>
<fetch-button <fetch-button
v-if="!object.actor.is_local" v-if="!object.actor.is_local"
@ -154,7 +154,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
@refresh="fetchData" @refresh="fetchData"
> >
<i class="refresh icon" />&nbsp; <i class="refresh icon" />&nbsp;
Refresh from remote server&nbsp; {{ $t('views.admin.ChannelDetail.refreshButton') }}
</fetch-button> </fetch-button>
<a <a
class="basic item" class="basic item"
@ -163,7 +163,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="external icon" /> <i class="external icon" />
Open remote profile&nbsp; {{ $t('views.admin.ChannelDetail.openRemoteButton') }}
</a> </a>
</div> </div>
</button> </button>
@ -173,22 +173,22 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
:class="['ui', {loading: isLoading}, 'basic danger button']" :class="['ui', {loading: isLoading}, 'basic danger button']"
:action="remove" :action="remove"
> >
Delete {{ $t('views.admin.ChannelDetail.deleteButton') }}
<template #modal-header> <template #modal-header>
<p> <p>
Delete this channel? {{ $t('views.admin.ChannelDetail.deleteModalHeader') }}
</p> </p>
</template> </template>
<template #modal-content> <template #modal-content>
<div> <div>
<p> <p>
The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible. {{ $t('views.admin.ChannelDetail.deleteModalMessage') }}
</p> </p>
</div> </div>
</template> </template>
<template #modal-confirm> <template #modal-confirm>
<p> <p>
Delete {{ $t('views.admin.ChannelDetail.deleteButton') }}
</p> </p>
</template> </template>
</dangerous-button> </dangerous-button>
@ -205,14 +205,14 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="info icon" /> <i class="info icon" />
<div class="content"> <div class="content">
Channel data {{ $t('views.admin.ChannelDetail.channelDataHeader') }}
</div> </div>
</h3> </h3>
<table class="ui very basic table"> <table class="ui very basic table">
<tbody> <tbody>
<tr> <tr>
<td> <td>
Name {{ $t('views.admin.ChannelDetail.nameLabel') }}
</td> </td>
<td> <td>
{{ object.artist.name }} {{ object.artist.name }}
@ -221,7 +221,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.channels', query: {q: getQuery('category', object.artist.content_category) }}"> <router-link :to="{name: 'manage.channels', query: {q: getQuery('category', object.artist.content_category) }}">
Category {{ $t('views.admin.ChannelDetail.categoryLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -231,7 +231,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.moderation.accounts.detail', params: {id: object.attributed_to.full_username }}"> <router-link :to="{name: 'manage.moderation.accounts.detail', params: {id: object.attributed_to.full_username }}">
Account {{ $t('views.admin.ChannelDetail.accountLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -241,7 +241,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr v-if="!object.actor.is_local"> <tr v-if="!object.actor.is_local">
<td> <td>
<router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.actor.domain }}"> <router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.actor.domain }}">
Domain {{ $t('views.admin.ChannelDetail.domainLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -250,7 +250,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr v-if="object.artist.description"> <tr v-if="object.artist.description">
<td> <td>
Description {{ $t('views.admin.ChannelDetail.descriptionLabel') }}
</td> </td>
<sanitized-html <sanitized-html
tag="td" tag="td"
@ -259,7 +259,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr v-if="object.actor.url"> <tr v-if="object.actor.url">
<td> <td>
URL {{ $t('views.admin.ChannelDetail.urlLabel') }}
</td> </td>
<td> <td>
<a <a
@ -271,7 +271,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr v-if="object.rss_url"> <tr v-if="object.rss_url">
<td> <td>
RSS Feed {{ $t('views.admin.ChannelDetail.rssLabel') }}
</td> </td>
<td> <td>
<a <a
@ -290,7 +290,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="feed icon" /> <i class="feed icon" />
<div class="content"> <div class="content">
Activity&nbsp; {{ $t('views.admin.ChannelDetail.activityHeader') }}
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span> <span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
</div> </div>
</h3> </h3>
@ -310,7 +310,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tbody> <tbody>
<tr> <tr>
<td> <td>
First seen {{ $t('views.admin.ChannelDetail.firstSeenLabel') }}
</td> </td>
<td> <td>
<human-date :date="object.creation_date" /> <human-date :date="object.creation_date" />
@ -318,7 +318,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Listenings {{ $t('views.admin.ChannelDetail.listeningsLabel') }}
</td> </td>
<td> <td>
{{ stats.listenings }} {{ stats.listenings }}
@ -326,7 +326,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Favorited tracks {{ $t('views.admin.ChannelDetail.favoritedLabel') }}
</td> </td>
<td> <td>
{{ stats.track_favorites }} {{ stats.track_favorites }}
@ -334,7 +334,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Playlists {{ $t('views.admin.ChannelDetail.playlistsLabel') }}
</td> </td>
<td> <td>
{{ stats.playlists }} {{ stats.playlists }}
@ -343,7 +343,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `channel:${object.uuid}`) }}"> <router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `channel:${object.uuid}`) }}">
Linked reports {{ $t('views.admin.ChannelDetail.linkedReportsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -353,7 +353,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.edits', query: {q: getQuery('target', 'artist ' + object.artist.id)}}"> <router-link :to="{name: 'manage.library.edits', query: {q: getQuery('target', 'artist ' + object.artist.id)}}">
Edits {{ $t('views.admin.ChannelDetail.editsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -369,7 +369,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="music icon" /> <i class="music icon" />
<div class="content"> <div class="content">
Audio content&nbsp; {{ $t('views.admin.ChannelDetail.audioContentHeader') }}
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span> <span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
</div> </div>
</h3> </h3>
@ -389,7 +389,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tbody> <tbody>
<tr> <tr>
<td> <td>
Cached size {{ $t('views.admin.ChannelDetail.cachedSizeLabel') }}
</td> </td>
<td> <td>
{{ humanSize(stats.media_downloaded_size) }} {{ humanSize(stats.media_downloaded_size) }}
@ -397,7 +397,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Total size {{ $t('views.admin.ChannelDetail.totalSizeLabel') }}
</td> </td>
<td> <td>
{{ humanSize(stats.media_total_size) }} {{ humanSize(stats.media_total_size) }}
@ -406,7 +406,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('channel_id', object.uuid) }}"> <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('channel_id', object.uuid) }}">
Uploads {{ $t('views.admin.ChannelDetail.uploadsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -416,7 +416,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.albums', query: {q: getQuery('channel_id', object.uuid) }}"> <router-link :to="{name: 'manage.library.albums', query: {q: getQuery('channel_id', object.uuid) }}">
Albums {{ $t('views.admin.ChannelDetail.albumsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -426,7 +426,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('channel_id', object.uuid) }}"> <router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('channel_id', object.uuid) }}">
Tracks {{ $t('views.admin.ChannelDetail.tracksLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>

View File

@ -27,16 +27,16 @@ const props = withDefaults(defineProps<Props>(), {
const { t } = useI18n() const { t } = useI18n()
const labels = computed(() => ({ const labels = computed(() => ({
accounts: t('Accounts'), accounts: t('views.admin.CommonList.accountsLabel'),
albums: t('Albums'), albums: t('views.admin.CommonList.albumsLabel'),
artists: t('Artists'), artists: t('views.admin.CommonList.artistsLabel'),
channels: t('Channels'), channels: t('views.admin.CommonList.channelsLabel'),
invitations: t('Invitations'), invitations: t('views.admin.CommonList.invitationsLabel'),
libraries: t('Libraries'), libraries: t('views.admin.CommonList.librariesLabel'),
tags: t('Tags'), tags: t('views.admin.CommonList.tagsLabel'),
tracks: t('Tracks'), tracks: t('views.admin.CommonList.tracksLabel'),
uploads: t('Uploads'), uploads: t('views.admin.CommonList.uploadsLabel'),
users: t('Users') users: t('views.admin.CommonList.usersLabel')
})) }))
const title = computed(() => labels.value[props.type]) const title = computed(() => labels.value[props.type])

View File

@ -20,7 +20,7 @@ const { t } = useI18n()
const groups = computed(() => [ const groups = computed(() => [
{ {
label: t('Instance information'), label: t('views.admin.Settings.instanceInfoLabel'),
id: 'instance', id: 'instance',
settings: [ settings: [
{ name: 'instance__name' }, { name: 'instance__name' },
@ -34,7 +34,7 @@ const groups = computed(() => [
] ]
}, },
{ {
label: t('Sign-ups'), label: t('views.admin.Settings.signupsLabel'),
id: 'signup', id: 'signup',
settings: [ settings: [
{ name: 'users__registration_enabled' }, { name: 'users__registration_enabled' },
@ -43,7 +43,7 @@ const groups = computed(() => [
] ]
}, },
{ {
label: t('Security'), label: t('views.admin.Settings.securityLabel'),
id: 'security', id: 'security',
settings: [ settings: [
{ name: 'common__api_authentication_required' }, { name: 'common__api_authentication_required' },
@ -52,7 +52,7 @@ const groups = computed(() => [
] ]
}, },
{ {
label: t('Music'), label: t('views.admin.Settings.musicLabel'),
id: 'music', id: 'music',
settings: [ settings: [
{ name: 'music__transcoding_enabled' }, { name: 'music__transcoding_enabled' },
@ -60,7 +60,7 @@ const groups = computed(() => [
] ]
}, },
{ {
label: t('Channels'), label: t('views.admin.Settings.channelsLabel'),
id: 'channels', id: 'channels',
settings: [ settings: [
{ name: 'audio__channels_enabled' }, { name: 'audio__channels_enabled' },
@ -68,14 +68,14 @@ const groups = computed(() => [
] ]
}, },
{ {
label: t('Playlists'), label: t('views.admin.Settings.playlistsLabel'),
id: 'playlists', id: 'playlists',
settings: [ settings: [
{ name: 'playlists__max_tracks' } { name: 'playlists__max_tracks' }
] ]
}, },
{ {
label: t('Moderation'), label: t('views.admin.Settings.moderationLabel'),
id: 'moderation', id: 'moderation',
settings: [ settings: [
{ name: 'moderation__allow_list_enabled' }, { name: 'moderation__allow_list_enabled' },
@ -84,7 +84,7 @@ const groups = computed(() => [
] ]
}, },
{ {
label: t('Federation'), label: t('views.admin.Settings.federationLabel'),
id: 'federation', id: 'federation',
settings: [ settings: [
{ name: 'federation__enabled' }, { name: 'federation__enabled' },
@ -95,14 +95,14 @@ const groups = computed(() => [
] ]
}, },
{ {
label: t('Subsonic'), label: t('views.admin.Settings.subsonicLabel'),
id: 'subsonic', id: 'subsonic',
settings: [ settings: [
{ name: 'subsonic__enabled' } { name: 'subsonic__enabled' }
] ]
}, },
{ {
label: t('Statistics'), label: t('views.admin.Settings.statsLabel'),
id: 'ui', id: 'ui',
settings: [ settings: [
{ name: 'ui__custom_css' }, { name: 'ui__custom_css' },
@ -110,7 +110,7 @@ const groups = computed(() => [
] ]
}, },
{ {
label: t('User Interface'), label: t('views.admin.Settings.uiLabel'),
id: 'statistics', id: 'statistics',
settings: [ settings: [
{ name: 'instance__nodeinfo_stats_enabled' }, { name: 'instance__nodeinfo_stats_enabled' },
@ -120,7 +120,7 @@ const groups = computed(() => [
] as SettingsGroupType[]) ] as SettingsGroupType[])
const labels = computed(() => ({ const labels = computed(() => ({
settings: t('Instance settings') settings: t('views.admin.Settings.settingsLabel')
})) }))
const scrollTo = (id: string) => { const scrollTo = (id: string) => {
@ -186,7 +186,7 @@ await nextTick()
<div class="four wide column"> <div class="four wide column">
<div class="ui sticky vertical secondary menu"> <div class="ui sticky vertical secondary menu">
<div class="header item"> <div class="header item">
Sections {{ $t('views.admin.Settings.sectionsHeader') }}
</div> </div>
<a <a
v-for="(group, key) in groups" v-for="(group, key) in groups"

View File

@ -21,7 +21,7 @@ const { t } = useI18n()
const router = useRouter() const router = useRouter()
const labels = computed(() => ({ const labels = computed(() => ({
statsWarning: t('Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object') statsWarning: t('views.admin.library.AlbumDetail.statsWarning')
})) }))
const isLoading = ref(false) const isLoading = ref(false)
@ -106,7 +106,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<template v-if="object.is_local"> <template v-if="object.is_local">
<span class="ui tiny accent label"> <span class="ui tiny accent label">
<i class="home icon" /> <i class="home icon" />
Local {{ $t('views.admin.library.AlbumDetail.localLabel') }}
</span> </span>
&nbsp; &nbsp;
</template> </template>
@ -130,7 +130,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
:to="{name: 'library.albums.detail', params: {id: object.id }}" :to="{name: 'library.albums.detail', params: {id: object.id }}"
> >
<i class="info icon" /> <i class="info icon" />
Open local profile&nbsp; {{ $t('views.admin.library.AlbumDetail.localProfileLink') }}
</router-link> </router-link>
<button <button
v-dropdown v-dropdown
@ -146,7 +146,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="wrench icon" /> <i class="wrench icon" />
View in Django's admin&nbsp; {{ $t('views.admin.library.AlbumDetail.djangoLink') }}
</a> </a>
<a <a
v-if="object.mbid" v-if="object.mbid"
@ -156,7 +156,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="external icon" /> <i class="external icon" />
Open on MusicBrainz&nbsp; {{ $t('views.admin.library.AlbumDetail.musicbrainzLink') }}
</a> </a>
<fetch-button <fetch-button
v-if="!object.is_local" v-if="!object.is_local"
@ -165,7 +165,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
@refresh="fetchData" @refresh="fetchData"
> >
<i class="refresh icon" />&nbsp; <i class="refresh icon" />&nbsp;
Refresh from remote server&nbsp; {{ $t('views.admin.library.AlbumDetail.remoteRefreshButton') }}
</fetch-button> </fetch-button>
<a <a
class="basic item" class="basic item"
@ -174,7 +174,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="external icon" /> <i class="external icon" />
Open remote profile&nbsp; {{ $t('views.admin.library.AlbumDetail.remoteProfileLink') }}
</a> </a>
</div> </div>
</button> </button>
@ -186,7 +186,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
class="ui labeled icon button" class="ui labeled icon button"
> >
<i class="edit icon" /> <i class="edit icon" />
Edit {{ $t('views.admin.library.AlbumDetail.editButton') }}
</router-link> </router-link>
</div> </div>
<div class="ui buttons"> <div class="ui buttons">
@ -194,22 +194,22 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
:class="['ui', {loading: isLoading}, 'basic danger button']" :class="['ui', {loading: isLoading}, 'basic danger button']"
:action="remove" :action="remove"
> >
Delete {{ $t('views.admin.library.AlbumDetail.deleteButton') }}
<template #modal-header> <template #modal-header>
<p> <p>
Delete this album? {{ $t('views.admin.library.AlbumDetail.deleteModalHeader') }}
</p> </p>
</template> </template>
<template #modal-content> <template #modal-content>
<div> <div>
<p> <p>
The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible. {{ $t('views.admin.library.AlbumDetail.deleteModalMessage') }}
</p> </p>
</div> </div>
</template> </template>
<template #modal-confirm> <template #modal-confirm>
<p> <p>
Delete {{ $t('views.admin.library.AlbumDetail.deleteButton') }}
</p> </p>
</template> </template>
</dangerous-button> </dangerous-button>
@ -226,14 +226,14 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="info icon" /> <i class="info icon" />
<div class="content"> <div class="content">
Album data {{ $t('views.admin.library.AlbumDetail.albumDataHeader') }}
</div> </div>
</h3> </h3>
<table class="ui very basic table"> <table class="ui very basic table">
<tbody> <tbody>
<tr> <tr>
<td> <td>
Title {{ $t('views.admin.library.AlbumDetail.titleLabel') }}
</td> </td>
<td> <td>
{{ object.title }} {{ object.title }}
@ -242,7 +242,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.artists.detail', params: {id: object.artist.id }}"> <router-link :to="{name: 'manage.library.artists.detail', params: {id: object.artist.id }}">
Artist {{ $t('views.admin.library.AlbumDetail.artistLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -252,7 +252,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr v-if="!object.is_local"> <tr v-if="!object.is_local">
<td> <td>
<router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}"> <router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}">
Domain {{ $t('views.admin.library.AlbumDetail.domainLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -261,7 +261,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr v-if="object.description"> <tr v-if="object.description">
<td> <td>
Description {{ $t('views.admin.library.AlbumDetail.descriptionLabel') }}
</td> </td>
<sanitized-html <sanitized-html
tag="td" tag="td"
@ -277,7 +277,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="feed icon" /> <i class="feed icon" />
<div class="content"> <div class="content">
Activity&nbsp; {{ $t('views.admin.library.AlbumDetail.activityHeader') }}
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span> <span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
</div> </div>
</h3> </h3>
@ -297,7 +297,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tbody> <tbody>
<tr> <tr>
<td> <td>
First seen {{ $t('views.admin.library.AlbumDetail.firstSeenLabel') }}
</td> </td>
<td> <td>
<human-date :date="object.creation_date" /> <human-date :date="object.creation_date" />
@ -305,7 +305,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Listenings {{ $t('views.admin.library.AlbumDetail.listeningsLabel') }}
</td> </td>
<td> <td>
{{ stats.listenings }} {{ stats.listenings }}
@ -313,7 +313,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Favorited tracks {{ $t('views.admin.library.AlbumDetail.favoritedLabel') }}
</td> </td>
<td> <td>
{{ stats.track_favorites }} {{ stats.track_favorites }}
@ -321,7 +321,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Playlists {{ $t('views.admin.library.AlbumDetail.playlistsLabel') }}
</td> </td>
<td> <td>
{{ stats.playlists }} {{ stats.playlists }}
@ -330,7 +330,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `album:${object.id}`) }}"> <router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `album:${object.id}`) }}">
Linked reports {{ $t('views.admin.library.AlbumDetail.linkedReportsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -340,7 +340,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.edits', query: {q: getQuery('target', 'album ' + object.id)}}"> <router-link :to="{name: 'manage.library.edits', query: {q: getQuery('target', 'album ' + object.id)}}">
Edits {{ $t('views.admin.library.AlbumDetail.editsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -356,7 +356,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="music icon" /> <i class="music icon" />
<div class="content"> <div class="content">
Audio content&nbsp; {{ $t('views.admin.library.AlbumDetail.audioContentHeader') }}
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span> <span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
</div> </div>
</h3> </h3>
@ -376,7 +376,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tbody> <tbody>
<tr> <tr>
<td> <td>
Cached size {{ $t('views.admin.library.AlbumDetail.cachedSizeLabel') }}
</td> </td>
<td> <td>
{{ humanSize(stats.media_downloaded_size) }} {{ humanSize(stats.media_downloaded_size) }}
@ -384,7 +384,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Total size {{ $t('views.admin.library.AlbumDetail.totalSizeLabel') }}
</td> </td>
<td> <td>
{{ humanSize(stats.media_total_size) }} {{ humanSize(stats.media_total_size) }}
@ -394,7 +394,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('album_id', object.id) }}"> <router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('album_id', object.id) }}">
Libraries {{ $t('views.admin.library.AlbumDetail.librariesLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -404,7 +404,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('album_id', object.id) }}"> <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('album_id', object.id) }}">
Uploads {{ $t('views.admin.library.AlbumDetail.uploadsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -414,7 +414,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('album_id', object.id) }}"> <router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('album_id', object.id) }}">
Tracks {{ $t('views.admin.library.AlbumDetail.tracksLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>

View File

@ -21,7 +21,7 @@ const { t } = useI18n()
const router = useRouter() const router = useRouter()
const labels = computed(() => ({ const labels = computed(() => ({
statsWarning: t('Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object') statsWarning: t('views.admin.library.ArtistDetail.statsWarning')
})) }))
const isLoading = ref(false) const isLoading = ref(false)
@ -106,7 +106,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<template v-if="object.is_local"> <template v-if="object.is_local">
<span class="ui tiny accent label"> <span class="ui tiny accent label">
<i class="home icon" /> <i class="home icon" />
Local {{ $t('views.admin.library.ArtistDetail.localLabel') }}
</span> </span>
&nbsp; &nbsp;
</template> </template>
@ -129,7 +129,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
:to="{name: 'library.artists.detail', params: {id: object.id }}" :to="{name: 'library.artists.detail', params: {id: object.id }}"
> >
<i class="info icon" /> <i class="info icon" />
Open local profile&nbsp; {{ $t('views.admin.library.ArtistDetail.localProfileLink') }}
</router-link> </router-link>
<button <button
v-dropdown v-dropdown
@ -145,7 +145,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="wrench icon" /> <i class="wrench icon" />
View in Django's admin&nbsp; {{ $t('views.admin.library.ArtistDetail.djangoLink') }}
</a> </a>
<a <a
v-if="object.mbid" v-if="object.mbid"
@ -155,7 +155,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="external icon" /> <i class="external icon" />
Open on MusicBrainz&nbsp; {{ $t('views.admin.library.ArtistDetail.musicbrainzLink') }}
</a> </a>
<fetch-button <fetch-button
v-if="!object.is_local" v-if="!object.is_local"
@ -164,7 +164,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
@refresh="fetchData" @refresh="fetchData"
> >
<i class="refresh icon" />&nbsp; <i class="refresh icon" />&nbsp;
Refresh from remote server&nbsp; {{ $t('views.admin.library.ArtistDetail.remoteRefreshButton') }}
</fetch-button> </fetch-button>
<a <a
class="basic item" class="basic item"
@ -173,7 +173,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="external icon" /> <i class="external icon" />
Open remote profile&nbsp; {{ $t('views.admin.library.ArtistDetail.remoteProfileLink') }}
</a> </a>
</div> </div>
</button> </button>
@ -185,7 +185,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
class="ui labeled icon button" class="ui labeled icon button"
> >
<i class="edit icon" /> <i class="edit icon" />
Edit {{ $t('views.admin.library.ArtistDetail.editButton') }}
</router-link> </router-link>
</div> </div>
<div class="ui buttons"> <div class="ui buttons">
@ -193,22 +193,22 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
:class="['ui', {loading: isLoading}, 'basic danger button']" :class="['ui', {loading: isLoading}, 'basic danger button']"
:action="remove" :action="remove"
> >
Delete {{ $t('views.admin.library.ArtistDetail.deleteButton') }}
<template #modal-header> <template #modal-header>
<p> <p>
Delete this artist? {{ $t('views.admin.library.ArtistDetail.deleteModalHeader') }}
</p> </p>
</template> </template>
<template #modal-content> <template #modal-content>
<div> <div>
<p> <p>
The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible. {{ $t('views.admin.library.ArtistDetail.deleteModalMessage') }}
</p> </p>
</div> </div>
</template> </template>
<template #modal-confirm> <template #modal-confirm>
<p> <p>
Delete {{ $t('views.admin.library.ArtistDetail.deleteButton') }}
</p> </p>
</template> </template>
</dangerous-button> </dangerous-button>
@ -225,14 +225,14 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="info icon" /> <i class="info icon" />
<div class="content"> <div class="content">
Artist data {{ $t('views.admin.library.ArtistDetail.artistDataHeader') }}
</div> </div>
</h3> </h3>
<table class="ui very basic table"> <table class="ui very basic table">
<tbody> <tbody>
<tr> <tr>
<td> <td>
Name {{ $t('views.admin.library.ArtistDetail.nameLabel') }}
</td> </td>
<td> <td>
{{ object.name }} {{ object.name }}
@ -241,7 +241,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.artists', query: {q: getQuery('category', object.content_category) }}"> <router-link :to="{name: 'manage.library.artists', query: {q: getQuery('category', object.content_category) }}">
Category {{ $t('views.admin.library.ArtistDetail.categoryLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -251,7 +251,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr v-if="!object.is_local"> <tr v-if="!object.is_local">
<td> <td>
<router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}"> <router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}">
Domain {{ $t('views.admin.library.ArtistDetail.domainLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -260,7 +260,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr v-if="object.description"> <tr v-if="object.description">
<td> <td>
Description {{ $t('views.admin.library.ArtistDetail.descriptionLabel') }}
</td> </td>
<sanitized-html <sanitized-html
tag="td" tag="td"
@ -276,7 +276,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="feed icon" /> <i class="feed icon" />
<div class="content"> <div class="content">
Activity&nbsp; {{ $t('views.admin.library.ArtistDetail.activityHeader') }}
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span> <span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
</div> </div>
</h3> </h3>
@ -296,7 +296,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tbody> <tbody>
<tr> <tr>
<td> <td>
First seen {{ $t('views.admin.library.ArtistDetail.firstSeenLabel') }}
</td> </td>
<td> <td>
<human-date :date="object.creation_date" /> <human-date :date="object.creation_date" />
@ -304,7 +304,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Listenings {{ $t('views.admin.library.ArtistDetail.listeningsLabel') }}
</td> </td>
<td> <td>
{{ stats.listenings }} {{ stats.listenings }}
@ -312,7 +312,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Favorited tracks {{ $t('views.admin.library.ArtistDetail.favoritedLabel') }}
</td> </td>
<td> <td>
{{ stats.track_favorites }} {{ stats.track_favorites }}
@ -320,7 +320,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Playlists {{ $t('views.admin.library.ArtistDetail.playlistsLabel') }}
</td> </td>
<td> <td>
{{ stats.playlists }} {{ stats.playlists }}
@ -329,7 +329,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `artist:${object.id}`) }}"> <router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `artist:${object.id}`) }}">
Linked reports {{ $t('views.admin.library.ArtistDetail.linkedReportsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -339,7 +339,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.edits', query: {q: getQuery('target', 'artist ' + object.id)}}"> <router-link :to="{name: 'manage.library.edits', query: {q: getQuery('target', 'artist ' + object.id)}}">
Edits {{ $t('views.admin.library.ArtistDetail.editsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -355,7 +355,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="music icon" /> <i class="music icon" />
<div class="content"> <div class="content">
Audio content&nbsp; {{ $t('views.admin.library.ArtistDetail.audioContentHeader') }}
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span> <span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
</div> </div>
</h3> </h3>
@ -375,7 +375,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tbody> <tbody>
<tr> <tr>
<td> <td>
Cached size {{ $t('views.admin.library.ArtistDetail.cachedSizeLabel') }}
</td> </td>
<td> <td>
{{ humanSize(stats.media_downloaded_size) }} {{ humanSize(stats.media_downloaded_size) }}
@ -383,7 +383,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Total size {{ $t('views.admin.library.ArtistDetail.totalSizeLabel') }}
</td> </td>
<td> <td>
{{ humanSize(stats.media_total_size) }} {{ humanSize(stats.media_total_size) }}
@ -393,7 +393,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('artist_id', object.id) }}"> <router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('artist_id', object.id) }}">
Libraries {{ $t('views.admin.library.ArtistDetail.librariesLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -403,7 +403,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('artist_id', object.id) }}"> <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('artist_id', object.id) }}">
Uploads {{ $t('views.admin.library.ArtistDetail.uploadsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -413,7 +413,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.albums', query: {q: getQuery('artist_id', object.id) }}"> <router-link :to="{name: 'manage.library.albums', query: {q: getQuery('artist_id', object.id) }}">
Albums {{ $t('views.admin.library.ArtistDetail.albumsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -423,7 +423,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('artist_id', object.id) }}"> <router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('artist_id', object.id) }}">
Tracks {{ $t('views.admin.library.ArtistDetail.tracksLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>

View File

@ -4,8 +4,8 @@ import { useI18n } from 'vue-i18n'
const { t } = useI18n() const { t } = useI18n()
const labels = computed(() => ({ const labels = computed(() => ({
title: t('Manage library'), title: t('views.admin.library.Base.title'),
secondaryMenu: t('Secondary menu') secondaryMenu: t('views.admin.library.Base.secondaryMenu')
})) }))
</script> </script>
@ -23,49 +23,49 @@ const labels = computed(() => ({
class="ui item" class="ui item"
:to="{name: 'manage.library.edits'}" :to="{name: 'manage.library.edits'}"
> >
Edits {{ $t('views.admin.library.Base.editsLink') }}
</router-link> </router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.channels'}" :to="{name: 'manage.channels'}"
> >
Channels {{ $t('views.admin.library.Base.channelsLink') }}
</router-link> </router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.library.artists'}" :to="{name: 'manage.library.artists'}"
> >
Artists {{ $t('views.admin.library.Base.artistsLink') }}
</router-link> </router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.library.albums'}" :to="{name: 'manage.library.albums'}"
> >
Albums {{ $t('views.admin.library.Base.albumsLink') }}
</router-link> </router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.library.tracks'}" :to="{name: 'manage.library.tracks'}"
> >
Tracks {{ $t('views.admin.library.Base.tracksLink') }}
</router-link> </router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.library.libraries'}" :to="{name: 'manage.library.libraries'}"
> >
Libraries {{ $t('views.admin.library.Base.librariesLink') }}
</router-link> </router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.library.uploads'}" :to="{name: 'manage.library.uploads'}"
> >
Uploads {{ $t('views.admin.library.Base.uploadsLink') }}
</router-link> </router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.library.tags'}" :to="{name: 'manage.library.tags'}"
> >
Tags {{ $t('views.admin.library.Base.tagsLink') }}
</router-link> </router-link>
</nav> </nav>
<router-view :key="$route.fullPath" /> <router-view :key="$route.fullPath" />

View File

@ -14,7 +14,7 @@ withDefaults(defineProps<Props>(), {
const { t } = useI18n() const { t } = useI18n()
const labels = computed(() => ({ const labels = computed(() => ({
title: t('Edits') title: t('views.admin.library.EditsList.title')
})) }))
</script> </script>
@ -26,7 +26,7 @@ const labels = computed(() => ({
:default-query="defaultQuery" :default-query="defaultQuery"
> >
<h2 class="ui header"> <h2 class="ui header">
Library edits {{ $t('views.admin.library.EditsList.libraryEditsHeader') }}
</h2> </h2>
</edits-card-list> </edits-card-list>
</section> </section>

View File

@ -27,7 +27,7 @@ const router = useRouter()
const logger = useLogger() const logger = useLogger()
const labels = computed(() => ({ const labels = computed(() => ({
statsWarning: t('Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object') statsWarning: t('views.admin.library.LibraryDetail.statsWarning')
})) }))
const isLoading = ref(false) const isLoading = ref(false)
@ -117,7 +117,7 @@ const updateObj = async (attr: string) => {
<template v-if="object.is_local"> <template v-if="object.is_local">
<span class="ui tiny accent label"> <span class="ui tiny accent label">
<i class="home icon" /> <i class="home icon" />
Local {{ $t('views.admin.library.LibraryDetail.localLabel') }}
</span> </span>
&nbsp; &nbsp;
</template> </template>
@ -134,7 +134,7 @@ const updateObj = async (attr: string) => {
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="wrench icon" /> <i class="wrench icon" />
View in Django's admin&nbsp; {{ $t('views.admin.library.LibraryDetail.djangoLink') }}
</a> </a>
<button <button
v-dropdown v-dropdown
@ -150,7 +150,7 @@ const updateObj = async (attr: string) => {
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="wrench icon" /> <i class="wrench icon" />
View in Django's admin&nbsp; {{ $t('views.admin.library.LibraryDetail.djangoLink') }}
</a> </a>
<a <a
class="basic item" class="basic item"
@ -159,7 +159,7 @@ const updateObj = async (attr: string) => {
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="external icon" /> <i class="external icon" />
Open remote profile&nbsp; {{ $t('views.admin.library.LibraryDetail.remoteProfileLink') }}
</a> </a>
</div> </div>
</button> </button>
@ -169,22 +169,22 @@ const updateObj = async (attr: string) => {
:class="['ui', {loading: isLoading}, 'basic danger button']" :class="['ui', {loading: isLoading}, 'basic danger button']"
:action="remove" :action="remove"
> >
Delete {{ $t('views.admin.library.LibraryDetail.deleteButton') }}
<template #modal-header> <template #modal-header>
<p> <p>
Delete this library? {{ $t('views.admin.library.LibraryDetail.deleteModalHeader') }}
</p> </p>
</template> </template>
<template #modal-content> <template #modal-content>
<div> <div>
<p> <p>
The library will be removed, as well as associated uploads, and follows. This action is irreversible. {{ $t('views.admin.library.LibraryDetail.deleteModalMessage') }}
</p> </p>
</div> </div>
</template> </template>
<template #modal-confirm> <template #modal-confirm>
<p> <p>
Delete {{ $t('views.admin.library.LibraryDetail.deleteButton') }}
</p> </p>
</template> </template>
</dangerous-button> </dangerous-button>
@ -201,14 +201,14 @@ const updateObj = async (attr: string) => {
<h3 class="ui header"> <h3 class="ui header">
<i class="info icon" /> <i class="info icon" />
<div class="content"> <div class="content">
Library data {{ $t('views.admin.library.LibraryDetail.libraryDataHeader') }}
</div> </div>
</h3> </h3>
<table class="ui very basic table"> <table class="ui very basic table">
<tbody> <tbody>
<tr> <tr>
<td> <td>
Name {{ $t('views.admin.library.LibraryDetail.nameLabel') }}
</td> </td>
<td> <td>
{{ object.name }} {{ object.name }}
@ -217,7 +217,7 @@ const updateObj = async (attr: string) => {
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('privacy_level', object.privacy_level) }}"> <router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('privacy_level', object.privacy_level) }}">
Visibility {{ $t('views.admin.library.LibraryDetail.visibilityLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -244,7 +244,7 @@ const updateObj = async (attr: string) => {
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.moderation.accounts.detail', params: {id: object.actor.full_username }}"> <router-link :to="{name: 'manage.moderation.accounts.detail', params: {id: object.actor.full_username }}">
Account {{ $t('views.admin.library.LibraryDetail.accountLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -254,7 +254,7 @@ const updateObj = async (attr: string) => {
<tr v-if="!object.is_local"> <tr v-if="!object.is_local">
<td> <td>
<router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}"> <router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}">
Domain {{ $t('views.admin.library.LibraryDetail.domainLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -263,7 +263,7 @@ const updateObj = async (attr: string) => {
</tr> </tr>
<tr> <tr>
<td> <td>
Description {{ $t('views.admin.library.LibraryDetail.descriptionLabel') }}
</td> </td>
<td> <td>
{{ object.description }} {{ object.description }}
@ -278,7 +278,7 @@ const updateObj = async (attr: string) => {
<h3 class="ui header"> <h3 class="ui header">
<i class="feed icon" /> <i class="feed icon" />
<div class="content"> <div class="content">
Activity&nbsp; {{ $t('views.admin.library.LibraryDetail.activityHeader') }}
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span> <span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
</div> </div>
</h3> </h3>
@ -298,7 +298,7 @@ const updateObj = async (attr: string) => {
<tbody> <tbody>
<tr> <tr>
<td> <td>
First seen {{ $t('views.admin.library.LibraryDetail.firstSeenLabel') }}
</td> </td>
<td> <td>
<human-date :date="object.creation_date" /> <human-date :date="object.creation_date" />
@ -306,7 +306,7 @@ const updateObj = async (attr: string) => {
</tr> </tr>
<tr> <tr>
<td> <td>
Followers {{ $t('views.admin.library.LibraryDetail.followersLabel') }}
</td> </td>
<td> <td>
{{ stats.followers }} {{ stats.followers }}
@ -315,7 +315,7 @@ const updateObj = async (attr: string) => {
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `library:${object.uuid}`) }}"> <router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `library:${object.uuid}`) }}">
Linked reports {{ $t('views.admin.library.LibraryDetail.linkedReportsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -331,7 +331,7 @@ const updateObj = async (attr: string) => {
<h3 class="ui header"> <h3 class="ui header">
<i class="music icon" /> <i class="music icon" />
<div class="content"> <div class="content">
Audio content&nbsp; {{ $t('views.admin.library.LibraryDetail.audioContentHeader') }}
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span> <span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
</div> </div>
</h3> </h3>
@ -351,7 +351,7 @@ const updateObj = async (attr: string) => {
<tbody> <tbody>
<tr> <tr>
<td> <td>
Cached size {{ $t('views.admin.library.LibraryDetail.cachedSizeLabel') }}
</td> </td>
<td> <td>
{{ humanSize(stats.media_downloaded_size) }} {{ humanSize(stats.media_downloaded_size) }}
@ -359,7 +359,7 @@ const updateObj = async (attr: string) => {
</tr> </tr>
<tr> <tr>
<td> <td>
Total size {{ $t('views.admin.library.LibraryDetail.totalSizeLabel') }}
</td> </td>
<td> <td>
{{ humanSize(stats.media_total_size) }} {{ humanSize(stats.media_total_size) }}
@ -368,7 +368,7 @@ const updateObj = async (attr: string) => {
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.artists', query: {q: getQuery('library_id', object.id) }}"> <router-link :to="{name: 'manage.library.artists', query: {q: getQuery('library_id', object.id) }}">
Artists {{ $t('views.admin.library.LibraryDetail.artistsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -378,7 +378,7 @@ const updateObj = async (attr: string) => {
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.albums', query: {q: getQuery('library_id', object.id) }}"> <router-link :to="{name: 'manage.library.albums', query: {q: getQuery('library_id', object.id) }}">
Albums {{ $t('views.admin.library.LibraryDetail.albumsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -388,7 +388,7 @@ const updateObj = async (attr: string) => {
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('library_id', object.id) }}"> <router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('library_id', object.id) }}">
Tracks {{ $t('views.admin.library.LibraryDetail.tracksLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -398,7 +398,7 @@ const updateObj = async (attr: string) => {
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('library_id', object.id) }}"> <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('library_id', object.id) }}">
Uploads {{ $t('views.admin.library.LibraryDetail.uploadsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>

View File

@ -77,7 +77,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
:to="{name: 'library.tags.detail', params: {id: object.name }}" :to="{name: 'library.tags.detail', params: {id: object.name }}"
> >
<i class="info icon" /> <i class="info icon" />
Open local profile&nbsp; {{ $t('views.admin.library.TagDetail.localProfileLink') }}
</router-link> </router-link>
<button <button
v-dropdown v-dropdown
@ -93,7 +93,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="wrench icon" /> <i class="wrench icon" />
View in Django's admin&nbsp; {{ $t('views.admin.library.TagDetail.djangoLink') }}
</a> </a>
</div> </div>
</button> </button>
@ -103,22 +103,22 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
:class="['ui', {loading: isLoading}, 'basic danger button']" :class="['ui', {loading: isLoading}, 'basic danger button']"
:action="remove" :action="remove"
> >
Delete {{ $t('views.admin.library.TagDetail.deleteButton') }}
<template #modal-header> <template #modal-header>
<p> <p>
Delete this tag? {{ $t('views.admin.library.TagDetail.deleteModalHeader') }}
</p> </p>
</template> </template>
<template #modal-content> <template #modal-content>
<div> <div>
<p> <p>
The tag will be removed and unlinked from any existing entity. This action is irreversible. {{ $t('views.admin.library.TagDetail.deleteModalMessage') }}
</p> </p>
</div> </div>
</template> </template>
<template #modal-confirm> <template #modal-confirm>
<p> <p>
Delete {{ $t('views.admin.library.TagDetail.deleteButton') }}
</p> </p>
</template> </template>
</dangerous-button> </dangerous-button>
@ -135,14 +135,14 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="info icon" /> <i class="info icon" />
<div class="content"> <div class="content">
Tag data {{ $t('views.admin.library.TagDetail.tagDataHeader') }}
</div> </div>
</h3> </h3>
<table class="ui very basic table"> <table class="ui very basic table">
<tbody> <tbody>
<tr> <tr>
<td> <td>
Name {{ $t('views.admin.library.TagDetail.nameLabel') }}
</td> </td>
<td> <td>
{{ object.name }} {{ object.name }}
@ -157,14 +157,14 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="feed icon" /> <i class="feed icon" />
<div class="content"> <div class="content">
Activity&nbsp; {{ $t('views.admin.library.TagDetail.activityHeader') }}
</div> </div>
</h3> </h3>
<table class="ui very basic table"> <table class="ui very basic table">
<tbody> <tbody>
<tr> <tr>
<td> <td>
First seen {{ $t('views.admin.library.TagDetail.firstSeenLabel') }}
</td> </td>
<td> <td>
<human-date :date="object.creation_date" /> <human-date :date="object.creation_date" />
@ -179,7 +179,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="music icon" /> <i class="music icon" />
<div class="content"> <div class="content">
Audio content&nbsp; {{ $t('views.admin.library.TagDetail.audioContentHeader') }}
</div> </div>
</h3> </h3>
<table class="ui very basic table"> <table class="ui very basic table">
@ -187,7 +187,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.artists', query: {q: getQuery('tag', object.name) }}"> <router-link :to="{name: 'manage.library.artists', query: {q: getQuery('tag', object.name) }}">
Artists {{ $t('views.admin.library.TagDetail.artistsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -197,7 +197,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.albums', query: {q: getQuery('tag', object.name) }}"> <router-link :to="{name: 'manage.library.albums', query: {q: getQuery('tag', object.name) }}">
Albums {{ $t('views.admin.library.TagDetail.albumsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -207,7 +207,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('tag', object.name) }}"> <router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('tag', object.name) }}">
Tracks {{ $t('views.admin.library.TagDetail.tracksLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>

View File

@ -19,7 +19,7 @@ const props = defineProps<Props>()
const { t } = useI18n() const { t } = useI18n()
const labels = computed(() => ({ const labels = computed(() => ({
statsWarning: t('Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object') statsWarning: t('views.admin.library.TrackDetail.statsWarning')
})) }))
const track = ref() const track = ref()
@ -105,7 +105,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<template v-if="track.is_local"> <template v-if="track.is_local">
<span class="ui tiny accent label"> <span class="ui tiny accent label">
<i class="home icon" /> <i class="home icon" />
Local {{ $t('views.admin.library.TrackDetail.localLabel') }}
</span> </span>
&nbsp; &nbsp;
</template> </template>
@ -129,7 +129,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
:to="{name: 'library.tracks.detail', params: {id: track.id }}" :to="{name: 'library.tracks.detail', params: {id: track.id }}"
> >
<i class="info icon" /> <i class="info icon" />
Open local profile&nbsp; {{ $t('views.admin.library.TrackDetail.localProfileLink') }}
</router-link> </router-link>
<button <button
v-dropdown v-dropdown
@ -145,7 +145,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="wrench icon" /> <i class="wrench icon" />
View in Django's admin&nbsp; {{ $t('views.admin.library.TrackDetail.djangoLink') }}
</a> </a>
<a <a
v-if="track.mbid" v-if="track.mbid"
@ -155,7 +155,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="external icon" /> <i class="external icon" />
Open on MusicBrainz&nbsp; {{ $t('views.admin.library.TrackDetail.musicbrainzLink') }}
</a> </a>
<fetch-button <fetch-button
v-if="!track.is_local" v-if="!track.is_local"
@ -164,7 +164,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
@refresh="fetchData" @refresh="fetchData"
> >
<i class="refresh icon" />&nbsp; <i class="refresh icon" />&nbsp;
Refresh from remote server&nbsp; {{ $t('views.admin.library.TrackDetail.remoteRefreshButton') }}
</fetch-button> </fetch-button>
<a <a
class="basic item" class="basic item"
@ -173,7 +173,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="external icon" /> <i class="external icon" />
Open remote profile&nbsp; {{ $t('views.admin.library.TrackDetail.remoteProfileLink') }}
</a> </a>
</div> </div>
</button> </button>
@ -185,7 +185,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
class="ui labeled icon button" class="ui labeled icon button"
> >
<i class="edit icon" /> <i class="edit icon" />
Edit {{ $t('views.admin.library.TrackDetail.editButton') }}
</router-link> </router-link>
</div> </div>
<div class="ui buttons"> <div class="ui buttons">
@ -193,22 +193,22 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
:class="['ui', {loading: isLoading}, 'basic danger button']" :class="['ui', {loading: isLoading}, 'basic danger button']"
:action="remove" :action="remove"
> >
Delete {{ $t('views.admin.library.TrackDetail.deleteButton') }}
<template #modal-header> <template #modal-header>
<p> <p>
Delete this track? {{ $t('views.admin.library.TrackDetail.deleteModalHeader') }}
</p> </p>
</template> </template>
<template #modal-content> <template #modal-content>
<div> <div>
<p> <p>
The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible. {{ $t('views.admin.library.TrackDetail.deleteModalMessage') }}
</p> </p>
</div> </div>
</template> </template>
<template #modal-confirm> <template #modal-confirm>
<p> <p>
Delete {{ $t('views.admin.library.TrackDetail.deleteButton') }}
</p> </p>
</template> </template>
</dangerous-button> </dangerous-button>
@ -225,14 +225,14 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="info icon" /> <i class="info icon" />
<div class="content"> <div class="content">
Track data {{ $t('views.admin.library.TrackDetail.trackDataHeader') }}
</div> </div>
</h3> </h3>
<table class="ui very basic table"> <table class="ui very basic table">
<tbody> <tbody>
<tr> <tr>
<td> <td>
Title {{ $t('views.admin.library.TrackDetail.titleLabel') }}
</td> </td>
<td> <td>
{{ track.title }} {{ track.title }}
@ -241,7 +241,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr v-if="track.album"> <tr v-if="track.album">
<td> <td>
<router-link :to="{name: 'manage.library.albums.detail', params: {id: track.album.id }}"> <router-link :to="{name: 'manage.library.albums.detail', params: {id: track.album.id }}">
Album {{ $t('views.admin.library.TrackDetail.albumLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -252,7 +252,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.artists.detail', params: {id: track.artist.id }}"> <router-link :to="{name: 'manage.library.artists.detail', params: {id: track.artist.id }}">
Artist {{ $t('views.admin.library.TrackDetail.artistLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -262,7 +262,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr v-if="track.album"> <tr v-if="track.album">
<td> <td>
<router-link :to="{name: 'manage.library.artists.detail', params: {id: track.album.artist.id }}"> <router-link :to="{name: 'manage.library.artists.detail', params: {id: track.album.artist.id }}">
Album artist {{ $t('views.admin.library.TrackDetail.albumArtistLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -271,7 +271,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Position {{ $t('views.admin.library.TrackDetail.positionLabel') }}
</td> </td>
<td> <td>
{{ track.position }} {{ track.position }}
@ -279,7 +279,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr v-if="track.disc_number"> <tr v-if="track.disc_number">
<td> <td>
Disc number {{ $t('views.admin.library.TrackDetail.discNumberLabel') }}
</td> </td>
<td> <td>
{{ track.disc_number }} {{ track.disc_number }}
@ -287,13 +287,13 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr v-if="track.copyright"> <tr v-if="track.copyright">
<td> <td>
Copyright {{ $t('views.admin.library.TrackDetail.copyrightLabel') }}
</td> </td>
<td>{{ track.copyright }}</td> <td>{{ track.copyright }}</td>
</tr> </tr>
<tr v-if="track.license"> <tr v-if="track.license">
<td> <td>
License {{ $t('views.admin.library.TrackDetail.licenseLabel') }}
</td> </td>
<td> <td>
<router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('license', track.license)}}"> <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"> <tr v-if="!track.is_local">
<td> <td>
<router-link :to="{name: 'manage.moderation.domains.detail', params: {id: track.domain }}"> <router-link :to="{name: 'manage.moderation.domains.detail', params: {id: track.domain }}">
Domain {{ $t('views.admin.library.TrackDetail.domainLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -313,7 +313,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr v-if="track.description"> <tr v-if="track.description">
<td> <td>
Description {{ $t('views.admin.library.TrackDetail.descriptionLabel') }}
</td> </td>
<sanitized-html <sanitized-html
tag="td" tag="td"
@ -329,7 +329,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="feed icon" /> <i class="feed icon" />
<div class="content"> <div class="content">
Activity&nbsp; {{ $t('views.admin.library.TrackDetail.activityHeader') }}
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span> <span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
</div> </div>
</h3> </h3>
@ -349,7 +349,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tbody> <tbody>
<tr> <tr>
<td> <td>
First seen {{ $t('views.admin.library.TrackDetail.firstSeenLabel') }}
</td> </td>
<td> <td>
<human-date :date="track.creation_date" /> <human-date :date="track.creation_date" />
@ -357,7 +357,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Listenings {{ $t('views.admin.library.TrackDetail.listeningsLabel') }}
</td> </td>
<td> <td>
{{ stats.listenings }} {{ stats.listenings }}
@ -365,7 +365,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Favorited tracks {{ $t('views.admin.library.TrackDetail.favoritedLabel') }}
</td> </td>
<td> <td>
{{ stats.track_favorites }} {{ stats.track_favorites }}
@ -373,7 +373,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Playlists {{ $t('views.admin.library.TrackDetail.playlistsLabel') }}
</td> </td>
<td> <td>
{{ stats.playlists }} {{ stats.playlists }}
@ -382,7 +382,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `track:${track.id}`) }}"> <router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `track:${track.id}`) }}">
Linked reports {{ $t('views.admin.library.TrackDetail.linkedReportsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -392,7 +392,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.edits', query: {q: getQuery('target', 'track ' + track.id)}}"> <router-link :to="{name: 'manage.library.edits', query: {q: getQuery('target', 'track ' + track.id)}}">
Edits {{ $t('views.admin.library.TrackDetail.editsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -408,7 +408,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<h3 class="ui header"> <h3 class="ui header">
<i class="music icon" /> <i class="music icon" />
<div class="content"> <div class="content">
Audio content&nbsp; {{ $t('views.admin.library.TrackDetail.trackDataHeader') }}
<span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span> <span :data-tooltip="labels.statsWarning"><i class="question circle icon" /></span>
</div> </div>
</h3> </h3>
@ -428,7 +428,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tbody> <tbody>
<tr> <tr>
<td> <td>
Cached size {{ $t('views.admin.library.TrackDetail.cachedSizeLabel') }}
</td> </td>
<td> <td>
{{ humanSize(stats.media_downloaded_size) }} {{ humanSize(stats.media_downloaded_size) }}
@ -436,7 +436,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
</tr> </tr>
<tr> <tr>
<td> <td>
Total size {{ $t('views.admin.library.TrackDetail.totalSizeLabel') }}
</td> </td>
<td> <td>
{{ humanSize(stats.media_total_size) }} {{ humanSize(stats.media_total_size) }}
@ -446,7 +446,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('track_id', track.id) }}"> <router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('track_id', track.id) }}">
Libraries {{ $t('views.admin.library.TrackDetail.librariesLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -456,7 +456,7 @@ const getQuery = (field: string, value: string) => `${field}:"${value}"`
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('track_id', track.id) }}"> <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('track_id', track.id) }}">
Uploads {{ $t('views.admin.library.TrackDetail.uploadsLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>

View File

@ -89,7 +89,7 @@ const showUploadDetailModal = ref(false)
<template v-if="object.is_local"> <template v-if="object.is_local">
<span class="ui tiny accent label"> <span class="ui tiny accent label">
<i class="home icon" /> <i class="home icon" />
Local {{ $t('views.admin.library.UploadDetail.localLabel') }}
</span> </span>
&nbsp; &nbsp;
</template> </template>
@ -106,7 +106,7 @@ const showUploadDetailModal = ref(false)
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="wrench icon" /> <i class="wrench icon" />
View in Django's admin&nbsp; {{ $t('views.admin.library.UploadDetail.djangoLink') }}
</a> </a>
<button <button
v-dropdown v-dropdown
@ -122,7 +122,7 @@ const showUploadDetailModal = ref(false)
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="wrench icon" /> <i class="wrench icon" />
View in Django's admin&nbsp; {{ $t('views.admin.library.UploadDetail.djangoLink') }}
</a> </a>
<a <a
class="basic item" class="basic item"
@ -131,7 +131,7 @@ const showUploadDetailModal = ref(false)
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="external icon" /> <i class="external icon" />
Open remote profile&nbsp; {{ $t('views.admin.library.UploadDetail.remoteProfileLink') }}
</a> </a>
</div> </div>
</button> </button>
@ -145,7 +145,7 @@ const showUploadDetailModal = ref(false)
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<i class="download icon" /> <i class="download icon" />
Download {{ $t('views.admin.library.UploadDetail.downloadButton') }}
</a> </a>
</div> </div>
<div class="ui buttons"> <div class="ui buttons">
@ -153,22 +153,22 @@ const showUploadDetailModal = ref(false)
:class="['ui', {loading: isLoading}, 'basic danger button']" :class="['ui', {loading: isLoading}, 'basic danger button']"
:action="remove" :action="remove"
> >
Delete {{ $t('views.admin.library.UploadDetail.deleteButton') }}
<template #modal-header> <template #modal-header>
<p> <p>
Delete this upload? {{ $t('views.admin.library.UploadDetail.deleteModalHeader') }}
</p> </p>
</template> </template>
<template #modal-content> <template #modal-content>
<div> <div>
<p> <p>
The upload will be removed. This action is irreversible. {{ $t('views.admin.library.UploadDetail.deleteModalMessage') }}
</p> </p>
</div> </div>
</template> </template>
<template #modal-confirm> <template #modal-confirm>
<p> <p>
Delete {{ $t('views.admin.library.UploadDetail.deleteButton') }}
</p> </p>
</template> </template>
</dangerous-button> </dangerous-button>
@ -185,14 +185,14 @@ const showUploadDetailModal = ref(false)
<h3 class="ui header"> <h3 class="ui header">
<i class="info icon" /> <i class="info icon" />
<div class="content"> <div class="content">
Upload data {{ $t('views.admin.library.UploadDetail.uploadDataHeader') }}
</div> </div>
</h3> </h3>
<table class="ui very basic table"> <table class="ui very basic table">
<tbody> <tbody>
<tr> <tr>
<td> <td>
Name {{ $t('views.admin.library.UploadDetail.nameLabel') }}
</td> </td>
<td> <td>
{{ displayName(object) }} {{ displayName(object) }}
@ -201,7 +201,7 @@ const showUploadDetailModal = ref(false)
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('privacy_level', object.library.privacy_level) }}"> <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('privacy_level', object.library.privacy_level) }}">
Visibility {{ $t('views.admin.library.UploadDetail.visibilityLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -211,7 +211,7 @@ const showUploadDetailModal = ref(false)
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.moderation.accounts.detail', params: {id: object.library.actor.full_username }}"> <router-link :to="{name: 'manage.moderation.accounts.detail', params: {id: object.library.actor.full_username }}">
Account {{ $t('views.admin.library.UploadDetail.accountLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -221,7 +221,7 @@ const showUploadDetailModal = ref(false)
<tr v-if="!object.is_local"> <tr v-if="!object.is_local">
<td> <td>
<router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}"> <router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}">
Domain {{ $t('views.admin.library.UploadDetail.domainLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -231,7 +231,7 @@ const showUploadDetailModal = ref(false)
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('status', object.import_status) }}"> <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('status', object.import_status) }}">
Import status {{ $t('views.admin.library.UploadDetail.importStatusLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -248,7 +248,7 @@ const showUploadDetailModal = ref(false)
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.libraries.detail', params: {id: object.library.uuid }}"> <router-link :to="{name: 'manage.library.libraries.detail', params: {id: object.library.uuid }}">
Library {{ $t('views.admin.library.UploadDetail.libraryLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -264,14 +264,14 @@ const showUploadDetailModal = ref(false)
<h3 class="ui header"> <h3 class="ui header">
<i class="feed icon" /> <i class="feed icon" />
<div class="content"> <div class="content">
Activity&nbsp; {{ $t('views.admin.library.UploadDetail.activityHeader') }}
</div> </div>
</h3> </h3>
<table class="ui very basic table"> <table class="ui very basic table">
<tbody> <tbody>
<tr> <tr>
<td> <td>
First seen {{ $t('views.admin.library.UploadDetail.firstSeenLabel') }}
</td> </td>
<td> <td>
<human-date :date="object.creation_date" /> <human-date :date="object.creation_date" />
@ -279,7 +279,7 @@ const showUploadDetailModal = ref(false)
</tr> </tr>
<tr> <tr>
<td> <td>
Accessed date {{ $t('views.admin.library.UploadDetail.accessedDateLabel') }}
</td> </td>
<td> <td>
<human-date <human-date
@ -289,7 +289,7 @@ const showUploadDetailModal = ref(false)
<translate <translate
v-else v-else
> >
N/A {{ $t('views.admin.library.UploadDetail.notApplicable') }}
</translate> </translate>
</td> </td>
</tr> </tr>
@ -302,7 +302,7 @@ const showUploadDetailModal = ref(false)
<h3 class="ui header"> <h3 class="ui header">
<i class="music icon" /> <i class="music icon" />
<div class="content"> <div class="content">
Audio content&nbsp; {{ $t('views.admin.library.UploadDetail.audioContentHeader') }}
</div> </div>
</h3> </h3>
<table class="ui very basic table"> <table class="ui very basic table">
@ -310,7 +310,7 @@ const showUploadDetailModal = ref(false)
<tr v-if="object.track"> <tr v-if="object.track">
<td> <td>
<router-link :to="{name: 'manage.library.tracks.detail', params: {id: object.track.id }}"> <router-link :to="{name: 'manage.library.tracks.detail', params: {id: object.track.id }}">
Track {{ $t('views.admin.library.UploadDetail.trackLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -319,7 +319,7 @@ const showUploadDetailModal = ref(false)
</tr> </tr>
<tr> <tr>
<td> <td>
Cached size {{ $t('views.admin.library.UploadDetail.cachedSizeLabel') }}
</td> </td>
<td> <td>
<template v-if="object.audio_file"> <template v-if="object.audio_file">
@ -328,13 +328,13 @@ const showUploadDetailModal = ref(false)
<translate <translate
v-else v-else
> >
N/A {{ $t('views.admin.library.UploadDetail.notApplicable') }}
</translate> </translate>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
Size {{ $t('views.admin.library.UploadDetail.sizeLabel') }}
</td> </td>
<td> <td>
{{ humanSize(object.size) }} {{ humanSize(object.size) }}
@ -342,22 +342,22 @@ const showUploadDetailModal = ref(false)
</tr> </tr>
<tr> <tr>
<td> <td>
Bitrate {{ $t('views.admin.library.UploadDetail.bitrateLabel') }}
</td> </td>
<td> <td>
<template v-if="object.bitrate"> <template v-if="object.bitrate">
{{ humanSize(object.bitrate) }}/s {{ $t('views.admin.library.UploadDetail.bitrateValue', {bitrate: humanSize(object.bitrate)}) }}
</template> </template>
<translate <translate
v-else v-else
> >
N/A {{ $t('views.admin.library.UploadDetail.notApplicable') }}
</translate> </translate>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
Duration {{ $t('views.admin.library.UploadDetail.durationLabel') }}
</td> </td>
<td> <td>
<template v-if="object.duration"> <template v-if="object.duration">
@ -366,14 +366,14 @@ const showUploadDetailModal = ref(false)
<translate <translate
v-else v-else
> >
N/A {{ $t('views.admin.library.UploadDetail.notApplicable') }}
</translate> </translate>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('type', object.mimetype) }}"> <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('type', object.mimetype) }}">
Type {{ $t('views.admin.library.UploadDetail.typeLabel') }}
</router-link> </router-link>
</td> </td>
<td> <td>
@ -383,7 +383,7 @@ const showUploadDetailModal = ref(false)
<translate <translate
v-else v-else
> >
N/A {{ $t('views.admin.library.UploadDetail.notApplicable') }}
</translate> </translate>
</td> </td>
</tr> </tr>