Resolve "i18n fixes for 0.20"

This commit is contained in:
Eliot Berriot 2019-10-01 15:19:55 +02:00
parent 6cee546391
commit 2cdc8fa63a
79 changed files with 2960 additions and 8736 deletions

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

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

@ -4,7 +4,7 @@ locales_dir="locales"
sources=$(find src -name '*.vue' -o -name '*.html' 2> /dev/null) sources=$(find src -name '*.vue' -o -name '*.html' 2> /dev/null)
js_sources=$(find src -name '*.vue' -o -name '*.js') js_sources=$(find src -name '*.vue' -o -name '*.js')
touch $locales_dir/app.pot touch $locales_dir/app.pot
GENERATE=${GENERATE-true}
# Create a main .pot template, then generate .po files for each available language. # Create a main .pot template, then generate .po files for each available language.
# Extract gettext strings from templates files and create a POT dictionary template. # Extract gettext strings from templates files and create a POT dictionary template.
$(yarn bin)/gettext-extract --attribute v-translate --quiet --output $locales_dir/app.pot $sources $(yarn bin)/gettext-extract --attribute v-translate --quiet --output $locales_dir/app.pot $sources
@ -18,12 +18,14 @@ xgettext --language=JavaScript --keyword=npgettext:1c,2,3 \
# Fix broken files path/lines in pot # Fix broken files path/lines in pot
sed -e 's|#: src/|#: front/src/|' -i $locales_dir/app.pot sed -e 's|#: src/|#: front/src/|' -i $locales_dir/app.pot
# Generate .po files for each available language. if [ $GENERATE = 'true' ]; then
echo $locales # Generate .po files for each available language.
for lang in $locales; do \ echo $locales
po_file=$locales_dir/$lang/LC_MESSAGES/app.po; \ for lang in $locales; do \
echo "msgmerge --update $po_file "; \ po_file=$locales_dir/$lang/LC_MESSAGES/app.po; \
mkdir -p $(dirname $po_file); \ echo "msgmerge --update $po_file "; \
[ -f $po_file ] && msgmerge --lang=$lang --update $po_file $locales_dir/app.pot --no-wrap || msginit --no-wrap --no-translator --locale=$lang --input=$locales_dir/app.pot --output-file=$po_file; \ mkdir -p $(dirname $po_file); \
msgattrib --no-wrap --no-obsolete -o $po_file $po_file; \ [ -f $po_file ] && msgmerge --lang=$lang --update $po_file $locales_dir/app.pot --no-wrap || msginit --no-wrap --no-translator --locale=$lang --input=$locales_dir/app.pot --output-file=$po_file; \
done; msgattrib --no-wrap --no-obsolete -o $po_file $po_file; \
done;
fi

View File

@ -0,0 +1,33 @@
import argparse
import collections
import polib
def print_duplicates(path):
pofile = polib.pofile(path)
contexts_by_id = collections.defaultdict(list)
for e in pofile:
contexts_by_id[e.msgid].append(e.msgctxt)
count = collections.Counter(
[e.msgid for e in pofile]
)
duplicates = [
(k, v) for k, v in count.items()
if v > 1
]
for k, v in sorted(duplicates, key=lambda r: r[1], reverse=True):
print('{} entries - {}:'.format(v, k))
for ctx in contexts_by_id[k]:
print(' - {}'.format(ctx))
print()
total_duplicates = sum([v - 1 for _, v in duplicates])
print('{} total duplicates'.format(total_duplicates))
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("po", help="Path of the po file to use as a source")
args = parser.parse_args()
print_duplicates(path=args.po)

View File

@ -83,7 +83,7 @@
<div class="ui stackable grid"> <div class="ui stackable grid">
<div class="four wide column"> <div class="four wide column">
<h3 class="header"> <h3 class="header">
<translate translate-context="Content/Home/Header">About Funkwhale</translate> <translate translate-context="Footer/*/Title/Short">About Funkwhale</translate>
</h3> </h3>
<p v-translate translate-context="Content/Home/Paragraph">This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network.</p> <p v-translate translate-context="Content/Home/Paragraph">This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network.</p>
<p v-translate translate-context="Content/Home/Paragraph">Funkwhale is free and developped by a friendly community of volunteers.</p> <p v-translate translate-context="Content/Home/Paragraph">Funkwhale is free and developped by a friendly community of volunteers.</p>

View File

@ -36,7 +36,7 @@
</div> </div>
</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="*/*/Button.Label/Verb">Close</translate></div>
</footer> </footer>
</modal> </modal>
</template> </template>

View File

@ -83,7 +83,7 @@
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="*/*/*">Library</translate> <i class="book icon"></i><translate translate-context="*/*/*/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"

View File

@ -3,7 +3,7 @@
<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/*/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>

View File

@ -97,7 +97,7 @@ export default {
}, },
title () { title () {
if (this.playable) { if (this.playable) {
return this.$pgettext('*/Queue/Button/Title', 'More…') return this.$pgettext('*/*/Button.Label/Noun', 'More…')
} else { } else {
if (this.track) { if (this.track) {
return this.$pgettext('*/Queue/Button/Title', 'This track is not available in any library you have access to') return this.$pgettext('*/Queue/Button/Title', 'This track is not available in any library you have access to')

View File

@ -39,7 +39,7 @@
<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/*/Card.Link/Verb">Collapse</translate> <translate translate-context="*/*/Button,Label">Collapse</translate>
</em> </em>
</div> </div>
</div> </div>

View File

@ -5,7 +5,7 @@
<tr> <tr>
<th></th> <th></th>
<th></th> <th></th>
<th colspan="6"><translate translate-context="Content/Track/*/Noun">Title</translate></th> <th colspan="6"><translate translate-context="*/*/*/Noun">Title</translate></th>
<th colspan="4"><translate translate-context="*/*/*/Noun">Artist</translate></th> <th colspan="4"><translate translate-context="*/*/*/Noun">Artist</translate></th>
<th colspan="4"><translate translate-context="*/*/*">Album</translate></th> <th colspan="4"><translate translate-context="*/*/*">Album</translate></th>
<th colspan="4"><translate translate-context="Content/*/*">Duration</translate></th> <th colspan="4"><translate translate-context="Content/*/*">Duration</translate></th>

View File

@ -8,7 +8,7 @@
</ul> </ul>
</div> </div>
<div class="ui field"> <div class="ui field">
<label><translate translate-context="Content/Applications/Input.Label/Noun">Name</translate></label> <label><translate translate-context="*/*/*/Noun">Name</translate></label>
<input name="name" required type="text" v-model="fields.name" /> <input name="name" required type="text" v-model="fields.name" />
</div> </div>
<div class="ui field"> <div class="ui field">
@ -21,7 +21,7 @@
</p> </p>
</div> </div>
<div class="ui field"> <div class="ui field">
<label><translate translate-context="Content/Applications/Input.Label/Noun">Scopes</translate></label> <label><translate translate-context="Content/*/*/Noun">Scopes</translate></label>
<p> <p>
<translate translate-context="Content/Applications/Paragraph/"> <translate translate-context="Content/Applications/Paragraph/">
Checking the parent "Read" or "Write" scopes implies access to all the corresponding children scopes. Checking the parent "Read" or "Write" scopes implies access to all the corresponding children scopes.

