Merge branch '662' into 'develop'

#662: last tasks on translation context

Closes #662

See merge request funkwhale/funkwhale!659
This commit is contained in:
Eliot Berriot 2019-03-18 10:07:58 +01:00
commit 1486d6301e
84 changed files with 339 additions and 338 deletions

View File

@ -6,7 +6,7 @@
<translate translate-context="Content/About/Title/Short, Noun" v-if="instance.name.value" :translate-params="{instance: instance.name.value}"> <translate translate-context="Content/About/Title/Short, Noun" v-if="instance.name.value" :translate-params="{instance: instance.name.value}">
About %{ instance } About %{ instance }
</translate> </translate>
<translate translate-context="Content/About/Title/Short, Noun" v-else>About this instance</translate> <translate translate-context="Content/About/Title" v-else>About this instance</translate>
</h1> </h1>
<stats></stats> <stats></stats>
</div> </div>
@ -64,7 +64,7 @@ export default {
}), }),
labels() { labels() {
return { return {
title: this.$pgettext('Head/About/Title', "About this instance") title: this.$pgettext('Content/About/Title', "About this instance")
} }
} }
} }

View File

@ -27,15 +27,15 @@
</div> </div>
</section> </section>
<section class="four wide column"> <section class="four wide column">
<h4 v-translate class="ui header">Using Funkwhale</h4> <h4 v-translate class="ui header" translate-context="Footer/*/Title">Using Funkwhale</h4>
<div class="ui link list"> <div class="ui link list">
<a href="https://docs.funkwhale.audio" class="item" target="_blank"><translate translate-context="Footer/*/List item.Link/Short, Noun">Documentation</translate></a> <a href="https://docs.funkwhale.audio" class="item" target="_blank"><translate translate-context="Footer/*/List item.Link/Short, Noun">Documentation</translate></a>
<a href="https://docs.funkwhale.audio/users/apps.html" class="item" target="_blank"><translate translate-context="Footer/*/List item.Link">Mobile and desktop apps</translate></a> <a href="https://docs.funkwhale.audio/users/apps.html" class="item" target="_blank"><translate translate-context="Footer/*/List item.Link">Mobile and desktop apps</translate></a>
<div role="button" class="item" @click="$emit('show:shortcuts-modal')"><translate translate-context="Footer/*/List item.Link/Short, Noun">Keyboard shortcuts</translate></div> <div role="button" class="item" @click="$emit('show:shortcuts-modal')"><translate translate-context="*/*/*/Noun">Keyboard shortcuts</translate></div>
</div> </div>
</section> </section>
<section class="four wide column"> <section class="four wide column">
<h4 v-translate class="ui header">Getting help</h4> <h4 v-translate translate-context="Footer/*/Link" class="ui header">Getting help</h4>
<div class="ui link list"> <div class="ui link list">
<a href="https://socialhub.network/c/funkwhale" class="item" target="_blank"><translate translate-context="Footer/*/Listitem.Link">Support forum</translate></a> <a href="https://socialhub.network/c/funkwhale" class="item" target="_blank"><translate translate-context="Footer/*/Listitem.Link">Support forum</translate></a>
<a href="https://riot.im/app/#/room/#funkwhale-troubleshooting:matrix.org" class="item" target="_blank"><translate translate-context="Footer/*/List item.Link">Chat room</translate></a> <a href="https://riot.im/app/#/room/#funkwhale-troubleshooting:matrix.org" class="item" target="_blank"><translate translate-context="Footer/*/List item.Link">Chat room</translate></a>
@ -43,7 +43,7 @@
</div> </div>
</section> </section>
<section class="four wide column"> <section class="four wide column">
<h4 v-translate class="ui header">About Funkwhale</h4> <h4 v-translate class="ui header" translate-context="Footer/*/Title/Short">About Funkwhale</h4>
<div class="ui link list"> <div class="ui link list">
<a href="https://funkwhale.audio" class="item" target="_blank"><translate translate-context="Footer/*/List item.Link">Official website</translate></a> <a href="https://funkwhale.audio" class="item" target="_blank"><translate translate-context="Footer/*/List item.Link">Official website</translate></a>
<a href="https://contribute.funkwhale.audio" class="item" target="_blank"><translate translate-context="Footer/*/List item.Link">Contribute</translate></a> <a href="https://contribute.funkwhale.audio" class="item" target="_blank"><translate translate-context="Footer/*/List item.Link">Contribute</translate></a>

View File

@ -76,7 +76,8 @@
<i class="tag icon"></i> <i class="tag icon"></i>
<div <div
class="content" class="content"
v-translate="{url: musicbrainzUrl}"> v-translate="{url: musicbrainzUrl}"
translate-context="Content/Home/List item/Verb">
Get quality metadata about your music thanks to <a href="%{ url }" target="_blank">MusicBrainz</a> Get quality metadata about your music thanks to <a href="%{ url }" target="_blank">MusicBrainz</a>
</div> </div>
</div> </div>

View File

@ -1,7 +1,7 @@
<template> <template>
<modal @update:show="$emit('update:show', $event)" :show="show"> <modal @update:show="$emit('update:show', $event)" :show="show">
<header class="header"> <header class="header">
<translate translate-context="Popup/Keyboard shortcuts/Title">Keyboard shortcuts</translate> <translate translate-context="*/*/*/Noun">Keyboard shortcuts</translate>
</header> </header>
<section class="scrolling content"> <section class="scrolling content">
<table <table

View File

@ -16,7 +16,7 @@
<div class="menu-area"> <div class="menu-area">
<div class="ui compact fluid two item inverted menu"> <div class="ui compact fluid two item inverted menu">
<a :class="[{active: selectedTab === 'library'}, 'item']" role="button" @click.prevent.stop="selectedTab = 'library'" data-tab="library"><translate translate-context="Sidebar/Library/Tab.Title/Verb">Browse</translate></a> <a :class="[{active: selectedTab === 'library'}, 'item']" role="button" @click.prevent.stop="selectedTab = 'library'" data-tab="library"><translate translate-context="*/Library/*/Verb">Browse</translate></a>
<a :class="[{active: selectedTab === 'queue'}, 'item']" role="button" @click.prevent.stop="selectedTab = 'queue'" data-tab="queue"> <a :class="[{active: selectedTab === 'queue'}, 'item']" role="button" @click.prevent.stop="selectedTab = 'queue'" data-tab="queue">
<translate translate-context="Sidebar/Queue/Tab.Title/Noun">Queue</translate>&nbsp; <translate translate-context="Sidebar/Queue/Tab.Title/Noun">Queue</translate>&nbsp;
<template v-if="queue.tracks.length === 0"> <template v-if="queue.tracks.length === 0">
@ -41,10 +41,10 @@
</translate> </translate>
<img class="ui right floated circular tiny avatar image" v-if="$store.state.auth.profile.avatar.square_crop" v-lazy="$store.getters['instance/absoluteUrl']($store.state.auth.profile.avatar.square_crop)" /> <img class="ui right floated circular tiny avatar image" v-if="$store.state.auth.profile.avatar.square_crop" v-lazy="$store.getters['instance/absoluteUrl']($store.state.auth.profile.avatar.square_crop)" />
</router-link> </router-link>
<router-link class="item" v-if="$store.state.auth.authenticated" :to="{path: '/settings'}"><i class="setting icon"></i><translate translate-context="Sidebar/Settings/List item.Link/Noun">Settings</translate></router-link> <router-link class="item" v-if="$store.state.auth.authenticated" :to="{path: '/settings'}"><i class="setting icon"></i><translate translate-context="*/*/*/Noun">Settings</translate></router-link>
<router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'notifications'}"> <router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'notifications'}">
<i class="feed icon"></i> <i class="feed icon"></i>
<translate translate-context="Sidebar/Notifications/List item.Link/Noun">Notifications</translate> <translate translate-context="*/Notifications/*">Notifications</translate>
<div <div
v-if="$store.state.ui.notifications.inbox > 0" v-if="$store.state.ui.notifications.inbox > 0"
:class="['ui', 'teal', 'label']"> :class="['ui', 'teal', 'label']">
@ -52,16 +52,16 @@
</router-link> </router-link>
<router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'logout'}"><i class="sign out icon"></i><translate translate-context="Sidebar/Login/List item.Link/Verb">Logout</translate></router-link> <router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'logout'}"><i class="sign out icon"></i><translate translate-context="Sidebar/Login/List item.Link/Verb">Logout</translate></router-link>
<template v-else> <template v-else>
<router-link class="item" :to="{name: 'login'}"><i class="sign in icon"></i><translate translate-context="Sidebar/Login/List item.Link/Verb">Login</translate></router-link> <router-link class="item" :to="{name: 'login'}"><i class="sign in icon"></i><translate translate-context="*/Login/*/Verb">Login</translate></router-link>
<router-link class="item" :to="{path: '/signup'}"> <router-link class="item" :to="{path: '/signup'}">
<i class="corner add icon"></i> <i class="corner add icon"></i>
<translate translate-context="Sidebar/Login/List item.Link/Verb">Create an account</translate> <translate translate-context="*/Signup/Link/Verb">Create an account</translate>
</router-link> </router-link>
</template> </template>
</div> </div>
</div> </div>
<div class="item"> <div class="item">
<header class="header"><translate translate-context="Sidebar/Library/Title">Music</translate></header> <header class="header"><translate translate-context="*/*/*/Noun">Music</translate></header>
<div class="menu"> <div class="menu">
<router-link class="item" :to="{path: '/library'}"><i class="sound icon"></i><translate translate-context="Sidebar/Library/List item.Link/Verb">Browse library</translate></router-link> <router-link class="item" :to="{path: '/library'}"><i class="sound icon"></i><translate translate-context="Sidebar/Library/List item.Link/Verb">Browse library</translate></router-link>
<router-link class="item" v-if="$store.state.auth.authenticated" :to="{path: '/favorites'}"><i class="heart icon"></i><translate translate-context="Sidebar/Favorites/List item.Link/Noun">Favorites</translate></router-link> <router-link class="item" v-if="$store.state.auth.authenticated" :to="{path: '/favorites'}"><i class="heart icon"></i><translate translate-context="Sidebar/Favorites/List item.Link/Noun">Favorites</translate></router-link>
@ -69,11 +69,11 @@
@click="$store.commit('playlists/chooseTrack', null)" @click="$store.commit('playlists/chooseTrack', null)"
v-if="$store.state.auth.authenticated" v-if="$store.state.auth.authenticated"
class="item"> class="item">
<i class="list icon"></i><translate translate-context="Sidebar/Playlist/List item.Link/Noun">Playlists</translate> <i class="list icon"></i><translate translate-context="*/*/*">Playlists</translate>
</a> </a>
<router-link <router-link
v-if="$store.state.auth.authenticated" v-if="$store.state.auth.authenticated"
class="item" :to="{name: 'content.index'}"><i class="upload icon"></i><translate translate-context="Sidebar/Library/List item.Link/Verb">Add content</translate></router-link> class="item" :to="{name: 'content.index'}"><i class="upload icon"></i><translate translate-context="*/Library/*/Verb">Add content</translate></router-link>
</div> </div>
</div> </div>
<div class="item" v-if="$store.state.auth.availablePermissions['settings'] || $store.state.auth.availablePermissions['moderation']"> <div class="item" v-if="$store.state.auth.availablePermissions['settings'] || $store.state.auth.availablePermissions['moderation']">
@ -83,25 +83,25 @@
v-if="$store.state.auth.availablePermissions['settings']" v-if="$store.state.auth.availablePermissions['settings']"
class="item" class="item"
:to="{path: '/manage/settings'}"> :to="{path: '/manage/settings'}">
<i class="settings icon"></i><translate translate-context="Sidebar/Admin/List item.Link/Noun">Settings</translate> <i class="settings icon"></i><translate translate-context="*/*/*/Noun">Settings</translate>
</router-link> </router-link>
<router-link <router-link
v-if="$store.state.auth.availablePermissions['settings']" v-if="$store.state.auth.availablePermissions['settings']"
class="item" class="item"
:to="{name: 'manage.users.users.list'}"> :to="{name: 'manage.users.users.list'}">
<i class="users icon"></i><translate translate-context="Sidebar/Admin/List item.Link/Noun">Users</translate> <i class="users icon"></i><translate translate-context="*/*/*/Noun">Users</translate>
</router-link> </router-link>
<router-link <router-link
v-if="$store.state.auth.availablePermissions['moderation']" v-if="$store.state.auth.availablePermissions['moderation']"
class="item" class="item"
:to="{name: 'manage.moderation.domains.list'}"> :to="{name: 'manage.moderation.domains.list'}">
<i class="shield icon"></i><translate translate-context="Sidebar/Moderation/List item.Link/Noun">Moderation</translate> <i class="shield icon"></i><translate translate-context="*/Moderation/*">Moderation</translate>
</router-link> </router-link>
<router-link <router-link
v-if="$store.state.auth.availablePermissions['library']" v-if="$store.state.auth.availablePermissions['library']"
class="item" class="item"
:to="{name: 'manage.library.edits', query: {q: 'is_approved:null'}}"> :to="{name: 'manage.library.edits', query: {q: 'is_approved:null'}}">
<i class="book icon"></i><translate translate-context="Sidebar/Moderation/List item.Link/Noun">Library</translate> <i class="book icon"></i><translate translate-context="*/*/*">Library</translate>
<div <div
v-if="$store.state.ui.notifications.pendingReviewEdits > 0" v-if="$store.state.ui.notifications.pendingReviewEdits > 0"
:title="labels.pendingReviewEdits" :title="labels.pendingReviewEdits"
@ -119,7 +119,7 @@
<translate translate-context="Sidebar/Queue/Message">Do you want to restore your previous queue?</translate> <translate translate-context="Sidebar/Queue/Message">Do you want to restore your previous queue?</translate>
</div> </div>
<p> <p>
<translate translate-context="Sidebar/Queue/Message" <translate translate-context="*/*/*"
translate-plural="%{ count } tracks" translate-plural="%{ count } tracks"
:translate-n="queue.previousQueue.tracks.length" :translate-n="queue.previousQueue.tracks.length"
:translate-params="{count: queue.previousQueue.tracks.length}"> :translate-params="{count: queue.previousQueue.tracks.length}">
@ -170,7 +170,7 @@
<i class="feed icon"></i> <translate translate-context="Sidebar/Player/Title">You have a radio playing</translate> <i class="feed icon"></i> <translate translate-context="Sidebar/Player/Title">You have a radio playing</translate>
</div> </div>
<p><translate translate-context="Sidebar/Player/Paragraph">New tracks will be appended here automatically.</translate></p> <p><translate translate-context="Sidebar/Player/Paragraph">New tracks will be appended here automatically.</translate></p>
<div @click="$store.dispatch('radios/stop')" class="ui basic inverted red button"><translate translate-context="Sidebar/Player/Button.Label/Verb">Stop radio</translate></div> <div @click="$store.dispatch('radios/stop')" class="ui basic inverted red button"><translate translate-context="*/Player/Button.Label/Short, Verb">Stop radio</translate></div>
</div> </div>
</div> </div>
</section> </section>

View File

@ -65,7 +65,7 @@
<button <button
type="submit" type="submit"
:class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']"> :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']">
<translate translate-context="Content/Settings/Button.Label/Short, Verb">Save</translate> <translate translate-context="Content/*/Button.Label/Verb">Save</translate>
</button> </button>
</form> </form>
</template> </template>

View File

@ -17,7 +17,7 @@
</template> </template>
</div> </div>
<div class="field"> <div class="field">
<button @click="copy" class="ui right teal labeled icon floated button"><i class="copy icon"></i><translate translate-context="Popup/*/Button.Label/Verb">Copy</translate></button> <button @click="copy" class="ui right teal labeled icon floated button"><i class="copy icon"></i><translate translate-context="*/*/Button.Label/Short, Verb">Copy</translate></button>
<label for="embed-width"><translate translate-context="Popup/Embed/Input.Label/Noun">Embed code</translate></label> <label for="embed-width"><translate translate-context="Popup/Embed/Input.Label/Noun">Embed code</translate></label>
<p><translate translate-context="Popup/Embed/Paragraph">Copy/paste this code in your website HTML</translate></p> <p><translate translate-context="Popup/Embed/Paragraph">Copy/paste this code in your website HTML</translate></p>
<textarea ref="textarea":value="embedCode" rows="5" readonly> <textarea ref="textarea":value="embedCode" rows="5" readonly>

View File

@ -7,7 +7,7 @@
:disabled="!playable" :disabled="!playable"
:class="buttonClasses.concat(['ui', {loading: isLoading}, {'mini': discrete}, {disabled: !playable}])"> :class="buttonClasses.concat(['ui', {loading: isLoading}, {'mini': discrete}, {disabled: !playable}])">
<i :class="[playIconClass, 'icon']"></i> <i :class="[playIconClass, 'icon']"></i>
<template v-if="!discrete && !iconOnly"><slot><translate translate-context="*/Queue/Button/Label/Short, Verb">Play</translate></slot></template> <template v-if="!discrete && !iconOnly"><slot><translate translate-context="*/Queue/Button.Label/Short, Verb">Play</translate></slot></template>
</button> </button>
<div v-if="!discrete && !iconOnly" :class="['ui', {disabled: !playable && !filterableArtist}, 'floating', 'dropdown', {'icon': !dropdownOnly}, {'button': !dropdownOnly}]"> <div v-if="!discrete && !iconOnly" :class="['ui', {disabled: !playable && !filterableArtist}, 'floating', 'dropdown', {'icon': !dropdownOnly}, {'button': !dropdownOnly}]">
<i :class="dropdownIconClasses.concat(['icon'])" :title="title" ></i> <i :class="dropdownIconClasses.concat(['icon'])" :title="title" ></i>
@ -16,13 +16,12 @@
<i class="plus icon"></i><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Add to queue</translate> <i class="plus icon"></i><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Add to queue</translate>
</button> </button>
<button class="item basic" ref="addNext" data-ref="addNext" :disabled="!playable" @click.stop.prevent="addNext()" :title="labels.playNext"> <button class="item basic" ref="addNext" data-ref="addNext" :disabled="!playable" @click.stop.prevent="addNext()" :title="labels.playNext">
<i class="step forward icon"></i><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Play next</translate> <i class="step forward icon"></i>{{ labels.playNext }}
</button> </button>
<button class="item basic" ref="playNow" data-ref="playNow" :disabled="!playable" @click.stop.prevent="addNext(true)" :title="labels.playNow"> <button class="item basic" ref="playNow" data-ref="playNow" :disabled="!playable" @click.stop.prevent="addNext(true)" :title="labels.playNow">
<i class="play icon"></i><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Play now</translate> <i class="play icon"></i>{{ labels.playNow }}</button>
</button>
<button v-if="track" class="item basic" :disabled="!playable" @click.stop.prevent="$store.dispatch('radios/start', {type: 'similar', objectId: track.id})" :title="labels.startRadio"> <button v-if="track" class="item basic" :disabled="!playable" @click.stop.prevent="$store.dispatch('radios/start', {type: 'similar', objectId: track.id})" :title="labels.startRadio">
<i class="feed icon"></i><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Start radio</translate> <i class="feed icon"></i><translate translate-context="*/Queue/Button.Label/Short, Verb">Start radio</translate>
</button> </button>
<button v-if="filterableArtist" class="item basic" :disabled="!filterableArtist" @click.stop.prevent="filterArtist" :title="labels.hideArtist"> <button v-if="filterableArtist" class="item basic" :disabled="!filterableArtist" @click.stop.prevent="filterArtist" :title="labels.hideArtist">
<i class="eye slash outline icon"></i><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Hide content from this artist</translate> <i class="eye slash outline icon"></i><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Hide content from this artist</translate>

