Merge branch 'context-population' into 'develop'

Context population

See merge request funkwhale/funkwhale!657
This commit is contained in:
Eliot Berriot 2019-03-08 12:48:29 +01:00
commit 9034044319
105 changed files with 31409 additions and 7936 deletions

View File

@ -363,17 +363,17 @@ Translations in HTML use the ``<translate>`` tag::
<template> <template>
<div> <div>
<h1><translate :translate-context="'Content/Profile/Header'">User profile</translate></h1> <h1><translate translate-context="Content/Profile/Header">User profile</translate></h1>
<p> <p>
<translate <translate
:translate-context="'Content/Profile/Paragraph'" translate-context="Content/Profile/Paragraph"
:translate-params="{username: 'alice'}"> :translate-params="{username: 'alice'}">
You are logged in as %{ username } You are logged in as %{ username }
</translate> </translate>
</p> </p>
<p> <p>
<translate <translate
:translate-context="'Content/Profile/Paragraph'" translate-context="Content/Profile/Paragraph"
translate-plural="You have %{ count } new messages, that's a lot!" translate-plural="You have %{ count } new messages, that's a lot!"
:translate-n="unreadMessagesCount" :translate-n="unreadMessagesCount"
:translate-params="{count: unreadMessagesCount}"> :translate-params="{count: unreadMessagesCount}">

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -3,10 +3,10 @@
<section class="ui vertical center aligned stripe segment"> <section class="ui vertical center aligned stripe segment">
<div class="ui text container"> <div class="ui text container">
<h1 class="ui huge header"> <h1 class="ui huge header">
<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/Short, Noun" v-else>About this instance</translate>
</h1> </h1>
<stats></stats> <stats></stats>
</div> </div>
@ -15,12 +15,12 @@
<div <div
class="ui middle aligned stackable text container"> class="ui middle aligned stackable text container">
<p <p
v-if="!instance.short_description.value && !instance.long_description.value"><translate :translate-context="'Content/About/Paragraph'">Unfortunately, the owners of this instance did not yet take the time to complete this page.</translate></p> v-if="!instance.short_description.value && !instance.long_description.value"><translate translate-context="Content/About/Paragraph">Unfortunately, the owners of this instance did not yet take the time to complete this page.</translate></p>
<router-link <router-link
class="ui button" class="ui button"
v-if="$store.state.auth.availablePermissions['settings']" v-if="$store.state.auth.availablePermissions['settings']"
:to="{path: '/manage/settings', hash: 'instance'}"> :to="{path: '/manage/settings', hash: 'instance'}">
<i class="pencil icon"></i><translate :translate-context="'Content/Settings/Button.Label/Verb'">Edit instance info</translate> <i class="pencil icon"></i><translate translate-context="Content/Settings/Button.Label/Verb">Edit instance info</translate>
</router-link> </router-link>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
</div> </div>

View File

@ -4,22 +4,22 @@
<div class="ui stackable equal height stackable grid"> <div class="ui stackable equal height stackable grid">
<section class="four wide column"> <section class="four wide column">
<h4 class="ui header"> <h4 class="ui header">
<translate :translate-context="'Footer/About/Title'" :translate-params="{instanceName: instanceHostname}" >About %{instanceName}</translate> <translate translate-context="Footer/About/Title" :translate-params="{instanceName: instanceHostname}" >About %{instanceName}</translate>
</h4> </h4>
<div class="ui link list"> <div class="ui link list">
<router-link class="item" to="/about"> <router-link class="item" to="/about">
<translate :translate-context="'Footer/About/List item.Link'">About page</translate> <translate translate-context="Footer/About/List item.Link">About page</translate>
</router-link> </router-link>
<div class="item" v-if="version"> <div class="item" v-if="version">
<translate :translate-context="'Footer/*/List item'" :translate-params="{version: version}" >Version %{version}</translate> <translate translate-context="Footer/*/List item" :translate-params="{version: version}" >Version %{version}</translate>
</div> </div>
<div role="button" class="item" @click="$emit('show:set-instance-modal')" > <div role="button" class="item" @click="$emit('show:set-instance-modal')" >
<translate :translate-context="'Footer/*/List item.Link'">Use another instance</translate> <translate translate-context="Footer/*/List item.Link">Use another instance</translate>
</div> </div>
</div> </div>
<div class="ui form"> <div class="ui form">
<div class="ui field"> <div class="ui field">
<label><translate :translate-context="'Footer/Settings/Dropdown.Label/Short, Verb'">Change language</translate></label> <label><translate translate-context="Footer/Settings/Dropdown.Label/Short, Verb">Change language</translate></label>
<select class="ui dropdown" :value="$language.current" @change="$store.commit('ui/currentLanguage', $event.target.value)"> <select class="ui dropdown" :value="$language.current" @change="$store.commit('ui/currentLanguage', $event.target.value)">
<option v-for="(language, key) in $language.available" :key="key" :value="key">{{ language }}</option> <option v-for="(language, key) in $language.available" :key="key" :value="key">{{ language }}</option>
</select> </select>
@ -29,29 +29,29 @@
<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">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="Footer/*/List item.Link/Short, 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 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>
<a href="https://dev.funkwhale.audio/funkwhale/funkwhale/issues" class="item" target="_blank"><translate :translate-context="'Footer/*/List item.Link'">Issue tracker</translate></a> <a href="https://dev.funkwhale.audio/funkwhale/funkwhale/issues" class="item" target="_blank"><translate translate-context="Footer/*/List item.Link">Issue tracker</translate></a>
</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">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>
<a href="https://dev.funkwhale.audio/funkwhale/funkwhale" class="item" target="_blank"><translate :translate-context="'Footer/*/List item.Link'">Source code</translate></a> <a href="https://dev.funkwhale.audio/funkwhale/funkwhale" class="item" target="_blank"><translate translate-context="Footer/*/List item.Link">Source code</translate></a>
</div> </div>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<p> <p>
<translate :translate-context="'Footer/*/List item.Link'">The funkwhale logo was kindly designed and provided by Francis Gading.</translate> <translate translate-context="Footer/*/List item.Link">The funkwhale logo was kindly designed and provided by Francis Gading.</translate>
</p> </p>
</section> </section>
</div> </div>

View File

@ -3,15 +3,15 @@
<section class="ui vertical center aligned stripe segment"> <section class="ui vertical center aligned stripe segment">
<div class="ui text container"> <div class="ui text container">
<h1 class="ui huge header"> <h1 class="ui huge header">
<translate :translate-context="'Content/Home/Title/Verb'">Welcome on Funkwhale</translate> <translate translate-context="Content/Home/Title/Verb">Welcome on Funkwhale</translate>
</h1> </h1>
<p><translate :translate-context="'Content/Home/Title'">We think listening to music should be simple.</translate></p> <p><translate translate-context="Content/Home/Title">We think listening to music should be simple.</translate></p>
<router-link class="ui icon button" to="/about"> <router-link class="ui icon button" to="/about">
<i class="info icon"></i> <i class="info icon"></i>
<translate :translate-context="'Content/Home/Button.Label/Verb'">Learn more about this instance</translate> <translate translate-context="Content/Home/Button.Label/Verb">Learn more about this instance</translate>
</router-link> </router-link>
<router-link class="ui icon teal button" to="/library"> <router-link class="ui icon teal button" to="/library">
<translate :translate-context="'Content/Home/Button.Label/Verb'">Get me to the library</translate> <translate translate-context="Content/Home/Button.Label/Verb">Get me to the library</translate>
<i class="right arrow icon"></i> <i class="right arrow icon"></i>
</router-link> </router-link>
</div> </div>
@ -22,9 +22,9 @@
<div class="row"> <div class="row">
<div class="eight wide left floated column"> <div class="eight wide left floated column">
<h2 class="ui header"> <h2 class="ui header">
<translate :translate-context="'Content/Home/Title'">Why funkwhale?</translate> <translate translate-context="Content/Home/Title">Why funkwhale?</translate>
</h2> </h2>
<p><translate :translate-context="'Content/Home/Paragraph'">That's simple: we loved Grooveshark and we want to build something even better.</translate></p> <p><translate translate-context="Content/Home/Paragraph">That's simple: we loved Grooveshark and we want to build something even better.</translate></p>
</div> </div>
<div class="four wide left floated column"> <div class="four wide left floated column">
<img class="ui medium image" src="../assets/logo/logo.png" /> <img class="ui medium image" src="../assets/logo/logo.png" />
@ -35,26 +35,26 @@
<div class="ui middle aligned stackable text container"> <div class="ui middle aligned stackable text container">
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<h2 class="ui header"> <h2 class="ui header">
<translate :translate-context="'Content/Home/Title'">Unlimited music</translate> <translate translate-context="Content/Home/Title">Unlimited music</translate>
</h2> </h2>
<p><translate :translate-context="'Content/Home/Paragraph'">Funkwhale is designed to make it easy to listen to music you like, or to discover new artists.</translate></p> <p><translate translate-context="Content/Home/Paragraph">Funkwhale is designed to make it easy to listen to music you like, or to discover new artists.</translate></p>
<div class="ui list"> <div class="ui list">
<div class="item"> <div class="item">
<i class="sound icon"></i> <i class="sound icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Home/List item/Verb'">Click once, listen for hours using built-in radios</translate> <translate translate-context="Content/Home/List item/Verb">Click once, listen for hours using built-in radios</translate>
</div> </div>
</div> </div>
<div class="item"> <div class="item">
<i class="heart icon"></i> <i class="heart icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Home/List item/Verb'">Keep a track of your favorite songs</translate> <translate translate-context="Content/Home/List item/Verb">Keep a track of your favorite songs</translate>
</div> </div>
</div> </div>
<div class="item"> <div class="item">
<i class="list icon"></i> <i class="list icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Home/List item'">Playlists? We got them</translate> <translate translate-context="Content/Home/List item">Playlists? We got them</translate>
</div> </div>
</div> </div>
</div> </div>
@ -62,14 +62,14 @@
<div class="ui middle aligned stackable text container"> <div class="ui middle aligned stackable text container">
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<h2 class="ui header"> <h2 class="ui header">
<translate :translate-context="'Content/Home/Title'">A clean library</translate> <translate translate-context="Content/Home/Title">A clean library</translate>
</h2> </h2>
<p><translate :translate-context="'Content/Home/Paragraph'">Funkwhale takes care of handling your music</translate>.</p> <p><translate translate-context="Content/Home/Paragraph">Funkwhale takes care of handling your music</translate>.</p>
<div class="ui list"> <div class="ui list">
<div class="item"> <div class="item">
<i class="download icon"></i> <i class="download icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Home/List item/Verb'">Import music from various platforms, such as YouTube or SoundCloud</translate> <translate translate-context="Content/Home/List item/Verb">Import music from various platforms, such as YouTube or SoundCloud</translate>
</div> </div>
</div> </div>
<div class="item"> <div class="item">
@ -83,7 +83,7 @@
<div class="item"> <div class="item">
<i class="plus icon"></i> <i class="plus icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Home/List item'">Covers, lyrics, our goal is to have them all ;)</translate> <translate translate-context="Content/Home/List item">Covers, lyrics, our goal is to have them all ;)</translate>
</div> </div>
</div> </div>
</div> </div>
@ -91,20 +91,20 @@
<div class="ui middle aligned stackable text container"> <div class="ui middle aligned stackable text container">
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<h2 class="ui header"> <h2 class="ui header">
<translate :translate-context="'Content/Home/Title'">Easy to use</translate> <translate translate-context="Content/Home/Title">Easy to use</translate>
</h2> </h2>
<p><translate :translate-context="'Content/Home/Paragraph'">Funkwhale is dead simple to use.</translate></p> <p><translate translate-context="Content/Home/Paragraph">Funkwhale is dead simple to use.</translate></p>
<div class="ui list"> <div class="ui list">
<div class="item"> <div class="item">
<i class="book icon"></i> <i class="book icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Home/List item'">No add-ons, no plugins : you only need a web library</translate> <translate translate-context="Content/Home/List item">No add-ons, no plugins : you only need a web library</translate>
</div> </div>
</div> </div>
<div class="item"> <div class="item">
<i class="wizard icon"></i> <i class="wizard icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Home/List item'">Access your music from a clean interface that focus on what really matters</translate> <translate translate-context="Content/Home/List item">Access your music from a clean interface that focus on what really matters</translate>
</div> </div>
</div> </div>
</div> </div>
@ -112,26 +112,26 @@
<div class="ui middle aligned stackable text container"> <div class="ui middle aligned stackable text container">
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<h2 class="ui header"> <h2 class="ui header">
<translate :translate-context="'Content/Home/Title'">Your music, your way</translate> <translate translate-context="Content/Home/Title">Your music, your way</translate>
</h2> </h2>
<p><translate :translate-context="'Content/Home/Paragraph'">Funkwhale is free and gives you control on your music.</translate></p> <p><translate translate-context="Content/Home/Paragraph">Funkwhale is free and gives you control on your music.</translate></p>
<div class="ui list"> <div class="ui list">
<div class="item"> <div class="item">
<i class="smile icon"></i> <i class="smile icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Home/List item'">The plaform is free and open-source, you can install it and modify it without worries</translate> <translate translate-context="Content/Home/List item">The plaform is free and open-source, you can install it and modify it without worries</translate>
</div> </div>
</div> </div>
<div class="item"> <div class="item">
<i class="protect icon"></i> <i class="protect icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Home/List item'">We do not track you or bother you with ads</translate> <translate translate-context="Content/Home/List item">We do not track you or bother you with ads</translate>
</div> </div>
</div> </div>
<div class="item"> <div class="item">
<i class="users icon"></i> <i class="users icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Home/List item'">You can invite friends and family to your instance so they can enjoy your music</translate> <translate translate-context="Content/Home/List item">You can invite friends and family to your instance so they can enjoy your music</translate>
</div> </div>
</div> </div>
</div> </div>

View File

@ -5,14 +5,14 @@
<h1 class="ui huge header"> <h1 class="ui huge header">
<i class="warning icon"></i> <i class="warning icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/*/Title'">Page not found!</translate> <translate translate-context="Content/*/Title">Page not found!</translate>
</div> </div>
</h1> </h1>
<p><translate :translate-context="'Content/*/Paragraph'">Sorry, the page you asked for does not exist:</translate></p> <p><translate translate-context="Content/*/Paragraph">Sorry, the page you asked for does not exist:</translate></p>
<a :href="path">{{ path }}</a> <a :href="path">{{ path }}</a>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<router-link class="ui icon labeled right button" to="/"> <router-link class="ui icon labeled right button" to="/">
<translate :translate-context="'Content/*/Button.Label/Verb'">Go to home page</translate> <translate translate-context="Content/*/Button.Label/Verb">Go to home page</translate>
<i class="right arrow icon"></i> <i class="right arrow icon"></i>
</router-link> </router-link>
</div> </div>

View File

@ -1,27 +1,27 @@
<template> <template>
<modal @update:show="$emit('update:show', $event); isError = false" :show="show"> <modal @update:show="$emit('update:show', $event); isError = false" :show="show">
<div class="header"><translate :translate-context="'Popup/Instance/Title'">Choose your instance</translate></div> <div class="header"><translate translate-context="Popup/Instance/Title">Choose your instance</translate></div>
<div class="scrolling content"> <div class="scrolling content">
<div v-if="isError" class="ui negative message"> <div v-if="isError" class="ui negative message">
<div class="header"><translate :translate-context="'Popup/Instance/Error message.Title'">It is not possible to connect to the given URL</translate></div> <div class="header"><translate translate-context="Popup/Instance/Error message.Title">It is not possible to connect to the given URL</translate></div>
<ul class="list"> <ul class="list">
<li><translate :translate-context="'Popup/Instance/Error message.List item'">The server might be down</translate></li> <li><translate translate-context="Popup/Instance/Error message.List item">The server might be down</translate></li>
<li><translate :translate-context="'Popup/Instance/Error message.List item'">The given address is not a Funkwhale server</translate></li> <li><translate translate-context="Popup/Instance/Error message.List item">The given address is not a Funkwhale server</translate></li>
</ul> </ul>
</div> </div>
<form class="ui form" @submit.prevent="checkAndSwitch(instanceUrl)"> <form class="ui form" @submit.prevent="checkAndSwitch(instanceUrl)">
<p v-if="$store.state.instance.instanceUrl" class="description" :translate-context="'Popup/Login/Paragraph'" v-translate="{url: $store.state.instance.instanceUrl, hostname: instanceHostname }"> <p v-if="$store.state.instance.instanceUrl" class="description" translate-context="Popup/Login/Paragraph" v-translate="{url: $store.state.instance.instanceUrl, hostname: instanceHostname }">
You are currently connected to <a href="%{ url }" target="_blank">%{ hostname }&nbsp;<i class="external icon"></i></a>. If you continue, you will be disconnected from your current instance and all your local data will be deleted. You are currently connected to <a href="%{ url }" target="_blank">%{ hostname }&nbsp;<i class="external icon"></i></a>. If you continue, you will be disconnected from your current instance and all your local data will be deleted.
</p> </p>
<p v-else> <p v-else>
<translate :translate-context="'Popup/Instance/Paragraph'">To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices.</translate> <translate translate-context="Popup/Instance/Paragraph">To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices.</translate>
</p> </p>
<div class="field"> <div class="field">
<label><translate :translate-context="'Popup/Instance/Input.Label/Noun'">Instance URL</translate></label> <label><translate translate-context="Popup/Instance/Input.Label/Noun">Instance URL</translate></label>
<div class="ui action input"> <div class="ui action input">
<input type="text" v-model="instanceUrl" placeholder="https://funkwhale.server"> <input type="text" v-model="instanceUrl" placeholder="https://funkwhale.server">
<button type="submit" :class="['ui', 'icon', {loading: isLoading}, 'button']"> <button type="submit" :class="['ui', 'icon', {loading: isLoading}, 'button']">
<translate :translate-context="'*/*/Button.Label/Verb'">Submit</translate> <translate translate-context="*/*/Button.Label/Verb">Submit</translate>
</button> </button>
</div> </div>
</div> </div>
@ -29,13 +29,13 @@
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<form class="ui form" @submit.prevent=""> <form class="ui form" @submit.prevent="">
<div class="field"> <div class="field">
<label><translate :translate-context="'Popup/Instance/List.Label'">Suggested choices</translate></label> <label><translate translate-context="Popup/Instance/List.Label">Suggested choices</translate></label>
<button v-for="url in suggestedInstances" @click="checkAndSwitch(url)" class="ui basic button">{{ url }}</button> <button v-for="url in suggestedInstances" @click="checkAndSwitch(url)" class="ui basic button">{{ url }}</button>
</div> </div>
</form> </form>
</div> </div>
<div class="actions"> <div class="actions">
<div class="ui cancel button"><translate :translate-context="'*/*/Button.Label/Verb'">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,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="Popup/Keyboard shortcuts/Title">Keyboard shortcuts</translate>
</header> </header>
<section class="scrolling content"> <section class="scrolling content">
<table <table
@ -18,7 +18,7 @@
</table> </table>
</section> </section>
<footer class="actions"> <footer class="actions">
<div class="ui cancel button"><translate :translate-context="'Popup/Keyboard shortcuts/Button.Label/Verb'">Close</translate></div> <div class="ui cancel button"><translate translate-context="Popup/Keyboard shortcuts/Button.Label/Verb">Close</translate></div>
</footer> </footer>
</modal> </modal>
</template> </template>

View File

@ -16,13 +16,13 @@
<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="Sidebar/Library/Tab.Title/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">
<translate :translate-context="'Sidebar/Queue/Tab.Title'">(empty)</translate> <translate translate-context="Sidebar/Queue/Tab.Title">(empty)</translate>
</template> </template>
<translate :translate-context="'Sidebar/Queue/Tab.Title'" v-else :translate-params="{index: queue.currentIndex + 1, length: queue.tracks.length}"> <translate translate-context="Sidebar/Queue/Tab.Title" v-else :translate-params="{index: queue.currentIndex + 1, length: queue.tracks.length}">
(%{ index } of %{ length }) (%{ index } of %{ length })
</translate> </translate>
</a> </a>
@ -32,76 +32,76 @@
<section :class="['ui', 'bottom', 'attached', {active: selectedTab === 'library'}, 'tab']" :aria-label="labels.mainMenu"> <section :class="['ui', 'bottom', 'attached', {active: selectedTab === 'library'}, 'tab']" :aria-label="labels.mainMenu">
<nav class="ui inverted vertical large fluid menu" role="navigation" :aria-label="labels.mainMenu"> <nav class="ui inverted vertical large fluid menu" role="navigation" :aria-label="labels.mainMenu">
<div class="item"> <div class="item">
<header class="header"><translate :translate-context="'Sidebar/Profile/Title'">My account</translate></header> <header class="header"><translate translate-context="Sidebar/Profile/Title">My account</translate></header>
<div class="menu"> <div class="menu">
<router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'profile', params: {username: $store.state.auth.username}}"> <router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'profile', params: {username: $store.state.auth.username}}">
<i class="user icon"></i> <i class="user icon"></i>
<translate :translate-context="'Sidebar/Profile/List item.Link'" :translate-params="{username: $store.state.auth.username}"> <translate translate-context="Sidebar/Profile/List item.Link" :translate-params="{username: $store.state.auth.username}">
Logged in as %{ username } Logged in as %{ username }
</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="Sidebar/Settings/List item.Link/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="Sidebar/Notifications/List item.Link/Noun">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']">
{{ $store.state.ui.notifications.inbox }}</div> {{ $store.state.ui.notifications.inbox }}</div>
</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="Sidebar/Login/List item.Link/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="Sidebar/Login/List item.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="Sidebar/Library/Title">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>
<a <a
@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="Sidebar/Playlist/List item.Link/Noun">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="Sidebar/Library/List item.Link/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']">
<header class="header"><translate :translate-context="'Sidebar/Admin/Title/Noun'">Administration</translate></header> <header class="header"><translate translate-context="Sidebar/Admin/Title/Noun">Administration</translate></header>
<div class="menu"> <div class="menu">
<router-link <router-link
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="Sidebar/Admin/List item.Link/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="Sidebar/Admin/List item.Link/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="Sidebar/Moderation/List item.Link/Noun">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="Sidebar/Moderation/List item.Link/Noun">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"
@ -116,10 +116,10 @@
<i class="history icon"></i> <i class="history icon"></i>
<div class="content"> <div class="content">
<div class="header"> <div class="header">
<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="Sidebar/Queue/Message"
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}">
@ -127,8 +127,8 @@
</translate> </translate>
</p> </p>
<div class="ui two buttons"> <div class="ui two buttons">
<div @click="queue.restore()" class="ui basic inverted green button"><translate :translate-context="'*/*/*'">Yes</translate></div> <div @click="queue.restore()" class="ui basic inverted green button"><translate translate-context="*/*/*">Yes</translate></div>
<div @click="queue.removePrevious()" class="ui basic inverted red button"><translate :translate-context="'*/*/*'">No</translate></div> <div @click="queue.removePrevious()" class="ui basic inverted red button"><translate translate-context="*/*/*">No</translate></div>
</div> </div>
</div> </div>
</div> </div>
@ -167,10 +167,10 @@
<div v-if="$store.state.radios.running" class="ui black message"> <div v-if="$store.state.radios.running" class="ui black message">
<div class="content"> <div class="content">
<div class="header"> <div class="header">
<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="Sidebar/Player/Button.Label/Verb">Stop radio</translate></div>
</div> </div>
</div> </div>
</section> </section>

View File

@ -3,13 +3,13 @@
<div class="ui divider" /> <div class="ui divider" />
<h3 class="ui header">{{ group.label }}</h3> <h3 class="ui header">{{ group.label }}</h3>
<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/Settings/Error message.Title'">Error while saving settings</translate></div> <div class="header"><translate translate-context="Content/Settings/Error message.Title">Error while saving settings</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 v-if="result" class="ui positive message"> <div v-if="result" class="ui positive message">
<translate :translate-context="'Content/Settings/Paragraph'">Settings updated successfully.</translate> <translate translate-context="Content/Settings/Paragraph">Settings updated successfully.</translate>
</div> </div>
<p v-if="group.help">{{ group.help }}</p> <p v-if="group.help">{{ group.help }}</p>
<div v-for="setting in settings" class="ui field"> <div v-for="setting in settings" class="ui field">
@ -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/Settings/Button.Label/Short, Verb">Save</translate>
</button> </button>
</form> </form>
</template> </template>

View File

@ -4,26 +4,26 @@
<div class="two fields"> <div class="two fields">
<div class="field"> <div class="field">
<div class="field"> <div class="field">
<label for="embed-width"><translate :translate-context="'Popup/Embed/Input.Label'">Widget width</translate></label> <label for="embed-width"><translate translate-context="Popup/Embed/Input.Label">Widget width</translate></label>
<p><translate :translate-context="'Popup/Embed/Paragraph'">Leave empty for a responsive widget</translate></p> <p><translate translate-context="Popup/Embed/Paragraph">Leave empty for a responsive widget</translate></p>
<input id="embed-width" type="number" v-model.number="width" min="0" step="10" /> <input id="embed-width" type="number" v-model.number="width" min="0" step="10" />
</div> </div>
<template v-if="type != 'track'"> <template v-if="type != 'track'">
<br> <br>
<div class="field"> <div class="field">
<label for="embed-height"><translate :translate-context="'Popup/Embed/Input.Label'">Widget height</translate></label> <label for="embed-height"><translate translate-context="Popup/Embed/Input.Label">Widget height</translate></label>
<input id="embed-height" type="number" v-model="height" :min="minHeight" max="1000" step="10" /> <input id="embed-height" type="number" v-model="height" :min="minHeight" max="1000" step="10" />
</div> </div>
</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="Popup/*/Button.Label/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>
</textarea> </textarea>
<div class="ui right"> <div class="ui right">
<p class="message" v-if=copied><translate :translate-context="'Content/*/Paragraph'">Text copied to clipboard!</translate></p> <p class="message" v-if=copied><translate translate-context="Content/*/Paragraph">Text copied to clipboard!</translate></p>
</div> </div>
</div> </div>
</div> </div>
@ -31,7 +31,7 @@
<div class="preview"> <div class="preview">
<h3> <h3>
<a :href="iframeSrc" target="_blank"> <a :href="iframeSrc" target="_blank">
<translate :translate-context="'Popup/Embed/Title/Noun'">Preview</translate> <translate translate-context="Popup/Embed/Title/Noun">Preview</translate>
</a> </a>
</h3> </h3>
<iframe :width="frameWidth" :height="height" scrolling="no" frameborder="no" :src="iframeSrc"></iframe> <iframe :width="frameWidth" :height="height" scrolling="no" frameborder="no" :src="iframeSrc"></iframe>

View File

@ -7,25 +7,25 @@
: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>
<div class="menu"> <div class="menu">
<button class="item basic" ref="add" data-ref="add" :disabled="!playable" @click.stop.prevent="add" :title="labels.addToQueue"> <button class="item basic" ref="add" data-ref="add" :disabled="!playable" @click.stop.prevent="add" :title="labels.addToQueue">
<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><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Play next</translate>
</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><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Play now</translate>
</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/Dropdown/Button/Label/Short">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>
</button> </button>
</div> </div>
</div> </div>

View File

@ -70,14 +70,14 @@
</div> </div>
<div class="ui small warning message" v-if="currentTrack && errored"> <div class="ui small warning message" v-if="currentTrack && errored">
<div class="header"> <div class="header">
<translate :translate-context="'Sidebar/Player/Error message.Title'">The track cannot be loaded</translate> <translate translate-context="Sidebar/Player/Error message.Title">The track cannot be loaded</translate>
</div> </div>
<p v-if="hasNext && playing && $store.state.player.errorCount < $store.state.player.maxConsecutiveErrors"> <p v-if="hasNext && playing && $store.state.player.errorCount < $store.state.player.maxConsecutiveErrors">
<translate :translate-context="'Sidebar/Player/Error message.Paragraph'">The next track will play automatically in a few seconds</translate> <translate translate-context="Sidebar/Player/Error message.Paragraph">The next track will play automatically in a few seconds</translate>
<i class="loading spinner icon"></i> <i class="loading spinner icon"></i>
</p> </p>
<p> <p>
<translate :translate-context="'Sidebar/Player/Error message.Paragraph'">You may have a connectivity issue.</translate> <translate translate-context="Sidebar/Player/Error message.Paragraph">You may have a connectivity issue.</translate>
</p> </p>
</div> </div>
<div class="two wide column controls ui grid"> <div class="two wide column controls ui grid">

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<h2><translate :translate-context="'Content/Search/Title'">Search for some music</translate></h2> <h2><translate translate-context="Content/Search/Title">Search for some music</translate></h2>
<div :class="['ui', {'loading': isLoading }, 'search']"> <div :class="['ui', {'loading': isLoading }, 'search']">
<div class="ui icon big input"> <div class="ui icon big input">
<i class="search icon"></i> <i class="search icon"></i>
@ -8,22 +8,22 @@
</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="Content/Search/Title">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>
</div> </div>
</div> </div>
<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="Content/Search/Title">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>
</div> </div>
</div> </div>
<p v-else><translate :translate-context="'Content/Search/Paragraph'">No album matched your query</translate></p> <p v-else><translate translate-context="Content/Search/Paragraph">No album matched your query</translate></p>
</template> </template>
</div> </div>
</template> </template>

View File

@ -11,7 +11,7 @@
<div class="meta"> <div class="meta">
<span> <span>
<router-link tag="span" :to="{name: 'library.artists.detail', params: {id: album.artist.id }}"> <router-link tag="span" :to="{name: 'library.artists.detail', params: {id: album.artist.id }}">
<translate :translate-context="'Content/Album/Card'" :translate-params="{artist: album.artist.name}">By %{ artist }</translate> <translate translate-context="Content/Album/Card" :translate-params="{artist: album.artist.name}">By %{ artist }</translate>
</router-link> </router-link>
</span><span class="time" v-if="album.release_date"> {{ album.release_date | year }}</span> </span><span class="time" v-if="album.release_date"> {{ album.release_date | year }}</span>
</div> </div>
@ -36,21 +36,21 @@
</table> </table>
<div class="center aligned segment" v-if="album.tracks.length > initialTracks"> <div class="center aligned segment" v-if="album.tracks.length > initialTracks">
<em v-if="!showAllTracks" @click="showAllTracks = true" class="expand"> <em v-if="!showAllTracks" @click="showAllTracks = true" class="expand">
<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/Album/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/Card.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="Content/Album/Card" :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

@ -28,10 +28,10 @@
</table> </table>
<div class="center aligned segment" v-if="artist.albums.length > initialAlbums"> <div class="center aligned segment" v-if="artist.albums.length > initialAlbums">
<em v-if="!showAllAlbums" @click="showAllAlbums = true" class="expand"> <em v-if="!showAllAlbums" @click="showAllAlbums = true" class="expand">
<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/Artist/Card.Link">Collapse</translate>
</em> </em>
</div> </div>
</div> </div>
@ -39,10 +39,10 @@
<div class="extra content"> <div class="extra content">
<span> <span>
<i class="sound icon"></i> <i class="sound icon"></i>
<translate :translate-context="'Content/Artist/Card'" :translate-params="{count: artist.albums.length}" :translate-n="artist.albums.length" translate-plural="%{ count } albums">1 album</translate> <translate translate-context="Content/Artist/Card" :translate-params="{count: artist.albums.length}" :translate-n="artist.albums.length" translate-plural="%{ count } albums">1 album</translate>
</span> </span>
<play-button :is-playable="isPlayable" class="mini basic orange right floated" :artist="artist"> <play-button :is-playable="isPlayable" class="mini basic orange right floated" :artist="artist">
<translate :translate-context="'Content/Queue/Button.Label/Short, Verb'">Play all</translate> <translate translate-context="Content/Queue/Button.Label/Short, Verb">Play all</translate>
</play-button> </play-button>
</div> </div>
</div> </div>

View File

@ -38,7 +38,7 @@
{{ time.parse(track.uploads[0].duration) }} {{ time.parse(track.uploads[0].duration) }}
</td> </td>
<td colspan="4" v-else> <td colspan="4" v-else>
<translate :translate-context="'*/*/*'">N/A</translate> <translate translate-context="*/*/*">N/A</translate>
</td> </td>
<td colspan="2" class="align right"> <td colspan="2" class="align right">
<track-favorite-icon class="favorite-icon" :track="track"></track-favorite-icon> <track-favorite-icon class="favorite-icon" :track="track"></track-favorite-icon>

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/Table.Label">Title</translate></th>
<th colspan="4"><translate :translate-context="'Content/Track/Table.Label'">Artist</translate></th> <th colspan="4"><translate translate-context="Content/Track/Table.Label">Artist</translate></th>
<th colspan="4"><translate :translate-context="'Content/Track/Table.Label'">Album</translate></th> <th colspan="4"><translate translate-context="Content/Track/Table.Label">Album</translate></th>
<th colspan="4"><translate :translate-context="'Content/Track/Table.Label'">Duration</translate></th> <th colspan="4"><translate translate-context="Content/Track/Table.Label">Duration</translate></th>
<th colspan="2"></th> <th colspan="2"></th>
</tr> </tr>
</thead> </thead>

View File

@ -2,20 +2,20 @@
<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 :translate-context="'Content/Login/Title/Verb'">Log in to your Funkwhale account</translate></h2> <h2><translate translate-context="Content/Login/Title/Verb">Log in to your Funkwhale account</translate></h2>
<form class="ui form" @submit.prevent="submit()"> <form class="ui form" @submit.prevent="submit()">
<div v-if="error" class="ui negative message"> <div v-if="error" class="ui negative message">
<div class="header"><translate :translate-context="'Content/Login/Error message.Title'">We cannot log you in</translate></div> <div class="header"><translate translate-context="Content/Login/Error message.Title">We cannot log you in</translate></div>
<ul class="list"> <ul class="list">
<li v-if="error == 'invalid_credentials'"><translate :translate-context="'Content/Login/Error message.List item/Call to action'">Please double-check your username/password couple is correct</translate></li> <li v-if="error == 'invalid_credentials'"><translate translate-context="Content/Login/Error message.List item/Call to action">Please double-check your username/password couple is correct</translate></li>
<li v-else><translate :translate-context="'Content/Login/Error message/List item'">An unknown error happend, this can mean the server is down or cannot be reached</translate></li> <li v-else><translate translate-context="Content/Login/Error message/List item">An unknown error happend, this can mean the server is down or cannot be reached</translate></li>
</ul> </ul>
</div> </div>
<div class="field"> <div class="field">
<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="Content/Login/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/Login/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="Content/Login/Link/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="Content/Login/Button.Label/Verb">Login</translate>
</button> </button>
</form> </form>
</div> </div>

View File

@ -3,10 +3,10 @@
<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> <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}">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>
</main> </main>

View File

@ -14,14 +14,14 @@
</div> </div>
</h2> </h2>
<div class="ui basic green label"> <div class="ui basic green label">
<translate :translate-context="'Content/Profile/Button.Paragraph'">This is you!</translate> <translate translate-context="Content/Profile/Button.Paragraph">This is you!</translate>
</div> </div>
<a v-if="profile.is_staff" <a v-if="profile.is_staff"
class="ui yellow label" class="ui yellow label"
: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/Button.Label">Staff member</translate>
</a> </a>
</div> </div>
</template> </template>

View File

@ -3,16 +3,16 @@
<div class="ui vertical stripe segment"> <div class="ui vertical stripe segment">
<section class="ui small text container"> <section class="ui small text container">
<h2 class="ui header"> <h2 class="ui header">
<translate :translate-context="'Content/Settings/Title'">Account settings</translate> <translate translate-context="Content/Settings/Title">Account settings</translate>
</h2> </h2>
<form class="ui form" @submit.prevent="submitSettings()"> <form class="ui form" @submit.prevent="submitSettings()">
<div v-if="settings.success" class="ui positive message"> <div v-if="settings.success" class="ui positive message">
<div class="header"> <div class="header">
<translate :translate-context="'Content/Settings/Message'">Settings updated</translate> <translate translate-context="Content/Settings/Message">Settings updated</translate>
</div> </div>
</div> </div>
<div v-if="settings.errors.length > 0" class="ui negative message"> <div v-if="settings.errors.length > 0" class="ui negative message">
<div class="header"><translate :translate-context="'Content/Settings/Error message.Title'">Your settings can't be updateds</translate></div> <div class="header"><translate translate-context="Content/Settings/Error message.Title">Your settings can't be updateds</translate></div>
<ul class="list"> <ul class="list">
<li v-for="error in settings.errors">{{ error }}</li> <li v-for="error in settings.errors">{{ error }}</li>
</ul> </ul>
@ -25,38 +25,38 @@
</select> </select>
</div> </div>
<button :class="['ui', {'loading': isLoading}, 'button']" type="submit"> <button :class="['ui', {'loading': isLoading}, 'button']" type="submit">
<translate :translate-context="'Content/Settings/Button.Label/Verb'">Update settings</translate> <translate translate-context="Content/Settings/Button.Label/Verb">Update settings</translate>
</button> </button>
</form> </form>
</section> </section>
<section class="ui small text container"> <section class="ui small text container">
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<h2 class="ui header"> <h2 class="ui header">
<translate :translate-context="'Content/Settings/Title'">Avatar</translate> <translate translate-context="Content/Settings/Title">Avatar</translate>
</h2> </h2>
<div class="ui form"> <div class="ui form">
<div v-if="avatarErrors.length > 0" class="ui negative message"> <div v-if="avatarErrors.length > 0" class="ui negative message">
<div class="header"><translate :translate-context="'Content/Settings/Error message.Title'">Your avatar cannot be saved</translate></div> <div class="header"><translate translate-context="Content/Settings/Error message.Title">Your avatar cannot be saved</translate></div>
<ul class="list"> <ul class="list">
<li v-for="error in avatarErrors">{{ error }}</li> <li v-for="error in avatarErrors">{{ error }}</li>
</ul> </ul>
</div> </div>
<div class="ui stackable grid"> <div class="ui stackable grid">
<div class="ui ten wide column"> <div class="ui ten wide column">
<h3 class="ui header"><translate :translate-context="'Content/Settings/Title/Verb'">Upload a new avatar</translate></h3> <h3 class="ui header"><translate translate-context="Content/Settings/Title/Verb">Upload a new avatar</translate></h3>
<p><translate :translate-context="'Content/Settings/Paragraph'">PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px.</translate></p> <p><translate translate-context="Content/Settings/Paragraph">PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px.</translate></p>
<input class="ui input" ref="avatar" type="file" /> <input class="ui input" ref="avatar" type="file" />
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<button @click="submitAvatar" :class="['ui', {'loading': isLoadingAvatar}, 'button']"> <button @click="submitAvatar" :class="['ui', {'loading': isLoadingAvatar}, 'button']">
<translate :translate-context="'Content/Settings/Button.Label/Verb'">Update avatar</translate> <translate translate-context="Content/Settings/Button.Label/Verb">Update avatar</translate>
</button> </button>
</div> </div>
<div class="ui six wide column"> <div class="ui six wide column">
<h3 class="ui header"><translate :translate-context="'Content/Settings/Title/Noun'">Current avatar</translate></h3> <h3 class="ui header"><translate translate-context="Content/Settings/Title/Noun">Current avatar</translate></h3>
<img class="ui circular image" v-if="currentAvatar && currentAvatar.square_crop" v-lazy="$store.getters['instance/absoluteUrl'](currentAvatar.medium_square_crop)" /> <img class="ui circular image" v-if="currentAvatar && currentAvatar.square_crop" v-lazy="$store.getters['instance/absoluteUrl'](currentAvatar.medium_square_crop)" />
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<button @click="removeAvatar" v-if="currentAvatar && currentAvatar.square_crop" :class="['ui', {'loading': isLoadingAvatar}, ,'yellow', 'button']"> <button @click="removeAvatar" v-if="currentAvatar && currentAvatar.square_crop" :class="['ui', {'loading': isLoadingAvatar}, ,'yellow', 'button']">
<translate :translate-context="'Content/Settings/Button.Label/Verb'">Remove avatar</translate> <translate translate-context="Content/Settings/Button.Label/Verb">Remove avatar</translate>
</button> </button>
</div> </div>
</div> </div>
@ -66,43 +66,43 @@
<section class="ui small text container"> <section class="ui small text container">
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<h2 class="ui header"> <h2 class="ui header">
<translate :translate-context="'Content/Settings/Title/Verb'">Change my password</translate> <translate translate-context="Content/Settings/Title/Verb">Change my password</translate>
</h2> </h2>
<div class="ui message"> <div class="ui message">
<translate :translate-context="'Content/Settings/Paragraph'">Changing your password will also change your Subsonic API password if you have requested one.</translate>&nbsp;<translate :translate-context="'Content/Settings/Paragraph'">You will have to update your password on your clients that use this password.</translate> <translate translate-context="Content/Settings/Paragraph'">Changing your password will also change your Subsonic API password if you have requested one.</translate>&nbsp;<translate translate-context="Content/Settings/Paragraph">You will have to update your password on your clients that use this password.</translate>
</div> </div>
<form class="ui form" @submit.prevent="submitPassword()"> <form class="ui form" @submit.prevent="submitPassword()">
<div v-if="passwordError" class="ui negative message"> <div v-if="passwordError" class="ui negative message">
<div class="header"> <div class="header">
<translate :translate-context="'Content/Settings/Error message.Title'">Your password cannot be changed</translate> <translate translate-context="Content/Settings/Error message.Title">Your password cannot be changed</translate>
</div> </div>
<ul class="list"> <ul class="list">
<li v-if="passwordError == 'invalid_credentials'"><translate :translate-context="'Content/Settings/Error message.List item/Call to action'">Please double-check your password is correct</translate></li> <li v-if="passwordError == 'invalid_credentials'"><translate translate-context="Content/Settings/Error message.List item/Call to action">Please double-check your password is correct</translate></li>
</ul> </ul>
</div> </div>
<div class="field"> <div class="field">
<label><translate :translate-context="'Content/Settings/Input.Label'">Old password</translate></label> <label><translate translate-context="Content/Settings/Input.Label">Old password</translate></label>
<password-input required v-model="old_password" /> <password-input required v-model="old_password" />
</div> </div>
<div class="field"> <div class="field">
<label><translate :translate-context="'Content/Settings/Input.Label'">New password</translate></label> <label><translate translate-context="Content/Settings/Input.Label">New password</translate></label>
<password-input required v-model="new_password" /> <password-input required v-model="new_password" />
</div> </div>
<dangerous-button <dangerous-button
color="yellow" color="yellow"
:class="['ui', {'loading': isLoading}, 'button']" :class="['ui', {'loading': isLoading}, 'button']"
:action="submitPassword"> :action="submitPassword">
<translate :translate-context="'Content/Settings/Button.Label'">Change password</translate> <translate translate-context="Content/Settings/Button.Label">Change password</translate>
<p slot="modal-header"><translate :translate-context="'Popup/Settings/Title'">Change your password?</translate></p> <p slot="modal-header"><translate translate-context="Popup/Settings/Title">Change your password?</translate></p>
<div slot="modal-content"> <div slot="modal-content">
<p><translate :translate-context="'Popup/Settings/Paragraph'">Changing your password will have the following consequences:</translate></p> <p><translate translate-context="Popup/Settings/Paragraph">Changing your password will have the following consequences:</translate></p>
<ul> <ul>
<li><translate :translate-context="'Popup/Settings/List item'">You will be logged out from this session and have to log in with the new one</translate></li> <li><translate translate-context="Popup/Settings/List item">You will be logged out from this session and have to log in with the new one</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> <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/Setting/Button.Label">Disable access</translate></div>
</dangerous-button> </dangerous-button>
</form> </form>
<div class="ui hidden divider" /> <div class="ui hidden divider" />
@ -123,7 +123,7 @@
@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">Refresh</translate>
</button> </button>
<h3 class="ui header"> <h3 class="ui header">
<translate>Hidden artists</translate> <translate>Hidden artists</translate>
@ -131,8 +131,8 @@
<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="Content/*/Table.Label">Name</translate></th>
<th><translate :translate-context="'Content/*/Table.Label'">Creation date</translate></th> <th><translate translate-context="Content/*/Table.Label">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="Content/*/Button.Label">Delete</translate>
</button> </button>
</td> </td>
</tr> </tr>

View File

@ -1,23 +1,23 @@
<template> <template>
<form class="ui form" @submit.prevent="requestNewToken()"> <form class="ui form" @submit.prevent="requestNewToken()">
<h2><translate :translate-context="'Content/Settings/Title'">Subsonic API password</translate></h2> <h2><translate translate-context="Content/Settings/Title">Subsonic API password</translate></h2>
<p class="ui message" v-if="!subsonicEnabled"> <p class="ui message" v-if="!subsonicEnabled">
<translate :translate-context="'Content/Settings/Paragraph'">The Subsonic API is not available on this Funkwhale instance.</translate> <translate translate-context="Content/Settings/Paragraph">The Subsonic API is not available on this Funkwhale instance.</translate>
</p> </p>
<p> <p>
<translate :translate-context="'Content/Settings/Paragraph'">Funkwhale is compatible with other music players that support the Subsonic API.</translate>&nbsp;<translate :translate-context="'Content/Settings/Paragraph'">You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance.</translate> <translate translate-context="Content/Settings/Paragraph'">Funkwhale is compatible with other music players that support the Subsonic API.</translate>&nbsp;<translate translate-context="Content/Settings/Paragraph">You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance.</translate>
</p> </p>
<p> <p>
<translate :translate-context="'Content/Settings/Paragraph'">However, accessing Funkwhale from those clients require a separate password you can set below.</translate> <translate translate-context="Content/Settings/Paragraph">However, accessing Funkwhale from those clients require a separate password you can set below.</translate>
</p> </p>
<p><a href="https://docs.funkwhale.audio/users/apps.html#subsonic-compatible-clients" target="_blank"> <p><a href="https://docs.funkwhale.audio/users/apps.html#subsonic-compatible-clients" target="_blank">
<translate :translate-context="'Content/Settings/Link'">Discover how to use Funkwhale from other apps</translate> <translate translate-context="Content/Settings/Link">Discover how to use Funkwhale from other apps</translate>
</a></p> </a></p>
<div v-if="success" class="ui positive message"> <div v-if="success" class="ui positive message">
<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/Settings/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,25 +31,25 @@
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="Content/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="Popup/Settings/Button.Label/Verb">Request a new password</translate></div>
</dangerous-button> </dangerous-button>
<button <button
v-else v-else
color="grey" color="grey"
:class="['ui', {'loading': isLoading}, 'button']" :class="['ui', {'loading': isLoading}, 'button']"
@click="requestNewToken"><translate :translate-context="'Content/Settings/Button.Label/Verb'">Request a password</translate></button> @click="requestNewToken"><translate translate-context="Content/Settings/Button.Label/Verb">Request a password</translate></button>
<dangerous-button <dangerous-button
v-if="token" v-if="token"
color="yellow" color="yellow"
:class="['ui', {'loading': isLoading}, 'button']" :class="['ui', {'loading': isLoading}, 'button']"
:action="disable"> :action="disable">
<translate :translate-context="'Content/Settings/Button.Label/Verb'">Disable Subsonic access</translate> <translate translate-context="Content/Settings/Button.Label/Verb">Disable Subsonic access</translate>
<p slot="modal-header"><translate :translate-context="'Popup/Settings/Title'">Disable Subsonic API access?</translate></p> <p slot="modal-header"><translate translate-context="Popup/Settings/Title">Disable Subsonic API access?</translate></p>
<p slot="modal-content"><translate :translate-context="'Popup/Settings/Paragraph'">This will completely disable access to the Subsonic API using from account.</translate></p> <p slot="modal-content"><translate translate-context="Popup/Settings/Paragraph">This will completely disable access to the Subsonic API using from account.</translate></p>
<div slot="modal-confirm"><translate :translate-context="'Popup/Settings/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>
</template> </template>
</form> </form>

View File

@ -6,7 +6,7 @@
<th colspan="1000"> <th colspan="1000">
<div v-if="refreshable" class="right floated"> <div v-if="refreshable" class="right floated">
<span v-if="needsRefresh"> <span v-if="needsRefresh">
<translate :translate-context="'Content/*/Button.Help text.Paragraph'">Content have been updated, click refresh to see up-to-date content</translate> <translate translate-context="Content/*/Button.Help text.Paragraph">Content have been updated, click refresh to see up-to-date content</translate>
</span> </span>
<button <button
@click="$emit('refresh')" @click="$emit('refresh')"
@ -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/*/Dropdown.Label/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 }}
@ -33,9 +33,9 @@
confirm-color="green" confirm-color="green"
color="" color=""
@confirm="launchAction"> @confirm="launchAction">
<translate :translate-context="'Content/*/Button.Label/Short, Verb'">Go</translate> <translate translate-context="Content/*/Button.Label/Short, Verb">Go</translate>
<p slot="modal-header"> <p slot="modal-header">
<translate :translate-context="'Modal/*/Title'" <translate translate-context="Modal/*/Title"
key="1" key="1"
:translate-n="affectedObjectsCount" :translate-n="affectedObjectsCount"
:translate-params="{count: affectedObjectsCount, action: currentActionName}" :translate-params="{count: affectedObjectsCount, action: currentActionName}"
@ -44,19 +44,19 @@
</translate> </translate>
</p> </p>
<p slot="modal-content"> <p slot="modal-content">
<translate :translate-context="'Modal/*/Paragraph'">This may affect a lot of elements or have irreversible consequences, please double check this is really what you want.</translate> <translate translate-context="Modal/*/Paragraph">This may affect a lot of elements or have irreversible consequences, please double check this is really what you want.</translate>
</p> </p>
<div slot="modal-confirm"><translate :translate-context="'Modal/*/Button.Label/Short, Verb'">Launch</translate></div> <div slot="modal-confirm"><translate translate-context="Modal/*/Button.Label/Short, Verb">Launch</translate></div>
</dangerous-button> </dangerous-button>
<div <div
v-else v-else
@click="launchAction" @click="launchAction"
:disabled="checked.length === 0" :disabled="checked.length === 0"
:class="['ui', {disabled: checked.length === 0}, {'loading': actionLoading}, 'button']"> :class="['ui', {disabled: checked.length === 0}, {'loading': actionLoading}, 'button']">
<translate :translate-context="'Content/*/Button.Label/Short, Verb'">Go</translate></div> <translate translate-context="Content/*/Button.Label/Short, Verb">Go</translate></div>
</div> </div>
<div class="count field"> <div class="count field">
<translate :translate-context="'Content/*/Paragraph'" <translate translate-context="Content/*/Paragraph"
tag="span" tag="span"
v-if="selectAll" v-if="selectAll"
key="1" key="1"
@ -65,7 +65,7 @@
translate-plural="All %{ count } elements selected"> translate-plural="All %{ count } elements selected">
All %{ count } element selected All %{ count } element selected
</translate> </translate>
<translate :translate-context="'Content/*/Paragraph'" <translate translate-context="Content/*/Paragraph"
tag="span" tag="span"
v-else v-else
key="2" key="2"
@ -76,7 +76,7 @@
</translate> </translate>
<template v-if="currentAction.allowAll && checkable.length > 0 && checkable.length === checked.length"> <template v-if="currentAction.allowAll && checkable.length > 0 && checkable.length === checked.length">
<a @click="selectAll = true" v-if="!selectAll"> <a @click="selectAll = true" v-if="!selectAll">
<translate :translate-context="'Content/*/Link/Verb'" <translate translate-context="Content/*/Link/Verb"
key="3" key="3"
:translate-n="objectsData.count" :translate-n="objectsData.count"
:translate-params="{total: objectsData.count}" :translate-params="{total: objectsData.count}"
@ -85,20 +85,20 @@
</translate> </translate>
</a> </a>
<a @click="selectAll = false" v-else> <a @click="selectAll = false" v-else>
<translate :translate-context="'Content/*/Link/Verb'" key="4">Select only current page</translate> <translate translate-context="Content/*/Link/Verb" key="4">Select only current page</translate>
</a> </a>
</template> </template>
</div> </div>
</div> </div>
<div v-if="actionErrors.length > 0" class="ui negative message"> <div v-if="actionErrors.length > 0" class="ui negative message">
<div class="header"><translate :translate-context="'Content/*/Error message/Header'">Error while applying action</translate></div> <div class="header"><translate translate-context="Content/*/Error message/Header">Error while applying action</translate></div>
<ul class="list"> <ul class="list">
<li v-for="error in actionErrors">{{ error }}</li> <li v-for="error in actionErrors">{{ error }}</li>
</ul> </ul>
</div> </div>
<div v-if="actionResult" class="ui positive message"> <div v-if="actionResult" class="ui positive message">
<p> <p>
<translate :translate-context="'Content/*/Paragraph'" <translate translate-context="Content/*/Paragraph"
:translate-n="actionResult.updated" :translate-n="actionResult.updated"
:translate-params="{count: actionResult.updated, action: actionResult.action}" :translate-params="{count: actionResult.updated, action: actionResult.action}"
translate-plural="Action %{ action } was launched successfully on %{ count } elements"> translate-plural="Action %{ action } was launched successfully on %{ count } elements">

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/Short">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="Content/*/Button.Label/Short, Verb">Copy</translate>
</button> </button>
</div> </div>
</template> </template>

View File

@ -5,7 +5,7 @@
<modal class="small" :show.sync="showModal"> <modal class="small" :show.sync="showModal">
<div class="header"> <div class="header">
<slot name="modal-header"> <slot name="modal-header">
<translate :translate-context="'Modal/*/Title'">Do you want to confirm this action?</translate> <translate translate-context="Modal/*/Title">Do you want to confirm this action?</translate>
</slot> </slot>
</div> </div>
<div class="scrolling content"> <div class="scrolling content">
@ -15,11 +15,11 @@
</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="Modal/*/Button.Label/Short, 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">
<translate :translate-context="'Modal/*/Button.Label/Short, Verb'">Confirm</translate> <translate translate-context="Modal/*/Button.Label/Short, Verb">Confirm</translate>
</slot> </slot>
</div> </div>
</div> </div>

View File

@ -1,9 +1,9 @@
<template> <template>
<span> <span>
<translate :translate-context="'Content/*/Paragraph'" <translate translate-context="Content/*/Paragraph"
v-if="durationData.hours > 0" v-if="durationData.hours > 0"
:translate-params="{minutes: durationData.minutes, hours: durationData.hours}">%{ hours } h %{ minutes } min</translate> :translate-params="{minutes: durationData.minutes, hours: durationData.hours}">%{ hours } h %{ minutes } min</translate>
<translate :translate-context="'Content/*/Paragraph'" <translate translate-context="Content/*/Paragraph"
v-else v-else
:translate-params="{minutes: durationData.minutes}">%{ minutes } min</translate> :translate-params="{minutes: durationData.minutes}">%{ minutes } min</translate>
</span> </span>

View File

@ -5,7 +5,7 @@
<slot name="title"> <slot name="title">
<i class="search icon"></i> <i class="search icon"></i>
<translate :translate-context="'Content/*/Paragraph'"> <translate translate-context="Content/*/Paragraph">
No results were found. No results were found.
</translate> </translate>
</slot> </slot>
@ -14,7 +14,7 @@
<div class="inline"> <div class="inline">
<slot></slot> <slot></slot>
<button v-if="refresh" class="ui button" @click="$emit('refresh')"> <button v-if="refresh" class="ui button" @click="$emit('refresh')">
<translate :translate-context="'Content/*/Button.Label/Short, Verb'"> <translate translate-context="Content/*/Button.Label/Short, Verb">
Refresh Refresh
</translate></button> </translate></button>
</button> </button>

View File

@ -3,7 +3,7 @@
<section class="ui vertical center aligned stripe segment"> <section class="ui vertical center aligned stripe segment">
<div :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']"> <div :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']">
<div class="ui text loader"> <div class="ui text loader">
<translate :translate-context="'Content/Favorites/Message'">Loading your favorites</translate> <translate translate-context="Content/Favorites/Message">Loading your favorites</translate>
</div> </div>
</div> </div>
<h2 v-if="results" class="ui center aligned icon header"> <h2 v-if="results" class="ui center aligned icon header">
@ -12,7 +12,7 @@
translate-plural="%{ count } favorites" translate-plural="%{ count } favorites"
:translate-n="$store.state.favorites.count" :translate-n="$store.state.favorites.count"
:translate-params="{count: results.count}" :translate-params="{count: results.count}"
:translate-context="'Content/Favorites/Title'"> translate-context="Content/Favorites/Title">
1 favorite 1 favorite
</translate> </translate>
</h2> </h2>
@ -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/Favorites/Dropdown.Title/Short, Name">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/*/Dropdown.Label/Short, Name">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/*/Dropdown/Short">Ascending</translate></option>
<option value="-"><translate :translate-context="'Content/*/Short'">Descending</translate></option> <option value="-"><translate translate-context="Content/*/Short">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/*/Dropdown.Label/Short, Name">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

@ -1,8 +1,8 @@
<template> <template>
<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/Button.Message">Add to favorites</translate>
</button> </button>
<button <button
v-else v-else

View File

@ -4,7 +4,7 @@
<slot name="title"></slot> <slot name="title"></slot>
</h3> </h3>
<p v-if="!isLoading && libraries.length > 0" class="ui subtitle"><slot name="subtitle"></slot></p> <p v-if="!isLoading && libraries.length > 0" class="ui subtitle"><slot name="subtitle"></slot></p>
<p v-if="!isLoading && libraries.length === 0" class="ui subtitle"><translate :translate-context="'Content/Federation/Paragraph'">No matching library.</translate></p> <p v-if="!isLoading && libraries.length === 0" class="ui subtitle"><translate translate-context="Content/Federation/Paragraph">No matching library.</translate></p>
<i @click="fetchData(previousPage)" :disabled="!previousPage" :class="['ui', {disabled: !previousPage}, 'circular', 'angle left', 'icon']"> <i @click="fetchData(previousPage)" :disabled="!previousPage" :class="['ui', {disabled: !previousPage}, 'circular', 'angle left', 'icon']">
</i> </i>
<i @click="fetchData(nextPage)" :disabled="!nextPage" :class="['ui', {disabled: !nextPage}, 'circular', 'angle right', 'icon']"> <i @click="fetchData(nextPage)" :disabled="!nextPage" :class="['ui', {disabled: !nextPage}, 'circular', 'angle right', 'icon']">

View File

@ -3,7 +3,7 @@
<div v-if="stats" class="ui stackable two column grid"> <div v-if="stats" class="ui stackable two column grid">
<div class="column"> <div class="column">
<h3 class="ui left aligned header"> <h3 class="ui left aligned header">
<translate :translate-context="'Content/About/Title/Noun'">User activity</translate> <translate translate-context="Content/About/Title/Noun">User activity</translate>
</h3> </h3>
<div v-if="stats" class="ui mini horizontal statistics"> <div v-if="stats" class="ui mini horizontal statistics">
<div class="statistic"> <div class="statistic">
@ -11,48 +11,48 @@
<i class="green user icon"></i> <i class="green user icon"></i>
{{ stats.users }} {{ stats.users }}
</div> </div>
<div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">users</translate></div> <div class="label"><translate translate-context="Content/About/Paragraph/Unit">users</translate></div>
</div> </div>
<div class="statistic"> <div class="statistic">
<div class="value"> <div class="value">
<i class="orange sound icon"></i> {{ stats.listenings }} <i class="orange sound icon"></i> {{ stats.listenings }}
</div> </div>
<div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">tracks listened</translate></div> <div class="label"><translate translate-context="Content/About/Paragraph/Unit">tracks listened</translate></div>
</div> </div>
<div class="statistic"> <div class="statistic">
<div class="value"> <div class="value">
<i class="pink heart icon"></i> {{ stats.trackFavorites }} <i class="pink heart icon"></i> {{ stats.trackFavorites }}
</div> </div>
<div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">Tracks favorited</translate></div> <div class="label"><translate translate-context="Content/About/Paragraph/Unit">Tracks favorited</translate></div>
</div> </div>
</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="Content/About/Title/Noun">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">
{{ parseInt(stats.musicDuration) }} {{ parseInt(stats.musicDuration) }}
</div> </div>
<div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">Hours of music</translate></div> <div class="label"><translate translate-context="Content/About/Paragraph/Unit">Hours of music</translate></div>
</div> </div>
<div class="statistic"> <div class="statistic">
<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="Content/About/Paragraph/Unit">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="Content/About/Paragraph/Unit">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="Content/About/Paragraph/Unit">Tracks</translate></div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -15,27 +15,27 @@
</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/*/Button.Label/Verb, Short">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">
<i class="wikipedia w icon"></i> <i class="wikipedia w icon"></i>
<translate :translate-context="'Content/*/Button.Label/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/*/Button.Label/Verb'">View on MusicBrainz</translate> <translate translate-context="Content/*/Button.Label/Verb">View on MusicBrainz</translate>
</a> </a>
<template v-if="publicLibraries.length > 0"> <template v-if="publicLibraries.length > 0">
<button <button
@click="showEmbedModal = !showEmbedModal" @click="showEmbedModal = !showEmbedModal"
class="ui button icon labeled"> class="ui button icon labeled">
<i class="code icon"></i> <i class="code icon"></i>
<translate :translate-context="'Content/*/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">
<translate :translate-context="'Popup/Album/Title/Verb'">Embed this album on your website</translate> <translate translate-context="Popup/Album/Title/Verb">Embed this album on your website</translate>
</div> </div>
<div class="content"> <div class="content">
<div class="description"> <div class="description">
@ -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="Popup/*/Button.Label/Verb">Cancel</translate>
</div> </div>
</div> </div>
</modal> </modal>
@ -58,10 +58,10 @@
tag="h2" tag="h2"
class="left floated" class="left floated"
:translate-params="{number: disc_number + 1}" :translate-params="{number: disc_number + 1}"
: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/*/Button.Label/Verb, Short">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,17 +69,17 @@
<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="Content/*/Title/Name">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/Name">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>
</library-widget> </library-widget>
</section> </section>
</template> </template>

View File

@ -2,18 +2,18 @@
<main v-title="labels.title"> <main v-title="labels.title">
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<h2 class="ui header"> <h2 class="ui header">
<translate :translate-context="'Content/Album/Title'">Browsing albums</translate> <translate translate-context="Content/Album/Title">Browsing albums</translate>
</h2> </h2>
<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> <label>
<translate :translate-context="'Content/Search/Input.Label/Verb'">Search</translate> <translate translate-context="Content/Search/Input.Label/Verb">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>
<div class="field"> <div class="field">
<label><translate :translate-context="'Content/Search/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]] }}
@ -21,14 +21,14 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate :translate-context="'Content/Search/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/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>
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate :translate-context="'Content/Search/Dropdown.Label/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>

View File

@ -11,7 +11,7 @@
<div class="content"> <div class="content">
{{ artist.name }} {{ artist.name }}
<div class="sub header" v-if="albums"> <div class="sub header" v-if="albums">
<translate :translate-context="'Content/Artist/Paragraph'" <translate translate-context="Content/Artist/Paragraph"
tag="div" tag="div"
translate-plural="%{ count } tracks in %{ albumsCount } albums" translate-plural="%{ count } tracks in %{ albumsCount } albums"
:translate-n="totalTracks" :translate-n="totalTracks"
@ -24,27 +24,27 @@
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<radio-button type="artist" :object-id="artist.id"></radio-button> <radio-button type="artist" :object-id="artist.id"></radio-button>
<play-button :is-playable="isPlayable" class="orange" :artist="artist"> <play-button :is-playable="isPlayable" class="orange" :artist="artist">
<translate :translate-context="'Content/Artist/Button.Label/Verb'">Play all albums</translate> <translate translate-context="Content/Artist/Button.Label/Verb">Play all albums</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">
<i class="wikipedia w icon"></i> <i class="wikipedia w icon"></i>
<translate :translate-context="'Content/*/Button.Label/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 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/*/Button.Label/Verb">View on MusicBrainz</translate>
</a> </a>
<template v-if="publicLibraries.length > 0"> <template v-if="publicLibraries.length > 0">
<button <button
@click="showEmbedModal = !showEmbedModal" @click="showEmbedModal = !showEmbedModal"
class="ui button icon labeled"> class="ui button icon labeled">
<i class="code icon"></i> <i class="code icon"></i>
<translate :translate-context="'Content/*/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">
<translate :translate-context="'Popup/Artist/Title/Verb'">Embed this artist work on your website</translate> <translate translate-context="Popup/Artist/Title/Verb">Embed this artist work on your website</translate>
</div> </div>
<div class="content"> <div class="content">
<div class="description"> <div class="description">
@ -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="Popup/*/Button.Label/Verb">Cancel</translate>
</div> </div>
</div> </div>
</modal> </modal>
@ -68,10 +68,10 @@
<translate>You are currently hiding content related to this artist.</translate> <translate>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>
</router-link> </router-link>
<button @click="$store.dispatch('moderation/deleteContentFilter', contentFilter.uuid)" class="ui basic tiny button"> <button @click="$store.dispatch('moderation/deleteContentFilter', contentFilter.uuid)" class="ui basic tiny button">
<translate :translate-context="'Content/Moderation/Button.Label'">Remove filter</translate> <translate translate-context="Content/Moderation/Button.Label">Remove filter</translate>
</button> </button>
</div> </div>
</div> </div>
@ -80,7 +80,7 @@
</section> </section>
<section v-else-if="albums && albums.length > 0" class="ui vertical stripe segment"> <section v-else-if="albums && albums.length > 0" class="ui vertical stripe segment">
<h2> <h2>
<translate :translate-context="'Content/Artist/Title'">Albums by this artist</translate> <translate translate-context="Content/Artist/Title">Albums by this artist</translate>
</h2> </h2>
<div class="ui cards" > <div class="ui cards" >
<album-card :mode="'rich'" :album="album" :key="album.id" v-for="album in albums"></album-card> <album-card :mode="'rich'" :album="album" :key="album.id" v-for="album in albums"></album-card>
@ -88,16 +88,16 @@
</section> </section>
<section v-if="tracks.length > 0" class="ui vertical stripe segment"> <section v-if="tracks.length > 0" class="ui vertical stripe segment">
<h2> <h2>
<translate :translate-context="'Content/Artist/Title'">Tracks by this artist</translate> <translate translate-context="Content/Artist/Title">Tracks by this artist</translate>
</h2> </h2>
<track-table :display-position="true" :tracks="tracks"></track-table> <track-table :display-position="true" :tracks="tracks"></track-table>
</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/Artist/Title">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>
</library-widget> </library-widget>
</section> </section>
</template> </template>