View File

@ -6,7 +6,7 @@
<translate translate-context="Content/Applications/Link">Back to settings</translate> <translate translate-context="Content/Applications/Link">Back to settings</translate>
</router-link> </router-link>
<h2 class="ui header"> <h2 class="ui header">
<translate translate-context="Content/Applications/Title">Create a new application</translate> <translate translate-context="Content/Settings/Button.Label">Create a new application</translate>
</h2> </h2>
<application-form <application-form
:defaults="defaults" :defaults="defaults"
@ -38,7 +38,7 @@ export default {
computed: { computed: {
labels() { labels() {
return { return {
title: this.$pgettext('Content/Applications/Title', "Create a new application") title: this.$pgettext('Content/Settings/Button.Label', "Create a new application")
} }
}, },
} }

View File

@ -30,7 +30,7 @@
</div> </div>
<div class="field"> <div class="field">
<label> <label>
<translate translate-context="Content/*/Input.Label">Password</translate> | <translate translate-context="*/*/*">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="*/Login/*/Verb">Reset your password</translate> <translate translate-context="*/Login/*/Verb">Reset your password</translate>
</router-link> </router-link>

View File

@ -244,7 +244,7 @@
</td> </td>
<td> <td>
<router-link class="ui basic tiny green button" :to="{name: 'settings.applications.edit', params: {id: app.client_id}}"> <router-link class="ui basic tiny green button" :to="{name: 'settings.applications.edit', params: {id: app.client_id}}">
<translate translate-context="Content/Settings/Button.Label">Edit</translate> <translate translate-context="Content/*/Button.Label/Verb">Edit</translate>
</router-link> </router-link>
<dangerous-button <dangerous-button
class="ui tiny basic button" class="ui tiny basic button"
@ -272,7 +272,7 @@
<h2 class="ui header"> <h2 class="ui header">
<i class="trash icon"></i> <i class="trash icon"></i>
<div class="content"> <div class="content">
<translate translate-context="Content/Settings/Title/Verb">Delete my account</translate> <translate translate-context="*/*/Button.Label">Delete my account</translate>
</div> </div>
</h2> </h2>
<p> <p>
@ -300,7 +300,7 @@
<div slot="modal-content"> <div slot="modal-content">
<p><translate translate-context="Popup/Settings/Paragraph">This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out.</translate></p> <p><translate translate-context="Popup/Settings/Paragraph">This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out.</translate></p>
</div> </div>
<div slot="modal-confirm"><translate translate-context="Popup/Settings/Button.Label">Delete my account</translate></div> <div slot="modal-confirm"><translate translate-context="*/*/Button.Label">Delete my account</translate></div>
</dangerous-button> </dangerous-button>
</div> </div>
</section> </section>

View File

@ -34,7 +34,7 @@
v-model="email"> v-model="email">
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/*/Input.Label">Password</translate></label> <label><translate translate-context="*/*/*">Password</translate></label>
<password-input v-model="password" /> <password-input v-model="password" />
</div> </div>
<div class="field" v-if="!$store.state.instance.settings.users.registration_enabled.value"> <div class="field" v-if="!$store.state.instance.settings.users.registration_enabled.value">

View File

@ -17,7 +17,7 @@
<template v-else> <template v-else>
<section class="ui vertical stripe segment"> <section class="ui vertical stripe segment">
<h2> <h2>
<translate translate-context="*/*/*/Noun">Tracks</translate> <translate translate-context="*/*/*">Tracks</translate>
</h2> </h2>
<track-table v-if="object" :artist="object.artist" :display-position="true" :tracks="object.tracks"></track-table> <track-table v-if="object" :artist="object.artist" :display-position="true" :tracks="object.tracks"></track-table>
</section> </section>

View File

@ -92,8 +92,8 @@
<thead> <thead>
<tr> <tr>
<th><translate translate-context="Content/Library/Table.Label">Filename</translate></th> <th><translate translate-context="Content/Library/Table.Label">Filename</translate></th>
<th><translate translate-context="Content/Library/*/in MB">Size</translate></th> <th><translate translate-context="Content/*/*/Noun">Size</translate></th>
<th><translate translate-context="Content/Library/Table.Label (Value is Uploading/Uploaded/Error)">Status</translate></th> <th><translate translate-context="*/*/*">Status</translate></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

View File

@ -44,7 +44,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Popup/Import/Table.Label/Noun">Getting help</translate> <translate translate-context="Footer/*/Link">Getting help</translate>
</td> </td>
<td> <td>
<ul> <ul>
@ -141,7 +141,7 @@ export default {
let detail = payload.detail || {} let detail = payload.detail || {}
d.errorRows = getErrors(detail) d.errorRows = getErrors(detail)
} else { } else {
d.label = this.$pgettext('Popup/Import/Error.Label', 'Unknown error') d.label = this.$pgettext('*/*/Error', 'Unknown error')
d.detail = this.$pgettext('Popup/Import/Error.Label', 'An unknown error occurred') d.detail = this.$pgettext('Popup/Import/Error.Label', 'An unknown error occurred')
} }
let debugInfo = { let debugInfo = {

View File

@ -17,7 +17,7 @@
<artist-widget :controls="false" :filters="{playable: true, ordering: '-creation_date', tag: id}"> <artist-widget :controls="false" :filters="{playable: true, ordering: '-creation_date', tag: id}">
<template slot="title"> <template slot="title">
<router-link :to="{name: 'library.artists.browse', query: {tag: id}}"> <router-link :to="{name: 'library.artists.browse', query: {tag: id}}">
<translate translate-context="*/*/*">Artists</translate> <translate translate-context="*/*/*/Noun">Artists</translate>
</router-link> </router-link>
</template> </template>
</artist-widget> </artist-widget>

View File

@ -9,7 +9,7 @@
<tbody> <tbody>
<tr> <tr>
<td> <td>
<translate translate-context="Content/Track/Table.Label/Noun">Copyright</translate> <translate translate-context="Content/Track/*/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>
@ -38,7 +38,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/Library/*/in MB">Size</translate> <translate translate-context="Content/*/*/Noun">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>

View File

@ -23,7 +23,7 @@
<input id="name" name="name" type="text" v-model="radioName" :placeholder="labels.placeholder.name" /> <input id="name" name="name" type="text" v-model="radioName" :placeholder="labels.placeholder.name" />
</div> </div>
<div class="field"> <div class="field">
<label for="description"><translate translate-context="Content/*/Input.Label/Noun">Description</translate></label> <label for="description"><translate translate-context="*/*/*/Noun">Description</translate></label>
<textarea rows="2" id="description" type="text" v-model="radioDesc" :placeholder="labels.placeholder.description" /> <textarea rows="2" id="description" type="text" v-model="radioDesc" :placeholder="labels.placeholder.description" />
</div> </div>
<div class="ui toggle checkbox"> <div class="ui toggle checkbox">

View File

@ -37,8 +37,8 @@
action-url="manage/library/albums/action/" action-url="manage/library/albums/action/"
:filters="actionFilters"> :filters="actionFilters">
<template slot="header-cells"> <template slot="header-cells">
<th><translate translate-context="*/*/*">Title</translate></th> <th><translate translate-context="*/*/*/Noun">Title</translate></th>
<th><translate translate-context="*/*/*">Artist</translate></th> <th><translate translate-context="*/*/*/Noun">Artist</translate></th>
<th><translate translate-context="Content/Moderation/*/Noun">Domain</translate></th> <th><translate translate-context="Content/Moderation/*/Noun">Domain</translate></th>
<th><translate translate-context="*/*/*">Tracks</translate></th> <th><translate translate-context="*/*/*">Tracks</translate></th>
<th><translate translate-context="Content/*/*/Noun">Release date</translate></th> <th><translate translate-context="Content/*/*/Noun">Release date</translate></th>

View File

@ -10,7 +10,7 @@
</form> </form>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Dropdown.Label (Value is All/Pending review/Approved/Rejected)">Status</translate></label> <label><translate translate-context="*/*/*">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/*/Dropdown">All</translate> <translate translate-context="Content/*/Dropdown">All</translate>

View File

@ -46,12 +46,12 @@
action-url="manage/library/libraries/action/" action-url="manage/library/libraries/action/"
:filters="actionFilters"> :filters="actionFilters">
<template slot="header-cells"> <template slot="header-cells">
<th><translate translate-context="*/*/*">Name</translate></th> <th><translate translate-context="*/*/*/Noun">Name</translate></th>
<th><translate translate-context="*/*/*">Account</translate></th> <th><translate translate-context="*/*/*/Noun">Account</translate></th>
<th><translate translate-context="Content/Moderation/*/Noun">Domain</translate></th> <th><translate translate-context="Content/Moderation/*/Noun">Domain</translate></th>
<th><translate translate-context="*/*/*">Visibility</translate></th> <th><translate translate-context="*/*/*">Visibility</translate></th>
<th><translate translate-context="Content/*/*/Noun">Uploads</translate></th> <th><translate translate-context="*/*/*">Uploads</translate></th>
<th><translate translate-context="Content/*/*/Noun">Followers</translate></th> <th><translate translate-context="Content/Federation/*/Noun">Followers</translate></th>
<th><translate translate-context="Content/*/*/Noun">Creation date</translate></th> <th><translate translate-context="Content/*/*/Noun">Creation date</translate></th>
</template> </template>
<template slot="row-cells" slot-scope="scope"> <template slot="row-cells" slot-scope="scope">

View File

@ -39,8 +39,8 @@
idField="name" idField="name"
:filters="actionFilters"> :filters="actionFilters">
<template slot="header-cells"> <template slot="header-cells">
<th><translate translate-context="*/*/*">Name</translate></th> <th><translate translate-context="*/*/*/Noun">Name</translate></th>
<th><translate translate-context="*/*/*">Artists</translate></th> <th><translate translate-context="*/*/*/Noun">Artists</translate></th>
<th><translate translate-context="*/*/*">Albums</translate></th> <th><translate translate-context="*/*/*">Albums</translate></th>
<th><translate translate-context="*/*/*">Tracks</translate></th> <th><translate translate-context="*/*/*">Tracks</translate></th>
<th><translate translate-context="Content/*/*/Noun">Creation date</translate></th> <th><translate translate-context="Content/*/*/Noun">Creation date</translate></th>

View File

@ -37,9 +37,9 @@
action-url="manage/library/tracks/action/" action-url="manage/library/tracks/action/"
:filters="actionFilters"> :filters="actionFilters">
<template slot="header-cells"> <template slot="header-cells">
<th><translate translate-context="*/*/*">Title</translate></th> <th><translate translate-context="*/*/*/Noun">Title</translate></th>
<th><translate translate-context="*/*/*">Album</translate></th> <th><translate translate-context="*/*/*">Album</translate></th>
<th><translate translate-context="*/*/*">Artist</translate></th> <th><translate translate-context="*/*/*/Noun">Artist</translate></th>
<th><translate translate-context="Content/Moderation/*/Noun">Domain</translate></th> <th><translate translate-context="Content/Moderation/*/Noun">Domain</translate></th>
<th><translate translate-context="Content/*/*/Noun">License</translate></th> <th><translate translate-context="Content/*/*/Noun">License</translate></th>
<th><translate translate-context="Content/*/*/Noun">Creation date</translate></th> <th><translate translate-context="Content/*/*/Noun">Creation date</translate></th>

View File

@ -18,7 +18,7 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Library/*/Noun">Import status</translate></label> <label><translate translate-context="Content/*/*/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/*/Dropdown">All</translate></option> <option value=""><translate translate-context="Content/*/Dropdown">All</translate></option>
<option value="pending"><translate translate-context="Content/Library/*/Short">Pending</translate></option> <option value="pending"><translate translate-context="Content/Library/*/Short">Pending</translate></option>
@ -57,9 +57,9 @@
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="*/*/*">Name</translate></th> <th><translate translate-context="*/*/*/Noun">Name</translate></th>
<th><translate translate-context="*/*/*">Library</translate></th> <th><translate translate-context="*/*/*/Noun">Library</translate></th>
<th><translate translate-context="*/*/*">Account</translate></th> <th><translate translate-context="*/*/*/Noun">Account</translate></th>
<th><translate translate-context="Content/Moderation/*/Noun">Domain</translate></th> <th><translate translate-context="Content/Moderation/*/Noun">Domain</translate></th>
<th><translate translate-context="*/*/*">Visibility</translate></th> <th><translate translate-context="*/*/*">Visibility</translate></th>
<th><translate translate-context="Content/*/*/Noun">Import status</translate></th> <th><translate translate-context="Content/*/*/Noun">Import status</translate></th>

View File

@ -39,7 +39,7 @@
<template slot="header-cells"> <template slot="header-cells">
<th><translate translate-context="*/*/*/Noun">Name</translate></th> <th><translate translate-context="*/*/*/Noun">Name</translate></th>
<th><translate translate-context="Content/Moderation/*/Noun">Domain</translate></th> <th><translate translate-context="Content/Moderation/*/Noun">Domain</translate></th>
<th><translate translate-context="Content/Moderation/Table.Label/Noun">Uploads</translate></th> <th><translate translate-context="*/*/*">Uploads</translate></th>
<th><translate translate-context="Content/Moderation/Table.Label/Short (Value is a date)">First seen</translate></th> <th><translate translate-context="Content/Moderation/Table.Label/Short (Value is a date)">First seen</translate></th>
<th><translate translate-context="Content/Moderation/Table.Label/Noun">Last seen</translate></th> <th><translate translate-context="Content/Moderation/Table.Label/Noun">Last seen</translate></th>
<th><translate translate-context="Content/Moderation/Table.Label/Short">Under moderation rule</translate></th> <th><translate translate-context="Content/Moderation/Table.Label/Short">Under moderation rule</translate></th>

View File

@ -9,7 +9,7 @@
<div class="field" v-if="allowListEnabled"> <div class="field" v-if="allowListEnabled">
<label><translate translate-context="Content/Moderation/*/Adjective">Is present on allow-list</translate></label> <label><translate translate-context="Content/Moderation/*/Adjective">Is present on allow-list</translate></label>
<select class="ui dropdown" v-model="allowed"> <select class="ui dropdown" v-model="allowed">
<option :value="null"><translate translate-context="*/*/*">All</translate></option> <option :value="null"><translate translate-context="Content/*/Dropdown">All</translate></option>
<option :value="true"><translate translate-context="*/*/*">Yes</translate></option> <option :value="true"><translate translate-context="*/*/*">Yes</translate></option>
<option :value="false"><translate translate-context="*/*/*">No</translate></option> <option :value="false"><translate translate-context="*/*/*">No</translate></option>
</select> </select>

View File

@ -6,7 +6,7 @@
<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="*/*/*/State of feature">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>

View File

@ -15,8 +15,8 @@
<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="*/*/*/State of feature" v-if="current.isActive" key="1">Enabled</translate>
<translate translate-context="*/*/*" v-else key="2">Disabled</translate> <translate translate-context="*/*/*/State of feature" v-else key="2">Disabled</translate>
<tooltip :content="labels.isActiveHelp" /> <tooltip :content="labels.isActiveHelp" />
</label> </label>
</div> </div>

View File

@ -41,7 +41,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="*/*/*/Noun">Creation date</translate> <translate translate-context="Content/*/*/Noun">Creation date</translate>
</td> </td>
<td> <td>
<human-date :date="obj.creation_date" :icon="true"></human-date> <human-date :date="obj.creation_date" :icon="true"></human-date>
@ -107,7 +107,7 @@
<div class="ui stackable two column grid"> <div class="ui stackable two column grid">
<div class="column"> <div class="column">
<h3> <h3>
<translate translate-context="Content/*/*/Short">Message</translate> <translate translate-context="*/*/Field.Label/Noun">Message</translate>
</h3> </h3>
<expandable-div v-if="obj.summary" class="summary" :content="obj.summary"> <expandable-div v-if="obj.summary" class="summary" :content="obj.summary">
<div v-html="markdown.makeHtml(obj.summary)"></div> <div v-html="markdown.makeHtml(obj.summary)"></div>
@ -132,7 +132,7 @@
<tbody> <tbody>
<tr v-if="target"> <tr v-if="target">
<td> <td>
<translate translate-context="*/*/*">Type</translate> <translate translate-context="Content/Track/Table.Label/Noun">Type</translate>
</td> </td>
<td colspan="2"> <td colspan="2">
<i :class="[configs[target.type].icon, 'icon']"></i> <i :class="[configs[target.type].icon, 'icon']"></i>
@ -154,7 +154,7 @@
</tr> </tr>
<tr v-if="target && target.type === 'account'"> <tr v-if="target && target.type === 'account'">
<td> <td>
<translate translate-context="*/*/*">Account</translate> <translate translate-context="*/*/*/Noun">Account</translate>
</td> </td>
<td> <td>
<actor-link :admin="true" :actor="obj.target_owner"></actor-link> <actor-link :admin="true" :actor="obj.target_owner"></actor-link>
@ -208,7 +208,7 @@
</div> </div>
<div class="column"> <div class="column">
<h3> <h3>
<translate translate-context="*/*/*">Actions</translate> <translate translate-context="Content/*/*/Noun">Actions</translate>
</h3> </h3>
<div class="ui labelled icon basic buttons"> <div class="ui labelled icon basic buttons">
<button <button

View File

@ -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/Library/Button.Label">Clear</translate></button>
</div> </div>
</div> </div>
</template> </template>

View File

@ -15,7 +15,7 @@
</select> </select>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Admin/*/Noun (Value is Used/Not used)">Status</translate></label> <label><translate translate-context="*/*/*">Status</translate></label>
<select class="ui dropdown" v-model="isOpen"> <select class="ui dropdown" v-model="isOpen">
<option :value="null"><translate translate-context="Content/*/Dropdown">All</translate></option> <option :value="null"><translate translate-context="Content/*/Dropdown">All</translate></option>
<option :value="true"><translate translate-context="Content/Admin/Dropdown/Adjective">Open</translate></option> <option :value="true"><translate translate-context="Content/Admin/Dropdown/Adjective">Open</translate></option>
@ -36,8 +36,8 @@
: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="*/*/*">Owner</translate></th>
<th><translate translate-context="Content/Admin/*/Noun (Value is Used/Not used)">Status</translate></th> <th><translate translate-context="*/*/*">Status</translate></th>
<th><translate translate-context="Content/*/*/Noun">Creation date</translate></th> <th><translate translate-context="Content/*/*/Noun">Creation date</translate></th>
<th><translate translate-context="Content/Admin/Table.Label/Noun">Expiration date</translate></th> <th><translate translate-context="Content/Admin/Table.Label/Noun">Expiration date</translate></th>
<th><translate translate-context="Content/Admin/Table.Label/Noun">Code</translate></th> <th><translate translate-context="Content/Admin/Table.Label/Noun">Code</translate></th>

View File

@ -40,8 +40,8 @@
<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/Profile/Table.Label/Short, Noun (Value is a date)">Last activity</translate></th> <th><translate translate-context="Content/Profile/Table.Label/Short, Noun (Value is a date)">Last activity</translate></th>
<th><translate translate-context="Content/Admin/Table.Label/Noun">Permissions</translate></th> <th><translate translate-context="Content/*/*/Noun">Permissions</translate></th>
<th><translate translate-context="Content/Admin/Table.Label/Noun (Value is Regular user/Admin)">Status</translate></th> <th><translate translate-context="*/*/*">Status</translate></th>
</template> </template>
<template slot="row-cells" slot-scope="scope"> <template slot="row-cells" slot-scope="scope">
<td> <td>
@ -171,7 +171,7 @@ export default {
return [ return [
{ {
'code': 'library', 'code': 'library',
'label': this.$pgettext('*/*/*', 'Library') 'label': this.$pgettext('*/*/*/Noun', 'Library')
}, },
{ {
'code': 'moderation', 'code': 'moderation',

View File

@ -11,7 +11,7 @@ export default {
type: 'account', type: 'account',
full_username: account.full_username, full_username: account.full_username,
label: account.full_username, label: account.full_username,
typeLabel: this.$pgettext("*/*/*", 'Account'), typeLabel: this.$pgettext("*/*/*/Noun", 'Account'),
} }
}) })
if (track) { if (track) {
@ -26,7 +26,7 @@ export default {
type: 'track', type: 'track',
id: track.id, id: track.id,
label: track.title, label: track.title,
typeLabel: this.$pgettext("*/*/*", 'Track'), typeLabel: this.$pgettext("*/*/*/Noun", 'Track'),
} }
}) })
album = track.album album = track.album
@ -53,7 +53,7 @@ export default {
type: 'artist', type: 'artist',
id: artist.id, id: artist.id,
label: artist.name, label: artist.name,
typeLabel: this.$pgettext("*/*/*", 'Artist'), typeLabel: this.$pgettext("*/*/*/Noun", 'Artist'),
} }
}) })
} }
@ -75,7 +75,7 @@ export default {
type: 'library', type: 'library',
uuid: library.uuid, uuid: library.uuid,
label: library.name, label: library.name,
typeLabel: this.$pgettext("*/*/*", 'Library'), typeLabel: this.$pgettext("*/*/*/Noun", 'Library'),
} }
}) })
} }

View File

@ -43,7 +43,7 @@ export default {
label: this.$pgettext('*/*/*', 'Category'), label: this.$pgettext('*/*/*', 'Category'),
choices: { choices: {
takedown_request: this.$pgettext("Content/Moderation/Dropdown", "Takedown request"), takedown_request: this.$pgettext("Content/Moderation/Dropdown", "Takedown request"),
invalid_metadata: this.$pgettext("Content/Moderation/Dropdown", "Invalid metadata"), invalid_metadata: this.$pgettext("Popup/Import/Error.Label", "Invalid metadata"),
illegal_content: this.$pgettext("Content/Moderation/Dropdown", "Illegal content"), illegal_content: this.$pgettext("Content/Moderation/Dropdown", "Illegal content"),
offensive_content: this.$pgettext("Content/Moderation/Dropdown", "Offensive content"), offensive_content: this.$pgettext("Content/Moderation/Dropdown", "Offensive content"),
other: this.$pgettext("Content/Moderation/Dropdown", "Other"), other: this.$pgettext("Content/Moderation/Dropdown", "Other"),
@ -64,7 +64,7 @@ export default {
name: this.$pgettext('*/*/*/Noun', 'Name'), name: this.$pgettext('*/*/*/Noun', 'Name'),
length: this.$pgettext('*/*/*/Noun', 'Length'), length: this.$pgettext('*/*/*/Noun', 'Length'),
items_count: this.$pgettext('*/*/*/Noun', 'Items'), items_count: this.$pgettext('*/*/*/Noun', 'Items'),
size: this.$pgettext('Content/Library/*/in MB', 'Size'), size: this.$pgettext('Content/*/*/Noun', 'Size'),
bitrate: this.$pgettext('Content/Track/*/Noun', 'Bitrate'), bitrate: this.$pgettext('Content/Track/*/Noun', 'Bitrate'),
duration: this.$pgettext('Content/*/*', 'Duration'), duration: this.$pgettext('Content/*/*', 'Duration'),
date_joined: this.$pgettext('Content/Admin/Table.Label/Noun', 'Sign-up date'), date_joined: this.$pgettext('Content/Admin/Table.Label/Noun', 'Sign-up date'),
@ -73,7 +73,7 @@ export default {
domain: this.$pgettext('Content/Moderation/*/Noun', 'Domain'), domain: this.$pgettext('Content/Moderation/*/Noun', 'Domain'),
users: this.$pgettext('*/*/*/Noun', 'Users'), users: this.$pgettext('*/*/*/Noun', 'Users'),
received_messages: this.$pgettext('Content/Moderation/*/Noun', 'Received messages'), received_messages: this.$pgettext('Content/Moderation/*/Noun', 'Received messages'),
uploads: this.$pgettext('Content/Moderation/Table.Label/Noun', 'Uploads'), uploads: this.$pgettext('*/*/*', 'Uploads'),
followers: this.$pgettext('Content/Federation/*/Noun', 'Followers'), followers: this.$pgettext('Content/Federation/*/Noun', 'Followers'),
}, },
scopes: { scopes: {
@ -86,11 +86,11 @@ export default {
description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to audio files, libraries, artists, albums and tracks'), description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to audio files, libraries, artists, albums and tracks'),
}, },
favorites: { favorites: {
label: this.$pgettext('Content/OAuth Scopes/Label', 'Favorites'), label: this.$pgettext('Sidebar/Favorites/List item.Link/Noun', 'Favorites'),
description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to favorites'), description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to favorites'),
}, },
listenings: { listenings: {
label: this.$pgettext('Content/OAuth Scopes/Label', 'Listenings'), label: this.$pgettext('*/*/*/Noun', 'Listenings'),
description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to listening history'), description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to listening history'),
}, },
follows: { follows: {
@ -98,23 +98,23 @@ export default {
description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to follows'), description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to follows'),
}, },
playlists: { playlists: {
label: this.$pgettext('Content/OAuth Scopes/Label', 'Playlists'), label: this.$pgettext('*/*/*', 'Playlists'),
description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to playlists'), description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to playlists'),
}, },
radios: { radios: {
label: this.$pgettext('Content/OAuth Scopes/Label', 'Radios'), label: this.$pgettext('*/*/*', 'Radios'),
description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to radios'), description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to radios'),
}, },
filters: { filters: {
label: this.$pgettext('Content/OAuth Scopes/Label', 'Content filters'), label: this.$pgettext('Content/Settings/Title/Noun', 'Content filters'),
description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to content filters'), description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to content filters'),
}, },
notifications: { notifications: {
label: this.$pgettext('Content/OAuth Scopes/Label', 'Notifications'), label: this.$pgettext('*/Notifications/*', 'Notifications'),
description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to notifications'), description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to notifications'),
}, },
edits: { edits: {
label: this.$pgettext('Content/OAuth Scopes/Label', 'Edits'), label: this.$pgettext('*/Admin/*/Noun', 'Edits'),
description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to edits'), description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to edits'),
} }
} }