View File

@ -8,7 +8,7 @@
</div> </div>
</div> </div>
<template v-if="query.length > 0"> <template v-if="query.length > 0">
<h3 class="ui title"><translate translate-context="Content/Search/Title">Artists</translate></h3> <h3 class="ui title"><translate translate-context="*/*/*/Noun">Artists</translate></h3>
<div v-if="results.artists.length > 0"> <div v-if="results.artists.length > 0">
<div class="ui cards"> <div class="ui cards">
<artist-card :key="artist.id" v-for="artist in results.artists" :artist="artist" ></artist-card> <artist-card :key="artist.id" v-for="artist in results.artists" :artist="artist" ></artist-card>
@ -17,7 +17,7 @@
<p v-else><translate translate-context="Content/Search/Paragraph">No artist matched your query</translate></p> <p v-else><translate translate-context="Content/Search/Paragraph">No artist matched your query</translate></p>
</template> </template>
<template v-if="query.length > 0"> <template v-if="query.length > 0">
<h3 class="ui title"><translate translate-context="Content/Search/Title">Albums</translate></h3> <h3 class="ui title"><translate translate-context="*/*/*">Albums</translate></h3>
<div v-if="results.albums.length > 0" class="ui stackable three column grid"> <div v-if="results.albums.length > 0" class="ui stackable three column grid">
<div class="column" :key="album.id" v-for="album in results.albums"> <div class="column" :key="album.id" v-for="album in results.albums">
<album-card class="fluid" :album="album" ></album-card> <album-card class="fluid" :album="album" ></album-card>

View File

