diff --git a/changes/changelog.d/662.enhancement b/changes/changelog.d/662.enhancement new file mode 100644 index 0000000000000000000000000000000000000000..cda19e4ed3449e1e8a547e7d17b861d7e8fc6ea4 --- /dev/null +++ b/changes/changelog.d/662.enhancement @@ -0,0 +1 @@ +Added standardized translation context for all strings in the frontend to give accurate hints to translators. diff --git a/front/src/components/About.vue b/front/src/components/About.vue index cfffb7b6a2de69beec727d6a230ec4df00941d64..f29f960f8d501bfd13b18d36fa77bfe6dd65aef3 100644 --- a/front/src/components/About.vue +++ b/front/src/components/About.vue @@ -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") } } } diff --git a/front/src/components/Footer.vue b/front/src/components/Footer.vue index e45a9b47b4d609810aedb16cfad4b63d65b4aa79..00ec4f79c01229fda99fc75b61149bdb47f44fa8 100644 --- a/front/src/components/Footer.vue +++ b/front/src/components/Footer.vue @@ -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> diff --git a/front/src/components/Home.vue b/front/src/components/Home.vue index bdca00005221abce7058d08dd9141d3cd3175867..747121fd39aadbb19f6c689566e81a351aece888 100644 --- a/front/src/components/Home.vue +++ b/front/src/components/Home.vue @@ -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") } } } diff --git a/front/src/components/PageNotFound.vue b/front/src/components/PageNotFound.vue index ef4e66f456cb03e63ad4dfcf441a22bcc1536735..5b91d2a47bb592e9b331e7839d82ebd8699c9705 100644 --- a/front/src/components/PageNotFound.vue +++ b/front/src/components/PageNotFound.vue @@ -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") } } } diff --git a/front/src/components/Pagination.vue b/front/src/components/Pagination.vue index 963b000a81b490d468a439be130893b66b5a7084..4820822380b0b44b084d7569f476782ec77bc324 100644 --- a/front/src/components/Pagination.vue +++ b/front/src/components/Pagination.vue @@ -36,7 +36,7 @@ export default { computed: { labels() { return { - pagination: this.$gettext("Pagination") + pagination: this.$pgettext('Content/*/Hidden text/Noun', "Pagination") } }, pages: function() { diff --git a/front/src/components/ShortcutsModal.vue b/front/src/components/ShortcutsModal.vue index 2338658dd7b80a9d67c0e424f22b7b7f827270b1..9bae0a9ca8f7823b66f4a6194b3b6883b1786716 100644 --- a/front/src/components/ShortcutsModal.vue +++ b/front/src/components/ShortcutsModal.vue @@ -1,7 +1,7 @@ <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') }, ] } diff --git a/front/src/components/Sidebar.vue b/front/src/components/Sidebar.vue index 77b9c02f5eb3e74db492acdebd648b7a35f48e91..31b35ebdcb5b2bd5b8a061f44139ba9fb848792d 100644 --- a/front/src/components/Sidebar.vue +++ b/front/src/components/Sidebar.vue @@ -16,13 +16,13 @@ <div class="menu-area"> <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>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"> - <translate>Queue</translate> + <translate :translate-context="'Sidebar/Queue/Tab.Title/Noun'">Queue</translate> <template v-if="queue.tracks.length === 0"> - <translate>(empty)</translate> + <translate :translate-context="'Sidebar/Queue/Tab.Title'">(empty)</translate> </template> - <translate 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 }) </translate> </a> @@ -32,76 +32,76 @@ <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"> <div class="item"> - <header class="header"><translate>My account</translate></header> + <header class="header"><translate :translate-context="'Sidebar/Profile/Title'">My account</translate></header> <div class="menu"> <router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'profile', params: {username: $store.state.auth.username}}"> <i class="user icon"></i> - <translate :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 } </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)" /> </router-link> - <router-link class="item" v-if="$store.state.auth.authenticated" :to="{path: '/settings'}"><i class="setting icon"></i><translate>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'}"> <i class="feed icon"></i> - <translate>Notifications</translate> + <translate :translate-context="'Sidebar/Notifications/List item.Link/Noun'">Notifications</translate> <div v-if="$store.state.ui.notifications.inbox > 0" :class="['ui', 'teal', 'label']"> {{ $store.state.ui.notifications.inbox }}</div> </router-link> - <router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'logout'}"><i class="sign out icon"></i><translate>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> - <router-link class="item" :to="{name: 'login'}"><i class="sign in icon"></i><translate>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'}"> <i class="corner add icon"></i> - <translate>Create an account</translate> + <translate :translate-context="'Sidebar/Login/List item.Link/Verb'">Create an account</translate> </router-link> </template> </div> </div> <div class="item"> - <header class="header"><translate>Music</translate></header> + <header class="header"><translate :translate-context="'Sidebar/Library/Title'">Music</translate></header> <div class="menu"> - <router-link class="item" :to="{path: '/library'}"><i class="sound icon"></i><translate>Browse library</translate></router-link> - <router-link class="item" v-if="$store.state.auth.authenticated" :to="{path: '/favorites'}"><i class="heart icon"></i><translate>Favorites</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> <a @click="$store.commit('playlists/chooseTrack', null)" v-if="$store.state.auth.authenticated" class="item"> - <i class="list icon"></i><translate>Playlists</translate> + <i class="list icon"></i><translate :translate-context="'Sidebar/Playlist/List item.Link/Noun'">Playlists</translate> </a> <router-link v-if="$store.state.auth.authenticated" - class="item" :to="{name: 'content.index'}"><i class="upload icon"></i><translate>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 class="item" v-if="$store.state.auth.availablePermissions['settings'] || $store.state.auth.availablePermissions['moderation']"> - <header class="header"><translate>Administration</translate></header> + <header class="header"><translate :translate-context="'Sidebar/Admin/Title/Noun'">Administration</translate></header> <div class="menu"> <router-link v-if="$store.state.auth.availablePermissions['settings']" class="item" :to="{path: '/manage/settings'}"> - <i class="settings icon"></i><translate>Settings</translate> + <i class="settings icon"></i><translate :translate-context="'Sidebar/Admin/List item.Link/Noun'">Settings</translate> </router-link> <router-link v-if="$store.state.auth.availablePermissions['settings']" class="item" :to="{name: 'manage.users.users.list'}"> - <i class="users icon"></i><translate>Users</translate> + <i class="users icon"></i><translate :translate-context="'Sidebar/Admin/List item.Link/Noun'">Users</translate> </router-link> <router-link v-if="$store.state.auth.availablePermissions['moderation']" class="item" :to="{name: 'manage.moderation.domains.list'}"> - <i class="shield icon"></i><translate>Moderation</translate> + <i class="shield icon"></i><translate :translate-context="'Sidebar/Moderation/List item.Link/Noun'">Moderation</translate> </router-link> <router-link v-if="$store.state.auth.availablePermissions['library']" class="item" :to="{name: 'manage.library.edits', query: {q: 'is_approved:null'}}"> - <i class="book icon"></i><translate>Library</translate> + <i class="book icon"></i><translate :translate-context="'Sidebar/Moderation/List item.Link/Noun'">Library</translate> <div v-if="$store.state.ui.notifications.pendingReviewEdits > 0" :title="labels.pendingReviewEdits" @@ -116,10 +116,10 @@ <i class="history icon"></i> <div class="content"> <div class="header"> - <translate>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> <p> - <translate + <translate :translate-context="'Sidebar/Queue/Message'" translate-plural="%{ count } tracks" :translate-n="queue.previousQueue.tracks.length" :translate-params="{count: queue.previousQueue.tracks.length}"> @@ -127,8 +127,8 @@ </translate> </p> <div class="ui two buttons"> - <div @click="queue.restore()" class="ui basic inverted green button"><translate>Yes</translate></div> - <div @click="queue.removePrevious()" class="ui basic inverted red button"><translate>No</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> </div> </div> @@ -167,10 +167,10 @@ <div v-if="$store.state.radios.running" class="ui black message"> <div class="content"> <div class="header"> - <i class="feed icon"></i> <translate>You have a radio playing</translate> + <i class="feed icon"></i> <translate :translate-context="'Sidebar/Player/Title'">You have a radio playing</translate> </div> - <p><translate>New tracks will be appended here automatically.</translate></p> - <div @click="$store.dispatch('radios/stop')" class="ui basic inverted red button"><translate>Stop radio</translate></div> + <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> </div> </section> @@ -218,10 +218,10 @@ export default { url: state => state.route.path }), labels() { - let mainMenu = this.$gettext("Main menu") - let selectTrack = this.$gettext("Play this track") - let pendingFollows = this.$gettext("Pending follow requests") - let pendingReviewEdits = this.$gettext("Pending review edits") + let mainMenu = this.$pgettext('Sidebar/*/Hidden text', "Main menu") + let selectTrack = this.$pgettext('Sidebar/Player/Hidden text', "Play this track") + let pendingFollows = this.$pgettext('Sidebar/Notifications/Hidden text', "Pending follow requests") + let pendingReviewEdits = this.$pgettext('Sidebar/Moderation/Hidden text', "Pending review edits") return { pendingFollows, mainMenu, diff --git a/front/src/components/admin/SettingsGroup.vue b/front/src/components/admin/SettingsGroup.vue index 85bb9eeaee5243a60d4841c264ea8947f9918fce..cb1ddad27cb6375f6da9711ffdaa2d16b3affbc8 100644 --- a/front/src/components/admin/SettingsGroup.vue +++ b/front/src/components/admin/SettingsGroup.vue @@ -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> diff --git a/front/src/components/federation/LibraryWidget.vue b/front/src/components/federation/LibraryWidget.vue index b9554d01ff36b235456dcf467647683ae769992b..7ec3117606cc7e5c1c2fbf23de6d6da5c929f084 100644 --- a/front/src/components/federation/LibraryWidget.vue +++ b/front/src/components/federation/LibraryWidget.vue @@ -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']"> diff --git a/front/src/components/forms/PasswordInput.vue b/front/src/components/forms/PasswordInput.vue index 26454048e41ff328bf26e9288af6091fe9c8e050..d57e3017f3010000e6e45932e25e2092982ef246 100644 --- a/front/src/components/forms/PasswordInput.vue +++ b/front/src/components/forms/PasswordInput.vue @@ -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 () { diff --git a/front/src/components/instance/Stats.vue b/front/src/components/instance/Stats.vue index 78632f6d23fa38702d1edefd78527bfd2d762f22..831bdbdcc31ee380e5a3a23a7c0e1be1cef3a8e1 100644 --- a/front/src/components/instance/Stats.vue +++ b/front/src/components/instance/Stats.vue @@ -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> diff --git a/front/src/components/notifications/NotificationRow.vue b/front/src/components/notifications/NotificationRow.vue index e98be41ec5fc55fbba672968eab87e4fb2fd9674..7843ae145088c2460ebdfd6a04ab2064ca9e28d7 100644 --- a/front/src/components/notifications/NotificationRow.vue +++ b/front/src/components/notifications/NotificationRow.vue @@ -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 { diff --git a/front/src/components/radios/Button.vue b/front/src/components/radios/Button.vue index 716cc66e19556d990e488a2d438c88fb5cd5fea6..6b26397d17a730ff56e528c6fc301d43f6e7a005 100644 --- a/front/src/components/radios/Button.vue +++ b/front/src/components/radios/Button.vue @@ -1,8 +1,8 @@ <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> diff --git a/front/src/components/radios/Card.vue b/front/src/components/radios/Card.vue index 9f085484180995a90bfd7bc92a94ef739e3dc523..d83eb700604cd24e111a053e9f428bcb5f85b265 100644 --- a/front/src/components/radios/Card.vue +++ b/front/src/components/radios/Card.vue @@ -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>