View File

@ -2,18 +2,18 @@
<main v-title="labels.title"> <main v-title="labels.title">
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<h2 class="ui header"> <h2 class="ui header">
<translate :translate-context="'Content/Artist/Title'">Browsing artists</translate> <translate translate-context="Content/Artist/Title">Browsing artists</translate>
</h2> </h2>
<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> <label>
<translate :translate-context="'Content/Search/Input.Label/Verb'">Search</translate> <translate translate-context="Content/Search/Input.Label/Verb">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>
<div class="field"> <div class="field">
<label><translate :translate-context="'Content/Search/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]] }}
@ -21,14 +21,14 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate :translate-context="'Content/Search/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/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>
</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">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

@ -3,7 +3,7 @@
<div class="content"> <div class="content">
<div class="header"> <div class="header">
<router-link :to="detailUrl"> <router-link :to="detailUrl">
<translate :translate-context="'Content/Library/Card/Short'" :translate-params="{id: obj.uuid.substring(0, 8)}">Modification %{ id }</translate> <translate translate-context="Content/Library/Card/Short" :translate-params="{id: obj.uuid.substring(0, 8)}">Modification %{ id }</translate>
</router-link> </router-link>
</div> </div>
<div class="meta"> <div class="meta">
@ -11,7 +11,7 @@
v-if="obj.target && obj.target.type === 'track'" v-if="obj.target && obj.target.type === 'track'"
:to="{name: 'library.tracks.detail', params: {id: obj.target.id }}"> :to="{name: 'library.tracks.detail', params: {id: obj.target.id }}">
<i class="music icon"></i> <i class="music icon"></i>
<translate :translate-context="'Content/Library/Card/Short'" :translate-params="{id: obj.target.id, name: obj.target.repr}">Track #%{ id } - %{ name }</translate> <translate translate-context="Content/Library/Card/Short" :translate-params="{id: obj.target.id, name: obj.target.repr}">Track #%{ id } - %{ name }</translate>
</router-link> </router-link>
<br> <br>
<human-date :date="obj.creation_date" :icon="true"></human-date> <human-date :date="obj.creation_date" :icon="true"></human-date>
@ -19,19 +19,19 @@
<span class="right floated"> <span class="right floated">
<span v-if="obj.is_approved && obj.is_applied"> <span v-if="obj.is_approved && obj.is_applied">
<i class="green check icon"></i> <i class="green check icon"></i>
<translate :translate-context="'Content/Library/Card/Short'">Approved and applied</translate> <translate translate-context="Content/Library/Card/Short">Approved and applied</translate>
</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/Library/Card/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/Library/Card/Short">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/Card/Short">Rejected</translate>
</span> </span>
</span> </span>
</div> </div>
@ -43,9 +43,9 @@
<table v-if="obj.type === 'update'" class="ui celled very basic fixed stacking table"> <table v-if="obj.type === 'update'" class="ui celled very basic fixed stacking table">
<thead> <thead>
<tr> <tr>
<th><translate :translate-context="'Content/Library/Card.Table.Header/Short'">Field</translate></th> <th><translate translate-context="Content/Library/Card.Table.Header/Short">Field</translate></th>
<th><translate :translate-context="'Content/Library/Card.Table.Header/Short'">Old value</translate></th> <th><translate translate-context="Content/Library/Card.Table.Header/Short">Old value</translate></th>
<th><translate :translate-context="'Content/Library/Card.Table.Header/Short'">New value</translate></th> <th><translate translate-context="Content/Library/Card.Table.Header/Short">New value</translate></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -58,7 +58,7 @@
</span> </span>
</td> </td>
<td v-else> <td v-else>
<translate :translate-context="'*/*/*'">N/A</translate> <translate translate-context="*/*/*">N/A</translate>
</td> </td>
<td v-if="field.diff"> <td v-if="field.diff">
@ -79,24 +79,24 @@
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/Library/Button.Label">Approve</translate>
</button> </button>
<button <button
v-if="canApprove && obj.is_approved === null" v-if="canApprove && obj.is_approved === null"
@click="approve(false)" @click="approve(false)"
:class="['ui', {loading: isLoading}, 'yellow', 'basic', 'button']"> :class="['ui', {loading: isLoading}, 'yellow', 'basic', 'button']">
<translate :translate-context="'Content/Library/Button.Label'">Reject</translate> <translate translate-context="Content/Library/Button.Label">Reject</translate>
</button> </button>
<dangerous-button <dangerous-button
v-if="canDelete" v-if="canDelete"
:class="['ui', {loading: isLoading}, 'basic button']" :class="['ui', {loading: isLoading}, 'basic button']"
:action="remove"> :action="remove">
<translate :translate-context="'*/*/*/Verb'">Delete</translate> <translate translate-context="*/*/*/Verb">Delete</translate>
<p slot="modal-header"><translate :translate-context="'Popup/Library/Title'">Delete this suggestion?</translate></p> <p slot="modal-header"><translate translate-context="Popup/Library/Title">Delete this suggestion?</translate></p>
<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="Popup/Library/Button.Label">Delete</translate></p>
</dangerous-button> </dangerous-button>
</div> </div>
</div> </div>

View File

@ -1,11 +1,11 @@
<template> <template>
<div v-if="submittedMutation"> <div v-if="submittedMutation">
<div class="ui positive message"> <div class="ui positive message">
<div class="header"><translate :translate-context="'Content/Library/Paragraph'">Your edit was successfully submitted.</translate></div> <div class="header"><translate translate-context="Content/Library/Paragraph">Your edit was successfully submitted.</translate></div>
</div> </div>
<edit-card :obj="submittedMutation" :current-state="currentState" /> <edit-card :obj="submittedMutation" :current-state="currentState" />
<button class="ui button" @click.prevent="submittedMutation = null"> <button class="ui button" @click.prevent="submittedMutation = null">
<translate :translate-context="'Content/Library/Button.Label'"> <translate translate-context="Content/Library/Button.Label">
Submit another edit Submit another edit
</translate> </translate>
</button> </button>
@ -15,28 +15,28 @@
<edit-list :filters="editListFilters" :url="mutationsUrl" :obj="object" :currentState="currentState"> <edit-list :filters="editListFilters" :url="mutationsUrl" :obj="object" :currentState="currentState">
<div slot="title"> <div slot="title">
<template v-if="showPendingReview"> <template v-if="showPendingReview">
<translate :translate-context="'Content/Library/Paragraph'"> <translate translate-context="Content/Library/Paragraph">
Recent edits awaiting review Recent edits awaiting review
</translate> </translate>
<button class="ui tiny basic right floated button" @click.prevent="showPendingReview = false"> <button class="ui tiny basic right floated button" @click.prevent="showPendingReview = false">
<translate :translate-context="'Content/Library/Button.Label'"> <translate translate-context="Content/Library/Button.Label">
Show all edits Show all edits
</translate> </translate>
</button> </button>
</template> </template>
<template v-else> <template v-else>
<translate :translate-context="'Content/Library/Paragraph'"> <translate translate-context="Content/Library/Paragraph">
Recent edits Recent edits
</translate> </translate>
<button class="ui tiny basic right floated button" @click.prevent="showPendingReview = true"> <button class="ui tiny basic right floated button" @click.prevent="showPendingReview = true">
<translate :translate-context="'Content/Library/Button.Label'"> <translate translate-context="Content/Library/Button.Label">
Retrict to unreviewed edits Retrict to unreviewed edits
</translate> </translate>
</button> </button>
</template> </template>
</div> </div>
<empty-state slot="empty-state"> <empty-state slot="empty-state">
<translate :translate-context="'Content/Library/Paragraph'"> <translate translate-context="Content/Library/Paragraph">
Suggest a change using the form below. Suggest a change using the form below.
</translate> </translate>
</empty-state> </empty-state>
@ -44,13 +44,13 @@
<form class="ui form" @submit.prevent="submit()"> <form class="ui form" @submit.prevent="submit()">
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<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 while submitting edit</translate></div> <div class="header"><translate translate-context="Content/Library/Error message.Title">Error while submitting edit</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 v-if="!canEdit" class="ui message"> <div v-if="!canEdit" class="ui message">
<translate :translate-context="'Content/Library/Paragraph'"> <translate translate-context="Content/Library/Paragraph">
You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval. You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval.
</translate> </translate>
</div> </div>
@ -62,12 +62,12 @@
<div v-if="values[fieldConfig.id] != initialValues[fieldConfig.id]"> <div v-if="values[fieldConfig.id] != initialValues[fieldConfig.id]">
<button class="ui tiny basic right floated reset button" form="noop" @click.prevent="values[fieldConfig.id] = initialValues[fieldConfig.id]"> <button class="ui tiny basic right floated reset button" form="noop" @click.prevent="values[fieldConfig.id] = initialValues[fieldConfig.id]">
<i class="undo icon"></i> <i class="undo icon"></i>
<translate :translate-context="'Content/Library/Button.Label'" :translate-params="{value: initialValues[fieldConfig.id]}">Reset to initial value: %{ value }</translate> <translate translate-context="Content/Library/Button.Label" :translate-params="{value: initialValues[fieldConfig.id]}">Reset to initial value: %{ value }</translate>
</button> </button>
</div> </div>
</div> </div>
<div class="field"> <div class="field">
<label for="summary"><translate :translate-context="'*/*/*'">Summary (optional)</translate></label> <label for="summary"><translate translate-context="*/*/*">Summary (optional)</translate></label>
<textarea name="change-summary" v-model="summary" id="change-summary" rows="3" :placeholder="labels.summaryPlaceholder"></textarea> <textarea name="change-summary" v-model="summary" id="change-summary" rows="3" :placeholder="labels.summaryPlaceholder"></textarea>
</div> </div>
<router-link <router-link
@ -75,11 +75,11 @@
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="Content/*/Button.Label">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>
<translate v-else key="2" :translate-context="'Content/Library/Button.Label/Verb'">Submit suggestion</translate> <translate v-else key="2" translate-context="Content/Library/Button.Label/Verb">Submit suggestion</translate>
</button> </button>
</form> </form>
</div> </div>

View File