@ -22,9 +22,9 @@ export default {
} }
}, },
mounted () { mounted () {
let artistLabel = this.$pgettext('Sidebar/Search/Title', 'Artist') let artistLabel = this.$pgettext('*/*/*/Noun', 'Artist')
let albumLabel = this.$pgettext('Sidebar/Search/Title', 'Album') let albumLabel = this.$pgettext('*/*/*', 'Album')
let trackLabel = this.$pgettext('Sidebar/Search/Title', 'Track') let trackLabel = this.$pgettext('*/*/*/Noun', 'Track')
let self = this let self = this
jQuery(this.$el).search({ jQuery(this.$el).search({
type: 'category', type: 'category',

View File

@ -39,18 +39,18 @@
<translate translate-context="Content/Album/Card.Link/Verb" :translate-params="{count: album.tracks.length - initialTracks}" :translate-n="album.tracks.length - initialTracks" translate-plural="Show %{ count } more tracks">Show %{ count } more track</translate> <translate translate-context="Content/Album/Card.Link/Verb" :translate-params="{count: album.tracks.length - initialTracks}" :translate-n="album.tracks.length - initialTracks" translate-plural="Show %{ count } more tracks">Show %{ count } more track</translate>
</em> </em>
<em v-else @click="showAllTracks = false" class="expand"> <em v-else @click="showAllTracks = false" class="expand">
<translate translate-context="Content/Album/Card.Link/Verb">Collapse</translate> <translate translate-context="Content/*/Card.Link/Verb">Collapse</translate>
</em> </em>
</div> </div>
</div> </div>
</div> </div>
<div class="extra content"> <div class="extra content">
<play-button class="mini basic orange right floated" :tracks="album.tracks" :album="album"> <play-button class="mini basic orange right floated" :tracks="album.tracks" :album="album">
<translate translate-context="Content/Queue/Card.Button.Label/Short, Verb">Play all</translate> <translate translate-context="Content/Queue/Button.Label/Short, Verb">Play all</translate>
</play-button> </play-button>
<span> <span>
<i class="music icon"></i> <i class="music icon"></i>
<translate translate-context="Content/Album/Card" :translate-params="{count: album.tracks.length}" :translate-n="album.tracks.length" translate-plural="%{ count } tracks">%{ count } track</translate> <translate translate-context="*/*/*" :translate-params="{count: album.tracks.length}" :translate-n="album.tracks.length" translate-plural="%{ count } tracks">%{ count } track</translate>
</span> </span>
</div> </div>
</div> </div>

View File

@ -31,7 +31,7 @@
<translate translate-context="Content/Artist/Card.Link" :translate-params="{count: artist.albums.length - initialAlbums}" :translate-n="artist.albums.length - initialAlbums" translate-plural="Show %{ count } more albums">Show 1 more album</translate> <translate translate-context="Content/Artist/Card.Link" :translate-params="{count: artist.albums.length - initialAlbums}" :translate-n="artist.albums.length - initialAlbums" translate-plural="Show %{ count } more albums">Show 1 more album</translate>
</em> </em>
<em v-else @click="showAllAlbums = false" class="expand"> <em v-else @click="showAllAlbums = false" class="expand">
<translate translate-context="Content/Artist/Card.Link">Collapse</translate> <translate translate-context="Content/*/Card.Link/Verb">Collapse</translate>
</em> </em>
</div> </div>
</div> </div>

View File

@ -5,10 +5,10 @@
<tr> <tr>
<th></th> <th></th>
<th></th> <th></th>
<th colspan="6"><translate translate-context="Content/Track/Table.Label">Title</translate></th> <th colspan="6"><translate translate-context="Content/Track/*/Noun">Title</translate></th>
<th colspan="4"><translate translate-context="Content/Track/Table.Label">Artist</translate></th> <th colspan="4"><translate translate-context="*/*/*/Noun">Artist</translate></th>
<th colspan="4"><translate translate-context="Content/Track/Table.Label">Album</translate></th> <th colspan="4"><translate translate-context="*/*/*">Album</translate></th>
<th colspan="4"><translate translate-context="Content/Track/Table.Label">Duration</translate></th> <th colspan="4"><translate translate-context="Content/*/*">Duration</translate></th>
<th colspan="2"></th> <th colspan="2"></th>
</tr> </tr>
</thead> </thead>

View File

@ -15,7 +15,7 @@
<label> <label>
<translate translate-context="Content/Login/Input.Label/Noun">Username or email</translate> | <translate translate-context="Content/Login/Input.Label/Noun">Username or email</translate> |
<router-link :to="{path: '/signup'}"> <router-link :to="{path: '/signup'}">
<translate translate-context="Content/Login/Link/Verb">Create an account</translate> <translate translate-context="*/Signup/Link/Verb">Create an account</translate>
</router-link> </router-link>
</label> </label>
<input <input
@ -31,16 +31,16 @@
</div> </div>
<div class="field"> <div class="field">
<label> <label>
<translate translate-context="Content/Login/Input.Label">Password</translate> | <translate translate-context="Content/*/Input.Label">Password</translate> |
<router-link :to="{name: 'auth.password-reset', query: {email: credentials.username}}"> <router-link :to="{name: 'auth.password-reset', query: {email: credentials.username}}">
<translate translate-context="Content/Login/Link/Verb">Reset your password</translate> <translate translate-context="*/Login/*/Verb">Reset your password</translate>
</router-link> </router-link>
</label> </label>
<password-input :index="2" required v-model="credentials.password" /> <password-input :index="2" required v-model="credentials.password" />
</div> </div>
<button tabindex="3" :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit"> <button tabindex="3" :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit">
<translate translate-context="Content/Login/Button.Label/Verb">Login</translate> <translate translate-context="*/Login/*/Verb">Login</translate>
</button> </button>
</form> </form>
</div> </div>

View File

@ -5,7 +5,7 @@
<h2> <h2>
<translate translate-context="Content/Login/Title">Are you sure you want to log out?</translate> <translate translate-context="Content/Login/Title">Are you sure you want to log out?</translate>
</h2> </h2>
<p v-translate="{username: $store.state.auth.username}">You are currently logged in as %{ username }</p> <p v-translate="{username: $store.state.auth.username}" translate-context="Content/Login/Paragraph">You are currently logged in as %{ username }</p>
<button class="ui button" @click="$store.dispatch('auth/logout')"><translate translate-context="Content/Login/Button.Label">Yes, log me out!</translate></button> <button class="ui button" @click="$store.dispatch('auth/logout')"><translate translate-context="Content/Login/Button.Label">Yes, log me out!</translate></button>
</div> </div>
</section> </section>

View File

@ -10,7 +10,7 @@
<img class="ui big circular image" v-else v-lazy="$store.getters['instance/absoluteUrl'](profile.avatar.square_crop)" /> <img class="ui big circular image" v-else v-lazy="$store.getters['instance/absoluteUrl'](profile.avatar.square_crop)" />
<div class="content"> <div class="content">
{{ profile.username }} {{ profile.username }}
<div class="sub header" v-translate="{date: signupDate}">Member since %{ date }</div> <div class="sub header" v-translate="{date: signupDate}" translate-context="Content/Profile/Paragraph">Member since %{ date }</div>
</div> </div>
</h2> </h2>
<div class="ui basic green label"> <div class="ui basic green label">
@ -21,7 +21,7 @@
:href="$store.getters['instance/absoluteUrl']('/api/admin')" :href="$store.getters['instance/absoluteUrl']('/api/admin')"
target="_blank"> target="_blank">
<i class="star icon"></i> <i class="star icon"></i>
<translate translate-context="Content/Profile/Button.Label">Staff member</translate> <translate translate-context="Content/Profile/User role">Staff member</translate>
</a> </a>
</div> </div>
</template> </template>

View File

@ -102,7 +102,7 @@
<li><translate translate-context="Popup/Settings/List item">Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password</translate></li> <li><translate translate-context="Popup/Settings/List item">Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password</translate></li>
</ul> </ul>
</div> </div>
<div slot="modal-confirm"><translate translate-context="Popup/Setting/Button.Label">Disable access</translate></div> <div slot="modal-confirm"><translate translate-context="Popup/Settings/Button.Label">Disable access</translate></div>
</dangerous-button> </dangerous-button>
</form> </form>
<div class="ui hidden divider" /> <div class="ui hidden divider" />
@ -114,25 +114,25 @@
<h2 class="ui header"> <h2 class="ui header">
<i class="eye slash outline icon"></i> <i class="eye slash outline icon"></i>
<div class="content"> <div class="content">
<translate>Content filters</translate> <translate translate-context="Content/Settings/Title/Noun">Content filters</translate>
</div> </div>
</h2> </h2>
<p><translate>Content filters help you hide content you don't want to see on the service.</translate></p> <p><translate translate-context="Content/Settings/Paragraph">Content filters help you hide content you don't want to see on the service.</translate></p>
<button <button
@click="$store.dispatch('moderation/fetchContentFilters')" @click="$store.dispatch('moderation/fetchContentFilters')"
class="ui basic icon button"> class="ui basic icon button">
<i class="refresh icon"></i>&nbsp; <i class="refresh icon"></i>&nbsp;
<translate translate-context="Content/*/Button.Label">Refresh</translate> <translate translate-context="Content/*/Button.Label/Short, Verb">Refresh</translate>
</button> </button>
<h3 class="ui header"> <h3 class="ui header">
<translate>Hidden artists</translate> <translate translate-context="Content/Settings/Title">Hidden artists</translate>
</h3> </h3>
<table class="ui compact very basic unstackable table"> <table class="ui compact very basic unstackable table">
<thead> <thead>
<tr> <tr>
<th><translate translate-context="Content/*/Table.Label">Name</translate></th> <th><translate translate-context="*/*/*/Noun">Name</translate></th>
<th><translate translate-context="Content/*/Table.Label">Creation date</translate></th> <th><translate translate-context="Content/*/*/Noun">Creation date</translate></th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
@ -148,7 +148,7 @@
</td> </td>
<td> <td>
<button @click="$store.dispatch('moderation/deleteContentFilter', filter.uuid)" class="ui basic tiny button"> <button @click="$store.dispatch('moderation/deleteContentFilter', filter.uuid)" class="ui basic tiny button">
<translate translate-context="Content/*/Button.Label">Delete</translate> <translate translate-context="*/*/*/Verb">Delete</translate>
</button> </button>
</td> </td>
</tr> </tr>

View File

@ -2,22 +2,22 @@
<main class="main pusher" v-title="labels.title"> <main class="main pusher" v-title="labels.title">
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<div class="ui small text container"> <div class="ui small text container">
<h2><translate :v-context="'Content/Signup/Header'">Create a funkwhale account</translate></h2> <h2><translate translate-context="Content/Signup/Title">Create a funkwhale account</translate></h2>
<form <form
:class="['ui', {'loading': isLoadingInstanceSetting}, 'form']" :class="['ui', {'loading': isLoadingInstanceSetting}, 'form']"
@submit.prevent="submit()"> @submit.prevent="submit()">
<p class="ui message" v-if="!$store.state.instance.settings.users.registration_enabled.value"> <p class="ui message" v-if="!$store.state.instance.settings.users.registration_enabled.value">
<translate :v-context="'Content/Signup/Form/Message'">Registration are closed on this instance, you will need an invitation code to signup.</translate> <translate translate-context="Content/Signup/Form/Paragraph">Registration are closed on this instance, you will need an invitation code to signup.</translate>
</p> </p>
<div v-if="errors.length > 0" class="ui negative message"> <div v-if="errors.length > 0" class="ui negative message">
<div class="header"><translate :v-context="'Content/Signup/Form/Message'">We cannot create your account</translate></div> <div class="header"><translate translate-context="Content/Signup/Form/Paragraph">Your account cannot be created.</translate></div>
<ul class="list"> <ul class="list">
<li v-for="error in errors">{{ error }}</li> <li v-for="error in errors">{{ error }}</li>
</ul> </ul>
</div> </div>
<div class="field"> <div class="field">
<label><translate :v-context="'Content/Signup/Form/Label'">Username</translate></label> <label><translate translate-context="Content/*/*">Username</translate></label>
<input <input
ref="username" ref="username"
name="username" name="username"
@ -28,7 +28,7 @@
v-model="username"> v-model="username">
</div> </div>
<div class="field"> <div class="field">
<label><translate :v-context="'Content/Signup/Form/Label'">Email</translate></label> <label><translate translate-context="Content/*/*/Noun">Email</translate></label>
<input <input
ref="email" ref="email"
name="email" name="email"
@ -38,11 +38,11 @@
v-model="email"> v-model="email">
</div> </div>
<div class="field"> <div class="field">
<label><translate :v-context="'Content/Signup/Form/Label'">Password</translate></label> <label><translate translate-context="Content/*/Input.Label">Password</translate></label>
<password-input v-model="password" /> <password-input v-model="password" />
</div> </div>
<div class="field" v-if="!$store.state.instance.settings.users.registration_enabled.value"> <div class="field" v-if="!$store.state.instance.settings.users.registration_enabled.value">
<label><translate :v-context="'Content/Signup/Form/Label'">Invitation code</translate></label> <label><translate translate-context="Content/*/Input.Label">Invitation code</translate></label>
<input <input
required required
type="text" type="text"
@ -51,7 +51,7 @@
v-model="invitation"> v-model="invitation">
</div> </div>
<button :class="['ui', 'green', {'loading': isLoading}, 'button']" type="submit"> <button :class="['ui', 'green', {'loading': isLoading}, 'button']" type="submit">
<translate :v-context="'Content/Signup/Form/Button'">Create my account</translate> <translate translate-context="Content/Signup/Button.Label">Create my account</translate>
</button> </button>
</form> </form>
</div> </div>

View File

@ -17,7 +17,7 @@
<div class="header">{{ successMessage }}</div> <div class="header">{{ successMessage }}</div>
</div> </div>
<div v-if="subsonicEnabled && errors.length > 0" class="ui negative message"> <div v-if="subsonicEnabled && errors.length > 0" class="ui negative message">
<div class="header"><translate translate-context="Content/Settings/Error message.Title">Error</translate></div> <div class="header"><translate translate-context="Content/*/Error message.Title">Error</translate></div>
<ul class="list"> <ul class="list">
<li v-for="error in errors">{{ error }}</li> <li v-for="error in errors">{{ error }}</li>
</ul> </ul>
@ -31,10 +31,10 @@
color="grey" color="grey"
:class="['ui', {'loading': isLoading}, 'button']" :class="['ui', {'loading': isLoading}, 'button']"
:action="requestNewToken"> :action="requestNewToken">
<translate translate-context="Content/Settings/Button.Label/Verb">Request a new password</translate> <translate translate-context="*/Settings/Button.Label/Verb">Request a new password</translate>
<p slot="modal-header"><translate translate-context="Popup/Settings/Title">Request a new Subsonic API password?</translate></p> <p slot="modal-header"><translate translate-context="Popup/Settings/Title">Request a new Subsonic API password?</translate></p>
<p slot="modal-content"><translate translate-context="Popup/Settings/Paragraph">This will log you out from existing devices that use the current password.</translate></p> <p slot="modal-content"><translate translate-context="Popup/Settings/Paragraph">This will log you out from existing devices that use the current password.</translate></p>
<div slot="modal-confirm"><translate translate-context="Popup/Settings/Button.Label/Verb">Request a new password</translate></div> <div slot="modal-confirm"><translate translate-context="*/Settings/Button.Label/Verb">Request a new password</translate></div>
</dangerous-button> </dangerous-button>
<button <button
v-else v-else

View File

@ -20,7 +20,7 @@
<div class="ui small left floated form" v-if="actionUrl && actions.length > 0"> <div class="ui small left floated form" v-if="actionUrl && actions.length > 0">
<div class="ui inline fields"> <div class="ui inline fields">
<div class="field"> <div class="field">
<label><translate translate-context="Content/*/Dropdown.Label/Noun">Actions</translate></label> <label><translate translate-context="Content/*/*/Noun">Actions</translate></label>
<select class="ui dropdown" v-model="currentActionName"> <select class="ui dropdown" v-model="currentActionName">
<option v-for="action in actions" :value="action.name"> <option v-for="action in actions" :value="action.name">
{{ action.label }} {{ action.label }}

View File

@ -1,12 +1,12 @@
<template> <template>
<div class="ui fluid action input"> <div class="ui fluid action input">
<p class="message" v-if="copied"> <p class="message" v-if="copied">
<translate translate-context="Content/*/Paragraph/Short">Text copied to clipboard!</translate> <translate translate-context="Content/*/Paragraph">Text copied to clipboard!</translate>
</p> </p>
<input ref="input" :value="value" type="text"> <input ref="input" :value="value" type="text">
<button @click="copy" :class="['ui', buttonClasses, 'right', 'labeled', 'icon', 'button']"> <button @click="copy" :class="['ui', buttonClasses, 'right', 'labeled', 'icon', 'button']">
<i class="copy icon"></i> <i class="copy icon"></i>
<translate translate-context="Content/*/Button.Label/Short, Verb">Copy</translate> <translate translate-context="*/*/Button.Label/Short, Verb">Copy</translate>
</button> </button>
</div> </div>
</template> </template>

View File

@ -15,7 +15,7 @@
</div> </div>
<div class="actions"> <div class="actions">
<div class="ui cancel button"> <div class="ui cancel button">
<translate translate-context="Modal/*/Button.Label/Short, Verb">Cancel</translate> <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
</div> </div>
<div :class="['ui', 'confirm', confirmButtonColor, 'button']" @click="confirm"> <div :class="['ui', 'confirm', confirmButtonColor, 'button']" @click="confirm">
<slot name="modal-confirm"> <slot name="modal-confirm">

View File

@ -22,7 +22,7 @@
<div :class="['ui', {'loading': isLoading}, 'form']"> <div :class="['ui', {'loading': isLoading}, 'form']">
<div class="fields"> <div class="fields">
<div class="field"> <div class="field">
<label><translate translate-context="Content/Favorites/Dropdown.Title/Short, Name">Ordering</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
<select class="ui dropdown" v-model="ordering"> <select class="ui dropdown" v-model="ordering">
<option v-for="option in orderingOptions" :value="option[0]"> <option v-for="option in orderingOptions" :value="option[0]">
{{ sharedLabels.filters[option[1]] }} {{ sharedLabels.filters[option[1]] }}
@ -30,14 +30,14 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/*/Dropdown.Label/Short, Name">Order</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Order</translate></label>
<select class="ui dropdown" v-model="orderingDirection"> <select class="ui dropdown" v-model="orderingDirection">
<option value="+"><translate translate-context="Content/*/Dropdown/Short">Ascending</translate></option> <option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option>
<option value="-"><translate translate-context="Content/*/Short">Descending</translate></option> <option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option>
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/*/Dropdown.Label/Short, Name">Results per page</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Results per page</translate></label>
<select class="ui dropdown" v-model="paginateBy"> <select class="ui dropdown" v-model="paginateBy">
<option :value="parseInt(12)">12</option> <option :value="parseInt(12)">12</option>
<option :value="parseInt(25)">25</option> <option :value="parseInt(25)">25</option>

View File

@ -2,7 +2,7 @@
<button @click="$store.dispatch('favorites/toggle', track.id)" v-if="button" :class="['ui', 'pink', {'inverted': isFavorite}, {'favorited': isFavorite}, 'icon', 'labeled', 'button']"> <button @click="$store.dispatch('favorites/toggle', track.id)" v-if="button" :class="['ui', 'pink', {'inverted': isFavorite}, {'favorited': isFavorite}, 'icon', 'labeled', 'button']">
<i class="heart icon"></i> <i class="heart icon"></i>
<translate v-if="isFavorite" translate-context="Content/Track/Button.Message">In favorites</translate> <translate v-if="isFavorite" translate-context="Content/Track/Button.Message">In favorites</translate>
<translate v-else translate-context="Content/Track/Button.Message">Add to favorites</translate> <translate v-else translate-context="Content/Track/*/Verb">Add to favorites</translate>
</button> </button>
<button <button
v-else v-else
@ -23,9 +23,9 @@ export default {
computed: { computed: {
title () { title () {
if (this.isFavorite) { if (this.isFavorite) {
return this.$pgettext('*/Favorites/Icon.Tooltip/Verb', 'Remove from favorites') return this.$pgettext('Content/Track/Icon.Tooltip/Verb', 'Remove from favorites')
} else { } else {
return this.$pgettext('*/Favorites/Icon.Tooltip/Verb', 'Add to favorites') return this.$pgettext('Content/Track/*/Verb', 'Add to favorites')
} }
}, },
isFavorite () { isFavorite () {

View File

@ -28,7 +28,7 @@
</div> </div>
</div> </div>
<div class="column"> <div class="column">
<h3 class="ui left aligned header"><translate translate-context="Content/About/Title/Noun">Library</translate></h3> <h3 class="ui left aligned header"><translate translate-context="*/*/*">Library</translate></h3>
<div class="ui mini horizontal statistics"> <div class="ui mini horizontal statistics">
<div class="statistic"> <div class="statistic">
<div class="value"> <div class="value">
@ -40,19 +40,19 @@
<div class="value"> <div class="value">
{{ stats.artists }} {{ stats.artists }}
</div> </div>
<div class="label"><translate translate-context="Content/About/Paragraph/Unit">Artists</translate></div> <div class="label"><translate translate-context="*/*/*/Noun">Artists</translate></div>
</div> </div>
<div class="statistic"> <div class="statistic">
<div class="value"> <div class="value">
{{ stats.albums }} {{ stats.albums }}
</div> </div>
<div class="label"><translate translate-context="Content/About/Paragraph/Unit">Albums</translate></div> <div class="label"><translate translate-context="*/*/*">Albums</translate></div>
</div> </div>
<div class="statistic"> <div class="statistic">
<div class="value"> <div class="value">
{{ stats.tracks }} {{ stats.tracks }}
</div> </div>
<div class="label"><translate translate-context="Content/About/Paragraph/Unit">Tracks</translate></div> <div class="label"><translate translate-context="*/*/*/Noun">Tracks</translate></div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -15,7 +15,7 @@
</h2> </h2>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<play-button class="orange" :tracks="album.tracks"> <play-button class="orange" :tracks="album.tracks">
<translate translate-context="Content/*/Button.Label/Verb, Short">Play all</translate> <translate translate-context="Content/Queue/Button.Label/Short, Verb">Play all</translate>
</play-button> </play-button>
<a :href="wikipediaUrl" target="_blank" class="ui icon labeled button"> <a :href="wikipediaUrl" target="_blank" class="ui icon labeled button">
@ -24,7 +24,7 @@
</a> </a>
<a v-if="musicbrainzUrl" :href="musicbrainzUrl" target="_blank" class="ui icon labeled button"> <a v-if="musicbrainzUrl" :href="musicbrainzUrl" target="_blank" class="ui icon labeled button">
<i class="external icon"></i> <i class="external icon"></i>
<translate translate-context="Content/*/Button.Label/Verb">View on MusicBrainz</translate> <translate translate-context="Content/*/*/Clickable, Verb">View on MusicBrainz</translate>
</a> </a>
<template v-if="publicLibraries.length > 0"> <template v-if="publicLibraries.length > 0">
<button <button
@ -45,7 +45,7 @@
</div> </div>
<div class="actions"> <div class="actions">
<div class="ui deny button"> <div class="ui deny button">
<translate translate-context="Popup/*/Button.Label/Verb">Cancel</translate> <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
</div> </div>
</div> </div>
</modal> </modal>
@ -61,7 +61,7 @@
translate-context="Content/Album/" translate-context="Content/Album/"
>Volume %{ number }</translate> >Volume %{ number }</translate>
<play-button class="right floated orange" :tracks="tracks"> <play-button class="right floated orange" :tracks="tracks">
<translate translate-context="Content/*/Button.Label/Verb, Short">Play all</translate> <translate translate-context="Content/Queue/Button.Label/Short, Verb">Play all</translate>
</play-button> </play-button>
<track-table :artist="album.artist" :display-position="true" :tracks="tracks"></track-table> <track-table :artist="album.artist" :display-position="true" :tracks="tracks"></track-table>
</section> </section>
@ -69,14 +69,14 @@
<template v-else> <template v-else>
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<h2> <h2>
<translate translate-context="Content/*/Title/Name">Tracks</translate> <translate translate-context="*/*/*/Noun">Tracks</translate>
</h2> </h2>
<track-table v-if="album" :artist="album.artist" :display-position="true" :tracks="album.tracks"></track-table> <track-table v-if="album" :artist="album.artist" :display-position="true" :tracks="album.tracks"></track-table>
</section> </section>
</template> </template>
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<h2> <h2>
<translate translate-context="Content/*/Title/Name">User libraries</translate> <translate translate-context="Content/*/Title/Noun">User libraries</translate>
</h2> </h2>
<library-widget @loaded="libraries = $event" :url="'albums/' + id + '/libraries/'"> <library-widget @loaded="libraries = $event" :url="'albums/' + id + '/libraries/'">
<translate slot="subtitle" translate-context="Content/Album/Paragraph">This album is present in the following libraries:</translate> <translate slot="subtitle" translate-context="Content/Album/Paragraph">This album is present in the following libraries:</translate>
@ -146,7 +146,7 @@ export default {
computed: { computed: {
labels() { labels() {
return { return {
title: this.$pgettext('Head/Album/Title/Name', 'Album') title: this.$pgettext('*/*/*', 'Album')
} }
}, },
publicLibraries () { publicLibraries () {

View File

@ -8,7 +8,7 @@
<div class="fields"> <div class="fields">
<div class="field"> <div class="field">
<label> <label>
<translate translate-context="Content/Search/Input.Label/Verb">Search</translate> <translate translate-context="Content/Search/Input.Label/Noun">Search</translate>
</label> </label>
<input type="text" name="search" v-model="query" :placeholder="labels.searchPlaceholder"/> <input type="text" name="search" v-model="query" :placeholder="labels.searchPlaceholder"/>
</div> </div>
@ -117,7 +117,7 @@ export default {
computed: { computed: {
labels() { labels() {
let searchPlaceholder = this.$pgettext('Content/Search/Input.Placeholder', "Enter album title...") let searchPlaceholder = this.$pgettext('Content/Search/Input.Placeholder', "Enter album title...")
let title = this.$pgettext('Head/Album/Title', "Albums") let title = this.$pgettext('*/*/*', "Albums")
return { return {
searchPlaceholder, searchPlaceholder,
title title

View File

@ -33,7 +33,7 @@
</a> </a>
<a v-if="musicbrainzUrl" :href="musicbrainzUrl" target="_blank" class="ui button"> <a v-if="musicbrainzUrl" :href="musicbrainzUrl" target="_blank" class="ui button">
<i class="external icon"></i> <i class="external icon"></i>
<translate translate-context="Content/*/Button.Label/Verb">View on MusicBrainz</translate> <translate translate-context="Content/*/*/Clickable, Verb">View on MusicBrainz</translate>
</a> </a>
<template v-if="publicLibraries.length > 0"> <template v-if="publicLibraries.length > 0">
<button <button
@ -54,7 +54,7 @@
</div> </div>
<div class="actions"> <div class="actions">
<div class="ui deny button"> <div class="ui deny button">
<translate translate-context="Popup/*/Button.Label/Verb">Cancel</translate> <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
</div> </div>
</div> </div>
</modal> </modal>
@ -65,7 +65,7 @@
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<div class="ui message"> <div class="ui message">
<p> <p>
<translate>You are currently hiding content related to this artist.</translate> <translate translate-context="Content/Artist/Paragraph">You are currently hiding content related to this artist.</translate>
</p> </p>
<router-link class="right floated" :to="{name: 'settings'}"> <router-link class="right floated" :to="{name: 'settings'}">
<translate translate-context="Content/Moderation/Link">Review my filters</translate> <translate translate-context="Content/Moderation/Link">Review my filters</translate>
@ -94,7 +94,7 @@
</section> </section>
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<h2> <h2>
<translate translate-context="Content/Artist/Title">User libraries</translate> <translate translate-context="Content/*/Title/Noun">User libraries</translate>
</h2> </h2>
<library-widget @loaded="libraries = $event" :url="'artists/' + id + '/libraries/'"> <library-widget @loaded="libraries = $event" :url="'artists/' + id + '/libraries/'">
<translate translate-context="Content/Artist/Paragraph" slot="subtitle">This artist is present in the following libraries:</translate> <translate translate-context="Content/Artist/Paragraph" slot="subtitle">This artist is present in the following libraries:</translate>
@ -176,7 +176,7 @@ export default {
computed: { computed: {
labels() { labels() {
return { return {
title: this.$pgettext('Head/Artist/Title', "Artist") title: this.$pgettext('*/*/*/Noun', "Artist")
} }
}, },
isPlayable() { isPlayable() {

View File

@ -8,7 +8,7 @@
<div class="fields"> <div class="fields">
<div class="field"> <div class="field">
<label> <label>
<translate translate-context="Content/Search/Input.Label/Verb">Search</translate> <translate translate-context="Content/Search/Input.Label/Noun">Search</translate>
</label> </label>
<input type="text" name="search" v-model="query" :placeholder="labels.searchPlaceholder"/> <input type="text" name="search" v-model="query" :placeholder="labels.searchPlaceholder"/>
</div> </div>
@ -28,7 +28,7 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Dropdown.Label">Results per page</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Results per page</translate></label>
<select class="ui dropdown" v-model="paginateBy"> <select class="ui dropdown" v-model="paginateBy">
<option :value="parseInt(12)">12</option> <option :value="parseInt(12)">12</option>
<option :value="parseInt(25)">25</option> <option :value="parseInt(25)">25</option>
@ -114,7 +114,7 @@ export default {
computed: { computed: {
labels() { labels() {
let searchPlaceholder = this.$pgettext('Content/Search/Input.Placeholder', "Enter artist name…") let searchPlaceholder = this.$pgettext('Content/Search/Input.Placeholder', "Enter artist name…")
let title = this.$pgettext('Head/Artist/Title', "Artists") let title = this.$pgettext('*/*/*/Noun', "Artists")
return { return {
searchPlaceholder, searchPlaceholder,
title title

View File

@ -23,15 +23,15 @@
</span> </span>
<span v-else-if="obj.is_approved"> <span v-else-if="obj.is_approved">
<i class="green check icon"></i> <i class="green check icon"></i>
<translate translate-context="Content/Library/Card/Short">Approved</translate> <translate translate-context="Content/*/*/Short">Approved</translate>
</span> </span>
<span v-else-if="obj.is_approved === null"> <span v-else-if="obj.is_approved === null">
<i class="yellow hourglass icon"></i> <i class="yellow hourglass icon"></i>
<translate translate-context="Content/Library/Card/Short">Pending review</translate> <translate translate-context="Content/Admin/*/Noun">Pending review</translate>
</span> </span>
<span v-else-if="obj.is_approved === false"> <span v-else-if="obj.is_approved === false">
<i class="red x icon"></i> <i class="red x icon"></i>
<translate translate-context="Content/Library/Card/Short">Rejected</translate> <translate translate-context="Content/Library/*/Short">Rejected</translate>
</span> </span>
</span> </span>
</div> </div>
@ -79,7 +79,7 @@
v-if="canApprove && obj.is_approved !== true" v-if="canApprove && obj.is_approved !== true"
@click="approve(true)" @click="approve(true)"
:class="['ui', {loading: isLoading}, 'green', 'basic', 'button']"> :class="['ui', {loading: isLoading}, 'green', 'basic', 'button']">
<translate translate-context="Content/Library/Button.Label">Approve</translate> <translate translate-context="Content/*/Button.Label/Verb">Approve</translate>
</button> </button>
<button <button
v-if="canApprove && obj.is_approved === null" v-if="canApprove && obj.is_approved === null"
@ -96,7 +96,7 @@
<div slot="modal-content"> <div slot="modal-content">
<p><translate translate-context="Popup/Library/Paragraph">The suggestion will be completely removed, this action is irreversible.</translate></p> <p><translate translate-context="Popup/Library/Paragraph">The suggestion will be completely removed, this action is irreversible.</translate></p>
</div> </div>
<p slot="modal-confirm"><translate translate-context="Popup/Library/Button.Label">Delete</translate></p> <p slot="modal-confirm"><translate translate-context="*/*/*/Verb">Delete</translate></p>
</dangerous-button> </dangerous-button>
</div> </div>
</div> </div>

View File

@ -75,7 +75,7 @@
v-if="objectType === 'track'" v-if="objectType === 'track'"
:to="{name: 'library.tracks.detail', params: {id: object.id }}" :to="{name: 'library.tracks.detail', params: {id: object.id }}"
> >
<translate translate-context="Content/*/Button.Label">Cancel</translate> <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
</router-link> </router-link>
<button :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit" :disabled="isLoading || !mutationPayload"> <button :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit" :disabled="isLoading || !mutationPayload">
<translate v-if="canEdit" key="1" translate-context="Content/Library/Button.Label/Verb">Submit and apply edit</translate> <translate v-if="canEdit" key="1" translate-context="Content/Library/Button.Label/Verb">Submit and apply edit</translate>

View File

@ -85,8 +85,8 @@
<thead> <thead>
<tr> <tr>
<th><translate translate-context="Content/Library/Table.Label">Filename</translate></th> <th><translate translate-context="Content/Library/Table.Label">Filename</translate></th>
<th><translate translate-context="Content/Library/Table.Label">Size</translate></th> <th><translate translate-context="Content/Library/*/in MB">Size</translate></th>
<th><translate translate-context="Content/Library/Table.Label">Status</translate></th> <th><translate translate-context="Content/Library/Table.Label (Value is Uploading/Uploaded/Error)">Status</translate></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -107,7 +107,7 @@
({{ parseInt(file.progress) }}%) ({{ parseInt(file.progress) }}%)
</span> </span>
<template v-else> <template v-else>
<span class="ui label"><translate translate-context="Content/Library/Table" key="3">Pending</translate></span> <span class="ui label"><translate translate-context="Content/Library/*/Short" key="3">Pending</translate></span>
<button class="ui tiny basic red icon button" @click.prevent="$refs.upload.remove(file)"><i class="delete icon"></i></button> <button class="ui tiny basic red icon button" @click.prevent="$refs.upload.remove(file)"><i class="delete icon"></i></button>
</template> </template>
</td> </td>

View File

@ -14,7 +14,7 @@
</div> </div>
<div class="column"> <div class="column">
<playlist-widget :url="'playlists/'" :filters="{scope: 'user', playable: true, ordering: '-creation_date'}"> <playlist-widget :url="'playlists/'" :filters="{scope: 'user', playable: true, ordering: '-creation_date'}">
<template slot="title"><translate translate-context="Content/Home/Title">Playlists</translate></template> <template slot="title"><translate translate-context="*/*/*">Playlists</translate></template>
</playlist-widget> </playlist-widget>
</div> </div>
</div> </div>

View File

@ -2,19 +2,19 @@
<div class="main library pusher"> <div class="main library pusher">
<nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu"> <nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu">
<router-link class="ui item" to="/library" exact> <router-link class="ui item" to="/library" exact>
<translate translate-context="Menu/Home/Link/Verb">Browse</translate> <translate translate-context="*/Library/*/Verb">Browse</translate>
</router-link> </router-link>
<router-link class="ui item" to="/library/albums" exact> <router-link class="ui item" to="/library/albums" exact>
<translate translate-context="Menu/Home/Link">Albums</translate> <translate translate-context="*/*/*">Albums</translate>
</router-link> </router-link>
<router-link class="ui item" to="/library/artists" exact> <router-link class="ui item" to="/library/artists" exact>
<translate translate-context="Menu/Home/Link">Artists</translate> <translate translate-context="*/*/*/Noun">Artists</translate>
</router-link> </router-link>
<router-link class="ui item" to="/library/radios" exact> <router-link class="ui item" to="/library/radios" exact>
<translate translate-context="Menu/Home/Link">Radios</translate> <translate translate-context="*/*/*">Radios</translate>
</router-link> </router-link>
<router-link class="ui item" to="/library/playlists" exact> <router-link class="ui item" to="/library/playlists" exact>
<translate translate-context="Menu/Home/Link">Playlists</translate> <translate translate-context="*/*/*">Playlists</translate>
</router-link> </router-link>
</nav> </nav>
<router-view :key="$route.fullPath"></router-view> <router-view :key="$route.fullPath"></router-view>

View File

@ -27,11 +27,11 @@
<div :class="['ui', {'loading': isLoading}, 'form']"> <div :class="['ui', {'loading': isLoading}, 'form']">
<div class="fields"> <div class="fields">
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Input.Label/Verb">Search</translate></label> <label><translate translate-context="Content/Search/Input.Label/Noun">Search</translate></label>
<input name="search" type="text" v-model="query" :placeholder="labels.searchPlaceholder"/> <input name="search" type="text" v-model="query" :placeholder="labels.searchPlaceholder"/>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Dropdown.Label">Ordering</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
<select class="ui dropdown" v-model="ordering"> <select class="ui dropdown" v-model="ordering">
<option v-for="option in orderingOptions" :value="option[0]"> <option v-for="option in orderingOptions" :value="option[0]">
{{ sharedLabels.filters[option[1]] }} {{ sharedLabels.filters[option[1]] }}
@ -39,7 +39,7 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Dropdown.Label">Order</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Order</translate></label>
<select class="ui dropdown" v-model="orderingDirection"> <select class="ui dropdown" v-model="orderingDirection">
<option value="+"> <option value="+">
<translate translate-context="Content/Search/Dropdown">Ascending</translate> <translate translate-context="Content/Search/Dropdown">Ascending</translate>
@ -50,7 +50,7 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Dropdown.Label">Results per page</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Results per page</translate></label>
<select class="ui dropdown" v-model="paginateBy"> <select class="ui dropdown" v-model="paginateBy">
<option :value="parseInt(12)">12</option> <option :value="parseInt(12)">12</option>
<option :value="parseInt(25)">25</option> <option :value="parseInt(25)">25</option>
@ -139,7 +139,7 @@ export default {
computed: { computed: {
labels() { labels() {
let searchPlaceholder = this.$pgettext('Content/Search/Input.Placeholder', "Enter a radio name…") let searchPlaceholder = this.$pgettext('Content/Search/Input.Placeholder', "Enter a radio name…")
let title = this.$pgettext('Head/Radio/Title', "Radios") let title = this.$pgettext('*/*/*', "Radios")
return { return {
searchPlaceholder, searchPlaceholder,
title title

View File

@ -30,11 +30,11 @@
<a :href="wikipediaUrl" target="_blank" class="ui icon labeled button"> <a :href="wikipediaUrl" target="_blank" class="ui icon labeled button">
<i class="wikipedia w icon"></i> <i class="wikipedia w icon"></i>
<translate translate-context="Content/*/Link/Verb">Search on Wikipedia</translate> <translate translate-context="Content/*/Button.Label/Verb">Search on Wikipedia</translate>
</a> </a>
<a v-if="musicbrainzUrl" :href="musicbrainzUrl" target="_blank" class="ui icon labeled button"> <a v-if="musicbrainzUrl" :href="musicbrainzUrl" target="_blank" class="ui icon labeled button">
<i class="external icon"></i> <i class="external icon"></i>
<translate translate-context="Content/*/Link/Verb">View on MusicBrainz</translate> <translate translate-context="Content/*/*/Clickable, Verb">View on MusicBrainz</translate>
</a> </a>
<a v-if="upload" :href="downloadUrl" target="_blank" class="ui icon labeled button"> <a v-if="upload" :href="downloadUrl" target="_blank" class="ui icon labeled button">
<i class="download icon"></i> <i class="download icon"></i>
@ -45,7 +45,7 @@
@click="showEmbedModal = !showEmbedModal" @click="showEmbedModal = !showEmbedModal"
class="ui icon labeled button"> class="ui icon labeled button">
<i class="code icon"></i> <i class="code icon"></i>
<translate translate-context="Content/Track/Button.Label/Verb">Embed</translate> <translate translate-context="Content/*/Button.Label/Verb">Embed</translate>
</button> </button>
<modal :show.sync="showEmbedModal"> <modal :show.sync="showEmbedModal">
<div class="header"> <div class="header">
@ -59,7 +59,7 @@
</div> </div>
<div class="actions"> <div class="actions">
<div class="ui deny button"> <div class="ui deny button">
<translate translate-context="Popup/Track/Button/Verb">Cancel</translate> <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
</div> </div>
</div> </div>
</modal> </modal>
@ -68,7 +68,7 @@
:to="{name: 'library.tracks.edit', params: {id: track.id }}" :to="{name: 'library.tracks.edit', params: {id: track.id }}"
class="ui icon labeled button"> class="ui icon labeled button">
<i class="edit icon"></i> <i class="edit icon"></i>
<translate translate-context="Content/Track/Button.Label/Verb">Edit</translate> <translate translate-context="Content/*/Button.Label/Verb">Edit</translate>
</router-link> </router-link>
</div> </div>
</section> </section>
@ -136,7 +136,7 @@ export default {
}, },
labels() { labels() {
return { return {
title: this.$pgettext('Head/Track/Title', "Track") title: this.$pgettext('*/*/*/Noun', "Track")
} }
}, },
wikipediaUrl() { wikipediaUrl() {

View File

@ -18,7 +18,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/Track/Table.Label/Noun">License</translate> <translate translate-context="Content/*/*/Noun">License</translate>
</td> </td>
<td v-if="license"> <td v-if="license">
<a :href="license.url" target="_blank" rel="noopener noreferrer">{{ license.name }}</a> <a :href="license.url" target="_blank" rel="noopener noreferrer">{{ license.name }}</a>
@ -29,7 +29,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/Track/Table.Label">Duration</translate> <translate translate-context="Content/*/*">Duration</translate>
</td> </td>
<td v-if="upload && upload.duration">{{ time.parse(upload.duration) }}</td> <td v-if="upload && upload.duration">{{ time.parse(upload.duration) }}</td>
<td v-else> <td v-else>
@ -38,7 +38,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/Track/Table.Label">Size</translate> <translate translate-context="Content/Library/*/in MB">Size</translate>
</td> </td>
<td v-if="upload && upload.size">{{ upload.size | humanSize }}</td> <td v-if="upload && upload.size">{{ upload.size | humanSize }}</td>
<td v-else> <td v-else>
@ -47,7 +47,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/Track/Table.Label">Bitrate</translate> <translate translate-context="Content/Track/*/Noun">Bitrate</translate>
</td> </td>
<td v-if="upload && upload.bitrate">{{ upload.bitrate | humanSize }}/s</td> <td v-if="upload && upload.bitrate">{{ upload.bitrate | humanSize }}/s</td>
<td v-else> <td v-else>
@ -86,7 +86,7 @@
</section> </section>
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<h2> <h2>
<translate translate-context="Content/Track/Title">User libraries</translate> <translate translate-context="Content/*/Title/Noun">User libraries</translate>
</h2> </h2>
<library-widget @loaded="$emit('libraries-loaded', $event)" :url="'tracks/' + id + '/libraries/'"> <library-widget @loaded="$emit('libraries-loaded', $event)" :url="'tracks/' + id + '/libraries/'">
<translate translate-context="Content/Track/Paragraph" slot="subtitle">This track is present in the following libraries:</translate> <translate translate-context="Content/Track/Paragraph" slot="subtitle">This track is present in the following libraries:</translate>
@ -152,7 +152,7 @@ export default {
computed: { computed: {
labels() { labels() {
return { return {
title: this.$pgettext('Head/Track/Title', "Track") title: this.$pgettext('*/*/*/Noun', "Track")
} }
}, },
upload() { upload() {

View File

@ -23,7 +23,7 @@
<input id="name" name="name" type="text" v-model="radioName" :placeholder="labels.placeholder.name" /> <input id="name" name="name" type="text" v-model="radioName" :placeholder="labels.placeholder.name" />
</div> </div>
<div class="field"> <div class="field">
<label for="description"><translate translate-context="Content/Radio/Input.Label">Description</translate></label> <label for="description"><translate translate-context="Content/*/Input.Label/Noun">Description</translate></label>
<textarea rows="2" id="description" type="text" v-model="radioDesc" :placeholder="labels.placeholder.description" /> <textarea rows="2" id="description" type="text" v-model="radioDesc" :placeholder="labels.placeholder.description" />
</div> </div>
<div class="ui toggle checkbox"> <div class="ui toggle checkbox">
@ -32,7 +32,7 @@
</div> </div>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<button :disabled="!canSave" @click="save" :class="['ui', 'green', {loading: isLoading}, 'button']"> <button :disabled="!canSave" @click="save" :class="['ui', 'green', {loading: isLoading}, 'button']">
<translate translate-context="Content/Radio/Button.Label/Verb">Save</translate> <translate translate-context="Content/*/Button.Label/Verb">Save</translate>
</button> </button>
<radio-button v-if="id" type="custom" :custom-radio-id="id"></radio-button> <radio-button v-if="id" type="custom" :custom-radio-id="id"></radio-button>
</div> </div>
@ -63,7 +63,7 @@
<th class="one wide"><translate translate-context="Content/Radio/Table.Label/Verb">Exclude</translate></th> <th class="one wide"><translate translate-context="Content/Radio/Table.Label/Verb">Exclude</translate></th>
<th class="six wide"><translate translate-context="Content/Radio/Table.Label/Verb (Value is a List of Parameters)">Config</translate></th> <th class="six wide"><translate translate-context="Content/Radio/Table.Label/Verb (Value is a List of Parameters)">Config</translate></th>
<th class="five wide"><translate translate-context="Content/Radio/Table.Label/Noun (Value is a number of Tracks)">Candidates</translate></th> <th class="five wide"><translate translate-context="Content/Radio/Table.Label/Noun (Value is a number of Tracks)">Candidates</translate></th>
<th class="two wide"><translate translate-context="Content/Radio/Table.Label/Noun (Value is a Button)">Actions</translate></th> <th class="two wide"><translate translate-context="Content/*/*/Noun">Actions</translate></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -83,7 +83,8 @@
class="ui header" class="ui header"
v-translate="{count: checkResult.candidates.count}" v-translate="{count: checkResult.candidates.count}"
:translate-n="checkResult.candidates.count" :translate-n="checkResult.candidates.count"
translate-plural="%{ count } tracks matching combined filters"> translate-plural="%{ count } tracks matching combined filters"
translate-context="Content/Radio/Table.Paragraph/Short">
%{ count } track matching combined filters %{ count } track matching combined filters
</h3> </h3>
<track-table v-if="checkResult.candidates.sample" :tracks="checkResult.candidates.sample" :playable="true"></track-table> <track-table v-if="checkResult.candidates.sample" :tracks="checkResult.candidates.sample" :playable="true"></track-table>

View File

@ -51,7 +51,7 @@
</div> </div>
<div class="actions"> <div class="actions">
<div class="ui black deny button"> <div class="ui black deny button">
<translate translate-context="Popup/Radio/Button.Label/Verb">Cancel</translate> <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
</div> </div>
</div> </div>
</modal> </modal>

View File

@ -10,24 +10,24 @@
</form> </form>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Dropdown.Label">Status</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label (Value is All/Pending review/Approved/Rejected)">Status</translate></label>
<select class="ui dropdown" @change="addSearchToken('is_approved', $event.target.value)" :value="getTokenValue('is_approved', '')"> <select class="ui dropdown" @change="addSearchToken('is_approved', $event.target.value)" :value="getTokenValue('is_approved', '')">
<option value=""> <option value="">
<translate translate-context="Content/Admin/Dropdown">All</translate> <translate translate-context="Content/*/Dropdown">All</translate>
</option> </option>
<option value="null"> <option value="null">
<translate translate-context="Content/Admin/Dropdown">Pending review</translate> <translate translate-context="Content/Admin/*/Noun">Pending review</translate>
</option> </option>
<option value="yes"> <option value="yes">
<translate translate-context="Content/Admin/Dropdown">Approved</translate> <translate translate-context="Content/*/*/Short">Approved</translate>
</option> </option>
<option value="no"> <option value="no">
<translate translate-context="Content/Admin/Dropdown">Rejected</translate> <translate translate-context="Content/Library/*/Short">Rejected</translate>
</option> </option>
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Dropdown.Label">Ordering</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
<select class="ui dropdown" v-model="ordering"> <select class="ui dropdown" v-model="ordering">
<option v-for="option in orderingOptions" :value="option[0]"> <option v-for="option in orderingOptions" :value="option[0]">
{{ sharedLabels.filters[option[1]] }} {{ sharedLabels.filters[option[1]] }}
@ -70,7 +70,7 @@
></pagination> ></pagination>
<span v-if="result && result.results.length > 0"> <span v-if="result && result.results.length > 0">
<translate translate-context="Content/Library/Paragraph" <translate translate-context="Content/*/Paragraph"
:translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}"> :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
Showing results %{ start }-%{ end } on %{ total } Showing results %{ start }-%{ end } on %{ total }
</translate> </translate>

View File

@ -9,7 +9,7 @@
</form> </form>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Input.Label/Noun">Ordering</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
<select class="ui dropdown" v-model="ordering"> <select class="ui dropdown" v-model="ordering">
<option v-for="option in orderingOptions" :value="option[0]"> <option v-for="option in orderingOptions" :value="option[0]">
{{ sharedLabels.filters[option[1]] }} {{ sharedLabels.filters[option[1]] }}
@ -17,7 +17,7 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Input.Label/Noun">Ordering direction</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering direction</translate></label>
<select class="ui dropdown" v-model="orderingDirection"> <select class="ui dropdown" v-model="orderingDirection">
<option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option> <option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option>
<option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option> <option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option>
@ -37,12 +37,12 @@
action-url="manage/accounts/action/" action-url="manage/accounts/action/"
:filters="actionFilters"> :filters="actionFilters">
<template slot="header-cells"> <template slot="header-cells">
<th><translate translate-context="Content/Moderation/Table.Label">Name</translate></th> <th><translate translate-context="*/*/*/Noun">Name</translate></th>
<th><translate translate-context="Content/Moderation/Table.Label">Domain</translate></th> <th><translate translate-context="Content/Moderation/*/Noun">Domain</translate></th>
<th><translate translate-context="Content/Moderation/Table.Label/Noun">Uploads</translate></th> <th><translate translate-context="Content/Moderation/Table.Label/Noun">Uploads</translate></th>
<th><translate translate-context="Content/Moderation/Table.Label/Noun">First seen</translate></th> <th><translate translate-context="Content/Moderation/Table.Label/Short (Value is a date)">First seen</translate></th>
<th><translate translate-context="Content/Moderation/Table.Label/Noun">Last seen</translate></th> <th><translate translate-context="Content/Moderation/Table.Label/Noun">Last seen</translate></th>
<th><translate translate-context="Content/Moderation/Table.Label/Short, Noun">Under moderation rule</translate></th> <th><translate translate-context="Content/Moderation/Table.Label/Short">Under moderation rule</translate></th>
</template> </template>
<template slot="row-cells" slot-scope="scope"> <template slot="row-cells" slot-scope="scope">
<td> <td>
@ -57,7 +57,7 @@
</template> </template>
<span role="button" v-else class="ui tiny teal icon link label" @click="addSearchToken('domain', scope.obj.domain)"> <span role="button" v-else class="ui tiny teal icon link label" @click="addSearchToken('domain', scope.obj.domain)">
<i class="home icon"></i> <i class="home icon"></i>
<translate translate-context="Content/Moderation/Table/Short, Noun">Local account</translate> <translate translate-context="Content/Moderation/*/Short, Noun">Local account</translate>
</span> </span>
</td> </td>
<td> <td>
@ -86,7 +86,7 @@
></pagination> ></pagination>
<span v-if="result && result.results.length > 0"> <span v-if="result && result.results.length > 0">
<translate translate-context="Content/Moderation/Paragraph" <translate translate-context="Content/*/Paragraph"
:translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}"> :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
Showing results %{ start }-%{ end } on %{ total } Showing results %{ start }-%{ end } on %{ total }
</translate> </translate>
@ -185,7 +185,7 @@ export default {
return [ return [
{ {
name: 'purge', name: 'purge',
label: this.$pgettext('Content/Moderation/Dropdown/Verb', 'Purge'), label: this.$pgettext('*/*/*/Verb', 'Purge'),
isDangerous: true isDangerous: true
} }
] ]

View File

@ -3,11 +3,11 @@
<div class="ui inline form"> <div class="ui inline form">
<div class="fields"> <div class="fields">
<div class="ui field"> <div class="ui field">
<label><translate translate-context="Content/Search/Input.Label/Verb">Search</translate></label> <label><translate translate-context="Content/Search/Input.Label/Noun">Search</translate></label>
<input name="search" type="text" v-model="search" :placeholder="labels.searchPlaceholder" /> <input name="search" type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Input.Label/Noun">Ordering</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
<select class="ui dropdown" v-model="ordering"> <select class="ui dropdown" v-model="ordering">
<option v-for="option in orderingOptions" :value="option[0]"> <option v-for="option in orderingOptions" :value="option[0]">
{{ sharedLabels.filters[option[1]] }} {{ sharedLabels.filters[option[1]] }}
@ -15,7 +15,7 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Input.Label/Noun">Ordering direction</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering direction</translate></label>
<select class="ui dropdown" v-model="orderingDirection"> <select class="ui dropdown" v-model="orderingDirection">
<option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option> <option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option>
<option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option> <option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option>
@ -36,10 +36,10 @@
idField="name" idField="name"
:filters="actionFilters"> :filters="actionFilters">
<template slot="header-cells"> <template slot="header-cells">
<th><translate translate-context="Content/Moderation/Table.Label">Name</translate></th> <th><translate translate-context="*/*/*/Noun">Name</translate></th>
<th><translate translate-context="Content/Moderation/Table.Label">Users</translate></th> <th><translate translate-context="*/*/*/Noun">Users</translate></th>
<th><translate translate-context="Content/Moderation/Table.Label/Short, Noun">Received messages</translate></th> <th><translate translate-context="Content/Moderation/*/Noun">Received messages</translate></th>
<th><translate translate-context="Content/Moderation/Table.Label/Short, Noun">First seen</translate></th> <th><translate translate-context="Content/Moderation/Table.Label/Short (Value is a date)">First seen</translate></th>
<th><translate translate-context="Content/Moderation/Table.Label/Short">Under moderation rule</translate></th> <th><translate translate-context="Content/Moderation/Table.Label/Short">Under moderation rule</translate></th>
</template> </template>
<template slot="row-cells" slot-scope="scope"> <template slot="row-cells" slot-scope="scope">
@ -72,7 +72,7 @@
></pagination> ></pagination>
<span v-if="result && result.results.length > 0"> <span v-if="result && result.results.length > 0">
<translate translate-context="Content/Moderation/Paragraph" <translate translate-context="Content/*/Paragraph"
:translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}"> :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
Showing results %{ start }-%{ end } on %{ total } Showing results %{ start }-%{ end } on %{ total }
</translate> </translate>
@ -165,7 +165,7 @@ export default {
return [ return [
{ {
name: 'purge', name: 'purge',
label: this.$pgettext('Content/Moderation/Dropdown/Verb', 'Purge'), label: this.$pgettext('*/*/*/Verb', 'Purge'),
isDangerous: true isDangerous: true
} }
] ]

View File

@ -17,33 +17,33 @@
<p><strong><translate translate-context="Content/Moderation/Card.Title/Noun">Rule</translate></strong></p> <p><strong><translate translate-context="Content/Moderation/Card.Title/Noun">Rule</translate></strong></p>
<p v-if="object.block_all"> <p v-if="object.block_all">
<i class="ban icon"></i> <i class="ban icon"></i>
<translate translate-context="Content/Moderation/Card.List item/Verb">Block everything</translate> <translate translate-context="Content/Moderation/*/Verb">Block everything</translate>
</p> </p>
<div v-else class="ui list"> <div v-else class="ui list">
<div class="ui item" v-if="object.silence_activity"> <div class="ui item" v-if="object.silence_activity">
<i class="feed icon"></i> <i class="feed icon"></i>
<div class="content"><translate translate-context="Content/Moderation/Card.List item/Verb">Mute activity</translate></div> <div class="content"><translate translate-context="Content/Moderation/*/Verb">Mute activity</translate></div>
</div> </div>
<div class="ui item" v-if="object.silence_notifications"> <div class="ui item" v-if="object.silence_notifications">
<i class="bell icon"></i> <i class="bell icon"></i>
<div class="content"><translate translate-context="Content/Moderation/Card.List item/Verb">Mute notifications</translate></div> <div class="content"><translate translate-context="Content/Moderation/*/Verb">Mute notifications</translate></div>
</div> </div>
<div class="ui item" v-if="object.reject_media"> <div class="ui item" v-if="object.reject_media">
<i class="file icon"></i> <i class="file icon"></i>
<div class="content"><translate translate-context="Content/Moderation/Card.List item/Verb">Reject media</translate></div> <div class="content"><translate translate-context="Content/Moderation/*/Verb">Reject media</translate></div>
</div> </div>
</div> </div>
</div> </div>
<div v-if="markdown && object.summary"> <div v-if="markdown && object.summary">
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<p><strong><translate translate-context="Content/Moderation/Card.Title/Noun">Reason</translate></strong></p> <p><strong><translate translate-context="Content/Moderation/*/Noun">Reason</translate></strong></p>
<div v-html="markdown.makeHtml(object.summary)"></div> <div v-html="markdown.makeHtml(object.summary)"></div>
</div> </div>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<button @click="$emit('update')" class="ui right floated labeled icon button"> <button @click="$emit('update')" class="ui right floated labeled icon button">
<i class="edit icon"></i> <i class="edit icon"></i>
<translate translate-context="Content/Moderation/Card.Button.Label/Verb">Edit</translate> <translate translate-context="Content/*/Button.Label/Verb">Edit</translate>
</button> </button>
</div> </div>
</template> </template>

View File

@ -23,7 +23,7 @@
</div> </div>
<div class="field"> <div class="field">
<label for="policy-summary"> <label for="policy-summary">
<translate translate-context="Content/Moderation/Input.Label/Noun">Reason</translate> <translate translate-context="Content/Moderation/*/Noun">Reason</translate>
<tooltip :content="labels.summaryHelp" /> <tooltip :content="labels.summaryHelp" />
</label> </label>
<textarea name="policy-summary" id="policy-summary" rows="5" v-model="current.summary"></textarea> <textarea name="policy-summary" id="policy-summary" rows="5" v-model="current.summary"></textarea>
@ -32,7 +32,7 @@
<div class="ui toggle checkbox"> <div class="ui toggle checkbox">
<input id="policy-is-active" v-model="current.blockAll" type="checkbox"> <input id="policy-is-active" v-model="current.blockAll" type="checkbox">
<label for="policy-is-active"> <label for="policy-is-active">
<translate translate-context="Content/Moderation/Checkbox.Label/Verb">Block everything</translate> <translate translate-context="Content/Moderation/*/Verb">Block everything</translate>
<tooltip :content="labels.blockAllHelp" /> <tooltip :content="labels.blockAllHelp" />
</label> </label>
</div> </div>
@ -52,14 +52,14 @@
</div> </div>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<button @click="$emit('cancel')" class="ui basic left floated button"> <button @click="$emit('cancel')" class="ui basic left floated button">
<translate translate-context="Content/Moderation/Card.Button.Label/Verb">Cancel</translate> <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
</button> </button>
<button :class="['ui', 'right', 'floated', 'green', {'disabled loading': isLoading}, 'button']" :disabled="isLoading"> <button :class="['ui', 'right', 'floated', 'green', {'disabled loading': isLoading}, 'button']" :disabled="isLoading">
<translate translate-context="Content/Moderation/Card.Button.Label/Verb" v-if="object" key="1">Update</translate> <translate translate-context="Content/Moderation/Card.Button.Label/Verb" v-if="object" key="1">Update</translate>
<translate translate-context="Content/Moderation/Card.Button.Label/Verb" v-else key="2">Create</translate> <translate translate-context="Content/Moderation/Card.Button.Label/Verb" v-else key="2">Create</translate>
</button> </button>
<dangerous-button v-if="object" class="right floated basic button" color='red' @confirm="remove"> <dangerous-button v-if="object" class="right floated basic button" color='red' @confirm="remove">
<translate translate-context="Content/Moderation/Card.Button.Label/Verb">Delete</translate> <translate translate-context="*/*/*/Verb">Delete</translate>
<p slot="modal-header"> <p slot="modal-header">
<translate translate-context="Popup/Moderation/Title">Delete this moderation rule?</translate> <translate translate-context="Popup/Moderation/Title">Delete this moderation rule?</translate>
</p> </p>
@ -112,15 +112,15 @@ export default {
blockAllHelp: this.$pgettext('Content/Moderation/Help text', "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"), blockAllHelp: this.$pgettext('Content/Moderation/Help text', "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"),
silenceActivity: { silenceActivity: {
help: this.$pgettext('Content/Moderation/Help text', "Hide account or domain content, except from followers."), help: this.$pgettext('Content/Moderation/Help text', "Hide account or domain content, except from followers."),
label: this.$pgettext('Content/Moderation/Checkbox.Label/Verb', "Mute activity"), label: this.$pgettext('Content/Moderation/*/Verb', "Mute activity"),
}, },
silenceNotifications: { silenceNotifications: {
help: this.$pgettext('Content/Moderation/Help text', "Prevent account or domain from triggering notifications, except from followers."), help: this.$pgettext('Content/Moderation/Help text', "Prevent account or domain from triggering notifications, except from followers."),
label: this.$pgettext('Content/Moderation/Checkbox.Label/Verb', "Mute notifications"), label: this.$pgettext('Content/Moderation/*/Verb', "Mute notifications"),
}, },
rejectMedia: { rejectMedia: {
help: this.$pgettext('Content/Moderation/Help text', "Do not download any media file (audio, album cover, account avatar…) from this account or domain. This will purge existing content as well."), help: this.$pgettext('Content/Moderation/Help text', "Do not download any media file (audio, album cover, account avatar…) from this account or domain. This will purge existing content as well."),
label: this.$pgettext('Content/Moderation/Checkbox.Label/Verb', "Reject media"), label: this.$pgettext('Content/Moderation/*/Verb', "Reject media"),
} }
} }
} }

View File

@ -9,7 +9,7 @@
</div> </div>
<div class="inline fields"> <div class="inline fields">
<div class="ui field"> <div class="ui field">
<label><translate translate-context="$1">Invitation code</translate></label> <label><translate translate-context="Content/*/Input.Label">Invitation code</translate></label>
<input name="code" type="text" v-model="code" :placeholder="labels.placeholder" /> <input name="code" type="text" v-model="code" :placeholder="labels.placeholder" />
</div> </div>
<div class="ui field"> <div class="ui field">

View File

@ -3,11 +3,11 @@
<div class="ui inline form"> <div class="ui inline form">
<div class="fields"> <div class="fields">
<div class="ui field"> <div class="ui field">
<label><translate translate-context="Content/Search/Input.Label/Verb">Search</translate></label> <label><translate translate-context="Content/Search/Input.Label/Noun">Search</translate></label>
<input name="search" type="text" v-model="search" :placeholder="labels.searchPlaceholder" /> <input name="search" type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Input.Label/Noun">Ordering</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
<select class="ui dropdown" v-model="ordering"> <select class="ui dropdown" v-model="ordering">
<option v-for="option in orderingOptions" :value="option[0]"> <option v-for="option in orderingOptions" :value="option[0]">
{{ sharedLabels.filters[option[1]] }} {{ sharedLabels.filters[option[1]] }}
@ -15,9 +15,9 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Admin/Dropdown.Label">Status</translate></label> <label><translate translate-context="Content/Admin/*/Noun (Value is Used/Not used)">Status</translate></label>
<select class="ui dropdown" v-model="isOpen"> <select class="ui dropdown" v-model="isOpen">
<option :value="null"><translate translate-context="Content/Admin/Dropdown">All</translate></option> <option :value="null"><translate translate-context="Content/*/Dropdown">All</translate></option>
<option :value="true"><translate translate-context="Content/Admin/Dropdown/Adjective">Open</translate></option> <option :value="true"><translate translate-context="Content/Admin/Dropdown/Adjective">Open</translate></option>
<option :value="false"><translate translate-context="Content/Admin/Dropdown/Adjective">Expired/used</translate></option> <option :value="false"><translate translate-context="Content/Admin/Dropdown/Adjective">Expired/used</translate></option>
</select> </select>
@ -37,10 +37,10 @@
:filters="actionFilters"> :filters="actionFilters">
<template slot="header-cells"> <template slot="header-cells">
<th><translate translate-context="Content/Admin/Table.Label">Owner</translate></th> <th><translate translate-context="Content/Admin/Table.Label">Owner</translate></th>
<th><translate translate-context="Content/Admin/Table.Label">Status</translate></th> <th><translate translate-context="Content/Admin/*/Noun (Value is Used/Not used)">Status</translate></th>
<th><translate translate-context="Content/Admin/Table.Label">Creation date</translate></th> <th><translate translate-context="Content/*/*/Noun">Creation date</translate></th>
<th><translate translate-context="Content/Admin/Table.Label">Expiration date</translate></th> <th><translate translate-context="Content/Admin/Table.Label/Noun">Expiration date</translate></th>
<th><translate translate-context="Content/Admin/Table.Label">Code</translate></th> <th><translate translate-context="Content/Admin/Table.Label/Noun">Code</translate></th>
</template> </template>
<template slot="row-cells" slot-scope="scope"> <template slot="row-cells" slot-scope="scope">
<td> <td>
@ -74,7 +74,7 @@
></pagination> ></pagination>
<span v-if="result && result.results.length > 0"> <span v-if="result && result.results.length > 0">
<translate translate-context="Content/Admin/Paragraph" <translate translate-context="Content/*/Paragraph"
:translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}"> :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
Showing results %{ start }-%{ end } on %{ total } Showing results %{ start }-%{ end } on %{ total }
</translate> </translate>
@ -150,7 +150,7 @@ export default {
computed: { computed: {
labels () { labels () {
return { return {
searchPlaceholder: this.$gettext('Search by username, e-mail address, code…') searchPlaceholder: this.$pgettext('Content/Admin/Input.Placeholder/Verb', 'Search by username, e-mail address, code…')
} }
}, },
actionFilters () { actionFilters () {
@ -164,7 +164,7 @@ export default {
} }
}, },
actions () { actions () {
let deleteLabel = this.$gettext('Delete') let deleteLabel = this.$pgettext('*/*/*/Verb', 'Delete')
return [ return [
{ {
name: 'delete', name: 'delete',

View File

@ -3,11 +3,11 @@
<div class="ui inline form"> <div class="ui inline form">
<div class="fields"> <div class="fields">
<div class="ui field"> <div class="ui field">
<label><translate translate-context="Content/Search/Input.Label/verb">Search</translate></label> <label><translate translate-context="Content/Search/Input.Label/Noun">Search</translate></label>
<input name="search" type="text" v-model="search" :placeholder="labels.searchPlaceholder" /> <input name="search" type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Input.Label/Noun">Ordering</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
<select class="ui dropdown" v-model="ordering"> <select class="ui dropdown" v-model="ordering">
<option v-for="option in orderingOptions" :value="option[0]"> <option v-for="option in orderingOptions" :value="option[0]">
{{ sharedLabels.filters[option[1]] }} {{ sharedLabels.filters[option[1]] }}
@ -35,13 +35,13 @@
:action-url="'manage/library/uploads/action/'" :action-url="'manage/library/uploads/action/'"
:filters="actionFilters"> :filters="actionFilters">
<template slot="header-cells"> <template slot="header-cells">
<th><translate translate-context="Content/Admin/Table.Label">Username</translate></th> <th><translate translate-context="Content/*/*">Username</translate></th>
<th><translate translate-context="Content/Admin/Table.Label">Email</translate></th> <th><translate translate-context="Content/*/*/Noun">Email</translate></th>
<th><translate translate-context="Content/Admin/Table.Label/Short, Noun">Account status</translate></th> <th><translate translate-context="Content/Admin/Table.Label/Short, Noun">Account status</translate></th>
<th><translate translate-context="Content/Admin/Table.Label/Short, Noun (Value is a date)">Sign-up</translate></th> <th><translate translate-context="Content/Admin/Table.Label/Short, Noun (Value is a date)">Sign-up</translate></th>
<th><translate translate-context="Content/Admin/Table.Label/Short, Noun (Value is a date)">Last activity</translate></th> <th><translate translate-context="Content/Profile/Table.Label/Short, Noun (Value is a date)">Last activity</translate></th>
<th><translate translate-context="Content/Admin/Table.Label/Noun">Permissions</translate></th> <th><translate translate-context="Content/Admin/Table.Label/Noun">Permissions</translate></th>
<th><translate translate-context="Content/Admin/Table.Label/Noun">Status</translate></th> <th><translate translate-context="Content/Admin/Table.Label/Noun (Value is Regular user/Admin)">Status</translate></th>
</template> </template>
<template slot="row-cells" slot-scope="scope"> <template slot="row-cells" slot-scope="scope">
<td> <td>
@ -68,8 +68,8 @@
</td> </td>
<td> <td>
<span v-if="scope.obj.is_superuser" class="ui pink label"><translate translate-context="Content/Admin/Table.User role">Admin</translate></span> <span v-if="scope.obj.is_superuser" class="ui pink label"><translate translate-context="Content/Admin/Table.User role">Admin</translate></span>
<span v-else-if="scope.obj.is_staff" class="ui purple label"><translate translate-context="Content/Admin/Table.User role">Staff member</translate></span> <span v-else-if="scope.obj.is_staff" class="ui purple label"><translate translate-context="Content/Profile/User role">Staff member</translate></span>
<span v-else class="ui basic label"><translate translate-context="Content/Admin/Table, User role">regular user</translate></span> <span v-else class="ui basic label"><translate translate-context="Content/Admin/Table, User role">Regular user</translate></span>
</td> </td>
</template> </template>
</action-table> </action-table>
@ -85,7 +85,7 @@
></pagination> ></pagination>
<span v-if="result && result.results.length > 0"> <span v-if="result && result.results.length > 0">
<translate translate-context="Content/Admin/Paragraph" <translate translate-context="Content/*/Paragraph"
:translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}"> :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
Showing results %{ start }-%{ end } on %{ total } Showing results %{ start }-%{ end } on %{ total }
</translate> </translate>
@ -170,15 +170,15 @@ export default {
return [ return [
{ {
'code': 'library', 'code': 'library',
'label': this.$pgettext('Content/Admin/Table', 'Library') 'label': this.$pgettext('*/*/*', 'Library')
}, },
{ {
'code': 'moderation', 'code': 'moderation',
'label': this.$pgettext('Content/Admin/Table', 'Moderation') 'label': this.$pgettext('*/Moderation/*', 'Moderation')
}, },
{ {
'code': 'settings', 'code': 'settings',
'label': this.$pgettext('Content/Admin/Table', 'Settings') 'label': this.$pgettext('*/*/*/Noun', 'Settings')
} }
] ]
}, },

View File

@ -46,7 +46,7 @@ export default Vue.extend({
computed: { computed: {
labels() { labels() {
return { return {
musicbrainz: this.$pgettext('Content/*/Link.Tooltip/Verb', "View on MusicBrainz") musicbrainz: this.$pgettext('Content/*/*/Clickable, Verb', "View on MusicBrainz")
} }
}, },
type() { type() {

View File

@ -50,7 +50,7 @@ export default Vue.extend({
computed: { computed: {
labels () { labels () {
return { return {
musicbrainz: this.$pgettext('Content/*/Link.Tooltip/Verb', 'View on MusicBrainz') musicbrainz: this.$pgettext('Content/*/*/Clickable, Verb', 'View on MusicBrainz')
} }
}, },
type () { type () {

View File

@ -127,15 +127,15 @@ export default {
return [ return [
{ {
value: 'artist', value: 'artist',
label: this.$pgettext('*/*/Noun', 'Artist') label: this.$pgettext('*/*/*/Noun', 'Artist')
}, },
{ {
value: 'release', value: 'release',
label: this.$pgettext('*/*/Noun', 'Album') label: this.$pgettext('*/*/*', 'Album')
}, },
{ {
value: 'recording', value: 'recording',
label: this.$pgettext('*/*/*', 'Track') label: this.$pgettext('*/*/*/Noun', 'Track')
} }
] ]
} }

View File

@ -15,7 +15,7 @@ export default {
} }
}, },
filters: { filters: {
creation_date: this.$pgettext('Content/*/Dropdown/Noun', 'Creation date'), creation_date: this.$pgettext('Content/*/*/Noun', 'Creation date'),
first_seen: this.$pgettext('Content/Moderation/Dropdown/Noun', 'First seen date'), first_seen: this.$pgettext('Content/Moderation/Dropdown/Noun', 'First seen date'),
last_seen: this.$pgettext('Content/Moderation/Dropdown/Noun', 'Last seen date'), last_seen: this.$pgettext('Content/Moderation/Dropdown/Noun', 'Last seen date'),
modification_date: this.$pgettext('Content/Playlist/Dropdown/Noun', 'Modification date'), modification_date: this.$pgettext('Content/Playlist/Dropdown/Noun', 'Modification date'),
@ -23,16 +23,16 @@ export default {
track_title: this.$pgettext('Content/*/Dropdown/Noun', 'Track name'), track_title: this.$pgettext('Content/*/Dropdown/Noun', 'Track name'),
album_title: this.$pgettext('Content/*/Dropdown/Noun', 'Album name'), album_title: this.$pgettext('Content/*/Dropdown/Noun', 'Album name'),
artist_name: this.$pgettext('Content/*/Dropdown/Noun', 'Artist name'), artist_name: this.$pgettext('Content/*/Dropdown/Noun', 'Artist name'),
name: this.$pgettext('Content/Moderation/*/Noun', 'Name'), name: this.$pgettext('*/*/*/Noun', 'Name'),
size: this.$pgettext('Content/Library/*/Noun, in MB', 'Size'), size: this.$pgettext('Content/Library/*/in MB', 'Size'),
bitrate: this.$pgettext('Content/*/*', 'Bitrate'), bitrate: this.$pgettext('Content/Track/*/Noun', 'Bitrate'),
duration: this.$pgettext('Content/*/*', 'Duration'), duration: this.$pgettext('Content/*/*', 'Duration'),
date_joined: this.$pgettext('Content/Profile/*/Noun', 'Sign-up date'), date_joined: this.$pgettext('Content/Admin/Table.Label/Noun', 'Sign-up date'),
last_activity: this.$pgettext('Content/Profile/*/Noun', 'Last activity'), last_activity: this.$pgettext('Content/Profile/Table.Label/Short, Noun (Value is a date)', 'Last activity'),
username: this.$pgettext('Content/Profile/*/Noun', 'Username'), username: this.$pgettext('Content/*/*', 'Username'),
domain: this.$pgettext('Content/Moderation/*/Noun', 'Domain'), domain: this.$pgettext('Content/Moderation/*/Noun', 'Domain'),
users: this.$pgettext('Content/Moderation/*/Noun', 'Users'), users: this.$pgettext('*/*/*/Noun', 'Users'),
received_messages: this.$pgettext('Content/Moderation/Dropdown/Noun', 'Received messages'), received_messages: this.$pgettext('Content/Moderation/*/Noun', 'Received messages'),
uploads: this.$pgettext('Content/Moderation/Table.Label/Noun', 'Uploads'), uploads: this.$pgettext('Content/Moderation/Table.Label/Noun', 'Uploads'),
followers: this.$pgettext('Content/Federation/*/Noun', 'Followers'), followers: this.$pgettext('Content/Federation/*/Noun', 'Followers'),
} }

View File

@ -37,7 +37,7 @@
</div> </div>
</div> </div>
<div class="actions"> <div class="actions">
<div class="ui cancel button"><translate translate-context="Popup/*/Button.Label">Cancel</translate></div> <div class="ui cancel button"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate></div>
<div :class="['ui', 'green', {loading: isLoading}, 'button']" @click="hide"><translate translate-context="Popup/*/Button.Label">Hide content</translate></div> <div :class="['ui', 'green', {loading: isLoading}, 'button']" @click="hide"><translate translate-context="Popup/*/Button.Label">Hide content</translate></div>
</div> </div>
</modal> </modal>

View File

@ -63,7 +63,7 @@ export default {
action = { action = {
buttonClass: 'green', buttonClass: 'green',
icon: 'check', icon: 'check',
label: this.$pgettext('Content/Notifications/Button.Label/Short, Verb', 'Approve'), label: this.$pgettext('Content/*/Button.Label/Verb', 'Approve'),
handler: () => { self.approveLibraryFollow(a.related_object) } handler: () => { self.approveLibraryFollow(a.related_object) }
} }
} else { } else {

View File

@ -38,12 +38,12 @@
</div> </div>
<dangerous-button :disabled="plts.length === 0" class="labeled right floated icon" color='yellow' :action="clearPlaylist"> <dangerous-button :disabled="plts.length === 0" class="labeled right floated icon" color='yellow' :action="clearPlaylist">
<i class="eraser icon"></i> <translate translate-context="Content/Playlist/Button.Label/Verb">Clear playlist</translate> <i class="eraser icon"></i> <translate translate-context="*/Playlist/Button.Label/Verb">Clear playlist</translate>
<p slot="modal-header"> <p slot="modal-header">
<translate translate-context="Popup/Playlist/Title" :translate-params="{playlist: playlist.name}">Do you want to clear the playlist "%{ playlist }"?</translate> <translate translate-context="Popup/Playlist/Title" :translate-params="{playlist: playlist.name}">Do you want to clear the playlist "%{ playlist }"?</translate>
</p> </p>
<p slot="modal-content"><translate translate-context="Popup/Playlist/Paragraph">This will remove all tracks from this playlist and cannot be undone.</translate></p> <p slot="modal-content"><translate translate-context="Popup/Playlist/Paragraph">This will remove all tracks from this playlist and cannot be undone.</translate></p>
<div slot="modal-confirm"><translate translate-context="Popup/Playlist/Button.Label">Clear playlist</translate></div> <div slot="modal-confirm"><translate translate-context="*/Playlist/Button.Label/Verb">Clear playlist</translate></div>
</dangerous-button> </dangerous-button>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<template v-if="plts.length > 0"> <template v-if="plts.length > 0">

View File

@ -29,9 +29,9 @@
<thead> <thead>
<tr> <tr>
<th></th> <th></th>
<th><translate translate-context="*/*/Table.Label">Name</translate></th> <th><translate translate-context="*/*/*/Noun">Name</translate></th>
<th class="sorted descending"><translate translate-context="Popup/Playlist/Table.Label/Short">Last modification</translate></th> <th class="sorted descending"><translate translate-context="Popup/Playlist/Table.Label/Short">Last modification</translate></th>
<th><translate translate-context="*/*/Table.Label">Tracks</translate></th> <th><translate translate-context="*/*/*/Noun">Tracks</translate></th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
@ -61,7 +61,7 @@
</div> </div>
</div> </div>
<div class="actions"> <div class="actions">
<div class="ui cancel button"><translate translate-context="Popup/Playlist/Button.Label">Cancel</translate></div> <div class="ui cancel button"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate></div>
</div> </div>
</modal> </modal>
</template> </template>

View File

@ -1,8 +1,8 @@
<template> <template>
<button @click="toggleRadio" :class="['ui', 'blue', {'inverted': running}, 'icon', 'labeled', 'button']"> <button @click="toggleRadio" :class="['ui', 'blue', {'inverted': running}, 'icon', 'labeled', 'button']">
<i class="ui feed icon"></i> <i class="ui feed icon"></i>
<template v-if="running"><translate translate-context="Content/Radio/Button.Label/Short, Verb">Stop radio</translate></template> <template v-if="running"><translate translate-context="*/Player/Button.Label/Short, Verb">Stop radio</translate></template>
<template v-else><translate translate-context="Content/Radio/Button.Label/Short, Verb">Start radio</translate></template> <template v-else><translate translate-context="*/Queue/Button.Label/Short, Verb">Start radio</translate></template>
</button> </button>
</template> </template>

View File

@ -21,7 +21,7 @@
class="ui basic yellow button right floated" class="ui basic yellow button right floated"
v-if="$store.state.auth.authenticated && type === 'custom' && radio.user.id === $store.state.auth.profile.id" v-if="$store.state.auth.authenticated && type === 'custom' && radio.user.id === $store.state.auth.profile.id"
:to="{name: 'library.radios.edit', params: {id: customRadioId }}"> :to="{name: 'library.radios.edit', params: {id: customRadioId }}">
<translate translate-context="Content/Radio/Card.Button.Label/Short, Verb">Edit</translate> <translate translate-context="Content/*/Button.Label/Verb">Edit</translate>
</router-link> </router-link>
</div> </div>
</div> </div>

View File

@ -7,14 +7,14 @@ export default {
id: 'title', id: 'title',
type: 'text', type: 'text',
required: true, required: true,
label: this.$pgettext('*/*/*/Short, Noun', 'Title'), label: this.$pgettext('Content/Track/*/Noun', 'Title'),
getValue: (obj) => { return obj.title } getValue: (obj) => { return obj.title }
}, },
{ {
id: 'license', id: 'license',
type: 'text', type: 'text',
required: false, required: false,
label: this.$pgettext('*/*/*/Short, Noun', 'License'), label: this.$pgettext('Content/*/*/Noun', 'License'),
getValue: (obj) => { return obj.license } getValue: (obj) => { return obj.license }
}, },
{ {

View File

@ -73,7 +73,7 @@ export default {
}), }),
labels() { labels() {
return { return {
title: this.$pgettext('Head/Notifications/Title', "Notifications") title: this.$pgettext('*/Notifications/*', "Notifications")
} }
} }
}, },

View File

@ -78,9 +78,9 @@ export default {
groups() { groups() {
// somehow, extraction fails if in the return block directly // somehow, extraction fails if in the return block directly
let instanceLabel = this.$pgettext('Content/Admin/Menu','Instance information') let instanceLabel = this.$pgettext('Content/Admin/Menu','Instance information')
let usersLabel = this.$pgettext('Content/Admin/Menu', 'Users') let usersLabel = this.$pgettext('*/*/*/Noun', 'Users')
let musicLabel = this.$pgettext('Content/Admin/Menu', 'Music') let musicLabel = this.$pgettext('*/*/*/Noun', 'Music')
let playlistsLabel = this.$pgettext('Content/Admin/Menu', 'Playlists') let playlistsLabel = this.$pgettext('*/*/*', 'Playlists')
let federationLabel = this.$pgettext('Content/Admin/Menu', 'Federation') let federationLabel = this.$pgettext('Content/Admin/Menu', 'Federation')
let subsonicLabel = this.$pgettext('Content/Admin/Menu', 'Subsonic') let subsonicLabel = this.$pgettext('Content/Admin/Menu', 'Subsonic')
let statisticsLabel = this.$pgettext('Content/Admin/Menu', 'Statistics') let statisticsLabel = this.$pgettext('Content/Admin/Menu', 'Statistics')

View File

@ -3,7 +3,7 @@
<nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu"> <nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu">
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.library.edits'}"><translate translate-context="Menu/Admin/Link">Edits</translate></router-link> :to="{name: 'manage.library.edits'}"><translate translate-context="*/Admin/*/Noun">Edits</translate></router-link>
</nav> </nav>
<router-view :key="$route.fullPath"></router-view> <router-view :key="$route.fullPath"></router-view>
</div> </div>
@ -14,7 +14,7 @@ export default {
computed: { computed: {
labels() { labels() {
let title = this.$pgettext('Head/Admin/Title', 'Manage library') let title = this.$pgettext('Head/Admin/Title', 'Manage library')
let secondaryMenu = this.$gettext('Menu/*/Hidden text', 'Secondary menu') let secondaryMenu = this.$pgettext('Menu/*/Hidden text', 'Secondary menu')
return { return {
title, title,
secondaryMenu secondaryMenu

View File

@ -21,7 +21,7 @@ export default {
computed: { computed: {
labels() { labels() {
return { return {
title: this.$pgettext('Head/Admin/Title/Noun', 'Edits') title: this.$pgettext('*/Admin/*/Noun', 'Edits')
} }
} }
} }

View File

@ -16,7 +16,7 @@
<template v-if="object.user"> <template v-if="object.user">
<span class="ui tiny teal icon label"> <span class="ui tiny teal icon label">
<i class="home icon"></i> <i class="home icon"></i>
<translate translate-context="Content/Moderation/List item">Local account</translate> <translate translate-context="Content/Moderation/*/Short, Noun">Local account</translate>
</span> </span>
&nbsp; &nbsp;
</template> </template>
@ -91,7 +91,7 @@
</tr> </tr>
<tr v-if="!object.user"> <tr v-if="!object.user">
<td> <td>
<translate translate-context="Content/*/*">Domain</translate> <translate translate-context="Content/Moderation/*/Noun">Domain</translate>
</td> </td>
<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 }}">
@ -125,17 +125,17 @@
@change="updateUser('is_active')" @change="updateUser('is_active')"
v-model="object.user.is_active" type="checkbox"> v-model="object.user.is_active" type="checkbox">
<label> <label>
<translate v-if="object.user.is_active" key="1" translate-context="Content/*/Label">Enabled</translate> <translate v-if="object.user.is_active" key="1" translate-context="*/*/*">Enabled</translate>
<translate v-else key="2" translate-context="Content/*/Label">Disabled</translate> <translate v-else key="2" translate-context="*/*/*">Disabled</translate>
</label> </label>
</div> </div>
<translate v-else-if="object.user.is_active" key="1" translate-context="Content/*/Label">Enabled</translate> <translate v-else-if="object.user.is_active" key="1" translate-context="*/*/*">Enabled</translate>
<translate v-else key="2" translate-context="Content/*/Label">Disabled</translate> <translate v-else key="2" translate-context="*/*/*">Disabled</translate>
</td> </td>
</tr> </tr>
<tr v-if="object.user"> <tr v-if="object.user">
<td> <td>
<translate translate-context="Content/Moderation/Table.Label">Permissions</translate> <translate translate-context="Content/Admin/Table.Label/Noun">Permissions</translate>
</td> </td>
<td> <td>
<select <select
@ -157,7 +157,7 @@
</tr> </tr>
<tr v-if="!object.user"> <tr v-if="!object.user">
<td> <td>
<translate translate-context="Content/*/Table.Label">First seen</translate> <translate translate-context="Content/Moderation/Table.Label/Short (Value is a date)">First seen</translate>
</td> </td>
<td> <td>
<human-date :date="object.creation_date"></human-date> <human-date :date="object.creation_date"></human-date>
@ -174,7 +174,7 @@
</tr> </tr>
<tr v-if="object.user"> <tr v-if="object.user">
<td> <td>
<translate translate-context="Content/*/Table.Label">Sign-up date</translate> <translate translate-context="Content/Admin/Table.Label/Noun">Sign-up date</translate>
</td> </td>
<td> <td>
<human-date :date="object.user.date_joined"></human-date> <human-date :date="object.user.date_joined"></human-date>
@ -182,7 +182,7 @@
</tr> </tr>
<tr v-if="object.user"> <tr v-if="object.user">
<td> <td>
<translate translate-context="Content/*/Table.Label">Last activity</translate> <translate translate-context="Content/Profile/Table.Label/Short, Noun (Value is a date)">Last activity</translate>
</td> </td>
<td> <td>
<human-date :date="object.user.last_activity"></human-date> <human-date :date="object.user.last_activity"></human-date>
@ -286,7 +286,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/*/*">Total size</translate> <translate translate-context="Content/Moderation/Table.Label">Total size</translate>
</td> </td>
<td> <td>
{{ stats.media_total_size | humanSize }} {{ stats.media_total_size | humanSize }}
@ -295,7 +295,7 @@
<tr> <tr>
<td> <td>
<translate translate-context="Content/Moderation/Table.Label">Libraries</translate> <translate translate-context="*/*/*/Noun">Libraries</translate>
</td> </td>
<td> <td>
{{ stats.libraries }} {{ stats.libraries }}
@ -311,7 +311,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/*/*">Artists</translate> <translate translate-context="*/*/*/Noun">Artists</translate>
</td> </td>
<td> <td>
{{ stats.artists }} {{ stats.artists }}
@ -319,7 +319,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/*/*">Albums</translate> <translate translate-context="*/*/*">Albums</translate>
</td> </td>
<td> <td>
{{ stats.albums}} {{ stats.albums}}
@ -327,7 +327,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/*/*">Tracks</translate> <translate translate-context="*/*/*/Noun">Tracks</translate>
</td> </td>
<td> <td>
{{ stats.tracks }} {{ stats.tracks }}
@ -459,15 +459,15 @@ export default {
return [ return [
{ {
code: "library", code: "library",
label: this.$pgettext('Content/Moderation/Dropdown', "Library") label: this.$pgettext('*/*/*', "Library")
}, },
{ {
code: "moderation", code: "moderation",
label: this.$pgettext('Content/Moderation/Dropdown', "Moderation") label: this.$pgettext('*/Moderation/*', "Moderation")
}, },
{ {
code: "settings", code: "settings",
label: this.$pgettext('Content/Moderation/Dropdown', "Settings") label: this.$pgettext('*/*/*/Noun', "Settings")
} }
] ]
} }

View File

@ -1,7 +1,7 @@
<template> <template>
<main v-title="labels.accounts"> <main v-title="labels.accounts">
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<h2 class="ui header"><translate translate-context="Content/Moderation/Title">Accounts</translate></h2> <h2 class="ui header"><translate translate-context="*/Moderation/Title">Accounts</translate></h2>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<accounts-table :update-url="true" :default-query="defaultQuery"></accounts-table> <accounts-table :update-url="true" :default-query="defaultQuery"></accounts-table>
</section> </section>
@ -21,7 +21,7 @@ export default {
computed: { computed: {
labels() { labels() {
return { return {
accounts: this.$pgettext('Head/Moderation/Title', "Accounts") accounts: this.$pgettext('*/Moderation/Title', "Accounts")
} }
} }
} }

View File

@ -3,10 +3,10 @@
<nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu"> <nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu">
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.moderation.domains.list'}"><translate translate-context="Menu/Moderation/Tab">Domains</translate></router-link> :to="{name: 'manage.moderation.domains.list'}"><translate translate-context="*/Moderation/*/Noun">Domains</translate></router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.moderation.accounts.list'}"><translate translate-context="Menu/Moderation/Tab">Accounts</translate></router-link> :to="{name: 'manage.moderation.accounts.list'}"><translate translate-context="*/Moderation/Title">Accounts</translate></router-link>
</nav> </nav>
<router-view :key="$route.fullPath"></router-view> <router-view :key="$route.fullPath"></router-view>
@ -18,7 +18,7 @@ export default {
computed: { computed: {
labels() { labels() {
return { return {
moderation: this.$pgettext('Head/Moderation/Title', "Moderation"), moderation: this.$pgettext('*/Moderation/*', "Moderation"),
secondaryMenu: this.$pgettext('Menu/*/Hidden text', "Secondary menu") secondaryMenu: this.$pgettext('Menu/*/Hidden text', "Secondary menu")
} }
} }

View File

@ -76,7 +76,7 @@
<tbody> <tbody>
<tr> <tr>
<td> <td>
<translate translate-context="Content/*/Table.Label">First seen</translate> <translate translate-context="Content/Moderation/Table.Label/Short (Value is a date)">First seen</translate>
</td> </td>
<td> <td>
<human-date :date="object.creation_date"></human-date> <human-date :date="object.creation_date"></human-date>
@ -98,15 +98,15 @@
<translate translate-context="Content/Moderation/Table.Label">Software</translate> <translate translate-context="Content/Moderation/Table.Label">Software</translate>
</td> </td>
<td> <td>
{{ lodash.get(object, 'nodeinfo.payload.software.name', $gettext('N/A')) }} ({{ lodash.get(object, 'nodeinfo.payload.software.version', $gettext('N/A')) }}) {{ lodash.get(object, 'nodeinfo.payload.software.name', $pgettext('*/*/*', 'N/A')) }} ({{ lodash.get(object, 'nodeinfo.payload.software.version', $pgettext('*/*/*', 'N/A')) }})
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/Moderation/Table.Label">Name</translate> <translate translate-context="*/*/*/Noun">Name</translate>
</td> </td>
<td> <td>
{{ lodash.get(object, 'nodeinfo.payload.metadata.nodeName', $gettext('N/A')) }} {{ lodash.get(object, 'nodeinfo.payload.metadata.nodeName', $pgettext('*/*/*', 'N/A')) }}
</td> </td>
</tr> </tr>
<tr> <tr>
@ -114,14 +114,14 @@
<translate translate-context="Content/*/*">Total users</translate> <translate translate-context="Content/*/*">Total users</translate>
</td> </td>
<td> <td>
{{ lodash.get(object, 'nodeinfo.payload.usage.users.total', $gettext('N/A')) }} {{ lodash.get(object, 'nodeinfo.payload.usage.users.total', $pgettext('*/*/*', 'N/A')) }}
</td> </td>
</tr> </tr>
</template> </template>
<template v-if="object.nodeinfo && object.nodeinfo.status === 'error'"> <template v-if="object.nodeinfo && object.nodeinfo.status === 'error'">
<tr> <tr>
<td> <td>
<translate translate-context="Content/Moderation/Table.Label">Status</translate> <translate translate-context="Content/Moderation/Table.Label (Value is Error message)">Status</translate>
</td> </td>
<td> <td>
<translate translate-context="Content/Moderation/Table">Error while fetching node info</translate>&nbsp; <translate translate-context="Content/Moderation/Table">Error while fetching node info</translate>&nbsp;
@ -231,7 +231,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/Moderation/Table.Label">Libraries</translate> <translate translate-context="*/*/*/Noun">Libraries</translate>
</td> </td>
<td> <td>
{{ stats.libraries }} {{ stats.libraries }}
@ -247,7 +247,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/*/*">Artists</translate> <translate translate-context="*/*/*/Noun">Artists</translate>
</td> </td>
<td> <td>
{{ stats.artists }} {{ stats.artists }}
@ -255,7 +255,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/*/*">Albums</translate> <translate translate-context="*/*/*">Albums</translate>
</td> </td>
<td> <td>
{{ stats.albums}} {{ stats.albums}}
@ -263,7 +263,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/*/*">Tracks</translate> <translate translate-context="*/*/*/Noun">Tracks</translate>
</td> </td>
<td> <td>
{{ stats.tracks }} {{ stats.tracks }}

View File

@ -1,7 +1,7 @@
<template> <template>
<main v-title="labels.domains"> <main v-title="labels.domains">
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<h2 class="ui left floated header"><translate translate-context="Content/Moderation/Title">Domains</translate></h2> <h2 class="ui left floated header"><translate translate-context="*/Moderation/*/Noun">Domains</translate></h2>
<form class="ui right floated form" @submit.prevent="createDomain"> <form class="ui right floated form" @submit.prevent="createDomain">
<div v-if="errors && errors.length > 0" class="ui negative message"> <div v-if="errors && errors.length > 0" class="ui negative message">
<div class="header"><translate translate-context="Content/Moderation/Message.Title">Error while creating domain</translate></div> <div class="header"><translate translate-context="Content/Moderation/Message.Title">Error while creating domain</translate></div>
@ -45,7 +45,7 @@ export default {
computed: { computed: {
labels() { labels() {
return { return {
domains: this.$pgettext('Head/Moderation/Title', "Domains") domains: this.$pgettext('*/Moderation/*/Noun', "Domains")
} }
} }
}, },

View File

@ -3,10 +3,10 @@
<nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu"> <nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu">
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.users.users.list'}"><translate translate-context="*/Admin/Link">Users</translate></router-link> :to="{name: 'manage.users.users.list'}"><translate translate-context="*/*/*/Noun">Users</translate></router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.users.invitations.list'}"><translate translate-context="Menu/Admin/Link">Invitations</translate></router-link> :to="{name: 'manage.users.invitations.list'}"><translate translate-context="*/Admin/*/Noun">Invitations</translate></router-link>
</nav> </nav>
<router-view :key="$route.fullPath"></router-view> <router-view :key="$route.fullPath"></router-view>
</div> </div>

View File

@ -1,7 +1,7 @@
<template> <template>
<main v-title="labels.invitations"> <main v-title="labels.invitations">
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<h2 class="ui header"><translate translate-context="*/Admin/Title">Invitations</translate></h2> <h2 class="ui header">{{ labels.invitations }}</h2>
<invitation-form></invitation-form> <invitation-form></invitation-form>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<invitations-table></invitations-table> <invitations-table></invitations-table>
@ -21,7 +21,7 @@ export default {
computed: { computed: {
labels() { labels() {
return { return {
invitations: this.$pgettext('*/Admin/Title', 'Invitations') invitations: this.$pgettext('*/Admin/*/Noun', 'Invitations')
} }
} }
} }

View File

@ -1,7 +1,7 @@
<template> <template>
<main v-title="labels.users"> <main v-title="labels.users">
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<h2 class="ui header"><translate translate-context="*/Admin/Title">Users</translate></h2> <h2 class="ui header">{{ labels.users }}</h2>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<users-table></users-table> <users-table></users-table>
</section> </section>
@ -18,7 +18,7 @@ export default {
computed: { computed: {
labels() { labels() {
return { return {
users: this.$pgettext('*/Admin/Title', 'Users') users: this.$pgettext('*/*/*/Noun', 'Users')
} }
} }
} }

View File

@ -2,7 +2,7 @@
<main class="main pusher" v-title="labels.confirm"> <main class="main pusher" v-title="labels.confirm">
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<div class="ui small text container"> <div class="ui small text container">
<h2><translate translate-context="Content/Signup/Title">Confirm your e-mail address</translate></h2> <h2>{{ labels.confirm }}</h2>
<form v-if="!success" class="ui form" @submit.prevent="submit()"> <form v-if="!success" class="ui form" @submit.prevent="submit()">
<div v-if="errors.length > 0" class="ui negative message"> <div v-if="errors.length > 0" class="ui negative message">
<div class="header"><translate translate-context="Content/Signup/Paragraph">Could not confirm your e-mail address</translate></div> <div class="header"><translate translate-context="Content/Signup/Paragraph">Could not confirm your e-mail address</translate></div>
@ -18,7 +18,7 @@
<translate translate-context="Content/Signup/Link/Verb">Return to login</translate> <translate translate-context="Content/Signup/Link/Verb">Return to login</translate>
</router-link> </router-link>
<button :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit"> <button :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit">
<translate translate-context="Content/Signup/Button.Label/Verb">Confirm your e-mail address</translate></button> {{ labels.confirm }}</button>
</form> </form>
<div v-else class="ui positive message"> <div v-else class="ui positive message">
<div class="header"><translate translate-context="Content/Signup/Message">E-mail address confirmed</translate></div> <div class="header"><translate translate-context="Content/Signup/Message">E-mail address confirmed</translate></div>

View File

@ -2,7 +2,7 @@
<main class="main pusher" v-title="labels.reset"> <main class="main pusher" v-title="labels.reset">
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<div class="ui small text container"> <div class="ui small text container">
<h2><translate translate-context="Content/Signup/Title">Reset your password</translate></h2> <h2><translate translate-context="*/Login/*/Verb">Reset your password</translate></h2>
<form class="ui form" @submit.prevent="submit()"> <form class="ui form" @submit.prevent="submit()">
<div v-if="errors.length > 0" class="ui negative message"> <div v-if="errors.length > 0" class="ui negative message">
<div class="header"><translate translate-context="Content/Signup/Card.Title">Error while asking for a password reset</translate></div> <div class="header"><translate translate-context="Content/Signup/Card.Title">Error while asking for a password reset</translate></div>
@ -50,7 +50,7 @@ export default {
}, },
computed: { computed: {
labels() { labels() {
let reset = this.$pgettext('Head/Signup/Title', "Reset your password") let reset = this.$pgettext('*/Login/*/Verb', "Reset your password")
let placeholder = this.$pgettext('Content/Signup/Input.Placeholder', "Enter the email address binded to your account" let placeholder = this.$pgettext('Content/Signup/Input.Placeholder', "Enter the email address binded to your account"
) )
return { return {

View File

@ -2,7 +2,7 @@
<main class="main pusher" v-title="labels.changePassword"> <main class="main pusher" v-title="labels.changePassword">
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<div class="ui small text container"> <div class="ui small text container">
<h2><translate translate-context="Content/Signup/Title">Change your password</translate></h2> <h2>{{ labels.changePassword }}</h2>
<form v-if="!success" class="ui form" @submit.prevent="submit()"> <form v-if="!success" class="ui form" @submit.prevent="submit()">
<div v-if="errors.length > 0" class="ui negative message"> <div v-if="errors.length > 0" class="ui negative message">
<div class="header"><translate translate-context="Content/Signup/Card.Title">Error while changing your password</translate></div> <div class="header"><translate translate-context="Content/Signup/Card.Title">Error while changing your password</translate></div>
@ -12,7 +12,7 @@
</div> </div>
<template v-if="token && uid"> <template v-if="token && uid">
<div class="field"> <div class="field">
<label><translate translate-context="Content/Signup/Input.Label">New password</translate></label> <label><translate translate-context="Content/Settings/Input.Label">New password</translate></label>
<password-input v-model="newPassword" /> <password-input v-model="newPassword" />
</div> </div>
<router-link :to="{path: '/login'}"> <router-link :to="{path: '/login'}">
@ -59,7 +59,7 @@ export default {
computed: { computed: {
labels() { labels() {
return { return {
changePassword: this.$pgettext('Head/Signup/Title', "Change your password") changePassword: this.$pgettext('*/Signup/Title', "Change your password")
} }
} }
}, },

View File

@ -3,10 +3,10 @@
<nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu"> <nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu">
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'content.libraries.index'}"><translate translate-context="Menu/Library/Tab.Link">Libraries</translate></router-link> :to="{name: 'content.libraries.index'}"><translate translate-context="*/*/*/Noun">Libraries</translate></router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'content.libraries.files'}"><translate translate-context="Menu/Library/Tab.Link">Tracks</translate></router-link> :to="{name: 'content.libraries.files'}"><translate translate-context="*/*/*/Noun">Tracks</translate></router-link>
</nav> </nav>
<router-view :key="$route.fullPath"></router-view> <router-view :key="$route.fullPath"></router-view>
</main> </main>
@ -15,7 +15,7 @@
export default { export default {
computed: { computed: {
labels() { labels() {
let title = this.$pgettext('Head/Library/Title', "Add content") let title = this.$pgettext('*/Library/*/Verb', "Add content")
let secondaryMenu = this.$pgettext('Menu/*/Hidden text', "Secondary menu") let secondaryMenu = this.$pgettext('Menu/*/Hidden text', "Secondary menu")
return { return {
title, title,

View File

@ -37,7 +37,7 @@
{{ library.size | humanSize }} {{ library.size | humanSize }}
</span> </span>
<i class="music icon"></i> <i class="music icon"></i>
<translate translate-context="Content/Library/Card.List item" :translate-params="{count: library.uploads_count}" :translate-n="library.uploads_count" translate-plural="%{ count } tracks">%{ count } track</translate> <translate translate-context="*/*/*" :translate-params="{count: library.uploads_count}" :translate-n="library.uploads_count" translate-plural="%{ count } tracks">%{ count } track</translate>
</div> </div>
</div> </div>
<div class="ui bottom basic attached buttons"> <div class="ui bottom basic attached buttons">

View File

@ -5,9 +5,9 @@
</div> </div>
<detail-area v-else :library="library"> <detail-area v-else :library="library">
<div class="ui top attached tabular menu"> <div class="ui top attached tabular menu">
<a :class="['item', {active: currentTab === 'follows'}]" @click="currentTab = 'follows'"><translate translate-context="Content/Library/Tab.Title">Followers</translate></a> <a :class="['item', {active: currentTab === 'follows'}]" @click="currentTab = 'follows'"><translate translate-context="Content/Federation/*/Noun">Followers</translate></a>
<a :class="['item', {active: currentTab === 'tracks'}]" @click="currentTab = 'tracks'"><translate translate-context="*/*/*">Tracks</translate></a> <a :class="['item', {active: currentTab === 'tracks'}]" @click="currentTab = 'tracks'"><translate translate-context="*/*/*/Noun">Tracks</translate></a>
<a :class="['item', {active: currentTab === 'edit'}]" @click="currentTab = 'edit'"><translate translate-context="*/*/*/Verb">Edit</translate></a> <a :class="['item', {active: currentTab === 'edit'}]" @click="currentTab = 'edit'"><translate translate-context="Content/*/Button.Label/Verb">Edit</translate></a>
</div> </div>
<div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'follows'}]"> <div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'follows'}]">
<div class="ui form"> <div class="ui form">
@ -26,7 +26,7 @@
<tr> <tr>
<th><translate translate-context="Content/Library/Table.Label">User</translate></th> <th><translate translate-context="Content/Library/Table.Label">User</translate></th>
<th><translate translate-context="Content/Library/Table.Label">Date</translate></th> <th><translate translate-context="Content/Library/Table.Label">Date</translate></th>
<th><translate translate-context="Content/Library/Table.Label">Status</translate></th> <th><translate translate-context="Content/Library.Federation/Table.Label (Value is Approved/Rejected)">Status</translate></th>
<th><translate translate-context="Content/Library/Table.Label">Action</translate></th> <th><translate translate-context="Content/Library/Table.Label">Action</translate></th>
</tr> </tr>
</thead> </thead>
@ -41,7 +41,7 @@
<translate translate-context="Content/Library/Table/Short">Accepted</translate> <translate translate-context="Content/Library/Table/Short">Accepted</translate>
</span> </span>
<span :class="['ui', 'red', 'basic', 'label']" v-else-if="follow.approved === false"> <span :class="['ui', 'red', 'basic', 'label']" v-else-if="follow.approved === false">
<translate translate-context="Content/Library/Table/Short">Rejected</translate> <translate translate-context="Content/Library/*/Short">Rejected</translate>
</span> </span>
</td> </td>
<td> <td>

View File

@ -3,23 +3,23 @@
<div class="ui inline form"> <div class="ui inline form">
<div class="fields"> <div class="fields">
<div class="ui six wide field"> <div class="ui six wide field">
<label><translate translate-context="Content/Library/Input.Label/Verb">Search</translate></label> <label><translate translate-context="Content/Search/Input.Label/Noun">Search</translate></label>
<form @submit.prevent="search.query = $refs.search.value"> <form @submit.prevent="search.query = $refs.search.value">
<input name="search" ref="search" type="text" :value="search.query" :placeholder="labels.searchPlaceholder" /> <input name="search" ref="search" type="text" :value="search.query" :placeholder="labels.searchPlaceholder" />
</form> </form>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Library/Dropdown.Label/Noun">Import status</translate></label> <label><translate translate-context="Content/Library/*/Noun">Import status</translate></label>
<select class="ui dropdown" @change="addSearchToken('status', $event.target.value)" :value="getTokenValue('status', '')"> <select class="ui dropdown" @change="addSearchToken('status', $event.target.value)" :value="getTokenValue('status', '')">
<option value=""><translate translate-context="Content/Library/Dropdown">All</translate></option> <option value=""><translate translate-context="Content/*/Dropdown">All</translate></option>
<option value="pending"><translate translate-context="Content/Library/Dropdown">Pending</translate></option> <option value="pending"><translate translate-context="Content/Library/*/Short">Pending</translate></option>
<option value="skipped"><translate translate-context="Content/Library/Dropdown">Skipped</translate></option> <option value="skipped"><translate translate-context="Content/Library/*">Skipped</translate></option>
<option value="errored"><translate translate-context="Content/Library/Dropdown">Failed</translate></option> <option value="errored"><translate translate-context="Content/Library/Dropdown">Failed</translate></option>
<option value="finished"><translate translate-context="Content/Library/Dropdown">Finished</translate></option> <option value="finished"><translate translate-context="Content/Library/*">Finished</translate></option>
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Library/Dropdown.Label/Noun">Ordering</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
<select class="ui dropdown" v-model="ordering"> <select class="ui dropdown" v-model="ordering">
<option v-for="option in orderingOptions" :value="option[0]"> <option v-for="option in orderingOptions" :value="option[0]">
{{ sharedLabels.filters[option[1]] }} {{ sharedLabels.filters[option[1]] }}
@ -27,10 +27,10 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Library/Dropdown.Label/Noun">Ordering direction</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering direction</translate></label>
<select class="ui dropdown" v-model="orderingDirection"> <select class="ui dropdown" v-model="orderingDirection">
<option value="+"><translate translate-context="Content/Library/Dropdown">Ascending</translate></option> <option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option>
<option value="-"><translate translate-context="Content/Library/Dropdown">Descending</translate></option> <option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option>
</select> </select>
</div> </div>
</div> </div>
@ -52,13 +52,13 @@
@refresh="fetchData" @refresh="fetchData"
:filters="actionFilters"> :filters="actionFilters">
<template slot="header-cells"> <template slot="header-cells">
<th><translate translate-context="*/*/*">Title</translate></th> <th><translate translate-context="Content/Track/*/Noun">Title</translate></th>
<th><translate translate-context="*/*/*">Artist</translate></th> <th><translate translate-context="*/*/*/Noun">Artist</translate></th>
<th><translate translate-context="*/*/*">Album</translate></th> <th><translate translate-context="*/*/*">Album</translate></th>
<th><translate translate-context="*/*/*/Noun">Upload date</translate></th> <th><translate translate-context="*/*/*/Noun">Upload date</translate></th>
<th><translate translate-context="*/*/*/Noun">Import status</translate></th> <th><translate translate-context="Content/Library/*/Noun">Import status</translate></th>
<th><translate translate-context="*/*/*">Duration</translate></th> <th><translate translate-context="Content/*/*">Duration</translate></th>
<th><translate translate-context="*/*/*">Size</translate></th> <th><translate translate-context="Content/Library/*/in MB">Size</translate></th>
</template> </template>
<template slot="row-cells" slot-scope="scope"> <template slot="row-cells" slot-scope="scope">
<template v-if="scope.obj.track"> <template v-if="scope.obj.track">
@ -112,7 +112,7 @@
></pagination> ></pagination>
<span v-if="result && result.results.length > 0"> <span v-if="result && result.results.length > 0">
<translate translate-context="Content/Library/Paragraph" <translate translate-context="Content/*/Paragraph"
:translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}"> :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
Showing results %{ start }-%{ end } on %{ total } Showing results %{ start }-%{ end } on %{ total }
</translate> </translate>
@ -201,11 +201,11 @@ export default {
searchPlaceholder: this.$pgettext('Content/Library/Input.Placeholder', 'Search by title, artist, album…'), searchPlaceholder: this.$pgettext('Content/Library/Input.Placeholder', 'Search by title, artist, album…'),
importStatuses: { importStatuses: {
skipped: { skipped: {
label: this.$pgettext('Content/Library/Table/Short', 'Skipped'), label: this.$pgettext('Content/Library/*', 'Skipped'),
help: this.$pgettext('Content/Library/Help text', 'This track is already present in one of your libraries'), help: this.$pgettext('Content/Library/Help text', 'This track is already present in one of your libraries'),
}, },
pending: { pending: {
label: this.$pgettext('Content/Library/Table/Short', 'Pending'), label: this.$pgettext('Content/Library/*/Short', 'Pending'),
help: this.$pgettext('Content/Library/Help text', 'This track has been uploaded, but hasn\'t been processed by the server yet'), help: this.$pgettext('Content/Library/Help text', 'This track has been uploaded, but hasn\'t been processed by the server yet'),
}, },
errored: { errored: {
@ -213,7 +213,7 @@ export default {
help: this.$pgettext('Content/Library/Help text', 'This track could not be processed, please it is tagged correctly'), help: this.$pgettext('Content/Library/Help text', 'This track could not be processed, please it is tagged correctly'),
}, },
finished: { finished: {
label: this.$pgettext('Content/Library/Table/Short', 'Finished'), label: this.$pgettext('Content/Library/*', 'Finished'),
help: this.$pgettext('Content/Library/Help text', 'Imported'), help: this.$pgettext('Content/Library/Help text', 'Imported'),
}, },
} }
@ -230,7 +230,7 @@ export default {
} }
}, },
actions () { actions () {
let deleteMsg = this.$pgettext('Content/Library/Dropdown/Verb', 'Delete') let deleteMsg = this.$pgettext('*/*/*/Verb', 'Delete')
let relaunchMsg = this.$pgettext('Content/Library/Dropdown/Verb', 'Restart import') let relaunchMsg = this.$pgettext('Content/Library/Dropdown/Verb', 'Restart import')
return [ return [
{ {

View File

@ -2,17 +2,17 @@
<form class="ui form" @submit.prevent="submit"> <form class="ui form" @submit.prevent="submit">
<p v-if="!library"><translate translate-context="Content/Library/Paragraph">Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family.</translate></p> <p v-if="!library"><translate translate-context="Content/Library/Paragraph">Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family.</translate></p>
<div v-if="errors.length > 0" class="ui negative message"> <div v-if="errors.length > 0" class="ui negative message">
<div class="header"><translate translate-context="Content/Library/Error message.Title">Error</translate></div> <div class="header"><translate translate-context="Content/*/Error message.Title">Error</translate></div>
<ul class="list"> <ul class="list">
<li v-for="error in errors">{{ error }}</li> <li v-for="error in errors">{{ error }}</li>
</ul> </ul>
</div> </div>
<div class="required field"> <div class="required field">
<label><translate translate-context="Content/Library/Input.Label">Name</translate></label> <label><translate translate-context="*/*/*/Noun">Name</translate></label>
<input name="name" v-model="currentName" :placeholder="labels.namePlaceholder" required maxlength="100"> <input name="name" v-model="currentName" :placeholder="labels.namePlaceholder" required maxlength="100">
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Library/Input.Label">Description</translate></label> <label><translate translate-context="Content/*/Input.Label/Noun">Description</translate></label>
<textarea v-model="currentDescription" :placeholder="labels.descriptionPlaceholder" maxlength="2000"></textarea> <textarea v-model="currentDescription" :placeholder="labels.descriptionPlaceholder" maxlength="2000"></textarea>
</div> </div>
<div class="field"> <div class="field">
@ -27,7 +27,7 @@
<translate translate-context="Content/Library/Button.Label/Verb" v-else>Create library</translate> <translate translate-context="Content/Library/Button.Label/Verb" v-else>Create library</translate>
</button> </button>
<dangerous-button v-if="library" class="right floated basic button" color='red' @confirm="remove()"> <dangerous-button v-if="library" class="right floated basic button" color='red' @confirm="remove()">
<translate translate-context="Content/Library/Button.Label/Verb">Delete</translate> <translate translate-context="*/*/*/Verb">Delete</translate>
<p slot="modal-header"> <p slot="modal-header">
<translate translate-context="Popup/Library/Title">Delete this library?</translate> <translate translate-context="Popup/Library/Title">Delete this library?</translate>
</p> </p>

View File

@ -34,10 +34,10 @@
color="grey" color="grey"
class="basic tiny" class="basic tiny"
:action="purgePendingFiles"> :action="purgePendingFiles">
<translate translate-context="Content/Library/Button.Label/Verb">Purge</translate> <translate translate-context="*/*/*/Verb">Purge</translate>
<p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge pending files?</translate></p> <p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge pending files?</translate></p>
<p slot="modal-content"><translate translate-context="Popup/Library/Paragraph">Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota.</translate></p> <p slot="modal-content"><translate translate-context="Popup/Library/Paragraph">Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota.</translate></p>
<div slot="modal-confirm"><translate translate-context="Popup/Library/Button.Label">Purge</translate></div> <div slot="modal-confirm"><translate translate-context="*/*/*/Verb">Purge</translate></div>
</dangerous-button> </dangerous-button>
</div> </div>
</div> </div>
@ -60,10 +60,10 @@
color="grey" color="grey"
class="basic tiny" class="basic tiny"
:action="purgeSkippedFiles"> :action="purgeSkippedFiles">
<translate translate-context="Content/Library/Button.Label/Verb">Purge</translate> <translate translate-context="*/*/*/Verb">Purge</translate>
<p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge skipped files?</translate></p> <p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge skipped files?</translate></p>
<p slot="modal-content"><translate translate-context="Popup/Library/Paragraph">Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota.</translate></p> <p slot="modal-content"><translate translate-context="Popup/Library/Paragraph">Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota.</translate></p>
<div slot="modal-confirm"><translate translate-context="Popup/Library/Button.Label">Purge</translate></div> <div slot="modal-confirm"><translate translate-context="*/*/*/Verb">Purge</translate></div>
</dangerous-button> </dangerous-button>
</div> </div>
</div> </div>
@ -86,10 +86,10 @@
color="grey" color="grey"
class="basic tiny" class="basic tiny"
:action="purgeErroredFiles"> :action="purgeErroredFiles">
<translate translate-context="Content/Library/Button.Label/Verb">Purge</translate> <translate translate-context="*/*/*/Verb">Purge</translate>
<p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge errored files?</translate></p> <p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge errored files?</translate></p>
<p slot="modal-content"><translate translate-context="Popup/Library/Paragraph">Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota.</translate></p> <p slot="modal-content"><translate translate-context="Popup/Library/Paragraph">Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota.</translate></p>
<div slot="modal-confirm"><translate translate-context="Popup/Library/Button.Label">Purge</translate></div> <div slot="modal-confirm"><translate translate-context="*/*/*/Verb">Purge</translate></div>
</dangerous-button> </dangerous-button>
</div> </div>
</div> </div>

View File

@ -24,7 +24,7 @@
</div> </div>
<div class="meta"> <div class="meta">
<i class="music icon"></i> <i class="music icon"></i>
<translate translate-context="Content/Library/Card.List item" :translate-params="{count: library.uploads_count}" :translate-n="library.uploads_count" translate-plural="%{ count } tracks">%{ count } track</translate> <translate translate-context="*/*/*" :translate-params="{count: library.uploads_count}" :translate-n="library.uploads_count" translate-plural="%{ count } tracks">%{ count } track</translate>
</div> </div>
<div v-if="displayScan && latestScan" class="meta"> <div v-if="displayScan && latestScan" class="meta">
<template v-if="latestScan.status === 'pending'"> <template v-if="latestScan.status === 'pending'">
@ -48,7 +48,7 @@
<translate translate-context="Content/Library/Card.List item">Scanned with errors</translate> <translate translate-context="Content/Library/Card.List item">Scanned with errors</translate>
</template> </template>
<span class="link right floated" @click="showScan = !showScan"> <span class="link right floated" @click="showScan = !showScan">
<translate translate-context="Content/Library/Card.Link">Details</translate> <translate translate-context="Content/Library/Card.Button.Label/Noun">Details</translate>
<i v-if="showScan" class="angle down icon" /> <i v-if="showScan" class="angle down icon" />
<i v-else class="angle right icon" /> <i v-else class="angle right icon" />
</span> </span>
@ -98,12 +98,12 @@
color="" color=""
:class="['ui', 'button']" :class="['ui', 'button']"
:action="unfollow"> :action="unfollow">
<translate translate-context="Content/Library/Card.Button.Label/Verb">Unfollow</translate> <translate translate-context="*/Library/Button.Label/Verb">Unfollow</translate>
<p slot="modal-header"><translate translate-context="Popup/Library/Title">Unfollow this library?</translate></p> <p slot="modal-header"><translate translate-context="Popup/Library/Title">Unfollow this library?</translate></p>
<div slot="modal-content"> <div slot="modal-content">
<p><translate translate-context="Popup/Library/Paragraph">By unfollowing this library, you loose access to its content.</translate></p> <p><translate translate-context="Popup/Library/Paragraph">By unfollowing this library, you loose access to its content.</translate></p>
</div> </div>
<div slot="modal-confirm"><translate translate-context="Popup/Library/Button.Label">Unfollow</translate></div> <div slot="modal-confirm"><translate translate-context="*/Library/Button.Label/Verb">Unfollow</translate></div>
</dangerous-button> </dangerous-button>
</div> </div>
</div> </div>

View File

@ -13,7 +13,7 @@
</div> </div>
<template v-if="existingFollows && existingFollows.count > 0"> <template v-if="existingFollows && existingFollows.count > 0">
<h2><translate translate-context="Content/Library/Title">Known libraries</translate></h2> <h2><translate translate-context="Content/Library/Title">Known libraries</translate></h2>
<i @click="fetch()" :class="['ui', 'circular', 'refresh', 'icon']" /> <translate translate-context="Content/Library/Button.Label">Refresh</translate> <i @click="fetch()" :class="['ui', 'circular', 'refresh', 'icon']" /> <translate translate-context="Content/*/Button.Label/Short, Verb">Refresh</translate>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<div class="ui two cards"> <div class="ui two cards">
<library-card <library-card

View File

@ -22,17 +22,17 @@
</div> </div>
</h2> </h2>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<play-button class="orange" :is-playable="playlist.is_playable" :tracks="tracks"><translate translate-context="Content/*/Button.Label/Verb, Short">Play all</translate></play-button> <play-button class="orange" :is-playable="playlist.is_playable" :tracks="tracks"><translate translate-context="Content/Queue/Button.Label/Short, Verb">Play all</translate></play-button>
<button <button
class="ui icon labeled button" class="ui icon labeled button"
v-if="$store.state.auth.profile && playlist.user.id === $store.state.auth.profile.id" v-if="$store.state.auth.profile && playlist.user.id === $store.state.auth.profile.id"
@click="edit = !edit"> @click="edit = !edit">
<i class="pencil icon"></i> <i class="pencil icon"></i>
<template v-if="edit"><translate translate-context="Content/Playlist/Button.Label/Verb">End edition</translate></template> <template v-if="edit"><translate translate-context="Content/Playlist/Button.Label/Verb">End edition</translate></template>
<template v-else><translate translate-context="Content/*/Button.Label/Verb">Edit</translate></template> <template v-else><translate translate-context="Content/*/Button.Label/Verb">Edit</translate></template>
</button> </button>
<dangerous-button v-if="$store.state.auth.profile && playlist.user.id === $store.state.auth.profile.id" class="labeled icon" :action="deletePlaylist"> <dangerous-button v-if="$store.state.auth.profile && playlist.user.id === $store.state.auth.profile.id" class="labeled icon" :action="deletePlaylist">
<i class="trash icon"></i> <translate translate-context="Content/*/Button.Label/Verb">Delete</translate> <i class="trash icon"></i> <translate translate-context="*/*/*/Verb">Delete</translate>
<p slot="modal-header"> <p slot="modal-header">
<translate :translate-params="{playlist: playlist.name}" translate-context="Popup/Playlist/Title/Call to action">Do you want to delete the playlist "%{ playlist }"?</translate> <translate :translate-params="{playlist: playlist.name}" translate-context="Popup/Playlist/Title/Call to action">Do you want to delete the playlist "%{ playlist }"?</translate>
</p> </p>
@ -49,7 +49,7 @@
:playlist="playlist" :playlist-tracks="playlistTracks"></playlist-editor> :playlist="playlist" :playlist-tracks="playlistTracks"></playlist-editor>
</template> </template>
<template v-else> <template v-else>
<h2><translate translate-context="Content/*/Title/Name">Tracks</translate></h2> <h2><translate translate-context="*/*/*/Noun">Tracks</translate></h2>
<track-table :display-position="true" :tracks="tracks"></track-table> <track-table :display-position="true" :tracks="tracks"></track-table>
</template> </template>
</section> </section>
@ -88,7 +88,7 @@ export default {
computed: { computed: {
labels() { labels() {
return { return {
playlist: this.$gettext('Playlist') playlist: this.$pgettext('Head/Playlist/Title', 'Playlist')
} }
} }
}, },

View File

@ -11,11 +11,11 @@
</template> </template>
<div class="fields"> <div class="fields">
<div class="field"> <div class="field">
<label><translate translate-context="Content/*/Form.Label/Short, Noun">Search</translate></label> <label><translate translate-context="Content/Search/Input.Label/Noun">Search</translate></label>
<input type="text" name="search" v-model="query" :placeholder="labels.searchPlaceholder"/> <input type="text" name="search" v-model="query" :placeholder="labels.searchPlaceholder"/>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/*/Dropdown.Label/Short, Noun">Ordering</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
<select class="ui dropdown" v-model="ordering"> <select class="ui dropdown" v-model="ordering">
<option v-for="option in orderingOptions" :value="option[0]"> <option v-for="option in orderingOptions" :value="option[0]">
{{ sharedLabels.filters[option[1]] }} {{ sharedLabels.filters[option[1]] }}
@ -23,14 +23,14 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/*/Dropdown.Label/Short, Noun">Order</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Order</translate></label>
<select class="ui dropdown" v-model="orderingDirection"> <select class="ui dropdown" v-model="orderingDirection">
<option value="+"><translate translate-context="Content/*/Dropdown/Short">Ascending</translate></option> <option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option>
<option value="-"><translate translate-context="Content/*/Dropdown/Short">Descending</translate></option> <option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option>
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/*/Dropdown.Label/Short, Noun">Results per page</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Results per page</translate></label>
<select class="ui dropdown" v-model="paginateBy"> <select class="ui dropdown" v-model="paginateBy">
<option :value="parseInt(12)">12</option> <option :value="parseInt(12)">12</option>
<option :value="parseInt(25)">25</option> <option :value="parseInt(25)">25</option>
@ -103,7 +103,7 @@ export default {
}, },
computed: { computed: {
labels() { labels() {
let playlists = this.$pgettext('Head/Playlist/Title/Noun', 'Playlists') let playlists = this.$pgettext('*/*/*', 'Playlists')
let searchPlaceholder = this.$pgettext('Content/Playlist/Placeholder/Call to action', 'Enter playlist name…') let searchPlaceholder = this.$pgettext('Content/Playlist/Placeholder/Call to action', 'Enter playlist name…')
return { return {
playlists, playlists,

View File

@ -32,7 +32,7 @@
</div> </div>
</section> </section>
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<h2><translate translate-context="Content/*/*">Tracks</translate></h2> <h2><translate translate-context="*/*/*/Noun">Tracks</translate></h2>
<track-table :tracks="tracks"></track-table> <track-table :tracks="tracks"></track-table>
<div class="ui center aligned basic segment"> <div class="ui center aligned basic segment">
<pagination <pagination