View File

@ -45,7 +45,7 @@
<th></th> <th></th>
<th><translate translate-context="*/*/*/Noun">Name</translate></th> <th><translate translate-context="*/*/*/Noun">Name</translate></th>
<th class="sorted descending"><translate translate-context="Popup/Playlist/Table.Label/Short">Last modification</translate></th> <th class="sorted descending"><translate translate-context="Popup/Playlist/Table.Label/Short">Last modification</translate></th>
<th><translate translate-context="*/*/*/Noun">Tracks</translate></th> <th><translate translate-context="*/*/*">Tracks</translate></th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>

View File

@ -9,7 +9,7 @@ export default {
getConfigs () { getConfigs () {
return { return {
artist: { artist: {
label: this.$pgettext('*/*/*', 'Artist'), label: this.$pgettext('*/*/*/Noun', 'Artist'),
icon: 'users', icon: 'users',
getDeleteUrl: (obj) => { getDeleteUrl: (obj) => {
return `manage/library/artists/${obj.id}/` return `manage/library/artists/${obj.id}/`
@ -26,7 +26,7 @@ export default {
}, },
{ {
id: 'creation_date', id: 'creation_date',
label: this.$pgettext('*/*/*/Noun', 'Creation date'), label: this.$pgettext('Content/*/*/Noun', 'Creation date'),
getValue: (obj) => { return obj.creation_date } getValue: (obj) => { return obj.creation_date }
}, },
{ {
@ -61,7 +61,7 @@ export default {
}, },
{ {
id: 'creation_date', id: 'creation_date',
label: this.$pgettext('*/*/*/Noun', 'Creation date'), label: this.$pgettext('Content/*/*/Noun', 'Creation date'),
getValue: (obj) => { return obj.creation_date } getValue: (obj) => { return obj.creation_date }
}, },
{ {
@ -85,7 +85,7 @@ export default {
] ]
}, },
track: { track: {
label: this.$pgettext('*/*/*', 'Track'), label: this.$pgettext('*/*/*/Noun', 'Track'),
icon: 'music', icon: 'music',
getDeleteUrl: (obj) => { getDeleteUrl: (obj) => {
return `manage/library/tracks/${obj.id}/` return `manage/library/tracks/${obj.id}/`
@ -129,7 +129,7 @@ export default {
] ]
}, },
library: { library: {
label: this.$pgettext('*/*/*', 'Library'), label: this.$pgettext('*/*/*/Noun', 'Library'),
icon: 'book', icon: 'book',
getDeleteUrl: (obj) => { getDeleteUrl: (obj) => {
return `manage/library/libraries/${obj.uuid}/` return `manage/library/libraries/${obj.uuid}/`
@ -176,7 +176,7 @@ export default {
] ]
}, },
account: { account: {
label: this.$pgettext('*/*/*', 'Account'), label: this.$pgettext('*/*/*/Noun', 'Account'),
icon: 'user', icon: 'user',
urls: { urls: {
getAdminDetail: (obj) => { return {name: 'manage.moderation.accounts.detail', params: {id: `${obj.preferred_username}@${obj.domain}`}}} getAdminDetail: (obj) => { return {name: 'manage.moderation.accounts.detail', params: {id: `${obj.preferred_username}@${obj.domain}`}}}

View File

@ -81,10 +81,10 @@ export default {
let usersLabel = this.$pgettext('*/*/*/Noun', 'Users') let usersLabel = this.$pgettext('*/*/*/Noun', 'Users')
let musicLabel = this.$pgettext('*/*/*/Noun', 'Music') let musicLabel = this.$pgettext('*/*/*/Noun', 'Music')
let playlistsLabel = this.$pgettext('*/*/*', 'Playlists') let playlistsLabel = this.$pgettext('*/*/*', 'Playlists')
let federationLabel = this.$pgettext('Content/Admin/Menu', 'Federation') let federationLabel = this.$pgettext('*/*/*', 'Federation')
let moderationLabel = this.$pgettext('Content/Admin/Menu', 'Moderation') let moderationLabel = this.$pgettext('*/Moderation/*', 'Moderation')
let subsonicLabel = this.$pgettext('Content/Admin/Menu', 'Subsonic') let subsonicLabel = this.$pgettext('Content/Admin/Menu', 'Subsonic')
let statisticsLabel = this.$pgettext('Content/Admin/Menu', 'Statistics') let statisticsLabel = this.$pgettext('Content/Home/Header', 'Statistics')
let uiLabel = this.$pgettext('Content/Admin/Menu', 'User Interface') let uiLabel = this.$pgettext('Content/Admin/Menu', 'User Interface')
let errorLabel = this.$pgettext('Content/Admin/Menu', 'Error reporting') let errorLabel = this.$pgettext('Content/Admin/Menu', 'Error reporting')
return [ return [

View File

@ -256,7 +256,7 @@
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('album_id', object.id) }}"> <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('album_id', object.id) }}">
<translate translate-context="Content/Moderation/Table.Label/Noun">Uploads</translate> <translate translate-context="*/*/*">Uploads</translate>
</router-link> </router-link>
</td> </td>
<td> <td>

View File

@ -244,7 +244,7 @@
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('artist_id', object.id) }}"> <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('artist_id', object.id) }}">
<translate translate-context="Content/Moderation/Table.Label/Noun">Uploads</translate> <translate translate-context="*/*/*">Uploads</translate>
</router-link> </router-link>
</td> </td>
<td> <td>

View File

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

View File

@ -6,7 +6,7 @@
:to="{name: 'manage.library.edits'}"><translate translate-context="*/Admin/*/Noun">Edits</translate></router-link> :to="{name: 'manage.library.edits'}"><translate translate-context="*/Admin/*/Noun">Edits</translate></router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.library.artists'}"><translate translate-context="*/*/*">Artists</translate></router-link> :to="{name: 'manage.library.artists'}"><translate translate-context="*/*/*/Noun">Artists</translate></router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.library.albums'}"><translate translate-context="*/*/*">Albums</translate></router-link> :to="{name: 'manage.library.albums'}"><translate translate-context="*/*/*">Albums</translate></router-link>
@ -15,13 +15,13 @@
:to="{name: 'manage.library.tracks'}"><translate translate-context="*/*/*">Tracks</translate></router-link> :to="{name: 'manage.library.tracks'}"><translate translate-context="*/*/*">Tracks</translate></router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.library.libraries'}"><translate translate-context="*/*/*">Libraries</translate></router-link> :to="{name: 'manage.library.libraries'}"><translate translate-context="*/*/*/Noun">Libraries</translate></router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.library.uploads'}"><translate translate-context="*/*/*">Uploads</translate></router-link> :to="{name: 'manage.library.uploads'}"><translate translate-context="*/*/*">Uploads</translate></router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'manage.library.tags'}"><translate translate-context="*/*/*">Tags</translate></router-link> :to="{name: 'manage.library.tags'}"><translate translate-context="*/*/*/Noun">Tags</translate></router-link>
</nav> </nav>
<router-view :key="$route.fullPath"></router-view> <router-view :key="$route.fullPath"></router-view>
</div> </div>

View File

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

View File

@ -226,7 +226,7 @@
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.artists', query: {q: getQuery('library_id', object.id) }}"> <router-link :to="{name: 'manage.library.artists', query: {q: getQuery('library_id', object.id) }}">
<translate translate-context="*/*/*">Artists</translate> <translate translate-context="*/*/*/Noun">Artists</translate>
</router-link> </router-link>
</td> </td>
<td> <td>
@ -256,7 +256,7 @@
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('library_id', object.id) }}"> <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('library_id', object.id) }}">
<translate translate-context="Content/Moderation/Table.Label/Noun">Uploads</translate> <translate translate-context="*/*/*">Uploads</translate>
</router-link> </router-link>
</td> </td>
<td> <td>

View File

@ -121,7 +121,7 @@
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.artists', query: {q: getQuery('tag', object.name) }}"> <router-link :to="{name: 'manage.library.artists', query: {q: getQuery('tag', object.name) }}">
<translate translate-context="*/*/*">Artists</translate> <translate translate-context="*/*/*/Noun">Artists</translate>
</router-link> </router-link>
</td> </td>
<td> <td>

View File

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

View File

@ -111,7 +111,7 @@
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.albums.detail', params: {id: object.album.id }}"> <router-link :to="{name: 'manage.library.albums.detail', params: {id: object.album.id }}">
<translate translate-context="*/*/*/Noun">Album</translate> <translate translate-context="*/*/*">Album</translate>
</router-link> </router-link>
</td> </td>
<td> <td>
@ -141,7 +141,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="*/*/*/Noun">Position</translate> <translate translate-context="*/*/*/Short, Noun">Position</translate>
</td> </td>
<td> <td>
{{ object.position }} {{ object.position }}
@ -157,7 +157,7 @@
</tr> </tr>
<tr v-if="object.copyright"> <tr v-if="object.copyright">
<td> <td>
<translate translate-context="Content/Track/Table.Label/Noun">Copyright</translate> <translate translate-context="Content/Track/*/Noun">Copyright</translate>
</td> </td>
<td>{{ object.copyright }}</td> <td>{{ object.copyright }}</td>
</tr> </tr>
@ -308,7 +308,7 @@
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('track_id', object.id) }}"> <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('track_id', object.id) }}">
<translate translate-context="Content/Moderation/Table.Label/Noun">Uploads</translate> <translate translate-context="*/*/*">Uploads</translate>
</router-link> </router-link>
</td> </td>
<td> <td>

View File

@ -142,7 +142,7 @@
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.libraries.detail', params: {id: object.library.uuid }}"> <router-link :to="{name: 'manage.library.libraries.detail', params: {id: object.library.uuid }}">
<translate translate-context="*/*/*">Library</translate> <translate translate-context="*/*/*/Noun">Library</translate>
</router-link> </router-link>
</td> </td>
<td> <td>
@ -197,7 +197,7 @@
<tr v-if="object.track"> <tr v-if="object.track">
<td> <td>
<router-link :to="{name: 'manage.library.tracks.detail', params: {id: object.track.id }}"> <router-link :to="{name: 'manage.library.tracks.detail', params: {id: object.track.id }}">
<translate translate-context="*/*/*">Track</translate> <translate translate-context="*/*/*/Noun">Track</translate>
</router-link> </router-link>
</td> </td>
<td> <td>

View File

@ -154,17 +154,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="*/*/*">Enabled</translate> <translate v-if="object.user.is_active" key="1" translate-context="*/*/*/State of feature">Enabled</translate>
<translate v-else key="2" translate-context="*/*/*">Disabled</translate> <translate v-else key="2" translate-context="*/*/*/State of feature">Disabled</translate>
</label> </label>
</div> </div>
<translate v-else-if="object.user.is_active" key="1" translate-context="*/*/*">Enabled</translate> <translate v-else-if="object.user.is_active" key="1" translate-context="*/*/*/State of feature">Enabled</translate>
<translate v-else key="2" translate-context="*/*/*">Disabled</translate> <translate v-else key="2" translate-context="*/*/*/State of feature">Disabled</translate>
</td> </td>
</tr> </tr>
<tr v-if="object.user"> <tr v-if="object.user">
<td> <td>
<translate translate-context="Content/Admin/Table.Label/Noun">Permissions</translate> <translate translate-context="Content/*/*/Noun">Permissions</translate>
</td> </td>
<td> <td>
<select <select
@ -179,7 +179,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="Content/Moderation/Table.Label/Noun">Type</translate> <translate translate-context="Content/Track/Table.Label/Noun">Type</translate>
</td> </td>
<td> <td>
{{ object.type }} {{ object.type }}
@ -307,7 +307,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="*/*/*" >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>
@ -347,7 +347,7 @@
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('account', object.full_username) }}"> <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('account', object.full_username) }}">
<translate translate-context="Content/Moderation/Table.Label/Noun">Uploads</translate> <translate translate-context="*/*/*">Uploads</translate>
</router-link> </router-link>
</td> </td>
<td> <td>
@ -372,7 +372,7 @@
</tr> </tr>
<tr> <tr>
<td> <td>
<translate translate-context="*/*/*/Noun">Tracks</translate> <translate translate-context="*/*/*">Tracks</translate>
</td> </td>
<td> <td>
{{ stats.tracks }} {{ stats.tracks }}
@ -515,7 +515,7 @@ export default {
return [ return [
{ {
code: "library", code: "library",
label: this.$pgettext('*/*/*', "Library") label: this.$pgettext('*/*/*/Noun', "Library")
}, },
{ {
code: "moderation", code: "moderation",

View File

@ -37,14 +37,14 @@
@click.prevent="setAllowList(false)" @click.prevent="setAllowList(false)"
:class="['ui', 'labeled', {loading: isLoadingAllowList}, 'icon', 'button']"> :class="['ui', 'labeled', {loading: isLoadingAllowList}, 'icon', 'button']">
<i class="x icon"></i> <i class="x icon"></i>
<translate translate-context="Content/Moderation/Link/Verb">Remove from allow-list</translate> <translate translate-context="Content/Moderation/Action/Verb">Remove from allow-list</translate>
</button> </button>
<button <button
v-else v-else
@click.prevent="setAllowList(true)" @click.prevent="setAllowList(true)"
:class="['ui', 'labeled', {loading: isLoadingAllowList}, 'icon', 'button']"> :class="['ui', 'labeled', {loading: isLoadingAllowList}, 'icon', 'button']">
<i class="check icon"></i> <i class="check icon"></i>
<translate translate-context="Content/Moderation/Link/Verb">Add to allow-list</translate> <translate translate-context="Content/Moderation/Action/Verb">Add to allow-list</translate>
</button> </button>
</div> </div>
</div> </div>
@ -150,7 +150,7 @@
<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 (Value is Error message)">Status</translate> <translate translate-context="*/*/*">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;
@ -279,7 +279,7 @@
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('domain', object.name) }}"> <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('domain', object.name) }}">
<translate translate-context="Content/Moderation/Table.Label/Noun">Uploads</translate> <translate translate-context="*/*/*">Uploads</translate>
</router-link> </router-link>
</td> </td>
<td> <td>
@ -309,7 +309,7 @@
<tr> <tr>
<td> <td>
<router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('domain', object.name) }}"> <router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('domain', object.name) }}">
<translate translate-context="*/*/*/Noun">Tracks</translate> <translate translate-context="*/*/*">Tracks</translate>
</router-link> </router-link>
</td> </td>
<td> <td>

View File

@ -16,7 +16,7 @@
</div> </div>
<div class="field" v-if="allowListEnabled"> <div class="field" v-if="allowListEnabled">
<input type="checkbox" name="allowed" id="allowed" v-model="domainAllowed"> <input type="checkbox" name="allowed" id="allowed" v-model="domainAllowed">
<label for="allowed"><translate translate-context="Content/Moderation/Form.Label/Verb">Add to allow-list</translate></label> <label for="allowed"><translate translate-context="Content/Moderation/Action/Verb">Add to allow-list</translate></label>
</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">

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="*/Moderation/Title,Name">Reports</translate></h2> <h2 class="ui header"><translate translate-context="*/Moderation/*/Noun">Reports</translate></h2>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<div class="ui inline form"> <div class="ui inline form">
<div class="fields"> <div class="fields">
@ -12,7 +12,7 @@
</form> </form>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Search/Dropdown.Label (Value is All/Resolved/Unresolved)">Status</translate></label> <label><translate translate-context="*/*/*">Status</translate></label>
<select class="ui dropdown" @change="addSearchToken('resolved', $event.target.value)" :value="getTokenValue('resolved', '')"> <select class="ui dropdown" @change="addSearchToken('resolved', $event.target.value)" :value="getTokenValue('resolved', '')">
<option value=""> <option value="">
<translate translate-context="Content/*/Dropdown">All</translate> <translate translate-context="Content/*/Dropdown">All</translate>
@ -205,7 +205,7 @@ export default {
labels () { labels () {
return { return {
searchPlaceholder: this.$pgettext('Content/Search/Input.Placeholder', 'Search by account, summary, domain…'), searchPlaceholder: this.$pgettext('Content/Search/Input.Placeholder', 'Search by account, summary, domain…'),
reports: this.$pgettext('*/Moderation/Title,Name', "Reports"), reports: this.$pgettext('*/Moderation/*/Noun', "Reports"),
} }
}, },
}, },

View File

@ -6,7 +6,7 @@
:to="{name: 'content.libraries.index'}"><translate translate-context="*/*/*/Noun">Libraries</translate></router-link> :to="{name: 'content.libraries.index'}"><translate translate-context="*/*/*/Noun">Libraries</translate></router-link>
<router-link <router-link
class="ui item" class="ui item"
:to="{name: 'content.libraries.files'}"><translate translate-context="*/*/*/Noun">Tracks</translate></router-link> :to="{name: 'content.libraries.files'}"><translate translate-context="*/*/*">Tracks</translate></router-link>
</nav> </nav>
<router-view :key="$route.fullPath"></router-view> <router-view :key="$route.fullPath"></router-view>
</main> </main>

View File

@ -6,7 +6,7 @@
<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/Federation/*/Noun">Followers</translate></a> <a :class="['item', {active: currentTab === 'follows'}]" @click="currentTab = 'follows'"><translate translate-context="Content/Federation/*/Noun">Followers</translate></a>
<a :class="['item', {active: currentTab === 'tracks'}]" @click="currentTab = 'tracks'"><translate translate-context="*/*/*/Noun">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="Content/*/Button.Label/Verb">Edit</translate></a> <a :class="['item', {active: currentTab === 'edit'}]" @click="currentTab = 'edit'"><translate translate-context="Content/*/Button.Label/Verb">Edit</translate></a>
</div> </div>
<div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'follows'}]"> <div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'follows'}]">
@ -26,7 +26,7 @@
<tr> <tr>
<th><translate translate-context="Content/Library/Table.Label">User</translate></th> <th><translate translate-context="Content/Library/Table.Label">User</translate></th>
<th><translate translate-context="Content/Library/Table.Label">Date</translate></th> <th><translate translate-context="Content/Library/Table.Label">Date</translate></th>
<th><translate translate-context="Content/Library.Federation/Table.Label (Value is Approved/Rejected)">Status</translate></th> <th><translate translate-context="*/*/*">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>

View File

@ -9,7 +9,7 @@
</form> </form>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Library/*/Noun">Import status</translate></label> <label><translate translate-context="Content/*/*/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/*/Dropdown">All</translate></option> <option value=""><translate translate-context="Content/*/Dropdown">All</translate></option>
<option value="pending"><translate translate-context="Content/Library/*/Short">Pending</translate></option> <option value="pending"><translate translate-context="Content/Library/*/Short">Pending</translate></option>
@ -53,13 +53,13 @@
@refresh="fetchData" @refresh="fetchData"
:filters="actionFilters"> :filters="actionFilters">
<template slot="header-cells"> <template slot="header-cells">
<th><translate translate-context="Content/Track/*/Noun">Title</translate></th> <th><translate translate-context="*/*/*/Noun">Title</translate></th>
<th><translate translate-context="*/*/*/Noun">Artist</translate></th> <th><translate translate-context="*/*/*/Noun">Artist</translate></th>
<th><translate translate-context="*/*/*">Album</translate></th> <th><translate translate-context="*/*/*">Album</translate></th>
<th><translate translate-context="*/*/*/Noun">Upload date</translate></th> <th><translate translate-context="*/*/*/Noun">Upload date</translate></th>
<th><translate translate-context="Content/Library/*/Noun">Import status</translate></th> <th><translate translate-context="Content/*/*/Noun">Import status</translate></th>
<th><translate translate-context="Content/*/*">Duration</translate></th> <th><translate translate-context="Content/*/*">Duration</translate></th>
<th><translate translate-context="Content/Library/*/in MB">Size</translate></th> <th><translate translate-context="Content/*/*/Noun">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">

View File

@ -12,11 +12,11 @@
<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/*/Input.Label/Noun">Description</translate></label> <label><translate translate-context="*/*/*/Noun">Description</translate></label>
<textarea v-model="currentDescription" :placeholder="labels.descriptionPlaceholder" maxlength="2000"></textarea> <textarea v-model="currentDescription" :placeholder="labels.descriptionPlaceholder" maxlength="2000"></textarea>
</div> </div>
<div class="field"> <div class="field">
<label><translate translate-context="Content/Library/Dropdown.Label">Visibility</translate></label> <label><translate translate-context="*/*/*">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']">{{ sharedLabels.fields.privacy_level.choices[c] }}</option> <option :value="c" v-for="c in ['me', 'instance', 'everyone']">{{ sharedLabels.fields.privacy_level.choices[c] }}</option>

View File

@ -74,7 +74,7 @@
:playlist="playlist" :playlist-tracks="playlistTracks"></playlist-editor> :playlist="playlist" :playlist-tracks="playlistTracks"></playlist-editor>
</template> </template>
<template v-else> <template v-else>
<h2><translate translate-context="*/*/*/Noun">Tracks</translate></h2> <h2><translate translate-context="*/*/*">Tracks</translate></h2>
<track-table :display-position="true" :tracks="tracks"></track-table> <track-table :display-position="true" :tracks="tracks"></track-table>
</template> </template>
</section> </section>
@ -118,7 +118,7 @@ export default {
computed: { computed: {
labels() { labels() {
return { return {
playlist: this.$pgettext('Head/Playlist/Title', 'Playlist') playlist: this.$pgettext('*/*/*', 'Playlist')
} }
} }
}, },

View File

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