Commit 3b9fd20d authored by jovuit's avatar jovuit Committed by Eliot Berriot

Added translation context

Minor rewording
Added changelog fragment
parent 009d3d5f
Added standardized translation context for all strings in the frontend to give accurate hints to translators.
......@@ -3,10 +3,10 @@
<section class="ui vertical center aligned stripe segment">
<div class="ui text container">
<h1 class="ui huge header">
<translate 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 }
</translate>
<translate v-else>About this instance</translate>
<translate :translate-context="'Content/About/Title/Short, Noun'" v-else>About this instance</translate>
</h1>
<stats></stats>
</div>
......@@ -15,12 +15,12 @@
<div
class="ui middle aligned stackable text container">
<p
v-if="!instance.short_description.value && !instance.long_description.value"><translate>Unfortunately, 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
class="ui button"
v-if="$store.state.auth.availablePermissions['settings']"
:to="{path: '/manage/settings', hash: 'instance'}">
<i class="pencil icon"></i><translate>Edit instance info</translate>
<i class="pencil icon"></i><translate :translate-context="'Content/Settings/Button.Label/Verb'">Edit instance info</translate>
</router-link>
<div class="ui hidden divider"></div>
</div>
......@@ -64,7 +64,7 @@ export default {
}),
labels() {
return {
title: this.$gettext("About this instance")
title: this.$pgettext('Head/About/Title', "About this instance")
}
}
}
......
......@@ -4,22 +4,22 @@
<div class="ui stackable equal height stackable grid">
<section class="four wide column">
<h4 class="ui header">
<translate :translate-params="{instanceName: instanceHostname}" >About %{instanceName}</translate>
<translate :translate-context="'Footer/About/Title'" :translate-params="{instanceName: instanceHostname}" >About %{instanceName}</translate>
</h4>
<div class="ui link list">
<router-link class="item" to="/about">
<translate>About page</translate>
<translate :translate-context="'Footer/About/List item.Link'">About page</translate>
</router-link>
<div class="item" v-if="version">
<translate :translate-params="{version: version}" >Version %{version}</translate>
<translate :translate-context="'Footer/*/List item'" :translate-params="{version: version}" >Version %{version}</translate>
</div>
<div role="button" class="item" @click="$emit('show:set-instance-modal')" >
<translate>Use another instance</translate>
<translate :translate-context="'Footer/*/List item.Link'">Use another instance</translate>
</div>
</div>
<div class="ui form">
<div class="ui field">
<label><translate>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)">
<option v-for="(language, key) in $language.available" :key="key" :value="key">{{ language }}</option>
</select>
......@@ -29,29 +29,29 @@
<section class="four wide column">
<h4 v-translate class="ui header">Using Funkwhale</h4>
<div class="ui link list">
<a href="https://docs.funkwhale.audio" class="item" target="_blank"><translate>Documentation</translate></a>
<a href="https://docs.funkwhale.audio/users/apps.html" class="item" target="_blank"><translate>Mobile and desktop apps</translate></a>
<div role="button" class="item" @click="$emit('show:shortcuts-modal')"><translate>Keyboard shortcuts</translate></div>
<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>
<div role="button" class="item" @click="$emit('show:shortcuts-modal')"><translate :translate-context="'Footer/*/List item.Link/Short, Noun'">Keyboard shortcuts</translate></div>
</div>
</section>
<section class="four wide column">
<h4 v-translate class="ui header">Getting help</h4>
<div class="ui link list">
<a href="https://socialhub.network/c/funkwhale" class="item" target="_blank"><translate>Support forum</translate></a>
<a href="https://riot.im/app/#/room/#funkwhale-troubleshooting:matrix.org" class="item" target="_blank"><translate>Chat room</translate></a>
<a href="https://dev.funkwhale.audio/funkwhale/funkwhale/issues" class="item" target="_blank"><translate>Issue tracker</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://dev.funkwhale.audio/funkwhale/funkwhale/issues" class="item" target="_blank"><translate :translate-context="'Footer/*/List item.Link'">Issue tracker</translate></a>
</div>
</section>
<section class="four wide column">
<h4 v-translate class="ui header">About Funkwhale</h4>
<div class="ui link list">
<a href="https://funkwhale.audio" class="item" target="_blank"><translate>Official website</translate></a>
<a href="https://contribute.funkwhale.audio" class="item" target="_blank"><translate>Contribute</translate></a>
<a href="https://dev.funkwhale.audio/funkwhale/funkwhale" class="item" target="_blank"><translate>Source code</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://dev.funkwhale.audio/funkwhale/funkwhale" class="item" target="_blank"><translate :translate-context="'Footer/*/List item.Link'">Source code</translate></a>
</div>
<div class="ui hidden divider"></div>
<p>
<translate>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>
</section>
</div>
......
......@@ -3,15 +3,15 @@
<section class="ui vertical center aligned stripe segment">
<div class="ui text container">
<h1 class="ui huge header">
<translate>Welcome on Funkwhale</translate>
<translate :translate-context="'Content/Home/Title/Verb'">Welcome on Funkwhale</translate>
</h1>
<p><translate>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">
<i class="info icon"></i>
<translate>Learn more about this instance</translate>
<translate :translate-context="'Content/Home/Button.Label/Verb'">Learn more about this instance</translate>
</router-link>
<router-link class="ui icon teal button" to="/library">
<translate>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>
</router-link>
</div>
......@@ -22,9 +22,9 @@
<div class="row">
<div class="eight wide left floated column">
<h2 class="ui header">
<translate>Why funkwhale?</translate>
<translate :translate-context="'Content/Home/Title'">Why funkwhale?</translate>
</h2>
<p><translate>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 class="four wide left floated column">
<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 hidden divider"></div>
<h2 class="ui header">
<translate>Unlimited music</translate>
<translate :translate-context="'Content/Home/Title'">Unlimited music</translate>
</h2>
<p><translate>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="item">
<i class="sound icon"></i>
<div class="content">
<translate>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 class="item">
<i class="heart icon"></i>
<div class="content">
<translate>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 class="item">
<i class="list icon"></i>
<div class="content">
<translate>Playlists? We got them</translate>
<translate :translate-context="'Content/Home/List item'">Playlists? We got them</translate>
</div>
</div>
</div>
......@@ -62,14 +62,14 @@
<div class="ui middle aligned stackable text container">
<div class="ui hidden divider"></div>
<h2 class="ui header">
<translate>Clean library</translate>
<translate :translate-context="'Content/Home/Title'">A clean library</translate>
</h2>
<p><translate>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="item">
<i class="download icon"></i>
<div class="content">
<translate>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 class="item">
......@@ -83,7 +83,7 @@
<div class="item">
<i class="plus icon"></i>
<div class="content">
<translate>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>
......@@ -91,20 +91,20 @@
<div class="ui middle aligned stackable text container">
<div class="ui hidden divider"></div>
<h2 class="ui header">
<translate>Easy to use</translate>
<translate :translate-context="'Content/Home/Title'">Easy to use</translate>
</h2>
<p><translate>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="item">
<i class="book icon"></i>
<div class="content">
<translate>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 class="item">
<i class="wizard icon"></i>
<div class="content">
<translate>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>
......@@ -112,26 +112,26 @@
<div class="ui middle aligned stackable text container">
<div class="ui hidden divider"></div>
<h2 class="ui header">
<translate>Your music, your way</translate>
<translate :translate-context="'Content/Home/Title'">Your music, your way</translate>
</h2>
<p><translate>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="item">
<i class="smile icon"></i>
<div class="content">
<translate>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 class="item">
<i class="protect icon"></i>
<div class="content">
<translate>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 class="item">
<i class="users icon"></i>
<div class="content">
<translate>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>
......@@ -150,7 +150,7 @@ export default {
computed: {
labels() {
return {
title: this.$gettext("Welcome")
title: this.$pgettext('Head/Home/Title', "Welcome")
}
}
}
......
......@@ -5,14 +5,14 @@
<h1 class="ui huge header">
<i class="warning icon"></i>
<div class="content">
<translate>Page not found!</translate>
<translate :translate-context="'Content/*/Title'">Page not found!</translate>
</div>
</h1>
<p><translate>We're 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>
<div class="ui hidden divider"></div>
<router-link class="ui icon button" to="/">
<translate>Go to home page</translate>
<translate :translate-context="'Content/*/Button.Label/Verb'">Go to home page</translate>
<i class="right arrow icon"></i>
</router-link>
</div>
......@@ -30,7 +30,7 @@ export default {
computed: {
labels() {
return {
title: this.$gettext("Page Not Found")
title: this.$pgettext('Head/*/Title', "Page Not Found")
}
}
}
......
......@@ -36,7 +36,7 @@ export default {
computed: {
labels() {
return {
pagination: this.$gettext("Pagination")
pagination: this.$pgettext('Content/*/Hidden text/Noun', "Pagination")
}
},
pages: function() {
......
<template>
<modal @update:show="$emit('update:show', $event)" :show="show">
<header class="header">
<translate>Keyboard shortcuts</translate>
<translate :translate-context="'Popup/Keyboard shortcuts/Title'">Keyboard shortcuts</translate>
</header>
<section class="scrolling content">
<table
......@@ -18,7 +18,7 @@
</table>
</section>
<footer class="actions">
<div class="ui cancel button"><translate>Close</translate></div>
<div class="ui cancel button"><translate :translate-context="'Popup/Keyboard shortcuts/Button.Label/Verb'">Close</translate></div>
</footer>
</modal>
</template>
......@@ -35,11 +35,11 @@ export default {
sections () {
return [
{
title: this.$gettext('General shortcuts'),
title: this.$pgettext('Popup/Keyboard shortcuts/Title', 'General shortcuts'),
shortcuts: [
{
key: 'h',
summary: this.$gettext('Show available keyboard shortcuts')
summary: this.$pgettext('Popup/Keyboard shortcuts/Table.Label/Verb', 'Show available keyboard shortcuts')
}
]
},
......@@ -52,35 +52,35 @@ export default {
// s.prevent.exact="shuffle"
{
title: this.$gettext('Audio player shortcuts'),
title: this.$pgettext('Popup/Keyboard shortcuts/Title', 'Audio player shortcuts'),
shortcuts: [
{
key: 'space',
summary: this.$gettext('Pause/play the current track')
summary: this.$pgettext('Popup/Keyboard shortcuts/Table.Label/Verb', 'Pause/play the current track')
},
{
key: 'ctrl left',
summary: this.$gettext('Play previous track')
summary: this.$pgettext('Popup/Keyboard shortcuts/Table.Label/Verb', 'Play previous track')
},
{
key: 'ctrl right',
summary: this.$gettext('Play next track')
summary: this.$pgettext('Popup/Keyboard shortcuts/Table.Label/Verb', 'Play next track')
},
{
key: 'ctrl up',
summary: this.$gettext('Increase volume')
summary: this.$pgettext('Popup/Keyboard shortcuts/Table.Label/Verb', 'Increase volume')
},
{
key: 'ctrl down',
summary: this.$gettext('Decrease volume')
summary: this.$pgettext('Popup/Keyboard shortcuts/Table.Label/Verb', 'Decrease volume')
},
{
key: 'l',
summary: this.$gettext('Toggle queue looping')
summary: this.$pgettext('Popup/Keyboard shortcuts/Table.Label/Verb', 'Toggle queue looping')
},
{
key: 's',
summary: this.$gettext('Shuffle queue')
summary: this.$pgettext('Popup/Keyboard shortcuts/Table.Label/Verb', 'Shuffle queue')
},
]
}
......
This diff is collapsed.
......@@ -3,13 +3,13 @@
<div class="ui divider" />
<h3 class="ui header">{{ group.label }}</h3>
<div v-if="errors.length > 0" class="ui negative message">
<div class="header"><translate>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">
<li v-for="error in errors">{{ error }}</li>
</ul>
</div>
<div v-if="result" class="ui positive message">
<translate>Settings updated successfully.</translate>
<translate :translate-context="'Content/Settings/Paragraph'">Settings updated successfully.</translate>
</div>
<p v-if="group.help">{{ group.help }}</p>
<div v-for="setting in settings" class="ui field">
......@@ -65,7 +65,7 @@
<button
type="submit"
:class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']">
<translate>Save</translate>
<translate :translate-context="'Content/Settings/Button.Label/Short, Verb'">Save</translate>
</button>
</form>
</template>
......
......@@ -4,7 +4,7 @@
<slot name="title"></slot>
</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"><translate>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>
<i @click="fetchData(nextPage)" :disabled="!nextPage" :class="['ui', {disabled: !nextPage}, 'circular', 'angle right', 'icon']">
......
......@@ -23,7 +23,7 @@ export default {
computed: {
labels () {
return {
title: this.$gettext('Show/hide password')
title: this.$pgettext('Content/Settings/Button.Tooltip/Verb', 'Show/hide password')
}
},
passwordInputType () {
......
......@@ -3,7 +3,7 @@
<div v-if="stats" class="ui stackable two column grid">
<div class="column">
<h3 class="ui left aligned header">
<translate>User activity</translate>
<translate :translate-context="'Content/About/Title/Noun'">User activity</translate>
</h3>
<div v-if="stats" class="ui mini horizontal statistics">
<div class="statistic">
......@@ -11,48 +11,48 @@
<i class="green user icon"></i>
{{ stats.users }}
</div>
<div class="label"><translate>users</translate></div>
<div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">users</translate></div>
</div>
<div class="statistic">
<div class="value">
<i class="orange sound icon"></i> {{ stats.listenings }}
</div>
<div class="label"><translate>tracks listened</translate></div>
<div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">tracks listened</translate></div>
</div>
<div class="statistic">
<div class="value">
<i class="pink heart icon"></i> {{ stats.trackFavorites }}
</div>
<div class="label"><translate>Tracks favorited</translate></div>
<div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">Tracks favorited</translate></div>
</div>
</div>
</div>
<div class="column">
<h3 class="ui left aligned header"><translate>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="statistic">
<div class="value">
{{ parseInt(stats.musicDuration) }}
</div>
<div class="label"><translate>Hours of music</translate></div>
<div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">Hours of music</translate></div>
</div>
<div class="statistic">
<div class="value">
{{ stats.artists }}
</div>
<div class="label"><translate>Artists</translate></div>
<div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">Artists</translate></div>
</div>
<div class="statistic">
<div class="value">
{{ stats.albums }}
</div>
<div class="label"><translate>Albums</translate></div>
<div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">Albums</translate></div>
</div>
<div class="statistic">
<div class="value">
{{ stats.tracks }}
</div>
<div class="label"><translate>tracks</translate></div>
<div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">Tracks</translate></div>
</div>
</div>
</div>
......
......@@ -36,15 +36,15 @@ export default {
return 'plop'
},
labels () {
let libraryFollowMessage = this.$gettext('%{ username } followed your library "%{ library }"')
let libraryAcceptFollowMessage = this.$gettext('%{ username } accepted your follow on library "%{ library }"')
let libraryPendingFollowMessage = this.$gettext('%{ username } wants to follow your library "%{ library }"')
let libraryFollowMessage = this.$pgettext('Content/Notifications/Paragraph', '%{ username } followed your library "%{ library }"')
let libraryAcceptFollowMessage = this.$pgettext('Content/Notifications/Paragraph', '%{ username } accepted your follow on library "%{ library }"')
let libraryPendingFollowMessage = this.$pgettext('Content/Notifications/Paragraph', '%{ username } wants to follow your library "%{ library }"')
return {
libraryFollowMessage,
libraryAcceptFollowMessage,
libraryPendingFollowMessage,
markRead: this.$gettext('Mark as read'),
markUnread: this.$gettext('Mark as unread'),
markRead: this.$pgettext('Content/Notifications/Button.Tooltip/Verb', 'Mark as read'),
markUnread: this.$pgettext('Content/Notifications/Button.Tooltip/Verb', 'Mark as unread'),
}
},
......@@ -63,7 +63,7 @@ export default {
action = {
buttonClass: 'green',
icon: 'check',
label: this.$gettext('Approve'),
label: this.$pgettext('Content/Notifications/Button.Label/Short, Verb', 'Approve'),
handler: () => { self.approveLibraryFollow(a.related_object) }
}
} else {
......
<template>
<button @click="toggleRadio" :class="['ui', 'blue', {'inverted': running}, 'icon', 'labeled', 'button']">
<i class="ui feed icon"></i>
<template v-if="running"><translate>Stop radio</translate></template>
<template v-else><translate>Start 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>
</button>
</template>
......
......@@ -21,7 +21,7 @@
class="ui basic yellow button right floated"
v-if="$store.state.auth.authenticated && type === 'custom' && radio.user.id === $store.state.auth.profile.id"
:to="{name: 'library.radios.edit', params: {id: customRadioId }}">
<translate>Edit…</translate>
<translate :translate-context="'Content/Radio/Card.Button.Label/Short, Verb'">Edit…</translate>
</router-link>
</div>
</div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment