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>&nbsp;
+        <translate :translate-context="'Sidebar/Queue/Tab.Title/Noun'">Queue</translate>&nbsp;
          <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>