@ -1,9 +1,9 @@
<template> <template>
<div> <div>
<div class="ui top attached tabular menu"> <div class="ui top attached tabular menu">
<a :class="['item', {active: currentTab === 'summary'}]" @click="currentTab = 'summary'"><translate :translate-context="'Content/Library/Tab.Title/Short'">Summary</translate></a> <a :class="['item', {active: currentTab === 'summary'}]" @click="currentTab = 'summary'"><translate translate-context="Content/Library/Tab.Title/Short">Summary</translate></a>
<a :class="['item', {active: currentTab === 'uploads'}]" @click="currentTab = 'uploads'"> <a :class="['item', {active: currentTab === 'uploads'}]" @click="currentTab = 'uploads'">
<translate :translate-context="'Content/Library/Tab.Title/Short'">Uploading</translate> <translate translate-context="Content/Library/Tab.Title/Short">Uploading</translate>
<div v-if="files.length === 0" class="ui label"> <div v-if="files.length === 0" class="ui label">
0 0
</div> </div>
@ -15,7 +15,7 @@
</div> </div>
</a> </a>
<a :class="['item', {active: currentTab === 'processing'}]" @click="currentTab = 'processing'"> <a :class="['item', {active: currentTab === 'processing'}]" @click="currentTab = 'processing'">
<translate :translate-context="'Content/Library/Tab.Title/Short'">Processing</translate> <translate translate-context="Content/Library/Tab.Title/Short">Processing</translate>
<div v-if="processableFiles === 0" class="ui label"> <div v-if="processableFiles === 0" class="ui label">
0 0
</div> </div>
@ -29,19 +29,19 @@
</div> </div>
<div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'summary'}]"> <div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'summary'}]">
<h2 class="ui header"><translate :translate-context="'Content/Library/Title/Verb'">Upload new tracks</translate></h2> <h2 class="ui header"><translate translate-context="Content/Library/Title/Verb">Upload new tracks</translate></h2>
<div class="ui message"> <div class="ui message">
<p><translate :translate-context="'Content/Library/Paragraph'">You are about to upload music to your library. Before proceeding, please ensure that:</translate></p> <p><translate translate-context="Content/Library/Paragraph">You are about to upload music to your library. Before proceeding, please ensure that:</translate></p>
<ul> <ul>
<li v-if="library.privacy_level != 'me'"> <li v-if="library.privacy_level != 'me'">
<translate :translate-context="'Content/Library/List item'">You are not uploading copyrighted content in a public library, otherwise you may be infringing the law</translate> <translate translate-context="Content/Library/List item">You are not uploading copyrighted content in a public library, otherwise you may be infringing the law</translate>
</li> </li>
<li> <li>
<translate :translate-context="'Content/Library/List item'">The music files you are uploading are tagged properly.</translate>&nbsp; <translate translate-context="Content/Library/List item">The music files you are uploading are tagged properly.</translate>&nbsp;
<a href="http://picard.musicbrainz.org/" target='_blank'><translate :translate-context="'Content/Library/Link'">We recommend using Picard for that purpose.</translate></a> <a href="http://picard.musicbrainz.org/" target='_blank'><translate translate-context="Content/Library/Link">We recommend using Picard for that purpose.</translate></a>
</li> </li>
<li> <li>
<translate :translate-context="'Content/Library/List item'">The uploaded music files are in OGG, Flac or MP3 format</translate> <translate translate-context="Content/Library/List item">The uploaded music files are in OGG, Flac or MP3 format</translate>
</li> </li>
</ul> </ul>
</div> </div>
@ -49,14 +49,14 @@
<div class="ui form"> <div class="ui form">
<div class="fields"> <div class="fields">
<div class="ui four wide field"> <div class="ui four wide field">
<label><translate :translate-context="'Content/Library/Input.Label/Noun'">Import reference</translate></label> <label><translate translate-context="Content/Library/Input.Label/Noun">Import reference</translate></label>
<p><translate :translate-context="'Content/Library/Paragraph'">This reference will be used to group imported files together.</translate></p> <p><translate translate-context="Content/Library/Paragraph">This reference will be used to group imported files together.</translate></p>
<input name="import-ref" type="text" v-model="importReference" /> <input name="import-ref" type="text" v-model="importReference" />
</div> </div>
</div> </div>
</div> </div>
<div class="ui green button" @click="currentTab = 'uploads'"><translate :translate-context="'Content/Library/Button.Label'">Proceed</translate></div> <div class="ui green button" @click="currentTab = 'uploads'"><translate translate-context="Content/Library/Button.Label">Proceed</translate></div>
</div> </div>
<div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'uploads'}]"> <div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'uploads'}]">
<div class="ui container"> <div class="ui container">
@ -73,10 +73,10 @@
@input-file="inputFile" @input-file="inputFile"
ref="upload"> ref="upload">
<i class="upload icon"></i>&nbsp; <i class="upload icon"></i>&nbsp;
<translate :translate-context="'Content/Library/Paragraph/Call to action'">Click to select files to upload or drag and drop files or directories</translate> <translate translate-context="Content/Library/Paragraph/Call to action">Click to select files to upload or drag and drop files or directories</translate>
<br /> <br />
<br /> <br />
<i><translate :translate-context="'Content/Library/Paragraph'" :translate-params="{extensions: supportedExtensions.join(', ')}">Supported extensions: %{ extensions }</translate></i> <i><translate translate-context="Content/Library/Paragraph" :translate-params="{extensions: supportedExtensions.join(', ')}">Supported extensions: %{ extensions }</translate></i>
</file-upload-widget> </file-upload-widget>
</div> </div>
<div v-if="files.length > 0" class="table-wrapper"> <div v-if="files.length > 0" class="table-wrapper">
@ -84,9 +84,9 @@
<table class="ui unstackable table"> <table class="ui unstackable table">
<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/Table.Label">Size</translate></th>
<th><translate :translate-context="'Content/Library/Table.Label'">Status</translate></th> <th><translate translate-context="Content/Library/Table.Label">Status</translate></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -100,14 +100,14 @@
</span> </span>
</span> </span>
<span v-else-if="file.success" class="ui green label"> <span v-else-if="file.success" class="ui green label">
<translate :translate-context="'Content/Library/Table'" key="1">Uploaded</translate> <translate translate-context="Content/Library/Table" key="1">Uploaded</translate>
</span> </span>
<span v-else-if="file.active" class="ui yellow label"> <span v-else-if="file.active" class="ui yellow label">
<translate :translate-context="'Content/Library/Table'" key="2">Uploading</translate> <translate translate-context="Content/Library/Table" key="2">Uploading</translate>
({{ 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/Table" 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

@ -4,17 +4,17 @@
<div class="ui stackable three column grid"> <div class="ui stackable three column grid">
<div class="column"> <div class="column">
<track-widget :url="'history/listenings/'" :filters="{scope: 'user', ordering: '-creation_date'}"> <track-widget :url="'history/listenings/'" :filters="{scope: 'user', ordering: '-creation_date'}">
<template slot="title"><translate :translate-context="'Content/Home/Title'">Recently listened</translate></template> <template slot="title"><translate translate-context="Content/Home/Title">Recently listened</translate></template>
</track-widget> </track-widget>
</div> </div>
<div class="column"> <div class="column">
<track-widget :url="'favorites/tracks/'" :filters="{scope: 'user', ordering: '-creation_date'}"> <track-widget :url="'favorites/tracks/'" :filters="{scope: 'user', ordering: '-creation_date'}">
<template slot="title"><translate :translate-context="'Content/Home/Title'">Recently favorited</translate></template> <template slot="title"><translate translate-context="Content/Home/Title">Recently favorited</translate></template>
</track-widget> </track-widget>
</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="Content/Home/Title">Playlists</translate></template>
</playlist-widget> </playlist-widget>
</div> </div>
</div> </div>
@ -22,7 +22,7 @@
<div class="ui stackable one column grid"> <div class="ui stackable one column grid">
<div class="column"> <div class="column">
<album-widget :filters="{playable: true, ordering: '-creation_date'}"> <album-widget :filters="{playable: true, ordering: '-creation_date'}">
<template slot="title"><translate :translate-context="'Content/Home/Title'">Recently added</translate></template> <template slot="title"><translate translate-context="Content/Home/Title">Recently added</translate></template>
</album-widget> </album-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="Menu/Home/Link/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="Menu/Home/Link">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="Menu/Home/Link">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="Menu/Home/Link">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="Menu/Home/Link">Playlists</translate>
</router-link> </router-link>
</nav> </nav>
<router-view :key="$route.fullPath"></router-view> <router-view :key="$route.fullPath"></router-view>

View File

@ -2,12 +2,12 @@
<main v-title="labels.title"> <main v-title="labels.title">
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<h2 class="ui header"> <h2 class="ui header">
<translate :translate-context="'Content/Radio/Title'">Browsing radios</translate> <translate translate-context="Content/Radio/Title">Browsing radios</translate>
</h2> </h2>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<div class="ui row"> <div class="ui row">
<h3 class="ui header"> <h3 class="ui header">
<translate :translate-context="'Content/Radio/Title'">Instance radios</translate> <translate translate-context="Content/Radio/Title">Instance radios</translate>
</h3> </h3>
<div class="ui cards"> <div class="ui cards">
<radio-card :type="'favorites'"></radio-card> <radio-card :type="'favorites'"></radio-card>
@ -18,20 +18,20 @@
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<h3 class="ui header"> <h3 class="ui header">
<translate :translate-context="'Content/Radio/Title'">User radios</translate> <translate translate-context="Content/Radio/Title">User radios</translate>
</h3> </h3>
<router-link class="ui green basic button" to="/library/radios/build" exact> <router-link class="ui green basic button" to="/library/radios/build" exact>
<translate :translate-context="'Content/Radio/Button.Label/Verb'">Create your own radio</translate> <translate translate-context="Content/Radio/Button.Label/Verb">Create your own radio</translate>
</router-link> </router-link>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<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/Verb">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">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,18 +39,18 @@
</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">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>
</option> </option>
<option value="-"> <option value="-">
<translate :translate-context="'Content/Search/Dropdown'">Descending</translate> <translate translate-context="Content/Search/Dropdown">Descending</translate>
</option> </option>
</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">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

@ -15,7 +15,7 @@
<div class="content"> <div class="content">
{{ track.title }} {{ track.title }}
<div class="sub header"> <div class="sub header">
<div :translate-context="'Content/Track/Paragraph'" <div translate-context="Content/Track/Paragraph"
v-translate="{album: track.album.title, artist: track.artist.name, albumUrl: albumUrl, artistUrl: artistUrl}" v-translate="{album: track.album.title, artist: track.artist.name, albumUrl: albumUrl, artistUrl: artistUrl}"
>From album <a class="internal" href="%{ albumUrl }">%{ album }</a> by <a class="internal" href="%{ artistUrl }">%{ artist }</a></div> >From album <a class="internal" href="%{ albumUrl }">%{ album }</a> by <a class="internal" href="%{ artistUrl }">%{ artist }</a></div>
</div> </div>
@ -23,33 +23,33 @@
</h2> </h2>
<play-button class="orange" :track="track"> <play-button class="orange" :track="track">
<translate :translate-context="'*/Queue/Button.Label/Short, Verb'">Play</translate> <translate translate-context="*/Queue/Button.Label/Short, Verb">Play</translate>
</play-button> </play-button>
<track-favorite-icon :track="track" :button="true"></track-favorite-icon> <track-favorite-icon :track="track" :button="true"></track-favorite-icon>
<track-playlist-icon :button="true" v-if="$store.state.auth.authenticated" :track="track"></track-playlist-icon> <track-playlist-icon :button="true" v-if="$store.state.auth.authenticated" :track="track"></track-playlist-icon>
<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/*/Link/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/*/Link/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>
<translate :translate-context="'Content/Track/Link/Verb'">Download</translate> <translate translate-context="Content/Track/Link/Verb">Download</translate>
</a> </a>
<template v-if="publicLibraries.length > 0"> <template v-if="publicLibraries.length > 0">
<button <button
@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/Track/Button.Label/Verb">Embed</translate>
</button> </button>
<modal :show.sync="showEmbedModal"> <modal :show.sync="showEmbedModal">
<div class="header"> <div class="header">
<translate :translate-context="'Popup/Track/Title'">Embed this track on your website</translate> <translate translate-context="Popup/Track/Title">Embed this track on your website</translate>
</div> </div>
<div class="content"> <div class="content">
<div class="description"> <div class="description">
@ -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="Popup/Track/Button/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/Track/Button.Label/Verb">Edit</translate>
</router-link> </router-link>
</div> </div>
</section> </section>

View File

@ -3,64 +3,64 @@
<div v-if="track"> <div v-if="track">
<section class="ui vertical stripe center aligned segment"> <section class="ui vertical stripe center aligned segment">
<h2 class="ui header"> <h2 class="ui header">
<translate :translate-context="'Content/Track/Title/Noun'">Track information</translate> <translate translate-context="Content/Track/Title/Noun">Track information</translate>
</h2> </h2>
<table class="ui very basic collapsing celled center aligned table"> <table class="ui very basic collapsing celled center aligned table">
<tbody> <tbody>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Track/Table.Label/Noun'">Copyright</translate> <translate translate-context="Content/Track/Table.Label/Noun">Copyright</translate>
</td> </td>
<td v-if="track.copyright" :title="track.copyright">{{ track.copyright|truncate(50) }}</td> <td v-if="track.copyright" :title="track.copyright">{{ track.copyright|truncate(50) }}</td>
<td v-else> <td v-else>
<translate :translate-context="'Content/Track/Table.Paragraph'">No copyright information available for this track</translate> <translate translate-context="Content/Track/Table.Paragraph">No copyright information available for this track</translate>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Track/Table.Label/Noun'">License</translate> <translate translate-context="Content/Track/Table.Label/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>
</td> </td>
<td v-else> <td v-else>
<translate :translate-context="'Content/Track/Table.Paragraph'">No licensing information for this track</translate> <translate translate-context="Content/Track/Table.Paragraph">No licensing information for this track</translate>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Track/Table.Label'">Duration</translate> <translate translate-context="Content/Track/Table.Label">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>
<translate :translate-context="'*/*/*'">N/A</translate> <translate translate-context="*/*/*">N/A</translate>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Track/Table.Label'">Size</translate> <translate translate-context="Content/Track/Table.Label">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>
<translate :translate-context="'*/*/*'">N/A</translate> <translate translate-context="*/*/*">N/A</translate>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Track/Table.Label'">Bitrate</translate> <translate translate-context="Content/Track/Table.Label">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>
<translate :translate-context="'*/*/*'">N/A</translate> <translate translate-context="*/*/*">N/A</translate>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Track/Table.Label/Noun'">Type</translate> <translate translate-context="Content/Track/Table.Label/Noun">Type</translate>
</td> </td>
<td v-if="upload && upload.extension">{{ upload.extension }}</td> <td v-if="upload && upload.extension">{{ upload.extension }}</td>
<td v-else> <td v-else>
<translate :translate-context="'*/*/*'">N/A</translate> <translate translate-context="*/*/*">N/A</translate>
</td> </td>
</tr> </tr>
</tbody> </tbody>
@ -68,7 +68,7 @@
</section> </section>
<section class="ui vertical stripe center aligned segment"> <section class="ui vertical stripe center aligned segment">
<h2> <h2>
<translate :translate-context="'Content/Track/Title'">Lyrics</translate> <translate translate-context="Content/Track/Title">Lyrics</translate>
</h2> </h2>
<div v-if="isLoadingLyrics" class="ui vertical segment"> <div v-if="isLoadingLyrics" class="ui vertical segment">
<div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div> <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
@ -76,20 +76,20 @@
<div v-if="lyrics" v-html="lyrics.content_rendered"></div> <div v-if="lyrics" v-html="lyrics.content_rendered"></div>
<template v-if="!isLoadingLyrics & !lyrics"> <template v-if="!isLoadingLyrics & !lyrics">
<p> <p>
<translate :translate-context="'Content/Track/Paragraph'">No lyrics available for this track.</translate> <translate translate-context="Content/Track/Paragraph">No lyrics available for this track.</translate>
</p> </p>
<a class="ui button" target="_blank" :href="lyricsSearchUrl"> <a class="ui button" target="_blank" :href="lyricsSearchUrl">
<i class="search icon"></i> <i class="search icon"></i>
<translate :translate-context="'Content/Track/Link/Verb'">Search on lyrics.wikia.com</translate> <translate translate-context="Content/Track/Link/Verb">Search on lyrics.wikia.com</translate>
</a> </a>
</template> </template>
</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/Track/Title">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>
</library-widget> </library-widget>
</section> </section>
</div> </div>

View File

@ -3,8 +3,8 @@
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<div class="ui text container"> <div class="ui text container">
<h2> <h2>
<translate v-if="canEdit" key="1" :translate-context="'Content/*/Title'">Edit this track</translate> <translate v-if="canEdit" key="1" translate-context="Content/*/Title">Edit this track</translate>
<translate v-else key="2" :translate-context="'Content/*/Title'">Suggest an edit on this track</translate> <translate v-else key="2" translate-context="Content/*/Title">Suggest an edit on this track</translate>
</h2> </h2>
<edit-form :object-type="objectType" :object="object" :can-edit="canEdit"></edit-form> <edit-form :object-type="objectType" :object="object" :can-edit="canEdit"></edit-form>
</div> </div>

View File

@ -3,53 +3,53 @@
<div> <div>
<section> <section>
<h2 class="ui header"> <h2 class="ui header">
<translate :translate-context="'Content/Radio/Title'">Builder</translate> <translate translate-context="Content/Radio/Title">Builder</translate>
</h2> </h2>
<p><translate :translate-context="'Content/Radio/Paragraph'">You can use this interface to build your own custom radio, which will play tracks according to your criteria.</translate></p> <p><translate translate-context="Content/Radio/Paragraph">You can use this interface to build your own custom radio, which will play tracks according to your criteria.</translate></p>
<div class="ui form"> <div class="ui form">
<div v-if="success" class="ui positive message"> <div v-if="success" class="ui positive message">
<div class="header"> <div class="header">
<template v-if="radioName"> <template v-if="radioName">
<translate :translate-context="'Content/Radio/Message'">Radio updated</translate> <translate translate-context="Content/Radio/Message">Radio updated</translate>
</template> </template>
<template v-else> <template v-else>
<translate :translate-context="'Content/Radio/Message'">Radio created</translate> <translate translate-context="Content/Radio/Message">Radio created</translate>
</template> </template>
</div> </div>
</div> </div>
<div class=""> <div class="">
<div class="field"> <div class="field">
<label for="name"><translate :translate-context="'Content/Radio/Input.Label/Noun'">Radio name</translate></label> <label for="name"><translate translate-context="Content/Radio/Input.Label/Noun">Radio name</translate></label>
<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/Radio/Input.Label">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">
<input id="public" type="checkbox" v-model="isPublic" /> <input id="public" type="checkbox" v-model="isPublic" />
<label for="public"><translate :translate-context="'Content/Radio/Checkbox.Label/Verb'">Display publicly</translate></label> <label for="public"><translate translate-context="Content/Radio/Checkbox.Label/Verb">Display publicly</translate></label>
</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/Radio/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>
</div> </div>
<div class="ui form"> <div class="ui form">
<p> <p>
<translate :translate-context="'Content/Radio/Paragraph'">Add filters to customize your radio</translate> <translate translate-context="Content/Radio/Paragraph">Add filters to customize your radio</translate>
</p> </p>
<div class="inline field"> <div class="inline field">
<select class="ui dropdown" v-model="currentFilterType"> <select class="ui dropdown" v-model="currentFilterType">
<option value=""> <option value="">
<translate :translate-context="'Content/Radio/Dropdown.Placeholder/Verb'">Select a filter</translate> <translate translate-context="Content/Radio/Dropdown.Placeholder/Verb">Select a filter</translate>
</option> </option>
<option v-for="f in availableFilters" :value="f.type">{{ f.label }}</option> <option v-for="f in availableFilters" :value="f.type">{{ f.label }}</option>
</select> </select>
<button :disabled="!currentFilterType" @click="add" class="ui button"> <button :disabled="!currentFilterType" @click="add" class="ui button">
<translate :translate-context="'Content/Radio/Button.Label/Verb'">Add filter</translate> <translate translate-context="Content/Radio/Button.Label/Verb">Add filter</translate>
</button> </button>
</div> </div>
<p v-if="currentFilter"> <p v-if="currentFilter">
@ -59,11 +59,11 @@
<table class="ui table"> <table class="ui table">
<thead> <thead>
<tr> <tr>
<th class="two wide"><translate :translate-context="'Content/Radio/Table.Label/Noun'">Filter name</translate></th> <th class="two wide"><translate translate-context="Content/Radio/Table.Label/Noun">Filter name</translate></th>
<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/Radio/Table.Label/Noun (Value is a Button)">Actions</translate></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

View File

@ -42,7 +42,7 @@
</span> </span>
<modal v-if="checkResult" :show.sync="showCandidadesModal"> <modal v-if="checkResult" :show.sync="showCandidadesModal">
<div class="header"> <div class="header">
<translate :translate-context="'Popup/Radio/Title/Noun'">Tracks matching filter</translate> <translate translate-context="Popup/Radio/Title/Noun">Tracks matching filter</translate>
</div> </div>
<div class="content"> <div class="content">
<div class="description"> <div class="description">
@ -51,13 +51,13 @@
</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="Popup/Radio/Button.Label/Verb">Cancel</translate>
</div> </div>
</div> </div>
</modal> </modal>
</td> </td>
<td> <td>
<button @click="$emit('delete', index)" class="ui basic red button"><translate :translate-context="'Content/Radio/Button.Label/Verb'">Remove</translate></button> <button @click="$emit('delete', index)" class="ui basic red button"><translate translate-context="Content/Radio/Button.Label/Verb">Remove</translate></button>
</td> </td>
</tr> </tr>
</template> </template>

View File

@ -4,30 +4,30 @@
<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/Noun'">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/Search/Dropdown.Label'">Status</translate></label> <label><translate translate-context="Content/Search/Dropdown.Label">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/Admin/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/Dropdown">Pending review</translate>
</option> </option>
<option value="yes"> <option value="yes">
<translate :translate-context="'Content/Admin/Dropdown'">Approved</translate> <translate translate-context="Content/Admin/Dropdown">Approved</translate>
</option> </option>
<option value="no"> <option value="no">
<translate :translate-context="'Content/Admin/Dropdown'">Rejected</translate> <translate translate-context="Content/Admin/Dropdown">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">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,10 +35,10 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate :translate-context="'Content/Search/Dropdown.Label/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/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>
</select> </select>
</div> </div>
</div> </div>
@ -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/Library/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

@ -3,13 +3,13 @@
<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/Search/Input.Label/Noun'">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/Search/Input.Label/Noun'">Ordering</translate></label> <label><translate translate-context="Content/Search/Input.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,10 +17,10 @@
</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/Input.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>
</select> </select>
</div> </div>
</div> </div>
@ -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="Content/Moderation/Table.Label">Name</translate></th>
<th><translate :translate-context="'Content/Moderation/Table.Label'">Domain</translate></th> <th><translate translate-context="Content/Moderation/Table.Label">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/Noun">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, Noun">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/Table/Short, Noun">Local account</translate>
</span> </span>
</td> </td>
<td> <td>
@ -70,7 +70,7 @@
<human-date v-if="scope.obj.last_fetch_date" :date="scope.obj.last_fetch_date"></human-date> <human-date v-if="scope.obj.last_fetch_date" :date="scope.obj.last_fetch_date"></human-date>
</td> </td>
<td> <td>
<span v-if="scope.obj.instance_policy"><i class="shield icon"></i> <translate :translate-context="'*/*/*'">Yes</translate></span> <span v-if="scope.obj.instance_policy"><i class="shield icon"></i> <translate translate-context="*/*/*">Yes</translate></span>
</td> </td>
</template> </template>
</action-table> </action-table>
@ -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/Moderation/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

@ -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/Verb">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/Input.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,10 +15,10 @@
</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/Input.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>
</select> </select>
</div> </div>
</div> </div>
@ -36,11 +36,11 @@
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="Content/Moderation/Table.Label">Name</translate></th>
<th><translate :translate-context="'Content/Moderation/Table.Label'">Users</translate></th> <th><translate translate-context="Content/Moderation/Table.Label">Users</translate></th>
<th><translate :translate-context="'Content/Moderation/Table.Label/Short, Noun'">Received messages</translate></th> <th><translate translate-context="Content/Moderation/Table.Label/Short, 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, Noun">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">
<td> <td>
@ -56,7 +56,7 @@
<human-date :date="scope.obj.creation_date"></human-date> <human-date :date="scope.obj.creation_date"></human-date>
</td> </td>
<td> <td>
<span v-if="scope.obj.instance_policy"><i class="shield icon"></i> <translate :translate-context="'*/*/*'">Yes</translate></span> <span v-if="scope.obj.instance_policy"><i class="shield icon"></i> <translate translate-context="*/*/*">Yes</translate></span>
</td> </td>
</template> </template>
</action-table> </action-table>
@ -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/Moderation/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

@ -6,44 +6,44 @@
<i class="user icon"></i>{{ object.actor }} &nbsp; <i class="user icon"></i>{{ object.actor }} &nbsp;
<template v-if="object.is_active"> <template v-if="object.is_active">
<i class="play icon"></i> <i class="play icon"></i>
<translate :translate-context="'*/*/*'">Enabled</translate> <translate translate-context="*/*/*">Enabled</translate>
</template> </template>
<template v-if="!object.is_active"> <template v-if="!object.is_active">
<i class="pause icon"></i> <i class="pause icon"></i>
<translate :translate-context="'Content/Moderation/Card.List item'">Paused</translate> <translate translate-context="Content/Moderation/Card.List item">Paused</translate>
</template> </template>
</p> </p>
<div> <div>
<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/Card.List item/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/Card.List item/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/Card.List item/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/Card.List item/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/Card.Title/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/Moderation/Card.Button.Label/Verb">Edit</translate>
</button> </button>
</div> </div>
</template> </template>

View File

@ -1,11 +1,11 @@
<template> <template>
<form class="ui form" @submit.prevent="createOrUpdate"> <form class="ui form" @submit.prevent="createOrUpdate">
<h3 class="ui header"> <h3 class="ui header">
<translate :translate-context="'Content/Moderation/Card.Title/Verb'" v-if="object" key="1">Edit moderation rule</translate> <translate translate-context="Content/Moderation/Card.Title/Verb" v-if="object" key="1">Edit moderation rule</translate>
<translate :translate-context="'Content/Moderation/Card.Button.Label/Verb'" v-else key="2">Add a new moderation rule</translate> <translate translate-context="Content/Moderation/Card.Button.Label/Verb" v-else key="2">Add a new moderation rule</translate>
</h3> </h3>
<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/Error message.Title'">Error while creating rule</translate></div> <div class="header"><translate translate-context="Content/Moderation/Error message.Title">Error while creating rule</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>
@ -15,15 +15,15 @@
<div class="ui toggle checkbox"> <div class="ui toggle checkbox">
<input id="policy-is-active" v-model="current.isActive" type="checkbox"> <input id="policy-is-active" v-model="current.isActive" type="checkbox">
<label for="policy-is-active"> <label for="policy-is-active">
<translate :translate-context="'*/*/*'" v-if="current.isActive" key="1">Enabled</translate> <translate translate-context="*/*/*" v-if="current.isActive" key="1">Enabled</translate>
<translate :translate-context="'*/*/*'" v-else key="2">Disabled</translate> <translate translate-context="*/*/*" v-else key="2">Disabled</translate>
<tooltip :content="labels.isActiveHelp" /> <tooltip :content="labels.isActiveHelp" />
</label> </label>
</div> </div>
</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/Input.Label/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,13 +32,13 @@
<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/Checkbox.Label/Verb">Block everything</translate>
<tooltip :content="labels.blockAllHelp" /> <tooltip :content="labels.blockAllHelp" />
</label> </label>
</div> </div>
</div> </div>
<div class="ui horizontal divider"> <div class="ui horizontal divider">
<translate :translate-context="'Content/Moderation/Card.Title'">Or customize your rule</translate> <translate translate-context="Content/Moderation/Card.Title">Or customize your rule</translate>
</div> </div>
<div v-for="config in fieldConfig" :class="['field']"> <div v-for="config in fieldConfig" :class="['field']">
<div class="ui toggle checkbox"> <div class="ui toggle checkbox">
@ -52,22 +52,22 @@
</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="Content/Moderation/Card.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="Content/Moderation/Card.Button.Label/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>
<p slot="modal-content"> <p slot="modal-content">
<translate :translate-context="'Popup/Moderation/Paragraph'">This action is irreversible.</translate> <translate translate-context="Popup/Moderation/Paragraph">This action is irreversible.</translate>
</p> </p>
<div slot="modal-confirm"> <div slot="modal-confirm">
<translate :translate-context="'Popup/Moderation/Button.Label/Verb'">Delete moderation rule</translate> <translate translate-context="Popup/Moderation/Button.Label/Verb">Delete moderation rule</translate>
</div> </div>
</dangerous-button> </dangerous-button>
</form> </form>

View File

@ -2,19 +2,19 @@
<div> <div>
<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/Admin/Error message.Title'">Error while creating invitation</translate></div> <div class="header"><translate translate-context="Content/Admin/Error message.Title">Error while creating invitation</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="inline fields"> <div class="inline fields">
<div class="ui field"> <div class="ui field">
<label><translate :translate-context="'Content/Admin/Input.Label/Noun'">Invitation code</translate></label> <label><translate translate-context="$1">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">
<button :class="['ui', {loading: isLoading}, 'button']" :disabled="isLoading" type="submit"> <button :class="['ui', {loading: isLoading}, 'button']" :disabled="isLoading" type="submit">
<translate :translate-context="'Content/Admin/Button.Label/Verb'">Get a new invitation</translate> <translate translate-context="Content/Admin/Button.Label/Verb">Get a new invitation</translate>
</button> </button>
</div> </div>
</div> </div>
@ -24,8 +24,8 @@
<table class="ui ui basic table"> <table class="ui ui basic table">
<thead> <thead>
<tr> <tr>
<th><translate :translate-context="'Content/Admin/Table.Label/Noun'">Code</translate></th> <th><translate translate-context="Content/Admin/Table.Label/Noun">Code</translate></th>
<th><translate :translate-context="'Content/Admin/Table.Label/Noun'">Share link</translate></th> <th><translate translate-context="Content/Admin/Table.Label/Noun">Share link</translate></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -35,7 +35,7 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
<button class="ui basic button" @click="invitations = []"><translate :translate-context="'Content/Admin/Button.Label/Verb'">Clear</translate></button> <button class="ui basic button" @click="invitations = []"><translate translate-context="Content/Admin/Button.Label/Verb">Clear</translate></button>
</div> </div>
</div> </div>
</template> </template>

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/Verb">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/Input.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,11 +15,11 @@
</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/Dropdown.Label">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/Admin/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>
</div> </div>
</div> </div>
@ -36,20 +36,20 @@
:action-url="'manage/users/invitations/action/'" :action-url="'manage/users/invitations/action/'"
: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/Table.Label">Status</translate></th>
<th><translate :translate-context="'Content/Admin/Table.Label'">Creation date</translate></th> <th><translate translate-context="Content/Admin/Table.Label">Creation date</translate></th>
<th><translate :translate-context="'Content/Admin/Table.Label'">Expiration date</translate></th> <th><translate translate-context="Content/Admin/Table.Label">Expiration date</translate></th>
<th><translate :translate-context="'Content/Admin/Table.Label'">Code</translate></th> <th><translate translate-context="Content/Admin/Table.Label">Code</translate></th>
</template> </template>
<template slot="row-cells" slot-scope="scope"> <template slot="row-cells" slot-scope="scope">
<td> <td>
<router-link :to="{name: 'manage.users.users.detail', params: {id: scope.obj.id }}">{{ scope.obj.owner.username }}</router-link> <router-link :to="{name: 'manage.users.users.detail', params: {id: scope.obj.id }}">{{ scope.obj.owner.username }}</router-link>
</td> </td>
<td> <td>
<span v-if="scope.obj.users.length > 0" class="ui green basic label"><translate :translate-context="'Content/Admin/Table'">Used</translate></span> <span v-if="scope.obj.users.length > 0" class="ui green basic label"><translate translate-context="Content/Admin/Table">Used</translate></span>
<span v-else-if="moment().isAfter(scope.obj.expiration_date)" class="ui red basic label"><translate :translate-context="'Content/Admin/Table'">Expired</translate></span> <span v-else-if="moment().isAfter(scope.obj.expiration_date)" class="ui red basic label"><translate translate-context="Content/Admin/Table">Expired</translate></span>
<span v-else class="ui basic label"><translate :translate-context="'Content/Admin/Table'">Not used</translate></span> <span v-else class="ui basic label"><translate translate-context="Content/Admin/Table">Not used</translate></span>
</td> </td>
<td> <td>
<human-date :date="scope.obj.creation_date"></human-date> <human-date :date="scope.obj.creation_date"></human-date>
@ -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/Admin/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

@ -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/verb">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/Input.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,10 +15,10 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate :translate-context="'Content/Search/Dropdown.Label/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/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>
</select> </select>
</div> </div>
</div> </div>
@ -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/Admin/Table.Label">Username</translate></th>
<th><translate :translate-context="'Content/Admin/Table.Label'">Email</translate></th> <th><translate translate-context="Content/Admin/Table.Label">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/Admin/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">Status</translate></th>
</template> </template>
<template slot="row-cells" slot-scope="scope"> <template slot="row-cells" slot-scope="scope">
<td> <td>
@ -51,15 +51,15 @@
<span>{{ scope.obj.email }}</span> <span>{{ scope.obj.email }}</span>
</td> </td>
<td> <td>
<span v-if="scope.obj.is_active" class="ui basic green label"><translate :translate-context="'Content/Admin/Table'">Active</translate></span> <span v-if="scope.obj.is_active" class="ui basic green label"><translate translate-context="Content/Admin/Table">Active</translate></span>
<span v-else class="ui basic grey label"><translate :translate-context="'Content/Admin/Table'">Inactive</translate></span> <span v-else class="ui basic grey label"><translate translate-context="Content/Admin/Table">Inactive</translate></span>
</td> </td>
<td> <td>
<human-date :date="scope.obj.date_joined"></human-date> <human-date :date="scope.obj.date_joined"></human-date>
</td> </td>
<td> <td>
<human-date v-if="scope.obj.last_activity" :date="scope.obj.last_activity"></human-date> <human-date v-if="scope.obj.last_activity" :date="scope.obj.last_activity"></human-date>
<template v-else><translate :translate-context="'*/*/*'">N/A</translate></template> <template v-else><translate translate-context="*/*/*">N/A</translate></template>
</td> </td>
<td> <td>
<template v-for="p in permissions"> <template v-for="p in permissions">
@ -67,9 +67,9 @@
</template> </template>
</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/Admin/Table.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/Admin/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

@ -4,32 +4,32 @@
<translate <translate
v-if="type === 'artist'" v-if="type === 'artist'"
key="1" key="1"
:translate-context="'Popup/Moderation/Title/Verb'" translate-context="Popup/Moderation/Title/Verb"
:translate-params="{name: target.name}">Do you want to hide content from artist "%{ name }"?</translate> :translate-params="{name: target.name}">Do you want to hide content from artist "%{ name }"?</translate>
</div> </div>
<div class="scrolling content"> <div class="scrolling content">
<div class="description"> <div class="description">
<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="'Popup/Moderation/Error message'">Error while creating filter</translate></div> <div class="header"><translate translate-context="Popup/Moderation/Error message">Error while creating filter</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>
<template v-if="type === 'artist'"> <template v-if="type === 'artist'">
<p> <p>
<translate :translate-context="'Popup/Moderation/Paragraph'"> <translate translate-context="Popup/Moderation/Paragraph">
You will not see tracks, albums and user activity linked to this artist anymore: You will not see tracks, albums and user activity linked to this artist anymore:
</translate> </translate>
</p> </p>
<ul> <ul>
<li><translate :translate-context="'Popup/Moderation/List item'">In other users favorites and listening history</translate></li> <li><translate translate-context="Popup/Moderation/List item">In other users favorites and listening history</translate></li>
<li><translate :translate-context="'Popup/Moderation/List item'">In "Recently added" widget</translate></li> <li><translate translate-context="Popup/Moderation/List item">In "Recently added" widget</translate></li>
<li><translate :translate-context="'Popup/Moderation/List item'">In artists and album listings</translate></li> <li><translate translate-context="Popup/Moderation/List item">In artists and album listings</translate></li>
<li><translate :translate-context="'Popup/Moderation/List item'">In radio suggestions</translate></li> <li><translate translate-context="Popup/Moderation/List item">In radio suggestions</translate></li>
</ul> </ul>
<p> <p>
<translate :translate-context="'Popup/Moderation/Paragraph'"> <translate translate-context="Popup/Moderation/Paragraph">
You can manage and update your filters anytime from your account settings. You can manage and update your filters anytime from your account settings.
</translate> </translate>
</p> </p>
@ -37,8 +37,8 @@
</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="Popup/*/Button.Label">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>
</template> </template>

View File

@ -16,7 +16,7 @@
<duration :seconds="playlist.duration" /> <duration :seconds="playlist.duration" />
| |
<i class="sound icon"></i> <i class="sound icon"></i>
<translate :translate-context="'Content/*/Card/List item'" <translate translate-context="Content/*/Card/List item"
translate-plural="%{ count } tracks" translate-plural="%{ count } tracks"
:translate-n="playlist.tracks_count" :translate-n="playlist.tracks_count"
:translate-params="{count: playlist.tracks_count}"> :translate-params="{count: playlist.tracks_count}">

View File

@ -2,16 +2,16 @@
<div class="ui text container"> <div class="ui text container">
<playlist-form @updated="$emit('playlist-updated', $event)" :title="false" :playlist="playlist"></playlist-form> <playlist-form @updated="$emit('playlist-updated', $event)" :title="false" :playlist="playlist"></playlist-form>
<h3 class="ui top attached header"> <h3 class="ui top attached header">
<translate :translate-context="'Content/Playlist/Title'">Playlist editor</translate> <translate translate-context="Content/Playlist/Title">Playlist editor</translate>
</h3> </h3>
<div class="ui attached segment"> <div class="ui attached segment">
<template v-if="status === 'loading'"> <template v-if="status === 'loading'">
<div class="ui active tiny inline loader"></div> <div class="ui active tiny inline loader"></div>
<translate :translate-context="'Content/Playlist/Paragraph'">Syncing changes to server</translate> <translate translate-context="Content/Playlist/Paragraph">Syncing changes to server</translate>
</template> </template>
<template v-else-if="status === 'errored'"> <template v-else-if="status === 'errored'">
<i class="red close icon"></i> <i class="red close icon"></i>
<translate :translate-context="'Content/Playlist/Error message.Title'">An error occured while saving your changes</translate> <translate translate-context="Content/Playlist/Error message.Title">An error occured while saving your changes</translate>
<div v-if="errors.length > 0" class="ui negative message"> <div v-if="errors.length > 0" class="ui negative message">
<ul class="list"> <ul class="list">
<li v-for="error in errors">{{ error }}</li> <li v-for="error in errors">{{ error }}</li>
@ -19,7 +19,7 @@
</div> </div>
</template> </template>
<template v-else-if="status === 'saved'"> <template v-else-if="status === 'saved'">
<i class="green check icon"></i> <translate :translate-context="'Content/Playlist/Paragraph'">Changes synced with server</translate> <i class="green check icon"></i> <translate translate-context="Content/Playlist/Paragraph">Changes synced with server</translate>
</template> </template>
</div> </div>
<div class="ui bottom attached segment"> <div class="ui bottom attached segment">
@ -29,7 +29,7 @@
:class="['ui', {disabled: queueTracks.length === 0}, 'labeled', 'icon', 'button']" :class="['ui', {disabled: queueTracks.length === 0}, 'labeled', 'icon', 'button']"
:title="labels.copyTitle"> :title="labels.copyTitle">
<i class="plus icon"></i> <i class="plus icon"></i>
<translate :translate-context="'Content/Playlist/Button.Label/Verb'" <translate translate-context="Content/Playlist/Button.Label/Verb"
translate-plural="Insert from queue (%{ count } tracks)" translate-plural="Insert from queue (%{ count } tracks)"
:translate-n="queueTracks.length" :translate-n="queueTracks.length"
:translate-params="{count: queueTracks.length}"> :translate-params="{count: queueTracks.length}">
@ -38,16 +38,16 @@
</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="Content/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="Popup/Playlist/Button.Label">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">
<p><translate :translate-context="'Content/Playlist/Paragraph/Call to action'">Drag and drop rows to reorder tracks in the playlist</translate></p> <p><translate translate-context="Content/Playlist/Paragraph/Call to action">Drag and drop rows to reorder tracks in the playlist</translate></p>
<div class="table-wrapper"> <div class="table-wrapper">
<table class="ui compact very basic unstackable table"> <table class="ui compact very basic unstackable table">
<draggable v-model="plts" element="tbody" @update="reorder"> <draggable v-model="plts" element="tbody" @update="reorder">

View File

@ -1,29 +1,29 @@
<template> <template>
<form class="ui form" @submit.prevent="submit()"> <form class="ui form" @submit.prevent="submit()">
<h4 v-if="title" class="ui header"><translate :translate-context="'Popup/Playlist/Title/Verb'">Create a new playlist</translate></h4> <h4 v-if="title" class="ui header"><translate translate-context="Popup/Playlist/Title/Verb">Create a new playlist</translate></h4>
<div v-if="success" class="ui positive message"> <div v-if="success" class="ui positive message">
<div class="header"> <div class="header">
<template v-if="playlist"> <template v-if="playlist">
<translate :translate-context="'Content/Playlist/Message'">Playlist updated</translate> <translate translate-context="Content/Playlist/Message">Playlist updated</translate>
</template> </template>
<template v-else> <template v-else>
<translate :translate-context="'Content/Playlist/Message'">Playlist created</translate> <translate translate-context="Content/Playlist/Message">Playlist created</translate>
</template> </template>
</div> </div>
</div> </div>
<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/Playlist/Error message.Title'">The playlist could not be created</translate></div> <div class="header"><translate translate-context="Content/Playlist/Error message.Title">The playlist could not 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="three fields"> <div class="three fields">
<div class="field"> <div class="field">
<label><translate :translate-context="'Content/Playlist/Input.Label'">Playlist name</translate></label> <label><translate translate-context="Content/Playlist/Input.Label">Playlist name</translate></label>
<input name="name" v-model="name" required type="text" :placeholder="labels.placeholder" /> <input name="name" v-model="name" required type="text" :placeholder="labels.placeholder" />
</div> </div>
<div class="field"> <div class="field">
<label><translate :translate-context="'Content/Playlist/Dropdown.Label'">Playlist visibility</translate></label> <label><translate translate-context="Content/Playlist/Dropdown.Label">Playlist visibility</translate></label>
<select class="ui dropdown" v-model="privacyLevel"> <select class="ui dropdown" v-model="privacyLevel">
<option :value="c.value" v-for="c in privacyLevelChoices">{{ c.label }}</option> <option :value="c.value" v-for="c in privacyLevelChoices">{{ c.label }}</option>
</select> </select>
@ -31,8 +31,8 @@
<div class="field"> <div class="field">
<label>&nbsp;</label> <label>&nbsp;</label>
<button :class="['ui', 'fluid', {'loading': isLoading}, 'button']" type="submit"> <button :class="['ui', 'fluid', {'loading': isLoading}, 'button']" type="submit">
<template v-if="playlist"><translate :translate-context="'Content/Playlist/Button.Label/Verb'">Update playlist</translate></template> <template v-if="playlist"><translate translate-context="Content/Playlist/Button.Label/Verb">Update playlist</translate></template>
<template v-else><translate :translate-context="'Content/Playlist/Button.Label/Verb'">Create playlist</translate></template> <template v-else><translate translate-context="Content/Playlist/Button.Label/Verb">Create playlist</translate></template>
</button> </button>
</div> </div>
</div> </div>

View File

@ -1,13 +1,13 @@
<template> <template>
<modal @update:show="update" :show="$store.state.playlists.showModal"> <modal @update:show="update" :show="$store.state.playlists.showModal">
<div class="header"> <div class="header">
<translate :translate-context="'Popup/Playlist/Title/Verb'">Manage playlists</translate> <translate translate-context="Popup/Playlist/Title/Verb">Manage playlists</translate>
</div> </div>
<div class="scrolling content"> <div class="scrolling content">
<div class="description"> <div class="description">
<template v-if="track"> <template v-if="track">
<h4 class="ui header"><translate :translate-context="'Popup/Playlist/Title'">Current track</translate></h4> <h4 class="ui header"><translate translate-context="Popup/Playlist/Title">Current track</translate></h4>
<translate :translate-context="'Popup/Playlist/Paragraph'" <translate translate-context="Popup/Playlist/Paragraph"
v-translate="{artist: track.artist.name, title: track.title}" v-translate="{artist: track.artist.name, title: track.title}"
:translate-params="{artist: track.artist.name, title: track.title}"> :translate-params="{artist: track.artist.name, title: track.title}">
"%{ title }", by %{ artist } "%{ title }", by %{ artist }
@ -18,20 +18,20 @@
<playlist-form :key="formKey"></playlist-form> <playlist-form :key="formKey"></playlist-form>
<div class="ui divider"></div> <div class="ui divider"></div>
<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="'Popup/Playlist/Error message.Title'">The track can't be added to a playlist</translate></div> <div class="header"><translate translate-context="Popup/Playlist/Error message.Title">The track can't be added to a playlist</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> </div>
<h4 class="ui header"><translate :translate-context="'Popup/Playlist/Title'">Available playlists</translate></h4> <h4 class="ui header"><translate translate-context="Popup/Playlist/Title">Available playlists</translate></h4>
<table class="ui unstackable very basic table"> <table class="ui unstackable very basic table">
<thead> <thead>
<tr> <tr>
<th></th> <th></th>
<th><translate :translate-context="'*/*/Table.Label'">Name</translate></th> <th><translate translate-context="*/*/Table.Label">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="*/*/Table.Label">Tracks</translate></th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
@ -52,7 +52,7 @@
class="ui green icon basic small right floated button" class="ui green icon basic small right floated button"
:title="labels.addToPlaylist" :title="labels.addToPlaylist"
@click="addToPlaylist(playlist.id)"> @click="addToPlaylist(playlist.id)">
<i class="plus icon"></i> <translate :translate-context="'Popup/Playlist/Table.Button.Label/Verb'">Add track</translate> <i class="plus icon"></i> <translate translate-context="Popup/Playlist/Table.Button.Label/Verb">Add track</translate>
</div> </div>
</td> </td>
</tr> </tr>
@ -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="Popup/Playlist/Button.Label">Cancel</translate></div>
</div> </div>
</modal> </modal>
</template> </template>

View File

@ -4,7 +4,7 @@
v-if="button" v-if="button"
:class="['ui', 'icon', 'labeled', 'button']"> :class="['ui', 'icon', 'labeled', 'button']">
<i class="list icon"></i> <i class="list icon"></i>
<translate :translate-context="'Sidebar/Player/Icon.Tooltip/Verb'">Add to playlist</translate> <translate translate-context="Sidebar/Player/Icon.Tooltip/Verb">Add to playlist</translate>
</button> </button>
<button <button
v-else v-else

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="Content/Radio/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="Content/Radio/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/Radio/Card.Button.Label/Short, Verb">Edit</translate>
</router-link> </router-link>
</div> </div>
</div> </div>

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 aligned stripe segment"> <section class="ui vertical aligned stripe segment">
<div class="ui container"> <div class="ui container">
<h1 class="ui header"><translate :translate-context="'Content/Notifications/Title'">Your notifications</translate></h1> <h1 class="ui header"><translate translate-context="Content/Notifications/Title">Your notifications</translate></h1>
<div class="ui toggle checkbox"> <div class="ui toggle checkbox">
<input v-model="filters.is_read" type="checkbox"> <input v-model="filters.is_read" type="checkbox">
<label><translate :translate-context="'Content/Notifications/Form.Label/Verb'">Show read notifications</translate></label> <label><translate translate-context="Content/Notifications/Form.Label/Verb">Show read notifications</translate></label>
</div> </div>
<div <div
v-if="filters.is_read === false && notifications.count > 0" v-if="filters.is_read === false && notifications.count > 0"
@click="markAllAsRead" @click="markAllAsRead"
class="ui basic labeled icon right floated button"> class="ui basic labeled icon right floated button">
<i class="ui check icon" /> <i class="ui check icon" />
<translate :translate-context="'Content/Notifications/Button.Label/Verb'">Mark all as read</translate> <translate translate-context="Content/Notifications/Button.Label/Verb">Mark all as read</translate>
</div> </div>
<div class="ui hidden divider" /> <div class="ui hidden divider" />
<div v-if="isLoading" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']"> <div v-if="isLoading" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']">
<div class="ui text loader"><translate :translate-context="'Content/Notifications/Paragraph'">Loading notifications</translate></div> <div class="ui text loader"><translate translate-context="Content/Notifications/Paragraph">Loading notifications</translate></div>
</div> </div>
<table v-else-if="notifications.count > 0" class="ui table"> <table v-else-if="notifications.count > 0" class="ui table">
@ -26,7 +26,7 @@
</tbody> </tbody>
</table> </table>
<p v-else> <p v-else>
<translate :translate-context="'Content/Notifications/Paragraph'">No notification to show.</translate> <translate translate-context="Content/Notifications/Paragraph">No notification to show.</translate>
</p> </p>
</div> </div>
</section> </section>

View File

@ -13,7 +13,7 @@
</div> </div>
<div class="four wide column"> <div class="four wide column">
<div class="ui sticky vertical secondary menu"> <div class="ui sticky vertical secondary menu">
<div class="header item"><translate :translate-context="'Content/Admin/Menu.Title'">Sections</translate></div> <div class="header item"><translate translate-context="Content/Admin/Menu.Title">Sections</translate></div>
<a :class="['menu', {active: group.id === current}, 'item']" <a :class="['menu', {active: group.id === current}, 'item']"
@click.prevent="scrollTo(group.id)" @click.prevent="scrollTo(group.id)"
:href="'#' + group.id" :href="'#' + group.id"

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="Menu/Admin/Link">Edits</translate></router-link>
</nav> </nav>
<router-view :key="$route.fullPath"></router-view> <router-view :key="$route.fullPath"></router-view>
</div> </div>

View File

@ -2,7 +2,7 @@
<main v-title="labels.title"> <main v-title="labels.title">
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<edits-card-list :update-url="true" :default-query="defaultQuery"> <edits-card-list :update-url="true" :default-query="defaultQuery">
<h2 class="ui header"><translate :translate-context="'Content/Admin/Title/Noun'">Library edits</translate></h2> <h2 class="ui header"><translate translate-context="Content/Admin/Title/Noun">Library edits</translate></h2>
</edits-card-list> </edits-card-list>
</section> </section>
</main> </main>

View File

@ -16,12 +16,12 @@
<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/List item">Local account</translate>
</span> </span>
&nbsp; &nbsp;
</template> </template>
<a :href="object.url || object.fid" target="_blank" rel="noopener noreferrer"> <a :href="object.url || object.fid" target="_blank" rel="noopener noreferrer">
<translate :translate-context="'Content/Moderation/Link/Verb'">Open profile</translate>&nbsp; <translate translate-context="Content/Moderation/Link/Verb">Open profile</translate>&nbsp;
<i class="external icon"></i> <i class="external icon"></i>
</a> </a>
</div> </div>
@ -44,16 +44,16 @@
<header class="ui header"> <header class="ui header">
<h3> <h3>
<i class="shield icon"></i> <i class="shield icon"></i>
<translate :translate-context="'Content/Moderation/Card.Title'">You don't have any rule in place for this account.</translate> <translate translate-context="Content/Moderation/Card.Title">You don't have any rule in place for this account.</translate>
</h3> </h3>
</header> </header>
<p><translate :translate-context="'Content/Moderation/Card.Paragraph'">Moderation policies help you control how your instance interact with a given domain or account.</translate></p> <p><translate translate-context="Content/Moderation/Card.Paragraph">Moderation policies help you control how your instance interact with a given domain or account.</translate></p>
<button @click="showPolicyForm = true" class="ui primary button"><translate :translate-context="'Content/Moderation/Button/Verb'">Add a moderation policy</translate></button> <button @click="showPolicyForm = true" class="ui primary button"><translate translate-context="Content/Moderation/Button/Verb">Add a moderation policy</translate></button>
</template> </template>
<instance-policy-card v-else-if="policy && !showPolicyForm" :object="policy" @update="showPolicyForm = true"> <instance-policy-card v-else-if="policy && !showPolicyForm" :object="policy" @update="showPolicyForm = true">
<header class="ui header"> <header class="ui header">
<h3> <h3>
<translate :translate-context="'Content/Moderation/Card.Title'">This domain is subject to specific moderation rules</translate> <translate translate-context="Content/Moderation/Card.Title">This domain is subject to specific moderation rules</translate>
</h3> </h3>
</header> </header>
</instance-policy-card> </instance-policy-card>
@ -76,14 +76,14 @@
<h3 class="ui header"> <h3 class="ui header">
<i class="info icon"></i> <i class="info icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Moderation/Title'">Account data</translate> <translate translate-context="Content/Moderation/Title">Account data</translate>
</div> </div>
</h3> </h3>
<table class="ui very basic table"> <table class="ui very basic table">
<tbody> <tbody>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/*/*'">Username</translate> <translate translate-context="Content/*/*">Username</translate>
</td> </td>
<td> <td>
{{ object.preferred_username }} {{ object.preferred_username }}
@ -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/*/*">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 }}">
@ -109,7 +109,7 @@
</tr> </tr>
<tr v-if="object.user"> <tr v-if="object.user">
<td> <td>
<translate :translate-context="'Content/*/*'">Email address</translate> <translate translate-context="Content/*/*">Email address</translate>
</td> </td>
<td> <td>
{{ object.user.email }} {{ object.user.email }}
@ -117,7 +117,7 @@
</tr> </tr>
<tr v-if="object.user"> <tr v-if="object.user">
<td> <td>
<translate :translate-context="'Content/*/*/Noun'">Login status</translate> <translate translate-context="Content/*/*/Noun">Login status</translate>
</td> </td>
<td> <td>
<div class="ui toggle checkbox" v-if="object.user.username != $store.state.auth.profile.username"> <div class="ui toggle checkbox" v-if="object.user.username != $store.state.auth.profile.username">
@ -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="Content/*/Label">Enabled</translate>
<translate v-else key="2" :translate-context="'Content/*/Label'">Disabled</translate> <translate v-else key="2" translate-context="Content/*/Label">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="Content/*/Label">Enabled</translate>
<translate v-else key="2" :translate-context="'Content/*/Label'">Disabled</translate> <translate v-else key="2" translate-context="Content/*/Label">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/Moderation/Table.Label">Permissions</translate>
</td> </td>
<td> <td>
<select <select
@ -149,7 +149,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label/Noun'">Type</translate> <translate translate-context="Content/Moderation/Table.Label/Noun">Type</translate>
</td> </td>
<td> <td>
{{ object.type }} {{ object.type }}
@ -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/*/Table.Label">First seen</translate>
</td> </td>
<td> <td>
<human-date :date="object.creation_date"></human-date> <human-date :date="object.creation_date"></human-date>
@ -165,16 +165,16 @@
</tr> </tr>
<tr v-if="!object.user"> <tr v-if="!object.user">
<td> <td>
<translate :translate-context="'Content/*/Table.Label'">Last checked</translate> <translate translate-context="Content/*/Table.Label">Last checked</translate>
</td> </td>
<td> <td>
<human-date v-if="object.last_fetch_date" :date="object.last_fetch_date"></human-date> <human-date v-if="object.last_fetch_date" :date="object.last_fetch_date"></human-date>
<translate v-else :translate-context="'*/*/*'">N/A</translate> <translate v-else translate-context="*/*/*">N/A</translate>
</td> </td>
</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/*/Table.Label">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/*/Table.Label">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>
@ -197,7 +197,7 @@
<h3 class="ui header"> <h3 class="ui header">
<i class="feed icon"></i> <i class="feed icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Moderation/Title'">Activity</translate>&nbsp; <translate translate-context="Content/Moderation/Title">Activity</translate>&nbsp;
<span :data-tooltip="labels.statsWarning"><i class="question circle icon"></i></span> <span :data-tooltip="labels.statsWarning"><i class="question circle icon"></i></span>
</div> </div>
@ -212,7 +212,7 @@
<tbody> <tbody>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label/Noun'">Emitted messages</translate> <translate translate-context="Content/Moderation/Table.Label/Noun">Emitted messages</translate>
</td> </td>
<td> <td>
{{ stats.outbox_activities}} {{ stats.outbox_activities}}
@ -220,7 +220,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label/Noun'">Received library follows</translate> <translate translate-context="Content/Moderation/Table.Label/Noun">Received library follows</translate>
</td> </td>
<td> <td>
{{ stats.received_library_follows}} {{ stats.received_library_follows}}
@ -228,7 +228,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label/Noun'">Emitted library follows</translate> <translate translate-context="Content/Moderation/Table.Label/Noun">Emitted library follows</translate>
</td> </td>
<td> <td>
{{ stats.emitted_library_follows}} {{ stats.emitted_library_follows}}
@ -243,7 +243,7 @@
<h3 class="ui header"> <h3 class="ui header">
<i class="music icon"></i> <i class="music icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Moderation/Title'">Audio content</translate>&nbsp; <translate translate-context="Content/Moderation/Title">Audio content</translate>&nbsp;
<span :data-tooltip="labels.statsWarning"><i class="question circle icon"></i></span> <span :data-tooltip="labels.statsWarning"><i class="question circle icon"></i></span>
</div> </div>
@ -259,7 +259,7 @@
<tr v-if="!object.user"> <tr v-if="!object.user">
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label/Noun'">Cached size</translate> <translate translate-context="Content/Moderation/Table.Label/Noun">Cached size</translate>
</td> </td>
<td> <td>
{{ stats.media_downloaded_size | humanSize }} {{ stats.media_downloaded_size | humanSize }}
@ -267,7 +267,7 @@
</tr> </tr>
<tr v-if="object.user"> <tr v-if="object.user">
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label/Noun'" >Upload quota</translate> <translate translate-context="Content/Moderation/Table.Label/Noun" >Upload quota</translate>
<span :data-tooltip="labels.uploadQuota"><i class="question circle icon"></i></span> <span :data-tooltip="labels.uploadQuota"><i class="question circle icon"></i></span>
</td> </td>
<td> <td>
@ -279,14 +279,14 @@
step="100" step="100"
type="number" /> type="number" />
<div class="ui basic label"> <div class="ui basic label">
<translate :translate-context="'Content/*/*/Unit'">MB</translate> <translate translate-context="Content/*/*/Unit">MB</translate>
</div> </div>
</div> </div>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/*/*'">Total size</translate> <translate translate-context="Content/*/*">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="Content/Moderation/Table.Label">Libraries</translate>
</td> </td>
<td> <td>
{{ stats.libraries }} {{ stats.libraries }}
@ -303,7 +303,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label/Noun'">Uploads</translate> <translate translate-context="Content/Moderation/Table.Label/Noun">Uploads</translate>
</td> </td>
<td> <td>
{{ stats.uploads }} {{ stats.uploads }}
@ -311,7 +311,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/*/*'">Artists</translate> <translate translate-context="Content/*/*">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="Content/*/*">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="Content/*/*">Tracks</translate>
</td> </td>
<td> <td>
{{ stats.tracks }} {{ stats.tracks }}

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="Content/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>

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="Menu/Moderation/Tab">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="Menu/Moderation/Tab">Accounts</translate></router-link>
</nav> </nav>
<router-view :key="$route.fullPath"></router-view> <router-view :key="$route.fullPath"></router-view>

View File

@ -14,7 +14,7 @@
{{ object.name }} {{ object.name }}
<div class="sub header"> <div class="sub header">
<a :href="externalUrl" target="_blank" rel="noopener noreferrer" class="logo-wrapper"> <a :href="externalUrl" target="_blank" rel="noopener noreferrer" class="logo-wrapper">
<translate :translate-context="'Content/Moderation/Link/Verb'">Open website</translate>&nbsp; <translate translate-context="Content/Moderation/Link/Verb">Open website</translate>&nbsp;
<i class="external icon"></i> <i class="external icon"></i>
</a> </a>
</div> </div>
@ -37,16 +37,16 @@
<header class="ui header"> <header class="ui header">
<h3> <h3>
<i class="shield icon"></i> <i class="shield icon"></i>
<translate :translate-context="'Content/Moderation/Card.Title'">You don't have any rule in place for this domain.</translate> <translate translate-context="Content/Moderation/Card.Title">You don't have any rule in place for this domain.</translate>
</h3> </h3>
</header> </header>
<p><translate :translate-context="'Content/Moderation/Card.Paragraph'">Moderation policies help you control how your instance interact with a given domain or account.</translate></p> <p><translate translate-context="Content/Moderation/Card.Paragraph">Moderation policies help you control how your instance interact with a given domain or account.</translate></p>
<button @click="showPolicyForm = true" class="ui primary button">Add a moderation policy</button> <button @click="showPolicyForm = true" class="ui primary button">Add a moderation policy</button>
</template> </template>
<instance-policy-card v-else-if="policy && !showPolicyForm" :object="policy" @update="showPolicyForm = true"> <instance-policy-card v-else-if="policy && !showPolicyForm" :object="policy" @update="showPolicyForm = true">
<header class="ui header"> <header class="ui header">
<h3> <h3>
<translate :translate-context="'Content/Moderation/Card.Title'">This domain is subject to specific moderation rules</translate> <translate translate-context="Content/Moderation/Card.Title">This domain is subject to specific moderation rules</translate>
</h3> </h3>
</header> </header>
</instance-policy-card> </instance-policy-card>
@ -69,14 +69,14 @@
<h3 class="ui header"> <h3 class="ui header">
<i class="info icon"></i> <i class="info icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Moderation/Title'">Instance data</translate> <translate translate-context="Content/Moderation/Title">Instance data</translate>
</div> </div>
</h3> </h3>
<table class="ui very basic table"> <table class="ui very basic table">
<tbody> <tbody>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/*/Table.Label'">First seen</translate> <translate translate-context="Content/*/Table.Label">First seen</translate>
</td> </td>
<td> <td>
<human-date :date="object.creation_date"></human-date> <human-date :date="object.creation_date"></human-date>
@ -84,18 +84,18 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/*/Table.Label'">Last checked</translate> <translate translate-context="Content/*/Table.Label">Last checked</translate>
</td> </td>
<td> <td>
<human-date v-if="object.nodeinfo_fetch_date" :date="object.nodeinfo_fetch_date"></human-date> <human-date v-if="object.nodeinfo_fetch_date" :date="object.nodeinfo_fetch_date"></human-date>
<translate v-else :translate-context="'*/*/*'">N/A</translate> <translate v-else translate-context="*/*/*">N/A</translate>
</td> </td>
</tr> </tr>
<template v-if="object.nodeinfo && object.nodeinfo.status === 'ok'"> <template v-if="object.nodeinfo && object.nodeinfo.status === 'ok'">
<tr> <tr>
<td> <td>
<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', $gettext('N/A')) }} ({{ lodash.get(object, 'nodeinfo.payload.software.version', $gettext('N/A')) }})
@ -103,7 +103,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label'">Name</translate> <translate translate-context="Content/Moderation/Table.Label">Name</translate>
</td> </td>
<td> <td>
{{ lodash.get(object, 'nodeinfo.payload.metadata.nodeName', $gettext('N/A')) }} {{ lodash.get(object, 'nodeinfo.payload.metadata.nodeName', $gettext('N/A')) }}
@ -111,7 +111,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<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', $gettext('N/A')) }}
@ -121,10 +121,10 @@
<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">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;
<span :data-tooltip="object.nodeinfo.error"><i class="question circle icon"></i></span> <span :data-tooltip="object.nodeinfo.error"><i class="question circle icon"></i></span>
</td> </td>
@ -133,7 +133,7 @@
</tbody> </tbody>
</table> </table>
<ajax-button @action-done="refreshNodeInfo" method="get" :url="'manage/federation/domains/' + object.name + '/nodeinfo/'"> <ajax-button @action-done="refreshNodeInfo" method="get" :url="'manage/federation/domains/' + object.name + '/nodeinfo/'">
<translate :translate-context="'Content/Moderation/Button.Label/Verb'">Refresh node info</translate> <translate translate-context="Content/Moderation/Button.Label/Verb">Refresh node info</translate>
</ajax-button> </ajax-button>
</section> </section>
</div> </div>
@ -142,7 +142,7 @@
<h3 class="ui header"> <h3 class="ui header">
<i class="feed icon"></i> <i class="feed icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Moderation/Title'">Activity</translate>&nbsp; <translate translate-context="Content/Moderation/Title">Activity</translate>&nbsp;
<span :data-tooltip="labels.statsWarning"><i class="question circle icon"></i></span> <span :data-tooltip="labels.statsWarning"><i class="question circle icon"></i></span>
</div> </div>
@ -159,7 +159,7 @@
<td> <td>
<router-link <router-link
:to="{name: 'manage.moderation.accounts.list', query: {q: 'domain:' + object.name }}"> :to="{name: 'manage.moderation.accounts.list', query: {q: 'domain:' + object.name }}">
<translate :translate-context="'Content/Moderation/Table.Label.Link'">Known accounts</translate> <translate translate-context="Content/Moderation/Table.Label.Link">Known accounts</translate>
</router-link> </router-link>
</td> </td>
@ -169,7 +169,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label/Noun'">Emitted messages</translate> <translate translate-context="Content/Moderation/Table.Label/Noun">Emitted messages</translate>
</td> </td>
<td> <td>
{{ stats.outbox_activities}} {{ stats.outbox_activities}}
@ -177,7 +177,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label/Noun'">Received library follows</translate> <translate translate-context="Content/Moderation/Table.Label/Noun">Received library follows</translate>
</td> </td>
<td> <td>
{{ stats.received_library_follows}} {{ stats.received_library_follows}}
@ -185,7 +185,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label/Noun'">Emitted library follows</translate> <translate translate-context="Content/Moderation/Table.Label/Noun">Emitted library follows</translate>
</td> </td>
<td> <td>
{{ stats.emitted_library_follows}} {{ stats.emitted_library_follows}}
@ -200,7 +200,7 @@
<h3 class="ui header"> <h3 class="ui header">
<i class="music icon"></i> <i class="music icon"></i>
<div class="content"> <div class="content">
<translate :translate-context="'Content/Moderation/Title'">Audio content</translate>&nbsp; <translate translate-context="Content/Moderation/Title">Audio content</translate>&nbsp;
<span :data-tooltip="labels.statsWarning"><i class="question circle icon"></i></span> <span :data-tooltip="labels.statsWarning"><i class="question circle icon"></i></span>
</div> </div>
@ -215,7 +215,7 @@
<tbody> <tbody>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label/Noun'">Cached size</translate> <translate translate-context="Content/Moderation/Table.Label/Noun">Cached size</translate>
</td> </td>
<td> <td>
{{ stats.media_downloaded_size | humanSize }} {{ stats.media_downloaded_size | humanSize }}
@ -223,7 +223,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label'">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 }}
@ -231,7 +231,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label'">Libraries</translate> <translate translate-context="Content/Moderation/Table.Label">Libraries</translate>
</td> </td>
<td> <td>
{{ stats.libraries }} {{ stats.libraries }}
@ -239,7 +239,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/Moderation/Table.Label/Noun'">Uploads</translate> <translate translate-context="Content/Moderation/Table.Label/Noun">Uploads</translate>
</td> </td>
<td> <td>
{{ stats.uploads }} {{ stats.uploads }}
@ -247,7 +247,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate :translate-context="'Content/*/*'">Artists</translate> <translate translate-context="Content/*/*">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="Content/*/*">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="Content/*/*">Tracks</translate>
</td> </td>
<td> <td>
{{ stats.tracks }} {{ stats.tracks }}

View File

@ -1,22 +1,22 @@
<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="Content/Moderation/Title">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>
<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="inline fields"> <div class="inline fields">
<div class="field"> <div class="field">
<label for="domain"><translate :translate-context="'Content/Moderation/Form.Label/Verb'">Add a domain</translate></label> <label for="domain"><translate translate-context="Content/Moderation/Form.Label/Verb">Add a domain</translate></label>
<input type="text" name="domain" id="domain" v-model="domainName"> <input type="text" name="domain" id="domain" v-model="domainName">
</div> </div>
<div class="field"> <div class="field">
<button :class="['ui', {'loading': isCreating}, 'green', 'button']" type="submit" :disabled="isCreating"> <button :class="['ui', {'loading': isCreating}, 'green', 'button']" type="submit" :disabled="isCreating">
<label for="domain"><translate :translate-context="'Content/Moderation/Button/Verb'">Add</translate></label> <label for="domain"><translate translate-context="Content/Moderation/Button/Verb">Add</translate></label>
</button> </button>
</div> </div>
</div> </div>

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="*/Admin/Link">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="Menu/Admin/Link">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"><translate translate-context="*/Admin/Title">Invitations</translate></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>

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"><translate translate-context="*/Admin/Title">Users</translate></h2>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<users-table></users-table> <users-table></users-table>
</section> </section>

View File

@ -2,29 +2,29 @@
<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><translate translate-context="Content/Signup/Title">Confirm your e-mail address</translate></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>
<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 :translate-context="'Content/Signup/Form.Label'">Confirmation code</translate></label> <label><translate translate-context="Content/Signup/Form.Label">Confirmation code</translate></label>
<input name="confirmation-code" type="text" required v-model="key" /> <input name="confirmation-code" type="text" required v-model="key" />
</div> </div>
<router-link :to="{path: '/login'}"> <router-link :to="{path: '/login'}">
<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> <translate translate-context="Content/Signup/Button.Label/Verb">Confirm your e-mail address</translate></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>
<p><translate :translate-context="'Content/Signup/Paragraph'">You can now use the service without limitations.</translate></p> <p><translate translate-context="Content/Signup/Paragraph">You can now use the service without limitations.</translate></p>
<router-link :to="{name: 'login'}"> <router-link :to="{name: 'login'}">
<translate :translate-context="'Content/Signup/Link/Verb'">Proceed to login</translate> <translate translate-context="Content/Signup/Link/Verb">Proceed to login</translate>
</router-link> </router-link>
</div> </div>
</div> </div>

View File

@ -2,17 +2,17 @@
<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="Content/Signup/Title">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>
<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>
<p><translate :translate-context="'Content/Signup/Paragraph'">Use this form to request a password reset. We will send an email to the given address with instructions to reset your password.</translate></p> <p><translate translate-context="Content/Signup/Paragraph">Use this form to request a password reset. We will send an email to the given address with instructions to reset your password.</translate></p>
<div class="field"> <div class="field">
<label><translate :translate-context="'Content/Signup/Input.Label'">Account's email</translate></label> <label><translate translate-context="Content/Signup/Input.Label">Account's email</translate></label>
<input <input
required required
ref="email" ref="email"
@ -23,10 +23,10 @@
v-model="email"> v-model="email">
</div> </div>
<router-link :to="{path: '/login'}"> <router-link :to="{path: '/login'}">
<translate :translate-context="'Content/Signup/Link'">Back to login</translate> <translate translate-context="Content/Signup/Link">Back 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'">Ask for a password reset</translate></button> <translate translate-context="Content/Signup/Button.Label/Verb">Ask for a password reset</translate></button>
</form> </form>
</div> </div>
</section> </section>

View File

@ -2,34 +2,34 @@
<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><translate translate-context="Content/Signup/Title">Change your password</translate></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>
<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>
<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/Signup/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'}">
<translate :translate-context="'Content/Signup/Link'">Back to login</translate> <translate translate-context="Content/Signup/Link">Back 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'">Update your password</translate></button> <translate translate-context="Content/Signup/Button.Label">Update your password</translate></button>
</template> </template>
<template v-else> <template v-else>
<p><translate :translate-context="'Content/Signup/Paragraph'">If the email address provided in the previous step is valid and binded to a user account, you should receive an email with reset instructions in the next couple of minutes.</translate></p> <p><translate translate-context="Content/Signup/Paragraph">If the email address provided in the previous step is valid and binded to a user account, you should receive an email with reset instructions in the next couple of minutes.</translate></p>
</template> </template>
</form> </form>
<div v-else class="ui positive message"> <div v-else class="ui positive message">
<div class="header"><translate :translate-context="'Content/Signup/Card.Title'">Password updated successfully</translate></div> <div class="header"><translate translate-context="Content/Signup/Card.Title">Password updated successfully</translate></div>
<p><translate :translate-context="'Content/Signup/Card.Paragraph'">Your password has been updated successfully.</translate></p> <p><translate translate-context="Content/Signup/Card.Paragraph">Your password has been updated successfully.</translate></p>
<router-link :to="{name: 'login'}"> <router-link :to="{name: 'login'}">
<translate :translate-context="'Content/Signup/Link/Verb'">Proceed to login</translate> <translate translate-context="Content/Signup/Link/Verb">Proceed to login</translate>
</router-link> </router-link>
</div> </div>
</div> </div>

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="Menu/Library/Tab.Link">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="Menu/Library/Tab.Link">Tracks</translate></router-link>
</nav> </nav>
<router-view :key="$route.fullPath"></router-view> <router-view :key="$route.fullPath"></router-view>
</main> </main>

View File

@ -2,22 +2,22 @@
<section class="ui vertical aligned stripe segment" v-title="labels.title"> <section class="ui vertical aligned stripe segment" v-title="labels.title">
<div class="ui text container"> <div class="ui text container">
<h1>{{ labels.title }}</h1> <h1>{{ labels.title }}</h1>
<p><translate :translate-context="'Content/Library/Paragraph'">There are various ways to grab new content and make it available here.</translate></p> <p><translate translate-context="Content/Library/Paragraph">There are various ways to grab new content and make it available here.</translate></p>
<div class="ui segment"> <div class="ui segment">
<h2><translate :translate-context="'Content/Library/Title/Verb'">Upload audio content</translate></h2> <h2><translate translate-context="Content/Library/Title/Verb">Upload audio content</translate></h2>
<p><translate :translate-context="'Content/Library/Paragraph'">Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here.</translate></p> <p><translate translate-context="Content/Library/Paragraph">Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here.</translate></p>
<p> <p>
<strong><translate :translate-context="'Content/Library/Paragraph'" :translate-params="{quota: defaultQuota}">This instance offers up to %{quota} of storage space for every user.</translate></strong> <strong><translate translate-context="Content/Library/Paragraph" :translate-params="{quota: defaultQuota}">This instance offers up to %{quota} of storage space for every user.</translate></strong>
</p> </p>
<router-link :to="{name: 'content.libraries.index'}" class="ui green button"> <router-link :to="{name: 'content.libraries.index'}" class="ui green button">
<translate :translate-context="'Content/Library/Button.Label/Verb'">Get started</translate> <translate translate-context="Content/Library/Button.Label/Verb">Get started</translate>
</router-link> </router-link>
</div> </div>
<div class="ui segment"> <div class="ui segment">
<h2><translate :translate-context="'Content/Library/Title/Verb'">Follow remote libraries</translate></h2> <h2><translate translate-context="Content/Library/Title/Verb">Follow remote libraries</translate></h2>
<p><translate :translate-context="'Content/Library/Paragraph'">You can follow libraries from other users to get access to new music. Public libraries can be followed immediatly, while following a private library requires approval from its owner.</translate></p> <p><translate translate-context="Content/Library/Paragraph">You can follow libraries from other users to get access to new music. Public libraries can be followed immediatly, while following a private library requires approval from its owner.</translate></p>
<router-link :to="{name: 'content.remote.index'}" class="ui green button"> <router-link :to="{name: 'content.remote.index'}" class="ui green button">
<translate :translate-context="'Content/Library/Button.Label/Verb'">Get started</translate> <translate translate-context="Content/Library/Button.Label/Verb">Get started</translate>
</router-link> </router-link>
</div> </div>

View File

@ -37,15 +37,15 @@
{{ 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="Content/Library/Card.List item" :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">
<router-link :to="{name: 'content.libraries.detail.upload', params: {id: library.uuid}}" class="ui button"> <router-link :to="{name: 'content.libraries.detail.upload', params: {id: library.uuid}}" class="ui button">
<translate :translate-context="'Content/Library/Card.Button.Label/Verb'">Upload</translate> <translate translate-context="Content/Library/Card.Button.Label/Verb">Upload</translate>
</router-link> </router-link>
<router-link :to="{name: 'content.libraries.detail', params: {id: library.uuid}}" exact class="ui button"> <router-link :to="{name: 'content.libraries.detail', params: {id: library.uuid}}" exact class="ui button">
<translate :translate-context="'Content/Library/Card.Button.Label/Noun'">Details</translate> <translate translate-context="Content/Library/Card.Button.Label/Noun">Details</translate>
</router-link> </router-link>
</div> </div>
</div> </div>

View File

@ -1,33 +1,33 @@
<template> <template>
<section class="ui vertical aligned stripe segment"> <section class="ui vertical aligned stripe segment">
<div v-if="isLoadingLibrary" :class="['ui', {'active': isLoadingLibrary}, 'inverted', 'dimmer']"> <div v-if="isLoadingLibrary" :class="['ui', {'active': isLoadingLibrary}, 'inverted', 'dimmer']">
<div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading library data</translate></div> <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading library data</translate></div>
</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/Library/Tab.Title">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="*/*/*">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="*/*/*/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">
<div class="field"> <div class="field">
<label><translate :translate-context="'Content/Library/Title'">Sharing link</translate></label> <label><translate translate-context="Content/Library/Title">Sharing link</translate></label>
<p><translate :translate-context="'Content/Library/Paragraph'">Share this link with other users so they can request access to your library.</translate></p> <p><translate translate-context="Content/Library/Paragraph">Share this link with other users so they can request access to your library.</translate></p>
<copy-input :value="library.fid" /> <copy-input :value="library.fid" />
</div> </div>
</div> </div>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<div v-if="isLoadingFollows" :class="['ui', {'active': isLoadingFollows}, 'inverted', 'dimmer']"> <div v-if="isLoadingFollows" :class="['ui', {'active': isLoadingFollows}, 'inverted', 'dimmer']">
<div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading followers</translate></div> <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading followers</translate></div>
</div> </div>
<table v-else-if="follows && follows.count > 0" class="ui table"> <table v-else-if="follows && follows.count > 0" class="ui table">
<thead> <thead>
<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/Table.Label">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>
<tr v-for="follow in follows.results" :key="follow.fid"> <tr v-for="follow in follows.results" :key="follow.fid">
@ -35,27 +35,27 @@
<td><human-date :date="follow.creation_date" /></td> <td><human-date :date="follow.creation_date" /></td>
<td> <td>
<span :class="['ui', 'yellow', 'basic', 'label']" v-if="follow.approved === null"> <span :class="['ui', 'yellow', 'basic', 'label']" v-if="follow.approved === null">
<translate :translate-context="'Content/Library/Table/Short'">Pending approval</translate> <translate translate-context="Content/Library/Table/Short">Pending approval</translate>
</span> </span>
<span :class="['ui', 'green', 'basic', 'label']" v-else-if="follow.approved === true"> <span :class="['ui', 'green', 'basic', 'label']" v-else-if="follow.approved === true">
<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/Table/Short">Rejected</translate>
</span> </span>
</td> </td>
<td> <td>
<div @click="updateApproved(follow, true)" :class="['ui', 'mini', 'icon', 'labeled', 'green', 'button']" v-if="follow.approved === null || follow.approved === false"> <div @click="updateApproved(follow, true)" :class="['ui', 'mini', 'icon', 'labeled', 'green', 'button']" v-if="follow.approved === null || follow.approved === false">
<i class="ui check icon"></i> <translate :translate-context="'Content/Library/Button.Label'">Accept</translate> <i class="ui check icon"></i> <translate translate-context="Content/Library/Button.Label">Accept</translate>
</div> </div>
<div @click="updateApproved(follow, false)" :class="['ui', 'mini', 'icon', 'labeled', 'red', 'button']" v-if="follow.approved === null || follow.approved === true"> <div @click="updateApproved(follow, false)" :class="['ui', 'mini', 'icon', 'labeled', 'red', 'button']" v-if="follow.approved === null || follow.approved === true">
<i class="ui x icon"></i> <translate :translate-context="'Content/Library/Button.Label'">Reject</translate> <i class="ui x icon"></i> <translate translate-context="Content/Library/Button.Label">Reject</translate>
</div> </div>
</td> </td>
</tr> </tr>
</table> </table>
<p v-else><translate :translate-context="'Content/Library/Paragraph'">Nobody is following this library</translate></p> <p v-else><translate translate-context="Content/Library/Paragraph">Nobody is following this library</translate></p>
</div> </div>
<div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'tracks'}]"> <div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'tracks'}]">
<library-files-table :filters="{library: library.uuid}"></library-files-table> <library-files-table :filters="{library: library.uuid}"></library-files-table>

View File

@ -2,7 +2,7 @@
<div> <div>
<div class="ui two column row"> <div class="ui two column row">
<div class="column"> <div class="column">
<h3 class="ui header"><translate :translate-context="'Content/Library/Title'">Current library</translate></h3> <h3 class="ui header"><translate translate-context="Content/Library/Title">Current library</translate></h3>
<library-card :library="library" /> <library-card :library="library" />
</div> </div>
</div> </div>

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/Library/Input.Label/Verb">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/Dropdown.Label/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/Library/Dropdown">All</translate></option>
<option value="pending"><translate :translate-context="'Content/Library/Dropdown'">Pending</translate></option> <option value="pending"><translate translate-context="Content/Library/Dropdown">Pending</translate></option>
<option value="skipped"><translate :translate-context="'Content/Library/Dropdown'">Skipped</translate></option> <option value="skipped"><translate translate-context="Content/Library/Dropdown">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/Dropdown">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/Library/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/Library/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/Library/Dropdown">Ascending</translate></option>
<option value="-"><translate :translate-context="'Content/Library/Dropdown'">Descending</translate></option> <option value="-"><translate translate-context="Content/Library/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="*/*/*">Title</translate></th>
<th><translate :translate-context="'*/*/*'">Artist</translate></th> <th><translate translate-context="*/*/*">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="*/*/*/Noun">Import status</translate></th>
<th><translate :translate-context="'*/*/*'">Duration</translate></th> <th><translate translate-context="*/*/*">Duration</translate></th>
<th><translate :translate-context="'*/*/*'">Size</translate></th> <th><translate translate-context="*/*/*">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">
@ -90,13 +90,13 @@
{{ time.parse(scope.obj.duration) }} {{ time.parse(scope.obj.duration) }}
</td> </td>
<td v-else> <td v-else>
<translate :translate-context="'*/*/*'">N/A</translate> <translate translate-context="*/*/*">N/A</translate>
</td> </td>
<td v-if="scope.obj.size"> <td v-if="scope.obj.size">
{{ scope.obj.size | humanSize }} {{ scope.obj.size | humanSize }}
</td> </td>
<td v-else> <td v-else>
<translate :translate-context="'*/*/*'">N/A</translate> <translate translate-context="*/*/*">N/A</translate>
</td> </td>
</template> </template>
</action-table> </action-table>
@ -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/Library/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

@ -1,43 +1,43 @@
<template> <template>
<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/Library/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="Content/Library/Input.Label">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/Library/Input.Label">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">
<label><translate :translate-context="'Content/Library/Dropdown.Label'">Visibility</translate></label> <label><translate translate-context="Content/Library/Dropdown.Label">Visibility</translate></label>
<p><translate :translate-context="'Content/Library/Paragraph'">You are able to share your library with other people, regardless of its visibility.</translate></p> <p><translate translate-context="Content/Library/Paragraph">You are able to share your library with other people, regardless of its visibility.</translate></p>
<select class="ui dropdown" v-model="currentVisibilityLevel"> <select class="ui dropdown" v-model="currentVisibilityLevel">
<option :value="c" v-for="c in ['me', 'instance', 'everyone']">{{ labels.visibility[c] }}</option> <option :value="c" v-for="c in ['me', 'instance', 'everyone']">{{ labels.visibility[c] }}</option>
</select> </select>
</div> </div>
<button class="ui submit button" type="submit"> <button class="ui submit button" type="submit">
<translate :translate-context="'Content/Library/Button.Label/Verb'" v-if="library">Update library</translate> <translate translate-context="Content/Library/Button.Label/Verb" v-if="library">Update library</translate>
<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="Content/Library/Button.Label/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>
<p slot="modal-content"> <p slot="modal-content">
<translate :translate-context="'Popup/Library/Paragraph'"> <translate translate-context="Popup/Library/Paragraph">
The library and all its tracks will be deleted. This can not be undone. The library and all its tracks will be deleted. This can not be undone.
</translate> </translate>
</p> </p>
<div slot="modal-confirm"> <div slot="modal-confirm">
<translate :translate-context="'Popup/Library/Button.Label/Verb'">Delete library</translate> <translate translate-context="Popup/Library/Button.Label/Verb">Delete library</translate>
</div> </div>
</dangerous-button> </dangerous-button>
</form> </form>

View File

@ -1,18 +1,18 @@
<template> <template>
<section class="ui vertical aligned stripe segment"> <section class="ui vertical aligned stripe segment">
<div v-if="isLoading" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']"> <div v-if="isLoading" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']">
<div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading Libraries</translate></div> <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading Libraries</translate></div>
</div> </div>
<div v-else class="ui text container"> <div v-else class="ui text container">
<h1 class="ui header"><translate :translate-context="'Content/Library/Title'">My libraries</translate></h1> <h1 class="ui header"><translate translate-context="Content/Library/Title">My libraries</translate></h1>
<p v-if="libraries.length == 0"> <p v-if="libraries.length == 0">
<translate :translate-context="'Content/Library/Paragraph'">Looks like you don't have a library, it's time to create one.</translate> <translate translate-context="Content/Library/Paragraph">Looks like you don't have a library, it's time to create one.</translate>
</p> </p>
<a @click="hiddenForm = !hiddenForm"> <a @click="hiddenForm = !hiddenForm">
<i class="plus icon" v-if="hiddenForm" /> <i class="plus icon" v-if="hiddenForm" />
<i class="minus icon" v-else /> <i class="minus icon" v-else />
<translate :translate-context="'Content/Library/Link/Verb'">Create a new library</translate> <translate translate-context="Content/Library/Link/Verb">Create a new library</translate>
</a> </a>
<library-form :library="null" v-if="!hiddenForm" @created="libraryCreated" /> <library-form :library="null" v-if="!hiddenForm" @created="libraryCreated" />
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>

View File

@ -1,15 +1,15 @@
<template> <template>
<div class="ui segment"> <div class="ui segment">
<h3 class="ui header"><translate :translate-context="'Content/Library/Title'">Current usage</translate></h3> <h3 class="ui header"><translate translate-context="Content/Library/Title">Current usage</translate></h3>
<div v-if="isLoading" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']"> <div v-if="isLoading" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']">
<div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading usage data</translate></div> <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading usage data</translate></div>
</div> </div>
<div :class="['ui', {'success': progress < 60}, {'yellow': progress >= 60 && progress < 96}, {'error': progress >= 95}, 'progress']"> <div :class="['ui', {'success': progress < 60}, {'yellow': progress >= 60 && progress < 96}, {'error': progress >= 95}, 'progress']">
<div class="bar" :style="{width: `${progress}%`}"> <div class="bar" :style="{width: `${progress}%`}">
<div class="progress">{{ progress }}%</div> <div class="progress">{{ progress }}%</div>
</div> </div>
<div class="label" v-if="quotaStatus"> <div class="label" v-if="quotaStatus">
<translate :translate-context="'Content/Library/Paragraph'" :translate-params="{max: humanSize(quotaStatus.max * 1000 * 1000), current: humanSize(quotaStatus.current * 1000 * 1000)}">%{ current } used on %{ max } allowed</translate> <translate translate-context="Content/Library/Paragraph" :translate-params="{max: humanSize(quotaStatus.max * 1000 * 1000), current: humanSize(quotaStatus.current * 1000 * 1000)}">%{ current } used on %{ max } allowed</translate>
</div> </div>
</div> </div>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
@ -20,24 +20,24 @@
{{ humanSize(quotaStatus.pending * 1000 * 1000) }} {{ humanSize(quotaStatus.pending * 1000 * 1000) }}
</div> </div>
<div class="label"> <div class="label">
<translate :translate-context="'Content/Library/Label'">Pending files</translate> <translate translate-context="Content/Library/Label">Pending files</translate>
</div> </div>
</div> </div>
<div> <div>
<router-link <router-link
class="ui basic blue tiny button" class="ui basic blue tiny button"
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'pending'}])}}"> :to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'pending'}])}}">
<translate :translate-context="'Content/Library/Link/Verb'">View files</translate> <translate translate-context="Content/Library/Link/Verb">View files</translate>
</router-link> </router-link>
<dangerous-button <dangerous-button
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="Content/Library/Button.Label/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="Popup/Library/Button.Label">Purge</translate></div>
</dangerous-button> </dangerous-button>
</div> </div>
</div> </div>
@ -47,23 +47,23 @@
{{ humanSize(quotaStatus.skipped * 1000 * 1000) }} {{ humanSize(quotaStatus.skipped * 1000 * 1000) }}
</div> </div>
<div class="label"> <div class="label">
<translate :translate-context="'Content/Library/Label'">Skipped files</translate> <translate translate-context="Content/Library/Label">Skipped files</translate>
</div> </div>
</div> </div>
<div> <div>
<router-link <router-link
class="ui basic blue tiny button" class="ui basic blue tiny button"
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'skipped'}])}}"> :to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'skipped'}])}}">
<translate :translate-context="'Content/Library/Link/Verb'">View files</translate> <translate translate-context="Content/Library/Link/Verb">View files</translate>
</router-link> </router-link>
<dangerous-button <dangerous-button
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="Content/Library/Button.Label/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="Popup/Library/Button.Label">Purge</translate></div>
</dangerous-button> </dangerous-button>
</div> </div>
</div> </div>
@ -73,23 +73,23 @@
{{ humanSize(quotaStatus.errored * 1000 * 1000) }} {{ humanSize(quotaStatus.errored * 1000 * 1000) }}
</div> </div>
<div class="label"> <div class="label">
<translate :translate-context="'Content/Library/Label'">Errored files</translate> <translate translate-context="Content/Library/Label">Errored files</translate>
</div> </div>
</div> </div>
<div> <div>
<router-link <router-link
class="ui basic blue tiny button" class="ui basic blue tiny button"
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'errored'}])}}"> :to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'errored'}])}}">
<translate :translate-context="'Content/Library/Link/Verb'">View files</translate> <translate translate-context="Content/Library/Link/Verb">View files</translate>
</router-link> </router-link>
<dangerous-button <dangerous-button
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="Content/Library/Button.Label/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="Popup/Library/Button.Label">Purge</translate></div>
</dangerous-button> </dangerous-button>
</div> </div>
</div> </div>

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="ui vertical aligned stripe segment"> <div class="ui vertical aligned stripe segment">
<div v-if="isLoadingLibrary" :class="['ui', {'active': isLoadingLibrary}, 'inverted', 'dimmer']"> <div v-if="isLoadingLibrary" :class="['ui', {'active': isLoadingLibrary}, 'inverted', 'dimmer']">
<div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading library data</translate></div> <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading library data</translate></div>
</div> </div>
<detail-area v-else :library="library"> <detail-area v-else :library="library">
<file-upload :default-import-reference="defaultImportReference" :library="library" /> <file-upload :default-import-reference="defaultImportReference" :library="library" />

View File

@ -24,44 +24,44 @@
</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="Content/Library/Card.List item" :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'">
<i class="hourglass icon"></i> <i class="hourglass icon"></i>
<translate :translate-context="'Content/Library/Card.List item'">Scan pending</translate> <translate translate-context="Content/Library/Card.List item">Scan pending</translate>
</template> </template>
<template v-if="latestScan.status === 'scanning'"> <template v-if="latestScan.status === 'scanning'">
<i class="loading spinner icon"></i> <i class="loading spinner icon"></i>
<translate :translate-context="'Content/Library/Card.List item'" :translate-params="{progress: scanProgress}">Scanning (%{ progress }%)</translate> <translate translate-context="Content/Library/Card.List item" :translate-params="{progress: scanProgress}">Scanning (%{ progress }%)</translate>
</template> </template>
<template v-else-if="latestScan.status === 'errored'"> <template v-else-if="latestScan.status === 'errored'">
<i class="red download icon"></i> <i class="red download icon"></i>
<translate :translate-context="'Content/Library/Card.List item'">Problem during scanning</translate> <translate translate-context="Content/Library/Card.List item">Problem during scanning</translate>
</template> </template>
<template v-else-if="latestScan.status === 'finished' && latestScan.errored_files === 0"> <template v-else-if="latestScan.status === 'finished' && latestScan.errored_files === 0">
<i class="green download icon"></i> <i class="green download icon"></i>
<translate :translate-context="'Content/Library/Card.List item'">Scanned</translate> <translate translate-context="Content/Library/Card.List item">Scanned</translate>
</template> </template>
<template v-else-if="latestScan.status === 'finished' && latestScan.errored_files > 0"> <template v-else-if="latestScan.status === 'finished' && latestScan.errored_files > 0">
<i class="yellow download icon"></i> <i class="yellow download icon"></i>
<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.Link">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>
<div v-if="showScan"> <div v-if="showScan">
<template v-if="latestScan.modification_date"> <template v-if="latestScan.modification_date">
<translate :translate-context="'Content/Library/Card.List item/Noun'">Last update:</translate><human-date :date="latestScan.modification_date" /><br /> <translate translate-context="Content/Library/Card.List item/Noun">Last update:</translate><human-date :date="latestScan.modification_date" /><br />
</template> </template>
<translate :translate-context="'Content/Library/Card.List item/Noun'">Failed tracks:</translate> {{ latestScan.errored_files }} <translate translate-context="Content/Library/Card.List item/Noun">Failed tracks:</translate> {{ latestScan.errored_files }}
</div> </div>
</div> </div>
<div v-if="displayScan && canLaunchScan" class="clearfix"> <div v-if="displayScan && canLaunchScan" class="clearfix">
<span class="right floated link" @click="launchScan"> <span class="right floated link" @click="launchScan">
<translate :translate-context="'Content/Library/Card.Button.Label/Verb'">Scan now</translate> <i class="paper plane icon" /> <translate translate-context="Content/Library/Card.Button.Label/Verb">Scan now</translate> <i class="paper plane icon" />
</span> </span>
</div> </div>
</div> </div>
@ -71,7 +71,7 @@
<div v-if="displayCopyFid" class="extra content"> <div v-if="displayCopyFid" class="extra content">
<div class="ui form"> <div class="ui form">
<div class="field"> <div class="field">
<label><translate :translate-context="'Content/Library/Title'">Sharing link</translate></label> <label><translate translate-context="Content/Library/Title">Sharing link</translate></label>
<copy-input :button-classes="'basic'" :value="library.fid" /> <copy-input :button-classes="'basic'" :value="library.fid" />
</div> </div>
</div> </div>
@ -81,29 +81,29 @@
v-if="!library.follow" v-if="!library.follow"
@click="follow()" @click="follow()"
:class="['ui', 'green', {'loading': isLoadingFollow}, 'button']"> :class="['ui', 'green', {'loading': isLoadingFollow}, 'button']">
<translate :translate-context="'Content/Library/Card.Button.Label/Verb'">Follow</translate> <translate translate-context="Content/Library/Card.Button.Label/Verb">Follow</translate>
</button> </button>
<button <button
v-else-if="!library.follow.approved" v-else-if="!library.follow.approved"
class="ui disabled button"><i class="hourglass icon"></i> class="ui disabled button"><i class="hourglass icon"></i>
<translate :translate-context="'Content/Library/Card.Paragraph'">Follow request pending approval</translate> <translate translate-context="Content/Library/Card.Paragraph">Follow request pending approval</translate>
</button> </button>
<button <button
v-else-if="!library.follow.approved" v-else-if="!library.follow.approved"
class="ui disabled button"><i class="check icon"></i> class="ui disabled button"><i class="check icon"></i>
<translate :translate-context="'Content/Library/Card.Paragraph'">Following</translate> <translate translate-context="Content/Library/Card.Paragraph">Following</translate>
</button> </button>
<dangerous-button <dangerous-button
v-else-if="library.follow.approved" v-else-if="library.follow.approved"
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="Content/Library/Card.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="Popup/Library/Button.Label">Unfollow</translate></div>
</dangerous-button> </dangerous-button>
</div> </div>
</div> </div>

Some files were not shown because too many files have changed in this diff Show More