diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index 1d0fbf9407f8b691aff752f9101855b55b9503c5..c2614425a2bd873a219121093e11a1b320ccc318 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -363,17 +363,17 @@ Translations in HTML use the ``<translate>`` tag::
 
     <template>
       <div>
-        <h1><translate :translate-context="'Content/Profile/Header'">User profile</translate></h1>
+        <h1><translate translate-context="Content/Profile/Header">User profile</translate></h1>
         <p>
           <translate
-            :translate-context="'Content/Profile/Paragraph'"
+            translate-context="Content/Profile/Paragraph"
             :translate-params="{username: 'alice'}">
             You are logged in as %{ username }
           </translate>
         </p>
          <p>
           <translate
-            :translate-context="'Content/Profile/Paragraph'"
+            translate-context="Content/Profile/Paragraph"
             translate-plural="You have %{ count } new messages, that's a lot!"
             :translate-n="unreadMessagesCount"
             :translate-params="{count: unreadMessagesCount}">
diff --git a/front/src/components/About.vue b/front/src/components/About.vue
index f29f960f8d501bfd13b18d36fa77bfe6dd65aef3..90c19d75f42fa0a85391b0cd43fe0089ec984f5c 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 :translate-context="'Content/About/Title/Short, Noun'" v-if="instance.name.value" :translate-params="{instance: instance.name.value}">
+            <translate translate-context="Content/About/Title/Short, Noun" v-if="instance.name.value" :translate-params="{instance: instance.name.value}">
              About %{ instance }
             </translate>
-            <translate :translate-context="'Content/About/Title/Short, Noun'" v-else>About this instance</translate>
+            <translate translate-context="Content/About/Title/Short, Noun" v-else>About this instance</translate>
         </h1>
         <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 :translate-context="'Content/About/Paragraph'">Unfortunately, the owners of this instance did not yet take the time to complete this page.</translate></p>
+        v-if="!instance.short_description.value && !instance.long_description.value"><translate translate-context="Content/About/Paragraph">Unfortunately, the owners of this instance did not yet take the time to complete this page.</translate></p>
         <router-link
           class="ui button"
           v-if="$store.state.auth.availablePermissions['settings']"
           :to="{path: '/manage/settings', hash: 'instance'}">
-          <i class="pencil icon"></i><translate :translate-context="'Content/Settings/Button.Label/Verb'">Edit instance info</translate>
+          <i class="pencil icon"></i><translate translate-context="Content/Settings/Button.Label/Verb">Edit instance info</translate>
         </router-link>
         <div class="ui hidden divider"></div>
       </div>
diff --git a/front/src/components/Footer.vue b/front/src/components/Footer.vue
index 00ec4f79c01229fda99fc75b61149bdb47f44fa8..c776a9b85007012160c290641ad7b26c5d6f4e0c 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-context="'Footer/About/Title'" :translate-params="{instanceName: instanceHostname}" >About %{instanceName}</translate>
+            <translate translate-context="Footer/About/Title" :translate-params="{instanceName: instanceHostname}" >About %{instanceName}</translate>
           </h4>
           <div class="ui link list">
             <router-link class="item" to="/about">
-              <translate :translate-context="'Footer/About/List item.Link'">About page</translate>
+              <translate translate-context="Footer/About/List item.Link">About page</translate>
             </router-link>
             <div class="item" v-if="version">
-              <translate :translate-context="'Footer/*/List item'" :translate-params="{version: version}" >Version %{version}</translate>
+              <translate translate-context="Footer/*/List item" :translate-params="{version: version}" >Version %{version}</translate>
             </div>
             <div role="button" class="item" @click="$emit('show:set-instance-modal')" >
-              <translate :translate-context="'Footer/*/List item.Link'">Use another instance</translate>
+              <translate translate-context="Footer/*/List item.Link">Use another instance</translate>
             </div>
           </div>
           <div class="ui form">
             <div class="ui field">
-              <label><translate :translate-context="'Footer/Settings/Dropdown.Label/Short, Verb'">Change language</translate></label>
+              <label><translate translate-context="Footer/Settings/Dropdown.Label/Short, Verb">Change language</translate></label>
               <select class="ui dropdown" :value="$language.current" @change="$store.commit('ui/currentLanguage', $event.target.value)">
                 <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 :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>
+            <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 :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>
+            <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 :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>
+            <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 :translate-context="'Footer/*/List item.Link'">The funkwhale logo was kindly designed and provided by Francis Gading.</translate>
+            <translate translate-context="Footer/*/List item.Link">The funkwhale logo was kindly designed and provided by Francis Gading.</translate>
           </p>
         </section>
       </div>
diff --git a/front/src/components/Home.vue b/front/src/components/Home.vue
index 747121fd39aadbb19f6c689566e81a351aece888..69ea0b9d9c54125340593d2aa0319929299f902e 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 :translate-context="'Content/Home/Title/Verb'">Welcome on Funkwhale</translate>
+          <translate translate-context="Content/Home/Title/Verb">Welcome on Funkwhale</translate>
         </h1>
-        <p><translate :translate-context="'Content/Home/Title'">We think listening to music should be simple.</translate></p>
+        <p><translate translate-context="Content/Home/Title">We think listening to music should be simple.</translate></p>
         <router-link class="ui icon button" to="/about">
           <i class="info icon"></i>
-          <translate :translate-context="'Content/Home/Button.Label/Verb'">Learn more about this instance</translate>
+          <translate translate-context="Content/Home/Button.Label/Verb">Learn more about this instance</translate>
         </router-link>
         <router-link class="ui icon teal button" to="/library">
-          <translate :translate-context="'Content/Home/Button.Label/Verb'">Get me to the library</translate>
+          <translate translate-context="Content/Home/Button.Label/Verb">Get me to the library</translate>
           <i class="right arrow icon"></i>
         </router-link>
       </div>
@@ -22,9 +22,9 @@
           <div class="row">
             <div class="eight wide left floated column">
               <h2 class="ui header">
-                <translate :translate-context="'Content/Home/Title'">Why funkwhale?</translate>
+                <translate translate-context="Content/Home/Title">Why funkwhale?</translate>
               </h2>
-              <p><translate :translate-context="'Content/Home/Paragraph'">That's simple: we loved Grooveshark and we want to build something even better.</translate></p>
+              <p><translate translate-context="Content/Home/Paragraph">That's simple: we loved Grooveshark and we want to build something even better.</translate></p>
             </div>
             <div 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 :translate-context="'Content/Home/Title'">Unlimited music</translate>
+          <translate translate-context="Content/Home/Title">Unlimited music</translate>
         </h2>
-        <p><translate :translate-context="'Content/Home/Paragraph'">Funkwhale is designed to make it easy to listen to music you like, or to discover new artists.</translate></p>
+        <p><translate translate-context="Content/Home/Paragraph">Funkwhale is designed to make it easy to listen to music you like, or to discover new artists.</translate></p>
         <div class="ui list">
           <div class="item">
             <i class="sound icon"></i>
             <div class="content">
-              <translate :translate-context="'Content/Home/List item/Verb'">Click once, listen for hours using built-in radios</translate>
+              <translate translate-context="Content/Home/List item/Verb">Click once, listen for hours using built-in radios</translate>
             </div>
           </div>
           <div class="item">
             <i class="heart icon"></i>
             <div class="content">
-              <translate :translate-context="'Content/Home/List item/Verb'">Keep a track of your favorite songs</translate>
+              <translate translate-context="Content/Home/List item/Verb">Keep a track of your favorite songs</translate>
             </div>
           </div>
           <div class="item">
             <i class="list icon"></i>
             <div class="content">
-              <translate :translate-context="'Content/Home/List item'">Playlists? We got them</translate>
+              <translate translate-context="Content/Home/List item">Playlists? We got them</translate>
             </div>
           </div>
         </div>
@@ -62,14 +62,14 @@
       <div class="ui middle aligned stackable text container">
         <div class="ui hidden divider"></div>
         <h2 class="ui header">
-          <translate :translate-context="'Content/Home/Title'">A clean library</translate>
+          <translate translate-context="Content/Home/Title">A clean library</translate>
         </h2>
-        <p><translate :translate-context="'Content/Home/Paragraph'">Funkwhale takes care of handling your music</translate>.</p>
+        <p><translate translate-context="Content/Home/Paragraph">Funkwhale takes care of handling your music</translate>.</p>
         <div class="ui list">
           <div class="item">
             <i class="download icon"></i>
             <div class="content">
-              <translate :translate-context="'Content/Home/List item/Verb'">Import music from various platforms, such as YouTube or SoundCloud</translate>
+              <translate translate-context="Content/Home/List item/Verb">Import music from various platforms, such as YouTube or SoundCloud</translate>
             </div>
           </div>
           <div class="item">
@@ -83,7 +83,7 @@
           <div class="item">
             <i class="plus icon"></i>
             <div class="content">
-              <translate :translate-context="'Content/Home/List item'">Covers, lyrics, our goal is to have them all ;)</translate>
+              <translate translate-context="Content/Home/List item">Covers, lyrics, our goal is to have them all ;)</translate>
             </div>
           </div>
         </div>
@@ -91,20 +91,20 @@
       <div class="ui middle aligned stackable text container">
         <div class="ui hidden divider"></div>
         <h2 class="ui header">
-          <translate :translate-context="'Content/Home/Title'">Easy to use</translate>
+          <translate translate-context="Content/Home/Title">Easy to use</translate>
         </h2>
-        <p><translate :translate-context="'Content/Home/Paragraph'">Funkwhale is dead simple to use.</translate></p>
+        <p><translate translate-context="Content/Home/Paragraph">Funkwhale is dead simple to use.</translate></p>
         <div class="ui list">
           <div class="item">
             <i class="book icon"></i>
             <div class="content">
-              <translate :translate-context="'Content/Home/List item'">No add-ons, no plugins : you only need a web library</translate>
+              <translate translate-context="Content/Home/List item">No add-ons, no plugins : you only need a web library</translate>
             </div>
           </div>
           <div class="item">
             <i class="wizard icon"></i>
             <div class="content">
-              <translate :translate-context="'Content/Home/List item'">Access your music from a clean interface that focus on what really matters</translate>
+              <translate translate-context="Content/Home/List item">Access your music from a clean interface that focus on what really matters</translate>
             </div>
           </div>
         </div>
@@ -112,26 +112,26 @@
       <div class="ui middle aligned stackable text container">
         <div class="ui hidden divider"></div>
         <h2 class="ui header">
-          <translate :translate-context="'Content/Home/Title'">Your music, your way</translate>
+          <translate translate-context="Content/Home/Title">Your music, your way</translate>
         </h2>
-        <p><translate :translate-context="'Content/Home/Paragraph'">Funkwhale is free and gives you control on your music.</translate></p>
+        <p><translate translate-context="Content/Home/Paragraph">Funkwhale is free and gives you control on your music.</translate></p>
         <div class="ui list">
           <div class="item">
             <i class="smile icon"></i>
             <div class="content">
-              <translate :translate-context="'Content/Home/List item'">The plaform is free and open-source, you can install it and modify it without worries</translate>
+              <translate translate-context="Content/Home/List item">The plaform is free and open-source, you can install it and modify it without worries</translate>
             </div>
           </div>
           <div class="item">
             <i class="protect icon"></i>
             <div class="content">
-              <translate :translate-context="'Content/Home/List item'">We do not track you or bother you with ads</translate>
+              <translate translate-context="Content/Home/List item">We do not track you or bother you with ads</translate>
             </div>
           </div>
           <div class="item">
             <i class="users icon"></i>
             <div class="content">
-              <translate :translate-context="'Content/Home/List item'">You can invite friends and family to your instance so they can enjoy your music</translate>
+              <translate translate-context="Content/Home/List item">You can invite friends and family to your instance so they can enjoy your music</translate>
             </div>
           </div>
         </div>
diff --git a/front/src/components/PageNotFound.vue b/front/src/components/PageNotFound.vue
index bdee7db9ff1a7df6b0402096d857642c098a8fc9..4dce665bbefaf0cc0957f8200ae939a7e641c5fd 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 :translate-context="'Content/*/Title'">Page not found!</translate>
+            <translate translate-context="Content/*/Title">Page not found!</translate>
           </div>
         </h1>
-        <p><translate :translate-context="'Content/*/Paragraph'">Sorry, the page you asked for does not exist:</translate></p>
+        <p><translate translate-context="Content/*/Paragraph">Sorry, the page you asked for does not exist:</translate></p>
         <a :href="path">{{ path }}</a>
         <div class="ui hidden divider"></div>
         <router-link class="ui icon labeled right button" to="/">
-          <translate :translate-context="'Content/*/Button.Label/Verb'">Go to home page</translate>
+          <translate translate-context="Content/*/Button.Label/Verb">Go to home page</translate>
           <i class="right arrow icon"></i>
         </router-link>
       </div>
diff --git a/front/src/components/SetInstanceModal.vue b/front/src/components/SetInstanceModal.vue
index 220043d9a1f6dcd80b5bf5ba4988c932991cf9fe..1ba5270b3a9e4b80d5bae2b1d44bb9828f41c3e5 100644
--- a/front/src/components/SetInstanceModal.vue
+++ b/front/src/components/SetInstanceModal.vue
@@ -1,27 +1,27 @@
 <template>
   <modal @update:show="$emit('update:show', $event); isError = false" :show="show">
-    <div class="header"><translate :translate-context="'Popup/Instance/Title'">Choose your instance</translate></div>
+    <div class="header"><translate translate-context="Popup/Instance/Title">Choose your instance</translate></div>
     <div class="scrolling content">
       <div v-if="isError" class="ui negative message">
-        <div class="header"><translate :translate-context="'Popup/Instance/Error message.Title'">It is not possible to connect to the given URL</translate></div>
+        <div class="header"><translate translate-context="Popup/Instance/Error message.Title">It is not possible to connect to the given URL</translate></div>
         <ul class="list">
-          <li><translate :translate-context="'Popup/Instance/Error message.List item'">The server might be down</translate></li>
-          <li><translate :translate-context="'Popup/Instance/Error message.List item'">The given address is not a Funkwhale server</translate></li>
+          <li><translate translate-context="Popup/Instance/Error message.List item">The server might be down</translate></li>
+          <li><translate translate-context="Popup/Instance/Error message.List item">The given address is not a Funkwhale server</translate></li>
         </ul>
       </div>
       <form class="ui form" @submit.prevent="checkAndSwitch(instanceUrl)">
-        <p v-if="$store.state.instance.instanceUrl" class="description" :translate-context="'Popup/Login/Paragraph'" v-translate="{url: $store.state.instance.instanceUrl, hostname: instanceHostname }">
+        <p v-if="$store.state.instance.instanceUrl" class="description" translate-context="Popup/Login/Paragraph" v-translate="{url: $store.state.instance.instanceUrl, hostname: instanceHostname }">
             You are currently connected to <a href="%{ url }" target="_blank">%{ hostname }&nbsp;<i class="external icon"></i></a>. If you continue, you will be disconnected from your current instance and all your local data will be deleted.
         </p>
         <p v-else>
-          <translate :translate-context="'Popup/Instance/Paragraph'">To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices.</translate>
+          <translate translate-context="Popup/Instance/Paragraph">To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices.</translate>
         </p>
         <div class="field">
-          <label><translate :translate-context="'Popup/Instance/Input.Label/Noun'">Instance URL</translate></label>
+          <label><translate translate-context="Popup/Instance/Input.Label/Noun">Instance URL</translate></label>
           <div class="ui action input">
             <input type="text" v-model="instanceUrl" placeholder="https://funkwhale.server">
             <button type="submit" :class="['ui', 'icon', {loading: isLoading}, 'button']">
-              <translate :translate-context="'*/*/Button.Label/Verb'">Submit</translate>
+              <translate translate-context="*/*/Button.Label/Verb">Submit</translate>
             </button>
           </div>
         </div>
@@ -29,13 +29,13 @@
       <div class="ui hidden divider"></div>
       <form class="ui form" @submit.prevent="">
         <div class="field">
-          <label><translate :translate-context="'Popup/Instance/List.Label'">Suggested choices</translate></label>
+          <label><translate translate-context="Popup/Instance/List.Label">Suggested choices</translate></label>
           <button v-for="url in suggestedInstances" @click="checkAndSwitch(url)" class="ui basic button">{{ url }}</button>
         </div>
       </form>
     </div>
     <div class="actions">
-      <div class="ui cancel button"><translate :translate-context="'*/*/Button.Label/Verb'">Cancel</translate></div>
+      <div class="ui cancel button"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate></div>
     </div>
   </modal>
 </template>
diff --git a/front/src/components/ShortcutsModal.vue b/front/src/components/ShortcutsModal.vue
index e1c2a422c3a547d24f2509d90e27ff674f4011cb..362c5208a76fda8aa1639037ce95752f24985fd6 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 :translate-context="'Popup/Keyboard shortcuts/Title'">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 :translate-context="'Popup/Keyboard shortcuts/Button.Label/Verb'">Close</translate></div>
+      <div class="ui cancel button"><translate translate-context="Popup/Keyboard shortcuts/Button.Label/Verb">Close</translate></div>
     </footer>
   </modal>
 </template>
diff --git a/front/src/components/Sidebar.vue b/front/src/components/Sidebar.vue
index 31b35ebdcb5b2bd5b8a061f44139ba9fb848792d..0bbc271a4bf1ae2502e054fa6806f4cb811edacb 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 :translate-context="'Sidebar/Library/Tab.Title/Verb'">Browse</translate></a>
+      <a :class="[{active: selectedTab === 'library'}, 'item']" role="button" @click.prevent.stop="selectedTab = 'library'" data-tab="library"><translate translate-context="Sidebar/Library/Tab.Title/Verb">Browse</translate></a>
       <a :class="[{active: selectedTab === 'queue'}, 'item']" role="button" @click.prevent.stop="selectedTab = 'queue'" data-tab="queue">
-        <translate :translate-context="'Sidebar/Queue/Tab.Title/Noun'">Queue</translate>&nbsp;
+        <translate translate-context="Sidebar/Queue/Tab.Title/Noun">Queue</translate>&nbsp;
          <template v-if="queue.tracks.length === 0">
-           <translate :translate-context="'Sidebar/Queue/Tab.Title'">(empty)</translate>
+           <translate translate-context="Sidebar/Queue/Tab.Title">(empty)</translate>
          </template>
-         <translate :translate-context="'Sidebar/Queue/Tab.Title'" v-else :translate-params="{index: queue.currentIndex + 1, length: queue.tracks.length}">
+         <translate translate-context="Sidebar/Queue/Tab.Title" v-else :translate-params="{index: queue.currentIndex + 1, length: queue.tracks.length}">
           (%{ index } of %{ length })
          </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 :translate-context="'Sidebar/Profile/Title'">My account</translate></header>
+          <header class="header"><translate translate-context="Sidebar/Profile/Title">My account</translate></header>
           <div class="menu">
             <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-context="'Sidebar/Profile/List item.Link'" :translate-params="{username: $store.state.auth.username}">
+              <translate translate-context="Sidebar/Profile/List item.Link" :translate-params="{username: $store.state.auth.username}">
                 Logged in as %{ username }
               </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 :translate-context="'Sidebar/Settings/List item.Link/Noun'">Settings</translate></router-link>
+            <router-link class="item" v-if="$store.state.auth.authenticated" :to="{path: '/settings'}"><i class="setting icon"></i><translate translate-context="Sidebar/Settings/List item.Link/Noun">Settings</translate></router-link>
             <router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'notifications'}">
               <i class="feed icon"></i>
-              <translate :translate-context="'Sidebar/Notifications/List item.Link/Noun'">Notifications</translate>
+              <translate translate-context="Sidebar/Notifications/List item.Link/Noun">Notifications</translate>
               <div
                 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 :translate-context="'Sidebar/Login/List item.Link/Verb'">Logout</translate></router-link>
+            <router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'logout'}"><i class="sign out icon"></i><translate translate-context="Sidebar/Login/List item.Link/Verb">Logout</translate></router-link>
             <template v-else>
-              <router-link class="item" :to="{name: 'login'}"><i class="sign in icon"></i><translate :translate-context="'Sidebar/Login/List item.Link/Verb'">Login</translate></router-link>
+              <router-link class="item" :to="{name: 'login'}"><i class="sign in icon"></i><translate translate-context="Sidebar/Login/List item.Link/Verb">Login</translate></router-link>
               <router-link class="item" :to="{path: '/signup'}">
                 <i class="corner add icon"></i>
-                <translate :translate-context="'Sidebar/Login/List item.Link/Verb'">Create an account</translate>
+                <translate translate-context="Sidebar/Login/List item.Link/Verb">Create an account</translate>
               </router-link>
             </template>
           </div>
         </div>
         <div class="item">
-          <header class="header"><translate :translate-context="'Sidebar/Library/Title'">Music</translate></header>
+          <header class="header"><translate translate-context="Sidebar/Library/Title">Music</translate></header>
           <div class="menu">
-            <router-link class="item" :to="{path: '/library'}"><i class="sound icon"></i><translate :translate-context="'Sidebar/Library/List item.Link/Verb'">Browse library</translate></router-link>
-            <router-link class="item" v-if="$store.state.auth.authenticated" :to="{path: '/favorites'}"><i class="heart icon"></i><translate :translate-context="'Sidebar/Favorites/List item.Link/Noun'">Favorites</translate></router-link>
+            <router-link class="item" :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 :translate-context="'Sidebar/Playlist/List item.Link/Noun'">Playlists</translate>
+              <i class="list icon"></i><translate translate-context="Sidebar/Playlist/List item.Link/Noun">Playlists</translate>
             </a>
             <router-link
               v-if="$store.state.auth.authenticated"
-              class="item" :to="{name: 'content.index'}"><i class="upload icon"></i><translate :translate-context="'Sidebar/Library/List item.Link/Verb'">Add content</translate></router-link>
+              class="item" :to="{name: 'content.index'}"><i class="upload icon"></i><translate translate-context="Sidebar/Library/List item.Link/Verb">Add content</translate></router-link>
           </div>
         </div>
         <div class="item" v-if="$store.state.auth.availablePermissions['settings'] || $store.state.auth.availablePermissions['moderation']">
-          <header class="header"><translate :translate-context="'Sidebar/Admin/Title/Noun'">Administration</translate></header>
+          <header class="header"><translate translate-context="Sidebar/Admin/Title/Noun">Administration</translate></header>
           <div class="menu">
             <router-link
               v-if="$store.state.auth.availablePermissions['settings']"
               class="item"
               :to="{path: '/manage/settings'}">
-              <i class="settings icon"></i><translate :translate-context="'Sidebar/Admin/List item.Link/Noun'">Settings</translate>
+              <i class="settings icon"></i><translate translate-context="Sidebar/Admin/List item.Link/Noun">Settings</translate>
             </router-link>
             <router-link
               v-if="$store.state.auth.availablePermissions['settings']"
               class="item"
               :to="{name: 'manage.users.users.list'}">
-              <i class="users icon"></i><translate :translate-context="'Sidebar/Admin/List item.Link/Noun'">Users</translate>
+              <i class="users icon"></i><translate translate-context="Sidebar/Admin/List item.Link/Noun">Users</translate>
             </router-link>
             <router-link
               v-if="$store.state.auth.availablePermissions['moderation']"
               class="item"
               :to="{name: 'manage.moderation.domains.list'}">
-              <i class="shield icon"></i><translate :translate-context="'Sidebar/Moderation/List item.Link/Noun'">Moderation</translate>
+              <i class="shield icon"></i><translate translate-context="Sidebar/Moderation/List item.Link/Noun">Moderation</translate>
             </router-link>
             <router-link
               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 :translate-context="'Sidebar/Moderation/List item.Link/Noun'">Library</translate>
+              <i class="book icon"></i><translate translate-context="Sidebar/Moderation/List item.Link/Noun">Library</translate>
               <div
                 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 :translate-context="'Sidebar/Queue/Message'">Do you want to restore your previous queue?</translate>
+          <translate translate-context="Sidebar/Queue/Message">Do you want to restore your previous queue?</translate>
         </div>
         <p>
-          <translate :translate-context="'Sidebar/Queue/Message'"
+          <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 :translate-context="'*/*/*'">Yes</translate></div>
-          <div @click="queue.removePrevious()" class="ui basic inverted red button"><translate :translate-context="'*/*/*'">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 :translate-context="'Sidebar/Player/Title'">You have a radio playing</translate>
+            <i class="feed icon"></i> <translate translate-context="Sidebar/Player/Title">You have a radio playing</translate>
           </div>
-          <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>
+          <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>
diff --git a/front/src/components/admin/SettingsGroup.vue b/front/src/components/admin/SettingsGroup.vue
index cb1ddad27cb6375f6da9711ffdaa2d16b3affbc8..dacae8f9956011ed257422b55a95f4f172de11e4 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 :translate-context="'Content/Settings/Error message.Title'">Error while saving settings</translate></div>
+      <div class="header"><translate translate-context="Content/Settings/Error message.Title">Error while saving settings</translate></div>
       <ul class="list">
         <li v-for="error in errors">{{ error }}</li>
       </ul>
     </div>
     <div v-if="result" class="ui positive message">
-      <translate :translate-context="'Content/Settings/Paragraph'">Settings updated successfully.</translate>
+      <translate translate-context="Content/Settings/Paragraph">Settings updated successfully.</translate>
     </div>
     <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 :translate-context="'Content/Settings/Button.Label/Short, Verb'">Save</translate>
+        <translate translate-context="Content/Settings/Button.Label/Short, Verb">Save</translate>
     </button>
   </form>
 </template>
diff --git a/front/src/components/audio/EmbedWizard.vue b/front/src/components/audio/EmbedWizard.vue
index ebb65b369a8783f67ed0dc383216c5d7e76575a3..9c11fe7e543803e2c47d46ba8ea815682028942c 100644
--- a/front/src/components/audio/EmbedWizard.vue
+++ b/front/src/components/audio/EmbedWizard.vue
@@ -4,26 +4,26 @@
       <div class="two fields">
         <div class="field">
           <div class="field">
-            <label for="embed-width"><translate :translate-context="'Popup/Embed/Input.Label'">Widget width</translate></label>
-            <p><translate :translate-context="'Popup/Embed/Paragraph'">Leave empty for a responsive widget</translate></p>
+            <label for="embed-width"><translate translate-context="Popup/Embed/Input.Label">Widget width</translate></label>
+            <p><translate translate-context="Popup/Embed/Paragraph">Leave empty for a responsive widget</translate></p>
             <input id="embed-width" type="number" v-model.number="width" min="0" step="10" />
           </div>
           <template v-if="type != 'track'">
             <br>
             <div class="field">
-              <label for="embed-height"><translate :translate-context="'Popup/Embed/Input.Label'">Widget height</translate></label>
+              <label for="embed-height"><translate translate-context="Popup/Embed/Input.Label">Widget height</translate></label>
               <input id="embed-height" type="number" v-model="height" :min="minHeight" max="1000" step="10" />
             </div>
           </template>
         </div>
         <div class="field">
-          <button @click="copy" class="ui right teal labeled icon floated button"><i class="copy icon"></i><translate :translate-context="'Popup/*/Button.Label/Verb'">Copy</translate></button>
-          <label for="embed-width"><translate :translate-context="'Popup/Embed/Input.Label/Noun'">Embed code</translate></label>
-          <p><translate :translate-context="'Popup/Embed/Paragraph'">Copy/paste this code in your website HTML</translate></p>
+          <button @click="copy" class="ui right teal labeled icon floated button"><i class="copy icon"></i><translate translate-context="Popup/*/Button.Label/Verb">Copy</translate></button>
+          <label for="embed-width"><translate translate-context="Popup/Embed/Input.Label/Noun">Embed code</translate></label>
+          <p><translate translate-context="Popup/Embed/Paragraph">Copy/paste this code in your website HTML</translate></p>
           <textarea ref="textarea":value="embedCode" rows="5" readonly>
           </textarea>
           <div class="ui right">
-          <p class="message" v-if=copied><translate :translate-context="'Content/*/Paragraph'">Text copied to clipboard!</translate></p>
+          <p class="message" v-if=copied><translate translate-context="Content/*/Paragraph">Text copied to clipboard!</translate></p>
           </div>
         </div>
       </div>
@@ -31,7 +31,7 @@
     <div class="preview">
       <h3>
         <a :href="iframeSrc" target="_blank">
-          <translate :translate-context="'Popup/Embed/Title/Noun'">Preview</translate>
+          <translate translate-context="Popup/Embed/Title/Noun">Preview</translate>
         </a>
       </h3>
       <iframe :width="frameWidth" :height="height" scrolling="no" frameborder="no" :src="iframeSrc"></iframe>
diff --git a/front/src/components/audio/PlayButton.vue b/front/src/components/audio/PlayButton.vue
index 932b79608fb974540703efbdc5877e511d94eb39..45d47afbe8f4181a8d088041207724568bb29b0d 100644
--- a/front/src/components/audio/PlayButton.vue
+++ b/front/src/components/audio/PlayButton.vue
@@ -7,25 +7,25 @@
       :disabled="!playable"
       :class="buttonClasses.concat(['ui', {loading: isLoading}, {'mini': discrete}, {disabled: !playable}])">
       <i :class="[playIconClass, 'icon']"></i>
-      <template v-if="!discrete && !iconOnly"><slot><translate :translate-context="'*/Queue/Button/Label/Short, Verb'">Play</translate></slot></template>
+      <template v-if="!discrete && !iconOnly"><slot><translate translate-context="*/Queue/Button/Label/Short, Verb">Play</translate></slot></template>
     </button>
     <div v-if="!discrete && !iconOnly" :class="['ui', {disabled: !playable && !filterableArtist}, 'floating', 'dropdown', {'icon': !dropdownOnly}, {'button': !dropdownOnly}]">
       <i :class="dropdownIconClasses.concat(['icon'])" :title="title" ></i>
       <div class="menu">
         <button class="item basic" ref="add" data-ref="add" :disabled="!playable" @click.stop.prevent="add" :title="labels.addToQueue">
-          <i class="plus icon"></i><translate :translate-context="'*/Queue/Dropdown/Button/Label/Short'">Add to queue</translate>
+          <i class="plus icon"></i><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Add to queue</translate>
         </button>
         <button class="item basic" ref="addNext" data-ref="addNext" :disabled="!playable" @click.stop.prevent="addNext()" :title="labels.playNext">
-          <i class="step forward icon"></i><translate :translate-context="'*/Queue/Dropdown/Button/Label/Short'">Play next</translate>
+          <i class="step forward icon"></i><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Play next</translate>
         </button>
         <button class="item basic" ref="playNow" data-ref="playNow" :disabled="!playable" @click.stop.prevent="addNext(true)" :title="labels.playNow">
-          <i class="play icon"></i><translate :translate-context="'*/Queue/Dropdown/Button/Label/Short'">Play now</translate>
+          <i class="play icon"></i><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Play now</translate>
         </button>
         <button v-if="track" class="item basic" :disabled="!playable" @click.stop.prevent="$store.dispatch('radios/start', {type: 'similar', objectId: track.id})" :title="labels.startRadio">
-          <i class="feed icon"></i><translate :translate-context="'*/Queue/Dropdown/Button/Label/Short'">Start radio</translate>
+          <i class="feed icon"></i><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Start radio</translate>
         </button>
         <button v-if="filterableArtist" class="item basic" :disabled="!filterableArtist" @click.stop.prevent="filterArtist" :title="labels.hideArtist">
-          <i class="eye slash outline icon"></i><translate :translate-context="'*/Queue/Dropdown/Button/Label/Short'">Hide content from this artist</translate>
+          <i class="eye slash outline icon"></i><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Hide content from this artist</translate>
         </button>
       </div>
     </div>
diff --git a/front/src/components/audio/Player.vue b/front/src/components/audio/Player.vue
index 2b1bd29682835cd56b71328fc1f78c08ac75bb88..53a0cb86a7650e5c8285ea9fd41b98e8903301ea 100644
--- a/front/src/components/audio/Player.vue
+++ b/front/src/components/audio/Player.vue
@@ -70,14 +70,14 @@
       </div>
       <div class="ui small warning message" v-if="currentTrack && errored">
         <div class="header">
-          <translate :translate-context="'Sidebar/Player/Error message.Title'">The track cannot be loaded</translate>
+          <translate translate-context="Sidebar/Player/Error message.Title">The track cannot be loaded</translate>
         </div>
         <p v-if="hasNext && playing && $store.state.player.errorCount < $store.state.player.maxConsecutiveErrors">
-          <translate :translate-context="'Sidebar/Player/Error message.Paragraph'">The next track will play automatically in a few seconds…</translate>
+          <translate translate-context="Sidebar/Player/Error message.Paragraph">The next track will play automatically in a few seconds…</translate>
           <i class="loading spinner icon"></i>
         </p>
         <p>
-          <translate :translate-context="'Sidebar/Player/Error message.Paragraph'">You may have a connectivity issue.</translate>
+          <translate translate-context="Sidebar/Player/Error message.Paragraph">You may have a connectivity issue.</translate>
         </p>
       </div>
       <div class="two wide column controls ui grid">
diff --git a/front/src/components/audio/Search.vue b/front/src/components/audio/Search.vue
index cdf933a61242200c17368125f8bc09783fd28de8..74a96f45002495cb08556a36131d85675f8c63ae 100644
--- a/front/src/components/audio/Search.vue
+++ b/front/src/components/audio/Search.vue
@@ -1,6 +1,6 @@
 <template>
   <div>
-    <h2><translate :translate-context="'Content/Search/Title'">Search for some music</translate></h2>
+    <h2><translate translate-context="Content/Search/Title">Search for some music</translate></h2>
     <div :class="['ui', {'loading': isLoading }, 'search']">
       <div class="ui icon big input">
         <i class="search icon"></i>
@@ -8,22 +8,22 @@
       </div>
     </div>
     <template v-if="query.length > 0">
-      <h3 class="ui title"><translate :translate-context="'Content/Search/Title'">Artists</translate></h3>
+      <h3 class="ui title"><translate translate-context="Content/Search/Title">Artists</translate></h3>
       <div v-if="results.artists.length > 0">
         <div class="ui cards">
           <artist-card :key="artist.id" v-for="artist in results.artists" :artist="artist" ></artist-card>
         </div>
       </div>
-      <p v-else><translate :translate-context="'Content/Search/Paragraph'">No artist matched your query</translate></p>
+      <p v-else><translate translate-context="Content/Search/Paragraph">No artist matched your query</translate></p>
     </template>
     <template v-if="query.length > 0">
-      <h3 class="ui title"><translate :translate-context="'Content/Search/Title'">Albums</translate></h3>
+      <h3 class="ui title"><translate translate-context="Content/Search/Title">Albums</translate></h3>
       <div v-if="results.albums.length > 0" class="ui stackable three column grid">
         <div class="column" :key="album.id" v-for="album in results.albums">
           <album-card class="fluid" :album="album" ></album-card>
         </div>
       </div>
-      <p v-else><translate :translate-context="'Content/Search/Paragraph'">No album matched your query</translate></p>
+      <p v-else><translate translate-context="Content/Search/Paragraph">No album matched your query</translate></p>
     </template>
   </div>
 </template>
diff --git a/front/src/components/audio/album/Card.vue b/front/src/components/audio/album/Card.vue
index 1f4021ef5db7c41f43e05aab768d8f27947c1c73..95c9d2f66b88d334a755ee842c1a6f7357b8bccd 100644
--- a/front/src/components/audio/album/Card.vue
+++ b/front/src/components/audio/album/Card.vue
@@ -11,7 +11,7 @@
         <div class="meta">
           <span>
             <router-link tag="span" :to="{name: 'library.artists.detail', params: {id: album.artist.id }}">
-              <translate :translate-context="'Content/Album/Card'" :translate-params="{artist: album.artist.name}">By %{ artist }</translate>
+              <translate translate-context="Content/Album/Card" :translate-params="{artist: album.artist.name}">By %{ artist }</translate>
             </router-link>
           </span><span class="time" v-if="album.release_date">– {{ album.release_date | year }}</span>
         </div>
@@ -36,21 +36,21 @@
           </table>
           <div class="center aligned segment" v-if="album.tracks.length > initialTracks">
             <em v-if="!showAllTracks" @click="showAllTracks = true" class="expand">
-              <translate :translate-context="'Content/Album/Card.Link/Verb'" :translate-params="{count: album.tracks.length - initialTracks}" :translate-n="album.tracks.length - initialTracks" translate-plural="Show %{ count } more tracks">Show %{ count } more track</translate>
+              <translate translate-context="Content/Album/Card.Link/Verb" :translate-params="{count: album.tracks.length - initialTracks}" :translate-n="album.tracks.length - initialTracks" translate-plural="Show %{ count } more tracks">Show %{ count } more track</translate>
             </em>
             <em v-else @click="showAllTracks = false" class="expand">
-              <translate :translate-context="'Content/Album/Card.Link/Verb'">Collapse</translate>
+              <translate translate-context="Content/Album/Card.Link/Verb">Collapse</translate>
             </em>
           </div>
         </div>
       </div>
       <div class="extra content">
         <play-button class="mini basic orange right floated" :tracks="album.tracks" :album="album">
-          <translate :translate-context="'Content/Queue/Card.Button.Label/Short, Verb'">Play all</translate>
+          <translate translate-context="Content/Queue/Card.Button.Label/Short, Verb">Play all</translate>
         </play-button>
         <span>
           <i class="music icon"></i>
-          <translate :translate-context="'Content/Album/Card'" :translate-params="{count: album.tracks.length}" :translate-n="album.tracks.length" translate-plural="%{ count } tracks">%{ count } track</translate>
+          <translate translate-context="Content/Album/Card" :translate-params="{count: album.tracks.length}" :translate-n="album.tracks.length" translate-plural="%{ count } tracks">%{ count } track</translate>
         </span>
       </div>
     </div>
diff --git a/front/src/components/audio/artist/Card.vue b/front/src/components/audio/artist/Card.vue
index d0223ac2d87d96d6dbbe89df7da229f6a671f013..f5e89cc5c359461a20d6359ccfb4e8c011cf339f 100644
--- a/front/src/components/audio/artist/Card.vue
+++ b/front/src/components/audio/artist/Card.vue
@@ -28,10 +28,10 @@
           </table>
           <div class="center aligned segment" v-if="artist.albums.length > initialAlbums">
             <em v-if="!showAllAlbums" @click="showAllAlbums = true" class="expand">
-              <translate :translate-context="'Content/Artist/Card.Link'" :translate-params="{count: artist.albums.length - initialAlbums}" :translate-n="artist.albums.length - initialAlbums" translate-plural="Show %{ count } more albums">Show 1 more album</translate>
+              <translate translate-context="Content/Artist/Card.Link" :translate-params="{count: artist.albums.length - initialAlbums}" :translate-n="artist.albums.length - initialAlbums" translate-plural="Show %{ count } more albums">Show 1 more album</translate>
             </em>
             <em v-else @click="showAllAlbums = false" class="expand">
-              <translate :translate-context="'Content/Artist/Card.Link'">Collapse</translate>
+              <translate translate-context="Content/Artist/Card.Link">Collapse</translate>
             </em>
           </div>
         </div>
@@ -39,10 +39,10 @@
     <div class="extra content">
         <span>
           <i class="sound icon"></i>
-            <translate :translate-context="'Content/Artist/Card'" :translate-params="{count: artist.albums.length}" :translate-n="artist.albums.length" translate-plural="%{ count } albums">1 album</translate>
+            <translate translate-context="Content/Artist/Card" :translate-params="{count: artist.albums.length}" :translate-n="artist.albums.length" translate-plural="%{ count } albums">1 album</translate>
         </span>
         <play-button :is-playable="isPlayable" class="mini basic orange right floated" :artist="artist">
-          <translate :translate-context="'Content/Queue/Button.Label/Short, Verb'">Play all</translate>
+          <translate translate-context="Content/Queue/Button.Label/Short, Verb">Play all</translate>
         </play-button>
       </div>
     </div>
diff --git a/front/src/components/audio/track/Row.vue b/front/src/components/audio/track/Row.vue
index e48de8e51796c2d40a2ddeb6e18fbf00e7bf2cf0..690fe48f5b89ac50d566d0256dae6d09f7e8566e 100644
--- a/front/src/components/audio/track/Row.vue
+++ b/front/src/components/audio/track/Row.vue
@@ -38,7 +38,7 @@
       {{ time.parse(track.uploads[0].duration) }}
     </td>
     <td colspan="4" v-else>
-      <translate :translate-context="'*/*/*'">N/A</translate>
+      <translate translate-context="*/*/*">N/A</translate>
     </td>
     <td colspan="2" class="align right">
       <track-favorite-icon class="favorite-icon" :track="track"></track-favorite-icon>
diff --git a/front/src/components/audio/track/Table.vue b/front/src/components/audio/track/Table.vue
index 910d8f98aa0716521a04b45525763923527e1fdd..13506acaeba02996d5cc1003589e8bdd185406b4 100644
--- a/front/src/components/audio/track/Table.vue
+++ b/front/src/components/audio/track/Table.vue
@@ -5,10 +5,10 @@
         <tr>
           <th></th>
           <th></th>
-          <th colspan="6"><translate :translate-context="'Content/Track/Table.Label'">Title</translate></th>
-          <th colspan="4"><translate :translate-context="'Content/Track/Table.Label'">Artist</translate></th>
-          <th colspan="4"><translate :translate-context="'Content/Track/Table.Label'">Album</translate></th>
-          <th colspan="4"><translate :translate-context="'Content/Track/Table.Label'">Duration</translate></th>
+          <th colspan="6"><translate translate-context="Content/Track/Table.Label">Title</translate></th>
+          <th colspan="4"><translate translate-context="Content/Track/Table.Label">Artist</translate></th>
+          <th colspan="4"><translate translate-context="Content/Track/Table.Label">Album</translate></th>
+          <th colspan="4"><translate translate-context="Content/Track/Table.Label">Duration</translate></th>
           <th colspan="2"></th>
         </tr>
       </thead>
diff --git a/front/src/components/auth/Login.vue b/front/src/components/auth/Login.vue
index 6a1b65cd3aca0ce9ec3ed3ff017150ae3b1ee211..50acc927a15ea428888ab04fa8d113fe46eda925 100644
--- a/front/src/components/auth/Login.vue
+++ b/front/src/components/auth/Login.vue
@@ -2,20 +2,20 @@
   <main class="main pusher" v-title="labels.title">
     <section class="ui vertical stripe segment">
       <div class="ui small text container">
-        <h2><translate :translate-context="'Content/Login/Title/Verb'">Log in to your Funkwhale account</translate></h2>
+        <h2><translate translate-context="Content/Login/Title/Verb">Log in to your Funkwhale account</translate></h2>
         <form class="ui form" @submit.prevent="submit()">
           <div v-if="error" class="ui negative message">
-            <div class="header"><translate :translate-context="'Content/Login/Error message.Title'">We cannot log you in</translate></div>
+            <div class="header"><translate translate-context="Content/Login/Error message.Title">We cannot log you in</translate></div>
             <ul class="list">
-              <li v-if="error == 'invalid_credentials'"><translate :translate-context="'Content/Login/Error message.List item/Call to action'">Please double-check your username/password couple is correct</translate></li>
-              <li v-else><translate :translate-context="'Content/Login/Error message/List item'">An unknown error happend, this can mean the server is down or cannot be reached</translate></li>
+              <li v-if="error == 'invalid_credentials'"><translate translate-context="Content/Login/Error message.List item/Call to action">Please double-check your username/password couple is correct</translate></li>
+              <li v-else><translate translate-context="Content/Login/Error message/List item">An unknown error happend, this can mean the server is down or cannot be reached</translate></li>
             </ul>
           </div>
           <div class="field">
             <label>
-              <translate :translate-context="'Content/Login/Input.Label/Noun'">Username or email</translate> |
+              <translate translate-context="Content/Login/Input.Label/Noun">Username or email</translate> |
               <router-link :to="{path: '/signup'}">
-                <translate :translate-context="'Content/Login/Link/Verb'">Create an account</translate>
+                <translate translate-context="Content/Login/Link/Verb">Create an account</translate>
               </router-link>
             </label>
             <input
@@ -31,16 +31,16 @@
           </div>
           <div class="field">
             <label>
-              <translate :translate-context="'Content/Login/Input.Label'">Password</translate> |
+              <translate translate-context="Content/Login/Input.Label">Password</translate> |
               <router-link :to="{name: 'auth.password-reset', query: {email: credentials.username}}">
-                <translate :translate-context="'Content/Login/Link/Verb'">Reset your password</translate>
+                <translate translate-context="Content/Login/Link/Verb">Reset your password</translate>
               </router-link>
             </label>
             <password-input :index="2" required v-model="credentials.password" />
 
           </div>
           <button tabindex="3" :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit">
-             <translate :translate-context="'Content/Login/Button.Label/Verb'">Login</translate>
+             <translate translate-context="Content/Login/Button.Label/Verb">Login</translate>
           </button>
         </form>
       </div>
diff --git a/front/src/components/auth/Logout.vue b/front/src/components/auth/Logout.vue
index 3582d6367411e9f7265b2dfbff203bd73482a797..84efcd1f0cb497bacafb05133b89e5e683796d8d 100644
--- a/front/src/components/auth/Logout.vue
+++ b/front/src/components/auth/Logout.vue
@@ -3,10 +3,10 @@
     <section class="ui vertical stripe segment">
       <div class="ui small text container">
         <h2>
-          <translate :translate-context="'Content/Login/Title'">Are you sure you want to log out?</translate>
+          <translate translate-context="Content/Login/Title">Are you sure you want to log out?</translate>
         </h2>
         <p v-translate="{username: $store.state.auth.username}">You are currently logged in as %{ username }</p>
-        <button class="ui button" @click="$store.dispatch('auth/logout')"><translate :translate-context="'Content/Login/Button.Label'">Yes, log me out!</translate></button>
+        <button class="ui button" @click="$store.dispatch('auth/logout')"><translate translate-context="Content/Login/Button.Label">Yes, log me out!</translate></button>
       </div>
     </section>
   </main>
diff --git a/front/src/components/auth/Profile.vue b/front/src/components/auth/Profile.vue
index 1aaafd102f845af3526621ae180692182555c83e..0f82b66103ef7fcc683adebf9a45c5fd7e168f33 100644
--- a/front/src/components/auth/Profile.vue
+++ b/front/src/components/auth/Profile.vue
@@ -14,14 +14,14 @@
           </div>
         </h2>
         <div class="ui basic green label">
-          <translate :translate-context="'Content/Profile/Button.Paragraph'">This is you!</translate>
+          <translate translate-context="Content/Profile/Button.Paragraph">This is you!</translate>
         </div>
         <a v-if="profile.is_staff"
           class="ui yellow label"
           :href="$store.getters['instance/absoluteUrl']('/api/admin')"
           target="_blank">
           <i class="star icon"></i>
-          <translate :translate-context="'Content/Profile/Button.Label'">Staff member</translate>
+          <translate translate-context="Content/Profile/Button.Label">Staff member</translate>
         </a>
       </div>
     </template>
diff --git a/front/src/components/auth/Settings.vue b/front/src/components/auth/Settings.vue
index 7959d07803c63a0818a58337b5132eeea5eb6c8f..6d698945070cde3464efe53bb432e40ca074d68d 100644
--- a/front/src/components/auth/Settings.vue
+++ b/front/src/components/auth/Settings.vue
@@ -3,16 +3,16 @@
     <div class="ui vertical stripe segment">
       <section class="ui small text container">
         <h2 class="ui header">
-          <translate :translate-context="'Content/Settings/Title'">Account settings</translate>
+          <translate translate-context="Content/Settings/Title">Account settings</translate>
         </h2>
         <form class="ui form" @submit.prevent="submitSettings()">
           <div v-if="settings.success" class="ui positive message">
             <div class="header">
-              <translate :translate-context="'Content/Settings/Message'">Settings updated</translate>
+              <translate translate-context="Content/Settings/Message">Settings updated</translate>
             </div>
           </div>
           <div v-if="settings.errors.length > 0" class="ui negative message">
-            <div class="header"><translate :translate-context="'Content/Settings/Error message.Title'">Your settings can't be updateds</translate></div>
+            <div class="header"><translate translate-context="Content/Settings/Error message.Title">Your settings can't be updateds</translate></div>
             <ul class="list">
               <li v-for="error in settings.errors">{{ error }}</li>
             </ul>
@@ -25,38 +25,38 @@
             </select>
           </div>
           <button :class="['ui', {'loading': isLoading}, 'button']" type="submit">
-            <translate :translate-context="'Content/Settings/Button.Label/Verb'">Update settings</translate>
+            <translate translate-context="Content/Settings/Button.Label/Verb">Update settings</translate>
           </button>
         </form>
       </section>
       <section class="ui small text container">
         <div class="ui hidden divider"></div>
         <h2 class="ui header">
-          <translate :translate-context="'Content/Settings/Title'">Avatar</translate>
+          <translate translate-context="Content/Settings/Title">Avatar</translate>
         </h2>
         <div class="ui form">
           <div v-if="avatarErrors.length > 0" class="ui negative message">
-            <div class="header"><translate :translate-context="'Content/Settings/Error message.Title'">Your avatar cannot be saved</translate></div>
+            <div class="header"><translate translate-context="Content/Settings/Error message.Title">Your avatar cannot be saved</translate></div>
             <ul class="list">
               <li v-for="error in avatarErrors">{{ error }}</li>
             </ul>
           </div>
           <div class="ui stackable grid">
             <div class="ui ten wide column">
-              <h3 class="ui header"><translate :translate-context="'Content/Settings/Title/Verb'">Upload a new avatar</translate></h3>
-              <p><translate :translate-context="'Content/Settings/Paragraph'">PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px.</translate></p>
+              <h3 class="ui header"><translate translate-context="Content/Settings/Title/Verb">Upload a new avatar</translate></h3>
+              <p><translate translate-context="Content/Settings/Paragraph">PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px.</translate></p>
               <input class="ui input" ref="avatar" type="file" />
               <div class="ui hidden divider"></div>
               <button @click="submitAvatar" :class="['ui', {'loading': isLoadingAvatar}, 'button']">
-                <translate :translate-context="'Content/Settings/Button.Label/Verb'">Update avatar</translate>
+                <translate translate-context="Content/Settings/Button.Label/Verb">Update avatar</translate>
               </button>
             </div>
             <div class="ui six wide column">
-              <h3 class="ui header"><translate :translate-context="'Content/Settings/Title/Noun'">Current avatar</translate></h3>
+              <h3 class="ui header"><translate translate-context="Content/Settings/Title/Noun">Current avatar</translate></h3>
               <img class="ui circular image" v-if="currentAvatar && currentAvatar.square_crop" v-lazy="$store.getters['instance/absoluteUrl'](currentAvatar.medium_square_crop)" />
               <div class="ui hidden divider"></div>
               <button @click="removeAvatar" v-if="currentAvatar && currentAvatar.square_crop" :class="['ui', {'loading': isLoadingAvatar}, ,'yellow', 'button']">
-                <translate :translate-context="'Content/Settings/Button.Label/Verb'">Remove avatar</translate>
+                <translate translate-context="Content/Settings/Button.Label/Verb">Remove avatar</translate>
               </button>
             </div>
           </div>
@@ -66,43 +66,43 @@
       <section class="ui small text container">
         <div class="ui hidden divider"></div>
         <h2 class="ui header">
-          <translate :translate-context="'Content/Settings/Title/Verb'">Change my password</translate>
+          <translate translate-context="Content/Settings/Title/Verb">Change my password</translate>
         </h2>
         <div class="ui message">
-          <translate :translate-context="'Content/Settings/Paragraph'">Changing your password will also change your Subsonic API password if you have requested one.</translate>&nbsp;<translate :translate-context="'Content/Settings/Paragraph'">You will have to update your password on your clients that use this password.</translate>
+          <translate translate-context="Content/Settings/Paragraph'">Changing your password will also change your Subsonic API password if you have requested one.</translate>&nbsp;<translate translate-context="Content/Settings/Paragraph">You will have to update your password on your clients that use this password.</translate>
         </div>
         <form class="ui form" @submit.prevent="submitPassword()">
           <div v-if="passwordError" class="ui negative message">
             <div class="header">
-              <translate :translate-context="'Content/Settings/Error message.Title'">Your password cannot be changed</translate>
+              <translate translate-context="Content/Settings/Error message.Title">Your password cannot be changed</translate>
             </div>
             <ul class="list">
-              <li v-if="passwordError == 'invalid_credentials'"><translate :translate-context="'Content/Settings/Error message.List item/Call to action'">Please double-check your password is correct</translate></li>
+              <li v-if="passwordError == 'invalid_credentials'"><translate translate-context="Content/Settings/Error message.List item/Call to action">Please double-check your password is correct</translate></li>
             </ul>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/Settings/Input.Label'">Old password</translate></label>
+            <label><translate translate-context="Content/Settings/Input.Label">Old password</translate></label>
             <password-input required v-model="old_password" />
 
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/Settings/Input.Label'">New password</translate></label>
+            <label><translate translate-context="Content/Settings/Input.Label">New password</translate></label>
             <password-input required v-model="new_password" />
           </div>
           <dangerous-button
             color="yellow"
             :class="['ui', {'loading': isLoading}, 'button']"
             :action="submitPassword">
-            <translate :translate-context="'Content/Settings/Button.Label'">Change password</translate>
-            <p slot="modal-header"><translate :translate-context="'Popup/Settings/Title'">Change your password?</translate></p>
+            <translate translate-context="Content/Settings/Button.Label">Change password</translate>
+            <p slot="modal-header"><translate translate-context="Popup/Settings/Title">Change your password?</translate></p>
             <div slot="modal-content">
-              <p><translate :translate-context="'Popup/Settings/Paragraph'">Changing your password will have the following consequences:</translate></p>
+              <p><translate translate-context="Popup/Settings/Paragraph">Changing your password will have the following consequences:</translate></p>
               <ul>
-                <li><translate :translate-context="'Popup/Settings/List item'">You will be logged out from this session and have to log in with the new one</translate></li>
-                <li><translate :translate-context="'Popup/Settings/List item'">Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password</translate></li>
+                <li><translate translate-context="Popup/Settings/List item">You will be logged out from this session and have to log in with the new one</translate></li>
+                <li><translate translate-context="Popup/Settings/List item">Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password</translate></li>
               </ul>
             </div>
-            <div slot="modal-confirm"><translate :translate-context="'Popup/Setting/Button.Label'">Disable access</translate></div>
+            <div slot="modal-confirm"><translate translate-context="Popup/Setting/Button.Label">Disable access</translate></div>
           </dangerous-button>
         </form>
         <div class="ui hidden divider" />
@@ -123,7 +123,7 @@
           @click="$store.dispatch('moderation/fetchContentFilters')"
           class="ui basic icon button">
           <i class="refresh icon"></i>&nbsp;
-          <translate :translate-context="'Content/*/Button.Label'">Refresh</translate>
+          <translate translate-context="Content/*/Button.Label">Refresh</translate>
         </button>
         <h3 class="ui header">
           <translate>Hidden artists</translate>
@@ -131,8 +131,8 @@
         <table class="ui compact very basic unstackable table">
           <thead>
             <tr>
-              <th><translate :translate-context="'Content/*/Table.Label'">Name</translate></th>
-              <th><translate :translate-context="'Content/*/Table.Label'">Creation date</translate></th>
+              <th><translate translate-context="Content/*/Table.Label">Name</translate></th>
+              <th><translate translate-context="Content/*/Table.Label">Creation date</translate></th>
               <th></th>
             </tr>
           </thead>
@@ -148,7 +148,7 @@
               </td>
               <td>
                 <button @click="$store.dispatch('moderation/deleteContentFilter', filter.uuid)" class="ui basic tiny button">
-                  <translate :translate-context="'Content/*/Button.Label'">Delete</translate>
+                  <translate translate-context="Content/*/Button.Label">Delete</translate>
                 </button>
               </td>
             </tr>
diff --git a/front/src/components/auth/SubsonicTokenForm.vue b/front/src/components/auth/SubsonicTokenForm.vue
index 496d69eaaf1c2f6a3b438d14904c41fc6574e797..631fdb48cd5d32adeabd37b3ce0abb5a9ba3a951 100644
--- a/front/src/components/auth/SubsonicTokenForm.vue
+++ b/front/src/components/auth/SubsonicTokenForm.vue
@@ -1,23 +1,23 @@
 <template>
   <form class="ui form" @submit.prevent="requestNewToken()">
-    <h2><translate :translate-context="'Content/Settings/Title'">Subsonic API password</translate></h2>
+    <h2><translate translate-context="Content/Settings/Title">Subsonic API password</translate></h2>
     <p class="ui message" v-if="!subsonicEnabled">
-      <translate :translate-context="'Content/Settings/Paragraph'">The Subsonic API is not available on this Funkwhale instance.</translate>
+      <translate translate-context="Content/Settings/Paragraph">The Subsonic API is not available on this Funkwhale instance.</translate>
     </p>
     <p>
-      <translate :translate-context="'Content/Settings/Paragraph'">Funkwhale is compatible with other music players that support the Subsonic API.</translate>&nbsp;<translate :translate-context="'Content/Settings/Paragraph'">You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance.</translate>
+      <translate translate-context="Content/Settings/Paragraph'">Funkwhale is compatible with other music players that support the Subsonic API.</translate>&nbsp;<translate translate-context="Content/Settings/Paragraph">You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance.</translate>
     </p>
     <p>
-      <translate :translate-context="'Content/Settings/Paragraph'">However, accessing Funkwhale from those clients require a separate password you can set below.</translate>
+      <translate translate-context="Content/Settings/Paragraph">However, accessing Funkwhale from those clients require a separate password you can set below.</translate>
     </p>
     <p><a href="https://docs.funkwhale.audio/users/apps.html#subsonic-compatible-clients" target="_blank">
-      <translate :translate-context="'Content/Settings/Link'">Discover how to use Funkwhale from other apps</translate>
+      <translate translate-context="Content/Settings/Link">Discover how to use Funkwhale from other apps</translate>
     </a></p>
     <div v-if="success" class="ui positive message">
       <div class="header">{{ successMessage }}</div>
     </div>
     <div v-if="subsonicEnabled && errors.length > 0" class="ui negative message">
-      <div class="header"><translate :translate-context="'Content/Settings/Error message.Title'">Error</translate></div>
+      <div class="header"><translate translate-context="Content/Settings/Error message.Title">Error</translate></div>
       <ul class="list">
         <li v-for="error in errors">{{ error }}</li>
       </ul>
@@ -31,25 +31,25 @@
         color="grey"
         :class="['ui', {'loading': isLoading}, 'button']"
         :action="requestNewToken">
-        <translate :translate-context="'Content/Settings/Button.Label/Verb'">Request a new password</translate>
-        <p slot="modal-header"><translate :translate-context="'Popup/Settings/Title'">Request a new Subsonic API password?</translate></p>
-        <p slot="modal-content"><translate :translate-context="'Popup/Settings/Paragraph'">This will log you out from existing devices that use the current password.</translate></p>
-        <div slot="modal-confirm"><translate :translate-context="'Popup/Settings/Button.Label/Verb'">Request a new password</translate></div>
+        <translate translate-context="Content/Settings/Button.Label/Verb">Request a new password</translate>
+        <p slot="modal-header"><translate translate-context="Popup/Settings/Title">Request a new Subsonic API password?</translate></p>
+        <p slot="modal-content"><translate translate-context="Popup/Settings/Paragraph">This will log you out from existing devices that use the current password.</translate></p>
+        <div slot="modal-confirm"><translate translate-context="Popup/Settings/Button.Label/Verb">Request a new password</translate></div>
       </dangerous-button>
       <button
         v-else
         color="grey"
         :class="['ui', {'loading': isLoading}, 'button']"
-        @click="requestNewToken"><translate :translate-context="'Content/Settings/Button.Label/Verb'">Request a password</translate></button>
+        @click="requestNewToken"><translate translate-context="Content/Settings/Button.Label/Verb">Request a password</translate></button>
         <dangerous-button
           v-if="token"
           color="yellow"
           :class="['ui', {'loading': isLoading}, 'button']"
           :action="disable">
-          <translate :translate-context="'Content/Settings/Button.Label/Verb'">Disable Subsonic access</translate>
-          <p slot="modal-header"><translate :translate-context="'Popup/Settings/Title'">Disable Subsonic API access?</translate></p>
-          <p slot="modal-content"><translate :translate-context="'Popup/Settings/Paragraph'">This will completely disable access to the Subsonic API using from account.</translate></p>
-          <div slot="modal-confirm"><translate :translate-context="'Popup/Settings/Button.Label'">Disable access</translate></div>
+          <translate translate-context="Content/Settings/Button.Label/Verb">Disable Subsonic access</translate>
+          <p slot="modal-header"><translate translate-context="Popup/Settings/Title">Disable Subsonic API access?</translate></p>
+          <p slot="modal-content"><translate translate-context="Popup/Settings/Paragraph">This will completely disable access to the Subsonic API using from account.</translate></p>
+          <div slot="modal-confirm"><translate translate-context="Popup/Settings/Button.Label">Disable access</translate></div>
         </dangerous-button>
     </template>
   </form>
diff --git a/front/src/components/common/ActionTable.vue b/front/src/components/common/ActionTable.vue
index f6143e0a32029e427ac1c6b41891e62d094e18c8..4e7415df8e791c507c62ee8c39ec9c67fa40278c 100644
--- a/front/src/components/common/ActionTable.vue
+++ b/front/src/components/common/ActionTable.vue
@@ -6,7 +6,7 @@
           <th colspan="1000">
             <div v-if="refreshable" class="right floated">
               <span v-if="needsRefresh">
-                <translate :translate-context="'Content/*/Button.Help text.Paragraph'">Content have been updated, click refresh to see up-to-date content</translate>
+                <translate translate-context="Content/*/Button.Help text.Paragraph">Content have been updated, click refresh to see up-to-date content</translate>
               </span>
               <button
                 @click="$emit('refresh')"
@@ -20,7 +20,7 @@
             <div class="ui small left floated form" v-if="actionUrl && actions.length > 0">
               <div class="ui inline fields">
                 <div class="field">
-                  <label><translate :translate-context="'Content/*/Dropdown.Label/Noun'">Actions</translate></label>
+                  <label><translate translate-context="Content/*/Dropdown.Label/Noun">Actions</translate></label>
                   <select class="ui dropdown" v-model="currentActionName">
                     <option v-for="action in actions" :value="action.name">
                       {{ action.label }}
@@ -33,9 +33,9 @@
                     confirm-color="green"
                     color=""
                     @confirm="launchAction">
-                    <translate :translate-context="'Content/*/Button.Label/Short, Verb'">Go</translate>
+                    <translate translate-context="Content/*/Button.Label/Short, Verb">Go</translate>
                     <p slot="modal-header">
-                      <translate :translate-context="'Modal/*/Title'"
+                      <translate translate-context="Modal/*/Title"
                         key="1"
                         :translate-n="affectedObjectsCount"
                         :translate-params="{count: affectedObjectsCount, action: currentActionName}"
@@ -44,19 +44,19 @@
                       </translate>
                     </p>
                     <p slot="modal-content">
-                      <translate :translate-context="'Modal/*/Paragraph'">This may affect a lot of elements or have irreversible consequences, please double check this is really what you want.</translate>
+                      <translate translate-context="Modal/*/Paragraph">This may affect a lot of elements or have irreversible consequences, please double check this is really what you want.</translate>
                     </p>
-                    <div slot="modal-confirm"><translate :translate-context="'Modal/*/Button.Label/Short, Verb'">Launch</translate></div>
+                    <div slot="modal-confirm"><translate translate-context="Modal/*/Button.Label/Short, Verb">Launch</translate></div>
                   </dangerous-button>
                   <div
                     v-else
                     @click="launchAction"
                     :disabled="checked.length === 0"
                     :class="['ui', {disabled: checked.length === 0}, {'loading': actionLoading}, 'button']">
-                    <translate :translate-context="'Content/*/Button.Label/Short, Verb'">Go</translate></div>
+                    <translate translate-context="Content/*/Button.Label/Short, Verb">Go</translate></div>
                 </div>
                 <div class="count field">
-                  <translate :translate-context="'Content/*/Paragraph'"
+                  <translate translate-context="Content/*/Paragraph"
                     tag="span"
                     v-if="selectAll"
                     key="1"
@@ -65,7 +65,7 @@
                     translate-plural="All %{ count } elements selected">
                     All %{ count } element selected
                   </translate>
-                  <translate :translate-context="'Content/*/Paragraph'"
+                  <translate translate-context="Content/*/Paragraph"
                     tag="span"
                     v-else
                     key="2"
@@ -76,7 +76,7 @@
                   </translate>
                   <template v-if="currentAction.allowAll && checkable.length > 0 && checkable.length === checked.length">
                     <a @click="selectAll = true" v-if="!selectAll">
-                      <translate :translate-context="'Content/*/Link/Verb'"
+                      <translate translate-context="Content/*/Link/Verb"
                         key="3"
                         :translate-n="objectsData.count"
                         :translate-params="{total: objectsData.count}"
@@ -85,20 +85,20 @@
                       </translate>
                     </a>
                     <a @click="selectAll = false" v-else>
-                      <translate :translate-context="'Content/*/Link/Verb'" key="4">Select only current page</translate>
+                      <translate translate-context="Content/*/Link/Verb" key="4">Select only current page</translate>
                     </a>
                   </template>
                 </div>
               </div>
               <div v-if="actionErrors.length > 0" class="ui negative message">
-                <div class="header"><translate :translate-context="'Content/*/Error message/Header'">Error while applying action</translate></div>
+                <div class="header"><translate translate-context="Content/*/Error message/Header">Error while applying action</translate></div>
                 <ul class="list">
                   <li v-for="error in actionErrors">{{ error }}</li>
                 </ul>
               </div>
               <div v-if="actionResult" class="ui positive message">
                 <p>
-                  <translate :translate-context="'Content/*/Paragraph'"
+                  <translate translate-context="Content/*/Paragraph"
                     :translate-n="actionResult.updated"
                     :translate-params="{count: actionResult.updated, action: actionResult.action}"
                     translate-plural="Action %{ action } was launched successfully on %{ count } elements">
diff --git a/front/src/components/common/CopyInput.vue b/front/src/components/common/CopyInput.vue
index 3e400893494cd447a2ee3b320fee4c5a205ac874..a422ff758a40b5998a497fd697dfe6717aca743b 100644
--- a/front/src/components/common/CopyInput.vue
+++ b/front/src/components/common/CopyInput.vue
@@ -1,12 +1,12 @@
 <template>
   <div class="ui fluid action input">
     <p class="message" v-if="copied">
-      <translate :translate-context="'Content/*/Paragraph/Short'">Text copied to clipboard!</translate>
+      <translate translate-context="Content/*/Paragraph/Short">Text copied to clipboard!</translate>
     </p>
     <input ref="input" :value="value" type="text">
     <button @click="copy" :class="['ui', buttonClasses, 'right', 'labeled', 'icon', 'button']">
       <i class="copy icon"></i>
-      <translate :translate-context="'Content/*/Button.Label/Short, Verb'">Copy</translate>
+      <translate translate-context="Content/*/Button.Label/Short, Verb">Copy</translate>
     </button>
   </div>
 </template>
diff --git a/front/src/components/common/DangerousButton.vue b/front/src/components/common/DangerousButton.vue
index 9a2fab48a3358225317144ec1b25133084bef1d9..ae05ccfecc688c8039ce24239cdb354d72a4f3f5 100644
--- a/front/src/components/common/DangerousButton.vue
+++ b/front/src/components/common/DangerousButton.vue
@@ -5,7 +5,7 @@
     <modal class="small" :show.sync="showModal">
       <div class="header">
         <slot name="modal-header">
-          <translate :translate-context="'Modal/*/Title'">Do you want to confirm this action?</translate>
+          <translate translate-context="Modal/*/Title">Do you want to confirm this action?</translate>
         </slot>
       </div>
       <div class="scrolling content">
@@ -15,11 +15,11 @@
       </div>
       <div class="actions">
         <div class="ui cancel button">
-          <translate :translate-context="'Modal/*/Button.Label/Short, Verb'">Cancel</translate>
+          <translate translate-context="Modal/*/Button.Label/Short, Verb">Cancel</translate>
         </div>
         <div :class="['ui', 'confirm', confirmButtonColor, 'button']" @click="confirm">
           <slot name="modal-confirm">
-            <translate :translate-context="'Modal/*/Button.Label/Short, Verb'">Confirm</translate>
+            <translate translate-context="Modal/*/Button.Label/Short, Verb">Confirm</translate>
           </slot>
         </div>
       </div>
diff --git a/front/src/components/common/Duration.vue b/front/src/components/common/Duration.vue
index 93465ba6fcb818faec5c92de93acfeb28f117967..4ee8ccfd168ead2571caaabc33094d3ce43b7d55 100644
--- a/front/src/components/common/Duration.vue
+++ b/front/src/components/common/Duration.vue
@@ -1,9 +1,9 @@
 <template>
   <span>
-    <translate :translate-context="'Content/*/Paragraph'"
+    <translate translate-context="Content/*/Paragraph"
       v-if="durationData.hours > 0"
       :translate-params="{minutes: durationData.minutes, hours: durationData.hours}">%{ hours } h %{ minutes } min</translate>
-    <translate :translate-context="'Content/*/Paragraph'"
+    <translate translate-context="Content/*/Paragraph"
       v-else
       :translate-params="{minutes: durationData.minutes}">%{ minutes } min</translate>
   </span>
diff --git a/front/src/components/common/EmptyState.vue b/front/src/components/common/EmptyState.vue
index 79067b8ee458d46eb5f3993ff88e5696b4eedf00..cc9f32ca1ef413fba27c62646ac90dabf3756911 100644
--- a/front/src/components/common/EmptyState.vue
+++ b/front/src/components/common/EmptyState.vue
@@ -5,7 +5,7 @@
         <slot name="title">
 
           <i class="search icon"></i>
-          <translate :translate-context="'Content/*/Paragraph'">
+          <translate translate-context="Content/*/Paragraph">
             No results were found.
           </translate>
         </slot>
@@ -14,7 +14,7 @@
     <div class="inline">
       <slot></slot>
       <button v-if="refresh" class="ui button" @click="$emit('refresh')">
-        <translate :translate-context="'Content/*/Button.Label/Short, Verb'">
+        <translate translate-context="Content/*/Button.Label/Short, Verb">
           Refresh
         </translate></button>
       </button>
diff --git a/front/src/components/favorites/List.vue b/front/src/components/favorites/List.vue
index 3db4e2306d7b9439ec02e9c6dc9255aa71f5989d..f531df2310b86c3cb25ee8b1130fe6d2903d6dc5 100644
--- a/front/src/components/favorites/List.vue
+++ b/front/src/components/favorites/List.vue
@@ -3,7 +3,7 @@
     <section class="ui vertical center aligned stripe segment">
       <div :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']">
         <div class="ui text loader">
-          <translate :translate-context="'Content/Favorites/Message'">Loading your favorites…</translate>
+          <translate translate-context="Content/Favorites/Message">Loading your favorites…</translate>
         </div>
       </div>
       <h2 v-if="results" class="ui center aligned icon header">
@@ -12,7 +12,7 @@
           translate-plural="%{ count } favorites"
           :translate-n="$store.state.favorites.count"
           :translate-params="{count: results.count}"
-          :translate-context="'Content/Favorites/Title'">
+          translate-context="Content/Favorites/Title">
           1 favorite
         </translate>
       </h2>
@@ -22,7 +22,7 @@
       <div :class="['ui', {'loading': isLoading}, 'form']">
         <div class="fields">
           <div class="field">
-            <label><translate :translate-context="'Content/Favorites/Dropdown.Title/Short, Name'">Ordering</translate></label>
+            <label><translate translate-context="Content/Favorites/Dropdown.Title/Short, Name">Ordering</translate></label>
             <select class="ui dropdown" v-model="ordering">
               <option v-for="option in orderingOptions" :value="option[0]">
                 {{ sharedLabels.filters[option[1]] }}
@@ -30,14 +30,14 @@
             </select>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/*/Dropdown.Label/Short, Name'">Order</translate></label>
+            <label><translate translate-context="Content/*/Dropdown.Label/Short, Name">Order</translate></label>
             <select class="ui dropdown" v-model="orderingDirection">
-              <option value="+"><translate :translate-context="'Content/*/Dropdown/Short'">Ascending</translate></option>
-              <option value="-"><translate :translate-context="'Content/*/Short'">Descending</translate></option>
+              <option value="+"><translate translate-context="Content/*/Dropdown/Short">Ascending</translate></option>
+              <option value="-"><translate translate-context="Content/*/Short">Descending</translate></option>
             </select>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/*/Dropdown.Label/Short, Name'">Results per page</translate></label>
+            <label><translate translate-context="Content/*/Dropdown.Label/Short, Name">Results per page</translate></label>
             <select class="ui dropdown" v-model="paginateBy">
               <option :value="parseInt(12)">12</option>
               <option :value="parseInt(25)">25</option>
diff --git a/front/src/components/favorites/TrackFavoriteIcon.vue b/front/src/components/favorites/TrackFavoriteIcon.vue
index 6ad18871d645ae8687e0ad66a437d81f24556280..61224ae6c3f396e54f78e2bfdb3dc4363f3374e2 100644
--- a/front/src/components/favorites/TrackFavoriteIcon.vue
+++ b/front/src/components/favorites/TrackFavoriteIcon.vue
@@ -1,8 +1,8 @@
  <template>
   <button @click="$store.dispatch('favorites/toggle', track.id)" v-if="button" :class="['ui', 'pink', {'inverted': isFavorite}, {'favorited': isFavorite}, 'icon', 'labeled', 'button']">
     <i class="heart icon"></i>
-    <translate v-if="isFavorite" :translate-context="'Content/Track/Button.Message'">In favorites</translate>
-    <translate v-else :translate-context="'Content/Track/Button.Message'">Add to favorites</translate>
+    <translate v-if="isFavorite" translate-context="Content/Track/Button.Message">In favorites</translate>
+    <translate v-else translate-context="Content/Track/Button.Message">Add to favorites</translate>
   </button>
   <button
     v-else
diff --git a/front/src/components/federation/LibraryWidget.vue b/front/src/components/federation/LibraryWidget.vue
index 7ec3117606cc7e5c1c2fbf23de6d6da5c929f084..7d24180879a70222cfefd18d4789953270af0f22 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 :translate-context="'Content/Federation/Paragraph'">No matching library.</translate></p>
+    <p v-if="!isLoading && libraries.length === 0" class="ui subtitle"><translate translate-context="Content/Federation/Paragraph">No matching library.</translate></p>
     <i @click="fetchData(previousPage)" :disabled="!previousPage" :class="['ui', {disabled: !previousPage}, 'circular', 'angle left', 'icon']">
     </i>
     <i @click="fetchData(nextPage)" :disabled="!nextPage" :class="['ui', {disabled: !nextPage}, 'circular', 'angle right', 'icon']">
diff --git a/front/src/components/instance/Stats.vue b/front/src/components/instance/Stats.vue
index 831bdbdcc31ee380e5a3a23a7c0e1be1cef3a8e1..b64574c54ff20f82e2da10746278ec44a782831b 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 :translate-context="'Content/About/Title/Noun'">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 :translate-context="'Content/About/Paragraph/Unit'">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 :translate-context="'Content/About/Paragraph/Unit'">tracks listened</translate></div>
+            <div class="label"><translate translate-context="Content/About/Paragraph/Unit">tracks listened</translate></div>
           </div>
           <div class="statistic">
             <div class="value">
               <i class="pink heart icon"></i> {{ stats.trackFavorites }}
             </div>
-            <div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">Tracks favorited</translate></div>
+            <div class="label"><translate translate-context="Content/About/Paragraph/Unit">Tracks favorited</translate></div>
           </div>
         </div>
       </div>
       <div class="column">
-        <h3 class="ui left aligned header"><translate :translate-context="'Content/About/Title/Noun'">Library</translate></h3>
+        <h3 class="ui left aligned header"><translate translate-context="Content/About/Title/Noun">Library</translate></h3>
         <div class="ui mini horizontal statistics">
           <div class="statistic">
             <div class="value">
               {{ parseInt(stats.musicDuration) }}
             </div>
-            <div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">Hours of music</translate></div>
+            <div class="label"><translate translate-context="Content/About/Paragraph/Unit">Hours of music</translate></div>
           </div>
           <div class="statistic">
             <div class="value">
               {{ stats.artists }}
             </div>
-            <div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">Artists</translate></div>
+            <div class="label"><translate translate-context="Content/About/Paragraph/Unit">Artists</translate></div>
           </div>
           <div class="statistic">
             <div class="value">
               {{ stats.albums }}
             </div>
-            <div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">Albums</translate></div>
+            <div class="label"><translate translate-context="Content/About/Paragraph/Unit">Albums</translate></div>
           </div>
           <div class="statistic">
             <div class="value">
               {{ stats.tracks }}
             </div>
-            <div class="label"><translate :translate-context="'Content/About/Paragraph/Unit'">Tracks</translate></div>
+            <div class="label"><translate translate-context="Content/About/Paragraph/Unit">Tracks</translate></div>
           </div>
         </div>
       </div>
diff --git a/front/src/components/library/Album.vue b/front/src/components/library/Album.vue
index 55190a3d35a68bbe6237f971a05537a8eca558ab..3f5851e3dc4a38b81a0a7a0187193d6f6bb1d3a6 100644
--- a/front/src/components/library/Album.vue
+++ b/front/src/components/library/Album.vue
@@ -15,27 +15,27 @@
           </h2>
           <div class="ui hidden divider"></div>
           <play-button class="orange" :tracks="album.tracks">
-            <translate :translate-context="'Content/*/Button.Label/Verb, Short'">Play all</translate>
+            <translate translate-context="Content/*/Button.Label/Verb, Short">Play all</translate>
           </play-button>
 
           <a :href="wikipediaUrl" target="_blank" class="ui icon labeled button">
             <i class="wikipedia w icon"></i>
-            <translate :translate-context="'Content/*/Button.Label/Verb'">Search on Wikipedia</translate>
+            <translate translate-context="Content/*/Button.Label/Verb">Search on Wikipedia</translate>
           </a>
           <a v-if="musicbrainzUrl" :href="musicbrainzUrl" target="_blank" class="ui icon labeled button">
             <i class="external icon"></i>
-            <translate :translate-context="'Content/*/Button.Label/Verb'">View on MusicBrainz</translate>
+            <translate translate-context="Content/*/Button.Label/Verb">View on MusicBrainz</translate>
           </a>
           <template v-if="publicLibraries.length > 0">
             <button
               @click="showEmbedModal = !showEmbedModal"
               class="ui button icon labeled">
               <i class="code icon"></i>
-              <translate :translate-context="'Content/*/Button.Label/Verb'">Embed</translate>
+              <translate translate-context="Content/*/Button.Label/Verb">Embed</translate>
             </button>
             <modal :show.sync="showEmbedModal">
               <div class="header">
-                <translate :translate-context="'Popup/Album/Title/Verb'">Embed this album on your website</translate>
+                <translate translate-context="Popup/Album/Title/Verb">Embed this album on your website</translate>
               </div>
               <div class="content">
                 <div class="description">
@@ -45,7 +45,7 @@
               </div>
               <div class="actions">
                 <div class="ui deny button">
-                  <translate :translate-context="'Popup/*/Button.Label/Verb'">Cancel</translate>
+                  <translate translate-context="Popup/*/Button.Label/Verb">Cancel</translate>
                 </div>
               </div>
             </modal>
@@ -58,10 +58,10 @@
             tag="h2"
             class="left floated"
             :translate-params="{number: disc_number + 1}"
-            :translate-context="'Content/Album/'"
+            translate-context="Content/Album/"
           >Volume %{ number }</translate>
           <play-button class="right floated orange" :tracks="tracks">
-            <translate :translate-context="'Content/*/Button.Label/Verb, Short'">Play all</translate>
+            <translate translate-context="Content/*/Button.Label/Verb, Short">Play all</translate>
           </play-button>
           <track-table :artist="album.artist" :display-position="true" :tracks="tracks"></track-table>
         </section>
@@ -69,17 +69,17 @@
       <template v-else>
         <section class="ui vertical stripe segment">
           <h2>
-            <translate :translate-context="'Content/*/Title/Name'">Tracks</translate>
+            <translate translate-context="Content/*/Title/Name">Tracks</translate>
           </h2>
           <track-table v-if="album" :artist="album.artist" :display-position="true" :tracks="album.tracks"></track-table>
         </section>
       </template>
       <section class="ui vertical stripe segment">
         <h2>
-          <translate :translate-context="'Content/*/Title/Name'">User libraries</translate>
+          <translate translate-context="Content/*/Title/Name">User libraries</translate>
         </h2>
         <library-widget @loaded="libraries = $event" :url="'albums/' + id + '/libraries/'">
-          <translate slot="subtitle" :translate-context="'Content/Album/Paragraph'">This album is present in the following libraries:</translate>
+          <translate slot="subtitle" translate-context="Content/Album/Paragraph">This album is present in the following libraries:</translate>
         </library-widget>
       </section>
     </template>
diff --git a/front/src/components/library/Albums.vue b/front/src/components/library/Albums.vue
index 78014f240aff870f58977861b64e21f7bcb9687b..ea717d77505ff243ada746276ddb00cbde906639 100644
--- a/front/src/components/library/Albums.vue
+++ b/front/src/components/library/Albums.vue
@@ -2,18 +2,18 @@
   <main v-title="labels.title">
     <section class="ui vertical stripe segment">
       <h2 class="ui header">
-        <translate :translate-context="'Content/Album/Title'">Browsing albums</translate>
+        <translate translate-context="Content/Album/Title">Browsing albums</translate>
       </h2>
       <div :class="['ui', {'loading': isLoading}, 'form']">
         <div class="fields">
           <div class="field">
             <label>
-              <translate :translate-context="'Content/Search/Input.Label/Verb'">Search</translate>
+              <translate translate-context="Content/Search/Input.Label/Verb">Search</translate>
             </label>
             <input type="text" name="search" v-model="query" :placeholder="labels.searchPlaceholder"/>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/Search/Dropdown.Label/Noun'">Ordering</translate></label>
+            <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
             <select class="ui dropdown" v-model="ordering">
               <option v-for="option in orderingOptions" :value="option[0]">
                 {{ sharedLabels.filters[option[1]] }}
@@ -21,14 +21,14 @@
             </select>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/Search/Dropdown.Label/Noun'">Ordering direction</translate></label>
+            <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering direction</translate></label>
             <select class="ui dropdown" v-model="orderingDirection">
-              <option value="+"><translate :translate-context="'Content/Search/Dropdown'">Ascending</translate></option>
-              <option value="-"><translate :translate-context="'Content/Search/Dropdown'">Descending</translate></option>
+              <option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option>
+              <option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option>
             </select>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/Search/Dropdown.Label/Noun'">Results per page</translate></label>
+            <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Results per page</translate></label>
             <select class="ui dropdown" v-model="paginateBy">
               <option :value="parseInt(12)">12</option>
               <option :value="parseInt(25)">25</option>
diff --git a/front/src/components/library/Artist.vue b/front/src/components/library/Artist.vue
index b23153d22ccee202efdcb30bb0645b7130bb11ba..f32f2c729e5a1701c22c48f00a308e21d29abdfc 100644
--- a/front/src/components/library/Artist.vue
+++ b/front/src/components/library/Artist.vue
@@ -11,7 +11,7 @@
             <div class="content">
               {{ artist.name }}
               <div class="sub header" v-if="albums">
-                <translate :translate-context="'Content/Artist/Paragraph'"
+                <translate translate-context="Content/Artist/Paragraph"
                   tag="div"
                   translate-plural="%{ count } tracks in %{ albumsCount } albums"
                   :translate-n="totalTracks"
@@ -24,27 +24,27 @@
           <div class="ui hidden divider"></div>
           <radio-button type="artist" :object-id="artist.id"></radio-button>
           <play-button :is-playable="isPlayable" class="orange" :artist="artist">
-            <translate :translate-context="'Content/Artist/Button.Label/Verb'">Play all albums</translate>
+            <translate translate-context="Content/Artist/Button.Label/Verb">Play all albums</translate>
           </play-button>
 
           <a :href="wikipediaUrl" target="_blank" class="ui icon labeled button">
             <i class="wikipedia w icon"></i>
-            <translate :translate-context="'Content/*/Button.Label/Verb'">Search on Wikipedia</translate>
+            <translate translate-context="Content/*/Button.Label/Verb">Search on Wikipedia</translate>
           </a>
           <a v-if="musicbrainzUrl" :href="musicbrainzUrl" target="_blank" class="ui button">
             <i class="external icon"></i>
-            <translate :translate-context="'Content/*/Button.Label/Verb'">View on MusicBrainz</translate>
+            <translate translate-context="Content/*/Button.Label/Verb">View on MusicBrainz</translate>
           </a>
           <template v-if="publicLibraries.length > 0">
             <button
               @click="showEmbedModal = !showEmbedModal"
               class="ui button icon labeled">
               <i class="code icon"></i>
-              <translate :translate-context="'Content/*/Button.Label/Verb'">Embed</translate>
+              <translate translate-context="Content/*/Button.Label/Verb">Embed</translate>
             </button>
             <modal :show.sync="showEmbedModal">
               <div class="header">
-                <translate :translate-context="'Popup/Artist/Title/Verb'">Embed this artist work on your website</translate>
+                <translate translate-context="Popup/Artist/Title/Verb">Embed this artist work on your website</translate>
               </div>
               <div class="content">
                 <div class="description">
@@ -54,7 +54,7 @@
               </div>
               <div class="actions">
                 <div class="ui deny button">
-                  <translate :translate-context="'Popup/*/Button.Label/Verb'">Cancel</translate>
+                  <translate translate-context="Popup/*/Button.Label/Verb">Cancel</translate>
                 </div>
               </div>
             </modal>
@@ -68,10 +68,10 @@
             <translate>You are currently hiding content related to this artist.</translate>
           </p>
           <router-link class="right floated" :to="{name: 'settings'}">
-            <translate :translate-context="'Content/Moderation/Link'">Review my filters</translate>
+            <translate translate-context="Content/Moderation/Link">Review my filters</translate>
           </router-link>
           <button @click="$store.dispatch('moderation/deleteContentFilter', contentFilter.uuid)" class="ui basic tiny button">
-            <translate :translate-context="'Content/Moderation/Button.Label'">Remove filter</translate>
+            <translate translate-context="Content/Moderation/Button.Label">Remove filter</translate>
           </button>
         </div>
       </div>
@@ -80,7 +80,7 @@
       </section>
       <section v-else-if="albums && albums.length > 0" class="ui vertical stripe segment">
         <h2>
-          <translate :translate-context="'Content/Artist/Title'">Albums by this artist</translate>
+          <translate translate-context="Content/Artist/Title">Albums by this artist</translate>
         </h2>
         <div class="ui cards" >
           <album-card :mode="'rich'" :album="album" :key="album.id" v-for="album in albums"></album-card>
@@ -88,16 +88,16 @@
       </section>
       <section v-if="tracks.length > 0" class="ui vertical stripe segment">
         <h2>
-          <translate :translate-context="'Content/Artist/Title'">Tracks by this artist</translate>
+          <translate translate-context="Content/Artist/Title">Tracks by this artist</translate>
         </h2>
         <track-table :display-position="true" :tracks="tracks"></track-table>
       </section>
       <section class="ui vertical stripe segment">
         <h2>
-          <translate :translate-context="'Content/Artist/Title'">User libraries</translate>
+          <translate translate-context="Content/Artist/Title">User libraries</translate>
         </h2>
         <library-widget @loaded="libraries = $event" :url="'artists/' + id + '/libraries/'">
-          <translate :translate-context="'Content/Artist/Paragraph'" slot="subtitle">This artist is present in the following libraries:</translate>
+          <translate translate-context="Content/Artist/Paragraph" slot="subtitle">This artist is present in the following libraries:</translate>
         </library-widget>
       </section>
     </template>
diff --git a/front/src/components/library/Artists.vue b/front/src/components/library/Artists.vue
index 64e5ab6c944e45cde389b081a2fa3102470a3ed0..f5f1dc47878f18f801807baf36fb306e62780ab2 100644
--- a/front/src/components/library/Artists.vue
+++ b/front/src/components/library/Artists.vue
@@ -2,18 +2,18 @@
   <main v-title="labels.title">
     <section class="ui vertical stripe segment">
       <h2 class="ui header">
-        <translate :translate-context="'Content/Artist/Title'">Browsing artists</translate>
+        <translate translate-context="Content/Artist/Title">Browsing artists</translate>
       </h2>
       <div :class="['ui', {'loading': isLoading}, 'form']">
         <div class="fields">
           <div class="field">
             <label>
-              <translate :translate-context="'Content/Search/Input.Label/Verb'">Search</translate>
+              <translate translate-context="Content/Search/Input.Label/Verb">Search</translate>
             </label>
             <input type="text" name="search" v-model="query" :placeholder="labels.searchPlaceholder"/>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/Search/Dropdown.Label/Noun'">Ordering</translate></label>
+            <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
             <select class="ui dropdown" v-model="ordering">
               <option v-for="option in orderingOptions" :value="option[0]">
                 {{ sharedLabels.filters[option[1]] }}
@@ -21,14 +21,14 @@
             </select>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/Search/Dropdown.Label/Noun'">Ordering direction</translate></label>
+            <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering direction</translate></label>
             <select class="ui dropdown" v-model="orderingDirection">
-              <option value="+"><translate :translate-context="'Content/Search/Dropdown'">Ascending</translate></option>
-              <option value="-"><translate :translate-context="'Content/Search/Dropdown'">Descending</translate></option>
+              <option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option>
+              <option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option>
             </select>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/Search/Dropdown.Label'">Results per page</translate></label>
+            <label><translate translate-context="Content/Search/Dropdown.Label">Results per page</translate></label>
             <select class="ui dropdown" v-model="paginateBy">
               <option :value="parseInt(12)">12</option>
               <option :value="parseInt(25)">25</option>
diff --git a/front/src/components/library/EditCard.vue b/front/src/components/library/EditCard.vue
index 88a512373bbcff4643e1d1127d2a155787191f7d..e3ef71a9b591fcbb6310d1d30daa2a860cf65c94 100644
--- a/front/src/components/library/EditCard.vue
+++ b/front/src/components/library/EditCard.vue
@@ -3,7 +3,7 @@
     <div class="content">
       <div class="header">
         <router-link :to="detailUrl">
-          <translate :translate-context="'Content/Library/Card/Short'" :translate-params="{id: obj.uuid.substring(0, 8)}">Modification %{ id }</translate>
+          <translate translate-context="Content/Library/Card/Short" :translate-params="{id: obj.uuid.substring(0, 8)}">Modification %{ id }</translate>
         </router-link>
       </div>
       <div class="meta">
@@ -11,7 +11,7 @@
           v-if="obj.target && obj.target.type === 'track'"
           :to="{name: 'library.tracks.detail', params: {id: obj.target.id }}">
           <i class="music icon"></i>
-          <translate :translate-context="'Content/Library/Card/Short'" :translate-params="{id: obj.target.id, name: obj.target.repr}">Track #%{ id } - %{ name }</translate>
+          <translate translate-context="Content/Library/Card/Short" :translate-params="{id: obj.target.id, name: obj.target.repr}">Track #%{ id } - %{ name }</translate>
         </router-link>
         <br>
         <human-date :date="obj.creation_date" :icon="true"></human-date>
@@ -19,19 +19,19 @@
         <span class="right floated">
           <span v-if="obj.is_approved && obj.is_applied">
             <i class="green check icon"></i>
-            <translate :translate-context="'Content/Library/Card/Short'">Approved and applied</translate>
+            <translate translate-context="Content/Library/Card/Short">Approved and applied</translate>
           </span>
           <span v-else-if="obj.is_approved">
             <i class="green check icon"></i>
-            <translate :translate-context="'Content/Library/Card/Short'">Approved</translate>
+            <translate translate-context="Content/Library/Card/Short">Approved</translate>
           </span>
           <span v-else-if="obj.is_approved === null">
             <i class="yellow hourglass icon"></i>
-            <translate :translate-context="'Content/Library/Card/Short'">Pending review</translate>
+            <translate translate-context="Content/Library/Card/Short">Pending review</translate>
           </span>
           <span v-else-if="obj.is_approved === false">
             <i class="red x icon"></i>
-            <translate :translate-context="'Content/Library/Card/Short'">Rejected</translate>
+            <translate translate-context="Content/Library/Card/Short">Rejected</translate>
           </span>
         </span>
       </div>
@@ -43,9 +43,9 @@
       <table v-if="obj.type === 'update'" class="ui celled very basic fixed stacking table">
         <thead>
           <tr>
-            <th><translate :translate-context="'Content/Library/Card.Table.Header/Short'">Field</translate></th>
-            <th><translate :translate-context="'Content/Library/Card.Table.Header/Short'">Old value</translate></th>
-            <th><translate :translate-context="'Content/Library/Card.Table.Header/Short'">New value</translate></th>
+            <th><translate translate-context="Content/Library/Card.Table.Header/Short">Field</translate></th>
+            <th><translate translate-context="Content/Library/Card.Table.Header/Short">Old value</translate></th>
+            <th><translate translate-context="Content/Library/Card.Table.Header/Short">New value</translate></th>
           </tr>
         </thead>
         <tbody>
@@ -58,7 +58,7 @@
               </span>
             </td>
             <td v-else>
-              <translate :translate-context="'*/*/*'">N/A</translate>
+              <translate translate-context="*/*/*">N/A</translate>
             </td>
 
             <td v-if="field.diff">
@@ -79,24 +79,24 @@
         v-if="canApprove && obj.is_approved !== true"
         @click="approve(true)"
         :class="['ui', {loading: isLoading}, 'green', 'basic', 'button']">
-        <translate :translate-context="'Content/Library/Button.Label'">Approve</translate>
+        <translate translate-context="Content/Library/Button.Label">Approve</translate>
       </button>
       <button
         v-if="canApprove && obj.is_approved === null"
         @click="approve(false)"
         :class="['ui', {loading: isLoading}, 'yellow', 'basic', 'button']">
-        <translate :translate-context="'Content/Library/Button.Label'">Reject</translate>
+        <translate translate-context="Content/Library/Button.Label">Reject</translate>
       </button>
       <dangerous-button
         v-if="canDelete"
         :class="['ui', {loading: isLoading}, 'basic button']"
         :action="remove">
-        <translate :translate-context="'*/*/*/Verb'">Delete</translate>
-        <p slot="modal-header"><translate :translate-context="'Popup/Library/Title'">Delete this suggestion?</translate></p>
+        <translate translate-context="*/*/*/Verb">Delete</translate>
+        <p slot="modal-header"><translate translate-context="Popup/Library/Title">Delete this suggestion?</translate></p>
         <div slot="modal-content">
-          <p><translate :translate-context="'Popup/Library/Paragraph'">The suggestion will be completely removed, this action is irreversible.</translate></p>
+          <p><translate translate-context="Popup/Library/Paragraph">The suggestion will be completely removed, this action is irreversible.</translate></p>
         </div>
-        <p slot="modal-confirm"><translate :translate-context="'Popup/Library/Button.Label'">Delete</translate></p>
+        <p slot="modal-confirm"><translate translate-context="Popup/Library/Button.Label">Delete</translate></p>
       </dangerous-button>
     </div>
   </div>
diff --git a/front/src/components/library/EditForm.vue b/front/src/components/library/EditForm.vue
index e98a4a6567d749d9a4e92a21a9686f38d37ef45c..55013293f4eea751e56b87607294342a2a0069ef 100644
--- a/front/src/components/library/EditForm.vue
+++ b/front/src/components/library/EditForm.vue
@@ -1,11 +1,11 @@
 <template>
   <div v-if="submittedMutation">
     <div class="ui positive message">
-      <div class="header"><translate :translate-context="'Content/Library/Paragraph'">Your edit was successfully submitted.</translate></div>
+      <div class="header"><translate translate-context="Content/Library/Paragraph">Your edit was successfully submitted.</translate></div>
     </div>
     <edit-card :obj="submittedMutation" :current-state="currentState" />
     <button class="ui button" @click.prevent="submittedMutation = null">
-      <translate :translate-context="'Content/Library/Button.Label'">
+      <translate translate-context="Content/Library/Button.Label">
         Submit another edit
       </translate>
     </button>
@@ -15,28 +15,28 @@
     <edit-list :filters="editListFilters" :url="mutationsUrl" :obj="object" :currentState="currentState">
       <div slot="title">
         <template v-if="showPendingReview">
-          <translate :translate-context="'Content/Library/Paragraph'">
+          <translate translate-context="Content/Library/Paragraph">
             Recent edits awaiting review
           </translate>
           <button class="ui tiny basic right floated button" @click.prevent="showPendingReview = false">
-            <translate :translate-context="'Content/Library/Button.Label'">
+            <translate translate-context="Content/Library/Button.Label">
               Show all edits
             </translate>
           </button>
         </template>
         <template v-else>
-          <translate :translate-context="'Content/Library/Paragraph'">
+          <translate translate-context="Content/Library/Paragraph">
             Recent edits
           </translate>
           <button class="ui tiny basic right floated button" @click.prevent="showPendingReview = true">
-            <translate :translate-context="'Content/Library/Button.Label'">
+            <translate translate-context="Content/Library/Button.Label">
               Retrict to unreviewed edits
             </translate>
           </button>
         </template>
       </div>
       <empty-state slot="empty-state">
-        <translate :translate-context="'Content/Library/Paragraph'">
+        <translate translate-context="Content/Library/Paragraph">
           Suggest a change using the form below.
         </translate>
       </empty-state>
@@ -44,13 +44,13 @@
     <form class="ui form" @submit.prevent="submit()">
       <div class="ui hidden divider"></div>
       <div v-if="errors.length > 0" class="ui negative message">
-        <div class="header"><translate :translate-context="'Content/Library/Error message.Title'">Error while submitting edit</translate></div>
+        <div class="header"><translate translate-context="Content/Library/Error message.Title">Error while submitting edit</translate></div>
         <ul class="list">
           <li v-for="error in errors">{{ error }}</li>
         </ul>
       </div>
       <div v-if="!canEdit" class="ui message">
-        <translate :translate-context="'Content/Library/Paragraph'">
+        <translate translate-context="Content/Library/Paragraph">
           You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval.
         </translate>
       </div>
@@ -62,12 +62,12 @@
         <div v-if="values[fieldConfig.id] != initialValues[fieldConfig.id]">
           <button class="ui tiny basic right floated reset button" form="noop" @click.prevent="values[fieldConfig.id] = initialValues[fieldConfig.id]">
             <i class="undo icon"></i>
-            <translate :translate-context="'Content/Library/Button.Label'" :translate-params="{value: initialValues[fieldConfig.id]}">Reset to initial value: %{ value }</translate>
+            <translate translate-context="Content/Library/Button.Label" :translate-params="{value: initialValues[fieldConfig.id]}">Reset to initial value: %{ value }</translate>
           </button>
         </div>
       </div>
       <div class="field">
-        <label for="summary"><translate :translate-context="'*/*/*'">Summary (optional)</translate></label>
+        <label for="summary"><translate translate-context="*/*/*">Summary (optional)</translate></label>
         <textarea name="change-summary" v-model="summary" id="change-summary" rows="3" :placeholder="labels.summaryPlaceholder"></textarea>
       </div>
       <router-link
@@ -75,11 +75,11 @@
         v-if="objectType === 'track'"
         :to="{name: 'library.tracks.detail', params: {id: object.id }}"
       >
-        <translate :translate-context="'Content/*/Button.Label'">Cancel</translate>
+        <translate translate-context="Content/*/Button.Label">Cancel</translate>
       </router-link>
       <button :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit" :disabled="isLoading || !mutationPayload">
-        <translate v-if="canEdit" key="1" :translate-context="'Content/Library/Button.Label/Verb'">Submit and apply edit</translate>
-        <translate v-else key="2" :translate-context="'Content/Library/Button.Label/Verb'">Submit suggestion</translate>
+        <translate v-if="canEdit" key="1" translate-context="Content/Library/Button.Label/Verb">Submit and apply edit</translate>
+        <translate v-else key="2" translate-context="Content/Library/Button.Label/Verb">Submit suggestion</translate>
       </button>
       </form>
     </div>
diff --git a/front/src/components/library/FileUpload.vue b/front/src/components/library/FileUpload.vue
index 8a867dadf926414e9adac04a0f089a6226fc54ba..be5ead114dd39aef3536b05e95283f025cc44791 100644
--- a/front/src/components/library/FileUpload.vue
+++ b/front/src/components/library/FileUpload.vue
@@ -1,9 +1,9 @@
   <template>
   <div>
     <div class="ui top attached tabular menu">
-      <a :class="['item', {active: currentTab === 'summary'}]" @click="currentTab = 'summary'"><translate :translate-context="'Content/Library/Tab.Title/Short'">Summary</translate></a>
+      <a :class="['item', {active: currentTab === 'summary'}]" @click="currentTab = 'summary'"><translate translate-context="Content/Library/Tab.Title/Short">Summary</translate></a>
       <a :class="['item', {active: currentTab === 'uploads'}]" @click="currentTab = 'uploads'">
-        <translate :translate-context="'Content/Library/Tab.Title/Short'">Uploading</translate>
+        <translate translate-context="Content/Library/Tab.Title/Short">Uploading</translate>
         <div v-if="files.length === 0" class="ui label">
           0
         </div>
@@ -15,7 +15,7 @@
         </div>
       </a>
       <a :class="['item', {active: currentTab === 'processing'}]" @click="currentTab = 'processing'">
-        <translate :translate-context="'Content/Library/Tab.Title/Short'">Processing</translate>
+        <translate translate-context="Content/Library/Tab.Title/Short">Processing</translate>
         <div v-if="processableFiles === 0" class="ui label">
           0
         </div>
@@ -29,19 +29,19 @@
     </div>
 
     <div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'summary'}]">
-      <h2 class="ui header"><translate :translate-context="'Content/Library/Title/Verb'">Upload new tracks</translate></h2>
+      <h2 class="ui header"><translate translate-context="Content/Library/Title/Verb">Upload new tracks</translate></h2>
       <div class="ui message">
-        <p><translate :translate-context="'Content/Library/Paragraph'">You are about to upload music to your library. Before proceeding, please ensure that:</translate></p>
+        <p><translate translate-context="Content/Library/Paragraph">You are about to upload music to your library. Before proceeding, please ensure that:</translate></p>
         <ul>
           <li v-if="library.privacy_level != 'me'">
-            <translate :translate-context="'Content/Library/List item'">You are not uploading copyrighted content in a public library, otherwise you may be infringing the law</translate>
+            <translate translate-context="Content/Library/List item">You are not uploading copyrighted content in a public library, otherwise you may be infringing the law</translate>
           </li>
           <li>
-            <translate :translate-context="'Content/Library/List item'">The music files you are uploading are tagged properly.</translate>&nbsp;
-            <a href="http://picard.musicbrainz.org/" target='_blank'><translate :translate-context="'Content/Library/Link'">We recommend using Picard for that purpose.</translate></a>
+            <translate translate-context="Content/Library/List item">The music files you are uploading are tagged properly.</translate>&nbsp;
+            <a href="http://picard.musicbrainz.org/" target='_blank'><translate translate-context="Content/Library/Link">We recommend using Picard for that purpose.</translate></a>
           </li>
           <li>
-            <translate :translate-context="'Content/Library/List item'">The uploaded music files are in OGG, Flac or MP3 format</translate>
+            <translate translate-context="Content/Library/List item">The uploaded music files are in OGG, Flac or MP3 format</translate>
           </li>
         </ul>
       </div>
@@ -49,14 +49,14 @@
       <div class="ui form">
         <div class="fields">
           <div class="ui four wide field">
-            <label><translate :translate-context="'Content/Library/Input.Label/Noun'">Import reference</translate></label>
-            <p><translate :translate-context="'Content/Library/Paragraph'">This reference will be used to group imported files together.</translate></p>
+            <label><translate translate-context="Content/Library/Input.Label/Noun">Import reference</translate></label>
+            <p><translate translate-context="Content/Library/Paragraph">This reference will be used to group imported files together.</translate></p>
             <input name="import-ref" type="text" v-model="importReference" />
           </div>
         </div>
 
       </div>
-      <div class="ui green button" @click="currentTab = 'uploads'"><translate :translate-context="'Content/Library/Button.Label'">Proceed</translate></div>
+      <div class="ui green button" @click="currentTab = 'uploads'"><translate translate-context="Content/Library/Button.Label">Proceed</translate></div>
     </div>
     <div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'uploads'}]">
       <div class="ui container">
@@ -73,10 +73,10 @@
           @input-file="inputFile"
           ref="upload">
           <i class="upload icon"></i>&nbsp;
-          <translate :translate-context="'Content/Library/Paragraph/Call to action'">Click to select files to upload or drag and drop files or directories</translate>
+          <translate translate-context="Content/Library/Paragraph/Call to action">Click to select files to upload or drag and drop files or directories</translate>
           <br />
           <br />
-          <i><translate :translate-context="'Content/Library/Paragraph'" :translate-params="{extensions: supportedExtensions.join(', ')}">Supported extensions: %{ extensions }</translate></i>
+          <i><translate translate-context="Content/Library/Paragraph" :translate-params="{extensions: supportedExtensions.join(', ')}">Supported extensions: %{ extensions }</translate></i>
         </file-upload-widget>
       </div>
       <div v-if="files.length > 0" class="table-wrapper">
@@ -84,9 +84,9 @@
         <table class="ui unstackable table">
           <thead>
             <tr>
-              <th><translate :translate-context="'Content/Library/Table.Label'">Filename</translate></th>
-              <th><translate :translate-context="'Content/Library/Table.Label'">Size</translate></th>
-              <th><translate :translate-context="'Content/Library/Table.Label'">Status</translate></th>
+              <th><translate translate-context="Content/Library/Table.Label">Filename</translate></th>
+              <th><translate translate-context="Content/Library/Table.Label">Size</translate></th>
+              <th><translate translate-context="Content/Library/Table.Label">Status</translate></th>
             </tr>
           </thead>
           <tbody>
@@ -100,14 +100,14 @@
                   </span>
                 </span>
                 <span v-else-if="file.success" class="ui green label">
-                  <translate :translate-context="'Content/Library/Table'" key="1">Uploaded</translate>
+                  <translate translate-context="Content/Library/Table" key="1">Uploaded</translate>
                 </span>
                 <span v-else-if="file.active" class="ui yellow label">
-                  <translate :translate-context="'Content/Library/Table'" key="2">Uploading…</translate>
+                  <translate translate-context="Content/Library/Table" key="2">Uploading…</translate>
                   ({{ parseInt(file.progress) }}%)
                 </span>
                 <template v-else>
-                  <span class="ui label"><translate :translate-context="'Content/Library/Table'" key="3">Pending</translate></span>
+                  <span class="ui label"><translate translate-context="Content/Library/Table" key="3">Pending</translate></span>
                   <button class="ui tiny basic red icon button" @click.prevent="$refs.upload.remove(file)"><i class="delete icon"></i></button>
                 </template>
               </td>
diff --git a/front/src/components/library/Home.vue b/front/src/components/library/Home.vue
index 42653c3a573b6a21ec865be0df237327f671490e..d26b39b3f8816b722707479f775c9f10784dd49e 100644
--- a/front/src/components/library/Home.vue
+++ b/front/src/components/library/Home.vue
@@ -4,17 +4,17 @@
       <div class="ui stackable three column grid">
         <div class="column">
           <track-widget :url="'history/listenings/'" :filters="{scope: 'user', ordering: '-creation_date'}">
-            <template slot="title"><translate :translate-context="'Content/Home/Title'">Recently listened</translate></template>
+            <template slot="title"><translate translate-context="Content/Home/Title">Recently listened</translate></template>
           </track-widget>
         </div>
         <div class="column">
           <track-widget :url="'favorites/tracks/'" :filters="{scope: 'user', ordering: '-creation_date'}">
-            <template slot="title"><translate :translate-context="'Content/Home/Title'">Recently favorited</translate></template>
+            <template slot="title"><translate translate-context="Content/Home/Title">Recently favorited</translate></template>
           </track-widget>
         </div>
         <div class="column">
           <playlist-widget :url="'playlists/'" :filters="{scope: 'user', playable: true, ordering: '-creation_date'}">
-            <template slot="title"><translate :translate-context="'Content/Home/Title'">Playlists</translate></template>
+            <template slot="title"><translate translate-context="Content/Home/Title">Playlists</translate></template>
           </playlist-widget>
         </div>
       </div>
@@ -22,7 +22,7 @@
       <div class="ui stackable one column grid">
         <div class="column">
           <album-widget :filters="{playable: true, ordering: '-creation_date'}">
-            <template slot="title"><translate :translate-context="'Content/Home/Title'">Recently added</translate></template>
+            <template slot="title"><translate translate-context="Content/Home/Title">Recently added</translate></template>
           </album-widget>
         </div>
       </div>
diff --git a/front/src/components/library/Library.vue b/front/src/components/library/Library.vue
index 06fdd2bd3034eae5c3619ae3e4645dcb065802fd..bcec59deccbef7f84d1ac99e3db3698b6e2beacb 100644
--- a/front/src/components/library/Library.vue
+++ b/front/src/components/library/Library.vue
@@ -2,19 +2,19 @@
   <div class="main library pusher">
     <nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu">
       <router-link class="ui item" to="/library" exact>
-        <translate :translate-context="'Menu/Home/Link/Verb'">Browse</translate>
+        <translate translate-context="Menu/Home/Link/Verb">Browse</translate>
       </router-link>
       <router-link class="ui item" to="/library/albums" exact>
-        <translate :translate-context="'Menu/Home/Link'">Albums</translate>
+        <translate translate-context="Menu/Home/Link">Albums</translate>
       </router-link>
       <router-link class="ui item" to="/library/artists" exact>
-        <translate :translate-context="'Menu/Home/Link'">Artists</translate>
+        <translate translate-context="Menu/Home/Link">Artists</translate>
       </router-link>
       <router-link class="ui item" to="/library/radios" exact>
-        <translate :translate-context="'Menu/Home/Link'">Radios</translate>
+        <translate translate-context="Menu/Home/Link">Radios</translate>
       </router-link>
       <router-link class="ui item" to="/library/playlists" exact>
-        <translate :translate-context="'Menu/Home/Link'">Playlists</translate>
+        <translate translate-context="Menu/Home/Link">Playlists</translate>
       </router-link>
     </nav>
     <router-view :key="$route.fullPath"></router-view>
diff --git a/front/src/components/library/Radios.vue b/front/src/components/library/Radios.vue
index 273d6ca7963fb4c91b3e4e45fbc9e4ef09686d5f..2567dcfb8dabc30dc28500e863e1d61be40df0f8 100644
--- a/front/src/components/library/Radios.vue
+++ b/front/src/components/library/Radios.vue
@@ -2,12 +2,12 @@
   <main v-title="labels.title">
     <section class="ui vertical stripe segment">
       <h2 class="ui header">
-        <translate :translate-context="'Content/Radio/Title'">Browsing radios</translate>
+        <translate translate-context="Content/Radio/Title">Browsing radios</translate>
       </h2>
       <div class="ui hidden divider"></div>
       <div class="ui row">
         <h3 class="ui header">
-          <translate :translate-context="'Content/Radio/Title'">Instance radios</translate>
+          <translate translate-context="Content/Radio/Title">Instance radios</translate>
         </h3>
         <div class="ui cards">
           <radio-card :type="'favorites'"></radio-card>
@@ -18,20 +18,20 @@
 
       <div class="ui hidden divider"></div>
       <h3 class="ui header">
-        <translate :translate-context="'Content/Radio/Title'">User radios</translate>
+        <translate translate-context="Content/Radio/Title">User radios</translate>
       </h3>
       <router-link class="ui green basic button" to="/library/radios/build" exact>
-        <translate :translate-context="'Content/Radio/Button.Label/Verb'">Create your own radio</translate>
+        <translate translate-context="Content/Radio/Button.Label/Verb">Create your own radio</translate>
       </router-link>
       <div class="ui hidden divider"></div>
       <div :class="['ui', {'loading': isLoading}, 'form']">
         <div class="fields">
           <div class="field">
-            <label><translate :translate-context="'Content/Search/Input.Label/Verb'">Search</translate></label>
+            <label><translate translate-context="Content/Search/Input.Label/Verb">Search</translate></label>
             <input name="search" type="text" v-model="query" :placeholder="labels.searchPlaceholder"/>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/Search/Dropdown.Label'">Ordering</translate></label>
+            <label><translate translate-context="Content/Search/Dropdown.Label">Ordering</translate></label>
             <select class="ui dropdown" v-model="ordering">
               <option v-for="option in orderingOptions" :value="option[0]">
                 {{ sharedLabels.filters[option[1]] }}
@@ -39,18 +39,18 @@
             </select>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/Search/Dropdown.Label'">Order</translate></label>
+            <label><translate translate-context="Content/Search/Dropdown.Label">Order</translate></label>
             <select class="ui dropdown" v-model="orderingDirection">
               <option value="+">
-                <translate :translate-context="'Content/Search/Dropdown'">Ascending</translate>
+                <translate translate-context="Content/Search/Dropdown">Ascending</translate>
               </option>
               <option value="-">
-                <translate :translate-context="'Content/Search/Dropdown'">Descending</translate>
+                <translate translate-context="Content/Search/Dropdown">Descending</translate>
               </option>
             </select>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/Search/Dropdown.Label'">Results per page</translate></label>
+            <label><translate translate-context="Content/Search/Dropdown.Label">Results per page</translate></label>
             <select class="ui dropdown" v-model="paginateBy">
               <option :value="parseInt(12)">12</option>
               <option :value="parseInt(25)">25</option>
diff --git a/front/src/components/library/TrackBase.vue b/front/src/components/library/TrackBase.vue
index c0209732df3698c5bee50b75194de52e339989d0..34ce4a2954598cbcb0b83a8509bf26c55dc31ede 100644
--- a/front/src/components/library/TrackBase.vue
+++ b/front/src/components/library/TrackBase.vue
@@ -15,7 +15,7 @@
             <div class="content">
               {{ track.title }}
               <div class="sub header">
-                <div :translate-context="'Content/Track/Paragraph'"
+                <div translate-context="Content/Track/Paragraph"
                   v-translate="{album: track.album.title, artist: track.artist.name, albumUrl: albumUrl, artistUrl: artistUrl}"
                 >From album <a class="internal" href="%{ albumUrl }">%{ album }</a> by <a class="internal" href="%{ artistUrl }">%{ artist }</a></div>
               </div>
@@ -23,33 +23,33 @@
           </h2>
 
           <play-button class="orange" :track="track">
-            <translate :translate-context="'*/Queue/Button.Label/Short, Verb'">Play</translate>
+            <translate translate-context="*/Queue/Button.Label/Short, Verb">Play</translate>
           </play-button>
           <track-favorite-icon :track="track" :button="true"></track-favorite-icon>
           <track-playlist-icon :button="true" v-if="$store.state.auth.authenticated" :track="track"></track-playlist-icon>
 
           <a :href="wikipediaUrl" target="_blank" class="ui icon labeled button">
             <i class="wikipedia w icon"></i>
-            <translate :translate-context="'Content/*/Link/Verb'">Search on Wikipedia</translate>
+            <translate translate-context="Content/*/Link/Verb">Search on Wikipedia</translate>
           </a>
           <a v-if="musicbrainzUrl" :href="musicbrainzUrl" target="_blank" class="ui icon labeled button">
             <i class="external icon"></i>
-            <translate :translate-context="'Content/*/Link/Verb'">View on MusicBrainz</translate>
+            <translate translate-context="Content/*/Link/Verb">View on MusicBrainz</translate>
           </a>
           <a v-if="upload" :href="downloadUrl" target="_blank" class="ui icon labeled button">
             <i class="download icon"></i>
-            <translate :translate-context="'Content/Track/Link/Verb'">Download</translate>
+            <translate translate-context="Content/Track/Link/Verb">Download</translate>
           </a>
           <template v-if="publicLibraries.length > 0">
             <button
               @click="showEmbedModal = !showEmbedModal"
               class="ui icon labeled button">
               <i class="code icon"></i>
-              <translate :translate-context="'Content/Track/Button.Label/Verb'">Embed</translate>
+              <translate translate-context="Content/Track/Button.Label/Verb">Embed</translate>
             </button>
             <modal :show.sync="showEmbedModal">
               <div class="header">
-                <translate :translate-context="'Popup/Track/Title'">Embed this track on your website</translate>
+                <translate translate-context="Popup/Track/Title">Embed this track on your website</translate>
               </div>
               <div class="content">
                 <div class="description">
@@ -59,7 +59,7 @@
               </div>
               <div class="actions">
                 <div class="ui deny button">
-                  <translate :translate-context="'Popup/Track/Button/Verb'">Cancel</translate>
+                  <translate translate-context="Popup/Track/Button/Verb">Cancel</translate>
                 </div>
               </div>
             </modal>
@@ -68,7 +68,7 @@
             :to="{name: 'library.tracks.edit', params: {id: track.id }}"
             class="ui icon labeled button">
             <i class="edit icon"></i>
-            <translate :translate-context="'Content/Track/Button.Label/Verb'">Edit…</translate>
+            <translate translate-context="Content/Track/Button.Label/Verb">Edit…</translate>
           </router-link>
         </div>
       </section>
diff --git a/front/src/components/library/TrackDetail.vue b/front/src/components/library/TrackDetail.vue
index 7f6d27dc1316aaba9fffa6d9890f73edbf86737f..8f65a7d0ddcd79ff59acd59dd950a620fa059fce 100644
--- a/front/src/components/library/TrackDetail.vue
+++ b/front/src/components/library/TrackDetail.vue
@@ -3,64 +3,64 @@
   <div v-if="track">
     <section class="ui vertical stripe center aligned segment">
       <h2 class="ui header">
-        <translate :translate-context="'Content/Track/Title/Noun'">Track information</translate>
+        <translate translate-context="Content/Track/Title/Noun">Track information</translate>
       </h2>
       <table class="ui very basic collapsing celled center aligned table">
         <tbody>
           <tr>
             <td>
-              <translate :translate-context="'Content/Track/Table.Label/Noun'">Copyright</translate>
+              <translate translate-context="Content/Track/Table.Label/Noun">Copyright</translate>
             </td>
             <td v-if="track.copyright" :title="track.copyright">{{ track.copyright|truncate(50) }}</td>
             <td v-else>
-              <translate :translate-context="'Content/Track/Table.Paragraph'">No copyright information available for this track</translate>
+              <translate translate-context="Content/Track/Table.Paragraph">No copyright information available for this track</translate>
             </td>
           </tr>
           <tr>
             <td>
-              <translate :translate-context="'Content/Track/Table.Label/Noun'">License</translate>
+              <translate translate-context="Content/Track/Table.Label/Noun">License</translate>
             </td>
             <td v-if="license">
               <a :href="license.url" target="_blank" rel="noopener noreferrer">{{ license.name }}</a>
             </td>
             <td v-else>
-              <translate :translate-context="'Content/Track/Table.Paragraph'">No licensing information for this track</translate>
+              <translate translate-context="Content/Track/Table.Paragraph">No licensing information for this track</translate>
             </td>
           </tr>
           <tr>
             <td>
-              <translate :translate-context="'Content/Track/Table.Label'">Duration</translate>
+              <translate translate-context="Content/Track/Table.Label">Duration</translate>
             </td>
             <td v-if="upload && upload.duration">{{ time.parse(upload.duration) }}</td>
             <td v-else>
-              <translate :translate-context="'*/*/*'">N/A</translate>
+              <translate translate-context="*/*/*">N/A</translate>
             </td>
           </tr>
           <tr>
             <td>
-              <translate :translate-context="'Content/Track/Table.Label'">Size</translate>
+              <translate translate-context="Content/Track/Table.Label">Size</translate>
             </td>
             <td v-if="upload && upload.size">{{ upload.size | humanSize }}</td>
             <td v-else>
-              <translate :translate-context="'*/*/*'">N/A</translate>
+              <translate translate-context="*/*/*">N/A</translate>
             </td>
           </tr>
           <tr>
             <td>
-              <translate :translate-context="'Content/Track/Table.Label'">Bitrate</translate>
+              <translate translate-context="Content/Track/Table.Label">Bitrate</translate>
             </td>
             <td v-if="upload && upload.bitrate">{{ upload.bitrate | humanSize }}/s</td>
             <td v-else>
-              <translate :translate-context="'*/*/*'">N/A</translate>
+              <translate translate-context="*/*/*">N/A</translate>
             </td>
           </tr>
           <tr>
             <td>
-              <translate :translate-context="'Content/Track/Table.Label/Noun'">Type</translate>
+              <translate translate-context="Content/Track/Table.Label/Noun">Type</translate>
             </td>
             <td v-if="upload && upload.extension">{{ upload.extension }}</td>
             <td v-else>
-              <translate :translate-context="'*/*/*'">N/A</translate>
+              <translate translate-context="*/*/*">N/A</translate>
             </td>
           </tr>
         </tbody>
@@ -68,7 +68,7 @@
     </section>
     <section class="ui vertical stripe center aligned segment">
       <h2>
-        <translate :translate-context="'Content/Track/Title'">Lyrics</translate>
+        <translate translate-context="Content/Track/Title">Lyrics</translate>
       </h2>
       <div v-if="isLoadingLyrics" class="ui vertical segment">
         <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
@@ -76,20 +76,20 @@
       <div v-if="lyrics" v-html="lyrics.content_rendered"></div>
       <template v-if="!isLoadingLyrics & !lyrics">
         <p>
-          <translate :translate-context="'Content/Track/Paragraph'">No lyrics available for this track.</translate>
+          <translate translate-context="Content/Track/Paragraph">No lyrics available for this track.</translate>
         </p>
         <a class="ui button" target="_blank" :href="lyricsSearchUrl">
           <i class="search icon"></i>
-          <translate :translate-context="'Content/Track/Link/Verb'">Search on lyrics.wikia.com</translate>
+          <translate translate-context="Content/Track/Link/Verb">Search on lyrics.wikia.com</translate>
         </a>
       </template>
     </section>
     <section class="ui vertical stripe segment">
       <h2>
-        <translate :translate-context="'Content/Track/Title'">User libraries</translate>
+        <translate translate-context="Content/Track/Title">User libraries</translate>
       </h2>
       <library-widget @loaded="$emit('libraries-loaded', $event)" :url="'tracks/' + id + '/libraries/'">
-        <translate :translate-context="'Content/Track/Paragraph'" slot="subtitle">This track is present in the following libraries:</translate>
+        <translate translate-context="Content/Track/Paragraph" slot="subtitle">This track is present in the following libraries:</translate>
       </library-widget>
     </section>
   </div>
diff --git a/front/src/components/library/TrackEdit.vue b/front/src/components/library/TrackEdit.vue
index 40178e6ed25968e1cc718fa6d479ae0bcd0db016..7e26d1df10595cbb229f68b58350c715431c6c27 100644
--- a/front/src/components/library/TrackEdit.vue
+++ b/front/src/components/library/TrackEdit.vue
@@ -3,8 +3,8 @@
   <section class="ui vertical stripe segment">
     <div class="ui text container">
       <h2>
-        <translate v-if="canEdit" key="1" :translate-context="'Content/*/Title'">Edit this track</translate>
-        <translate v-else key="2" :translate-context="'Content/*/Title'">Suggest an edit on this track</translate>
+        <translate v-if="canEdit" key="1" translate-context="Content/*/Title">Edit this track</translate>
+        <translate v-else key="2" translate-context="Content/*/Title">Suggest an edit on this track</translate>
       </h2>
       <edit-form :object-type="objectType" :object="object" :can-edit="canEdit"></edit-form>
       </div>
diff --git a/front/src/components/library/radios/Builder.vue b/front/src/components/library/radios/Builder.vue
index 66161d15c276e88ea0f9b150b7ef5a53879e74db..58e7b9f099701bcb21fd40c279cc16fa4220326c 100644
--- a/front/src/components/library/radios/Builder.vue
+++ b/front/src/components/library/radios/Builder.vue
@@ -3,53 +3,53 @@
     <div>
       <section>
         <h2 class="ui header">
-          <translate :translate-context="'Content/Radio/Title'">Builder</translate>
+          <translate translate-context="Content/Radio/Title">Builder</translate>
         </h2>
-        <p><translate :translate-context="'Content/Radio/Paragraph'">You can use this interface to build your own custom radio, which will play tracks according to your criteria.</translate></p>
+        <p><translate translate-context="Content/Radio/Paragraph">You can use this interface to build your own custom radio, which will play tracks according to your criteria.</translate></p>
         <div class="ui form">
           <div v-if="success" class="ui positive message">
             <div class="header">
               <template v-if="radioName">
-                <translate :translate-context="'Content/Radio/Message'">Radio updated</translate>
+                <translate translate-context="Content/Radio/Message">Radio updated</translate>
               </template>
               <template v-else>
-                <translate :translate-context="'Content/Radio/Message'">Radio created</translate>
+                <translate translate-context="Content/Radio/Message">Radio created</translate>
               </template>
             </div>
           </div>
           <div class="">
             <div class="field">
-              <label for="name"><translate :translate-context="'Content/Radio/Input.Label/Noun'">Radio name</translate></label>
+              <label for="name"><translate translate-context="Content/Radio/Input.Label/Noun">Radio name</translate></label>
               <input id="name" name="name" type="text" v-model="radioName" :placeholder="labels.placeholder.name" />
             </div>
             <div class="field">
-              <label for="description"><translate :translate-context="'Content/Radio/Input.Label'">Description</translate></label>
+              <label for="description"><translate translate-context="Content/Radio/Input.Label">Description</translate></label>
               <textarea rows="2" id="description" type="text" v-model="radioDesc" :placeholder="labels.placeholder.description" />
             </div>
             <div class="ui toggle checkbox">
               <input id="public" type="checkbox" v-model="isPublic" />
-              <label for="public"><translate :translate-context="'Content/Radio/Checkbox.Label/Verb'">Display publicly</translate></label>
+              <label for="public"><translate translate-context="Content/Radio/Checkbox.Label/Verb">Display publicly</translate></label>
             </div>
             <div class="ui hidden divider"></div>
             <button :disabled="!canSave" @click="save" :class="['ui', 'green', {loading: isLoading}, 'button']">
-              <translate :translate-context="'Content/Radio/Button.Label/Verb'">Save</translate>
+              <translate translate-context="Content/Radio/Button.Label/Verb">Save</translate>
             </button>
             <radio-button v-if="id" type="custom" :custom-radio-id="id"></radio-button>
           </div>
         </div>
         <div class="ui form">
           <p>
-            <translate :translate-context="'Content/Radio/Paragraph'">Add filters to customize your radio</translate>
+            <translate translate-context="Content/Radio/Paragraph">Add filters to customize your radio</translate>
           </p>
           <div class="inline field">
             <select class="ui dropdown" v-model="currentFilterType">
               <option value="">
-                <translate :translate-context="'Content/Radio/Dropdown.Placeholder/Verb'">Select a filter</translate>
+                <translate translate-context="Content/Radio/Dropdown.Placeholder/Verb">Select a filter</translate>
               </option>
               <option v-for="f in availableFilters" :value="f.type">{{ f.label }}</option>
             </select>
             <button :disabled="!currentFilterType" @click="add" class="ui button">
-              <translate :translate-context="'Content/Radio/Button.Label/Verb'">Add filter</translate>
+              <translate translate-context="Content/Radio/Button.Label/Verb">Add filter</translate>
             </button>
           </div>
           <p v-if="currentFilter">
@@ -59,11 +59,11 @@
         <table class="ui table">
           <thead>
             <tr>
-              <th class="two wide"><translate :translate-context="'Content/Radio/Table.Label/Noun'">Filter name</translate></th>
-              <th class="one wide"><translate :translate-context="'Content/Radio/Table.Label/Verb'">Exclude</translate></th>
-              <th class="six wide"><translate :translate-context="'Content/Radio/Table.Label/Verb (Value is a List of Parameters)'">Config</translate></th>
-              <th class="five wide"><translate :translate-context="'Content/Radio/Table.Label/Noun (Value is a number of Tracks)'">Candidates</translate></th>
-              <th class="two wide"><translate :translate-context="'Content/Radio/Table.Label/Noun (Value is a Button)'">Actions</translate></th>
+              <th class="two wide"><translate translate-context="Content/Radio/Table.Label/Noun">Filter name</translate></th>
+              <th class="one wide"><translate translate-context="Content/Radio/Table.Label/Verb">Exclude</translate></th>
+              <th class="six wide"><translate translate-context="Content/Radio/Table.Label/Verb (Value is a List of Parameters)">Config</translate></th>
+              <th class="five wide"><translate translate-context="Content/Radio/Table.Label/Noun (Value is a number of Tracks)">Candidates</translate></th>
+              <th class="two wide"><translate translate-context="Content/Radio/Table.Label/Noun (Value is a Button)">Actions</translate></th>
             </tr>
           </thead>
           <tbody>
diff --git a/front/src/components/library/radios/Filter.vue b/front/src/components/library/radios/Filter.vue
index ad1fb2de4b764a049131b150462236ab4403562b..f9e158320a42c0380e41ceca28c444407e4969f1 100644
--- a/front/src/components/library/radios/Filter.vue
+++ b/front/src/components/library/radios/Filter.vue
@@ -42,7 +42,7 @@
       </span>
       <modal v-if="checkResult" :show.sync="showCandidadesModal">
         <div class="header">
-          <translate :translate-context="'Popup/Radio/Title/Noun'">Tracks matching filter</translate>
+          <translate translate-context="Popup/Radio/Title/Noun">Tracks matching filter</translate>
         </div>
         <div class="content">
           <div class="description">
@@ -51,13 +51,13 @@
         </div>
         <div class="actions">
           <div class="ui black deny button">
-            <translate :translate-context="'Popup/Radio/Button.Label/Verb'">Cancel</translate>
+            <translate translate-context="Popup/Radio/Button.Label/Verb">Cancel</translate>
           </div>
         </div>
       </modal>
     </td>
     <td>
-      <button @click="$emit('delete', index)" class="ui basic red button"><translate :translate-context="'Content/Radio/Button.Label/Verb'">Remove</translate></button>
+      <button @click="$emit('delete', index)" class="ui basic red button"><translate translate-context="Content/Radio/Button.Label/Verb">Remove</translate></button>
     </td>
   </tr>
 </template>
diff --git a/front/src/components/manage/library/EditsCardList.vue b/front/src/components/manage/library/EditsCardList.vue
index 8e51ff0f0c3bea28520a84d4f100d04551ae190f..c66cfeaa23bb4390f6d5ca4ca8bf58dace7c84ca 100644
--- a/front/src/components/manage/library/EditsCardList.vue
+++ b/front/src/components/manage/library/EditsCardList.vue
@@ -4,30 +4,30 @@
     <div class="ui inline form">
       <div class="fields">
         <div class="ui field">
-          <label><translate :translate-context="'Content/Search/Input.Label/Noun'">Search</translate></label>
+          <label><translate translate-context="Content/Search/Input.Label/Noun">Search</translate></label>
           <form @submit.prevent="search.query = $refs.search.value">
             <input name="search" ref="search" type="text" :value="search.query" :placeholder="labels.searchPlaceholder" />
           </form>
         </div>
         <div class="field">
-          <label><translate :translate-context="'Content/Search/Dropdown.Label'">Status</translate></label>
+          <label><translate translate-context="Content/Search/Dropdown.Label">Status</translate></label>
           <select class="ui dropdown" @change="addSearchToken('is_approved', $event.target.value)" :value="getTokenValue('is_approved', '')">
             <option value="">
-              <translate :translate-context="'Content/Admin/Dropdown'">All</translate>
+              <translate translate-context="Content/Admin/Dropdown">All</translate>
             </option>
             <option value="null">
-              <translate :translate-context="'Content/Admin/Dropdown'">Pending review</translate>
+              <translate translate-context="Content/Admin/Dropdown">Pending review</translate>
             </option>
             <option value="yes">
-              <translate :translate-context="'Content/Admin/Dropdown'">Approved</translate>
+              <translate translate-context="Content/Admin/Dropdown">Approved</translate>
             </option>
             <option value="no">
-              <translate :translate-context="'Content/Admin/Dropdown'">Rejected</translate>
+              <translate translate-context="Content/Admin/Dropdown">Rejected</translate>
             </option>
           </select>
         </div>
         <div class="field">
-          <label><translate :translate-context="'Content/Search/Dropdown.Label'">Ordering</translate></label>
+          <label><translate translate-context="Content/Search/Dropdown.Label">Ordering</translate></label>
           <select class="ui dropdown" v-model="ordering">
             <option v-for="option in orderingOptions" :value="option[0]">
               {{ sharedLabels.filters[option[1]] }}
@@ -35,10 +35,10 @@
           </select>
         </div>
         <div class="field">
-          <label><translate :translate-context="'Content/Search/Dropdown.Label/Noun'">Order</translate></label>
+          <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Order</translate></label>
           <select class="ui dropdown" v-model="orderingDirection">
-            <option value="+"><translate :translate-context="'Content/Search/Dropdown'">Ascending</translate></option>
-            <option value="-"><translate :translate-context="'Content/Search/Dropdown'">Descending</translate></option>
+            <option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option>
+            <option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option>
           </select>
         </div>
       </div>
@@ -70,7 +70,7 @@
         ></pagination>
 
       <span v-if="result && result.results.length > 0">
-        <translate :translate-context="'Content/Library/Paragraph'"
+        <translate translate-context="Content/Library/Paragraph"
           :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
           Showing results %{ start }-%{ end } on %{ total }
         </translate>
diff --git a/front/src/components/manage/moderation/AccountsTable.vue b/front/src/components/manage/moderation/AccountsTable.vue
index d8897ab3b76ea1fd31af4896ec93f06b92c6be9f..85c316fac4229990bb60b0488672c0874ed490d9 100644
--- a/front/src/components/manage/moderation/AccountsTable.vue
+++ b/front/src/components/manage/moderation/AccountsTable.vue
@@ -3,13 +3,13 @@
     <div class="ui inline form">
       <div class="fields">
         <div class="ui six wide field">
-          <label><translate :translate-context="'Content/Search/Input.Label/Noun'">Search</translate></label>
+          <label><translate translate-context="Content/Search/Input.Label/Noun">Search</translate></label>
           <form @submit.prevent="search.query = $refs.search.value">
             <input name="search" ref="search" type="text" :value="search.query" :placeholder="labels.searchPlaceholder" />
           </form>
         </div>
         <div class="field">
-          <label><translate :translate-context="'Content/Search/Input.Label/Noun'">Ordering</translate></label>
+          <label><translate translate-context="Content/Search/Input.Label/Noun">Ordering</translate></label>
           <select class="ui dropdown" v-model="ordering">
             <option v-for="option in orderingOptions" :value="option[0]">
               {{ sharedLabels.filters[option[1]] }}
@@ -17,10 +17,10 @@
           </select>
         </div>
         <div class="field">
-          <label><translate :translate-context="'Content/Search/Input.Label/Noun'">Ordering direction</translate></label>
+          <label><translate translate-context="Content/Search/Input.Label/Noun">Ordering direction</translate></label>
           <select class="ui dropdown" v-model="orderingDirection">
-            <option value="+"><translate :translate-context="'Content/Search/Dropdown'">Ascending</translate></option>
-            <option value="-"><translate :translate-context="'Content/Search/Dropdown'">Descending</translate></option>
+            <option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option>
+            <option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option>
           </select>
         </div>
       </div>
@@ -37,12 +37,12 @@
         action-url="manage/accounts/action/"
         :filters="actionFilters">
         <template slot="header-cells">
-          <th><translate :translate-context="'Content/Moderation/Table.Label'">Name</translate></th>
-          <th><translate :translate-context="'Content/Moderation/Table.Label'">Domain</translate></th>
-          <th><translate :translate-context="'Content/Moderation/Table.Label/Noun'">Uploads</translate></th>
-          <th><translate :translate-context="'Content/Moderation/Table.Label/Noun'">First seen</translate></th>
-          <th><translate :translate-context="'Content/Moderation/Table.Label/Noun'">Last seen</translate></th>
-          <th><translate :translate-context="'Content/Moderation/Table.Label/Short, Noun'">Under moderation rule</translate></th>
+          <th><translate translate-context="Content/Moderation/Table.Label">Name</translate></th>
+          <th><translate translate-context="Content/Moderation/Table.Label">Domain</translate></th>
+          <th><translate translate-context="Content/Moderation/Table.Label/Noun">Uploads</translate></th>
+          <th><translate translate-context="Content/Moderation/Table.Label/Noun">First seen</translate></th>
+          <th><translate translate-context="Content/Moderation/Table.Label/Noun">Last seen</translate></th>
+          <th><translate translate-context="Content/Moderation/Table.Label/Short, Noun">Under moderation rule</translate></th>
         </template>
         <template slot="row-cells" slot-scope="scope">
           <td>
@@ -57,7 +57,7 @@
             </template>
             <span role="button" v-else class="ui tiny teal icon link label" @click="addSearchToken('domain', scope.obj.domain)">
               <i class="home icon"></i>
-              <translate :translate-context="'Content/Moderation/Table/Short, Noun'">Local account</translate>
+              <translate translate-context="Content/Moderation/Table/Short, Noun">Local account</translate>
             </span>
           </td>
           <td>
@@ -70,7 +70,7 @@
             <human-date v-if="scope.obj.last_fetch_date" :date="scope.obj.last_fetch_date"></human-date>
           </td>
           <td>
-            <span v-if="scope.obj.instance_policy"><i class="shield icon"></i> <translate :translate-context="'*/*/*'">Yes</translate></span>
+            <span v-if="scope.obj.instance_policy"><i class="shield icon"></i> <translate translate-context="*/*/*">Yes</translate></span>
           </td>
         </template>
       </action-table>
@@ -86,7 +86,7 @@
         ></pagination>
 
       <span v-if="result && result.results.length > 0">
-        <translate :translate-context="'Content/Moderation/Paragraph'"
+        <translate translate-context="Content/Moderation/Paragraph"
           :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
           Showing results %{ start }-%{ end } on %{ total }
         </translate>
diff --git a/front/src/components/manage/moderation/DomainsTable.vue b/front/src/components/manage/moderation/DomainsTable.vue
index f07a1e426c80fcadf4a82690da3f82cbbaf565a2..66561b81c2a2c5ba2042e29a34dc4b9736018a48 100644
--- a/front/src/components/manage/moderation/DomainsTable.vue
+++ b/front/src/components/manage/moderation/DomainsTable.vue
@@ -3,11 +3,11 @@
     <div class="ui inline form">
       <div class="fields">
         <div class="ui field">
-          <label><translate :translate-context="'Content/Search/Input.Label/Verb'">Search</translate></label>
+          <label><translate translate-context="Content/Search/Input.Label/Verb">Search</translate></label>
           <input name="search" type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
         </div>
         <div class="field">
-          <label><translate :translate-context="'Content/Search/Input.Label/Noun'">Ordering</translate></label>
+          <label><translate translate-context="Content/Search/Input.Label/Noun">Ordering</translate></label>
           <select class="ui dropdown" v-model="ordering">
             <option v-for="option in orderingOptions" :value="option[0]">
               {{ sharedLabels.filters[option[1]] }}
@@ -15,10 +15,10 @@
           </select>
         </div>
         <div class="field">
-          <label><translate :translate-context="'Content/Search/Input.Label/Noun'">Ordering direction</translate></label>
+          <label><translate translate-context="Content/Search/Input.Label/Noun">Ordering direction</translate></label>
           <select class="ui dropdown" v-model="orderingDirection">
-            <option value="+"><translate :translate-context="'Content/Search/Dropdown'">Ascending</translate></option>
-            <option value="-"><translate :translate-context="'Content/Search/Dropdown'">Descending</translate></option>
+            <option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option>
+            <option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option>
           </select>
         </div>
       </div>
@@ -36,11 +36,11 @@
         idField="name"
         :filters="actionFilters">
         <template slot="header-cells">
-          <th><translate :translate-context="'Content/Moderation/Table.Label'">Name</translate></th>
-          <th><translate :translate-context="'Content/Moderation/Table.Label'">Users</translate></th>
-          <th><translate :translate-context="'Content/Moderation/Table.Label/Short, Noun'">Received messages</translate></th>
-          <th><translate :translate-context="'Content/Moderation/Table.Label/Short, Noun'">First seen</translate></th>
-          <th><translate :translate-context="'Content/Moderation/Table.Label/Short'">Under moderation rule</translate></th>
+          <th><translate translate-context="Content/Moderation/Table.Label">Name</translate></th>
+          <th><translate translate-context="Content/Moderation/Table.Label">Users</translate></th>
+          <th><translate translate-context="Content/Moderation/Table.Label/Short, Noun">Received messages</translate></th>
+          <th><translate translate-context="Content/Moderation/Table.Label/Short, Noun">First seen</translate></th>
+          <th><translate translate-context="Content/Moderation/Table.Label/Short">Under moderation rule</translate></th>
         </template>
         <template slot="row-cells" slot-scope="scope">
           <td>
@@ -56,7 +56,7 @@
             <human-date :date="scope.obj.creation_date"></human-date>
           </td>
           <td>
-            <span v-if="scope.obj.instance_policy"><i class="shield icon"></i> <translate :translate-context="'*/*/*'">Yes</translate></span>
+            <span v-if="scope.obj.instance_policy"><i class="shield icon"></i> <translate translate-context="*/*/*">Yes</translate></span>
           </td>
         </template>
       </action-table>
@@ -72,7 +72,7 @@
         ></pagination>
 
       <span v-if="result && result.results.length > 0">
-        <translate :translate-context="'Content/Moderation/Paragraph'"
+        <translate translate-context="Content/Moderation/Paragraph"
           :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
           Showing results %{ start }-%{ end } on %{ total }
         </translate>
diff --git a/front/src/components/manage/moderation/InstancePolicyCard.vue b/front/src/components/manage/moderation/InstancePolicyCard.vue
index f88f0487efe917600d9c6df55475638c228edb3c..07e6e948d5c5843f3300e5091bc318e2d8e3143f 100644
--- a/front/src/components/manage/moderation/InstancePolicyCard.vue
+++ b/front/src/components/manage/moderation/InstancePolicyCard.vue
@@ -6,44 +6,44 @@
       <i class="user icon"></i>{{ object.actor }}  &nbsp;
       <template v-if="object.is_active">
         <i class="play icon"></i>
-        <translate :translate-context="'*/*/*'">Enabled</translate>
+        <translate translate-context="*/*/*">Enabled</translate>
       </template>
       <template v-if="!object.is_active">
         <i class="pause icon"></i>
-        <translate :translate-context="'Content/Moderation/Card.List item'">Paused</translate>
+        <translate translate-context="Content/Moderation/Card.List item">Paused</translate>
       </template>
     </p>
     <div>
-      <p><strong><translate :translate-context="'Content/Moderation/Card.Title/Noun'">Rule</translate></strong></p>
+      <p><strong><translate translate-context="Content/Moderation/Card.Title/Noun">Rule</translate></strong></p>
       <p v-if="object.block_all">
         <i class="ban icon"></i>
-        <translate :translate-context="'Content/Moderation/Card.List item/Verb'">Block everything</translate>
+        <translate translate-context="Content/Moderation/Card.List item/Verb">Block everything</translate>
       </p>
       <div v-else class="ui list">
         <div class="ui item" v-if="object.silence_activity">
           <i class="feed icon"></i>
-          <div class="content"><translate :translate-context="'Content/Moderation/Card.List item/Verb'">Mute activity</translate></div>
+          <div class="content"><translate translate-context="Content/Moderation/Card.List item/Verb">Mute activity</translate></div>
         </div>
         <div class="ui item" v-if="object.silence_notifications">
           <i class="bell icon"></i>
-          <div class="content"><translate :translate-context="'Content/Moderation/Card.List item/Verb'">Mute notifications</translate></div>
+          <div class="content"><translate translate-context="Content/Moderation/Card.List item/Verb">Mute notifications</translate></div>
         </div>
         <div class="ui item" v-if="object.reject_media">
           <i class="file icon"></i>
-          <div class="content"><translate :translate-context="'Content/Moderation/Card.List item/Verb'">Reject media</translate></div>
+          <div class="content"><translate translate-context="Content/Moderation/Card.List item/Verb">Reject media</translate></div>
         </div>
 
       </div>
     </div>
     <div v-if="markdown && object.summary">
       <div class="ui hidden divider"></div>
-      <p><strong><translate :translate-context="'Content/Moderation/Card.Title/Noun'">Reason</translate></strong></p>
+      <p><strong><translate translate-context="Content/Moderation/Card.Title/Noun">Reason</translate></strong></p>
       <div v-html="markdown.makeHtml(object.summary)"></div>
     </div>
     <div class="ui hidden divider"></div>
     <button @click="$emit('update')" class="ui right floated labeled icon button">
       <i class="edit icon"></i>
-      <translate :translate-context="'Content/Moderation/Card.Button.Label/Verb'">Edit</translate>
+      <translate translate-context="Content/Moderation/Card.Button.Label/Verb">Edit</translate>
     </button>
   </div>
 </template>
diff --git a/front/src/components/manage/moderation/InstancePolicyForm.vue b/front/src/components/manage/moderation/InstancePolicyForm.vue
index 7235b9417ad73b13f94cff292c50d3d04cabe842..f7dedc55bf4616b8738ca60dbc2644453361cc7e 100644
--- a/front/src/components/manage/moderation/InstancePolicyForm.vue
+++ b/front/src/components/manage/moderation/InstancePolicyForm.vue
@@ -1,11 +1,11 @@
 <template>
   <form class="ui form" @submit.prevent="createOrUpdate">
     <h3 class="ui header">
-      <translate :translate-context="'Content/Moderation/Card.Title/Verb'" v-if="object" key="1">Edit moderation rule</translate>
-      <translate :translate-context="'Content/Moderation/Card.Button.Label/Verb'" v-else key="2">Add a new moderation rule</translate>
+      <translate translate-context="Content/Moderation/Card.Title/Verb" v-if="object" key="1">Edit moderation rule</translate>
+      <translate translate-context="Content/Moderation/Card.Button.Label/Verb" v-else key="2">Add a new moderation rule</translate>
     </h3>
     <div v-if="errors && errors.length > 0" class="ui negative message">
-      <div class="header"><translate :translate-context="'Content/Moderation/Error message.Title'">Error while creating rule</translate></div>
+      <div class="header"><translate translate-context="Content/Moderation/Error message.Title">Error while creating rule</translate></div>
       <ul class="list">
         <li v-for="error in errors">{{ error }}</li>
       </ul>
@@ -15,15 +15,15 @@
       <div class="ui toggle checkbox">
         <input id="policy-is-active" v-model="current.isActive" type="checkbox">
         <label for="policy-is-active">
-          <translate :translate-context="'*/*/*'" v-if="current.isActive" key="1">Enabled</translate>
-          <translate :translate-context="'*/*/*'" v-else key="2">Disabled</translate>
+          <translate translate-context="*/*/*" v-if="current.isActive" key="1">Enabled</translate>
+          <translate translate-context="*/*/*" v-else key="2">Disabled</translate>
           <tooltip :content="labels.isActiveHelp" />
         </label>
       </div>
     </div>
     <div class="field">
       <label for="policy-summary">
-        <translate :translate-context="'Content/Moderation/Input.Label/Noun'">Reason</translate>
+        <translate translate-context="Content/Moderation/Input.Label/Noun">Reason</translate>
         <tooltip :content="labels.summaryHelp" />
       </label>
       <textarea name="policy-summary" id="policy-summary" rows="5" v-model="current.summary"></textarea>
@@ -32,13 +32,13 @@
       <div class="ui toggle checkbox">
         <input id="policy-is-active" v-model="current.blockAll" type="checkbox">
         <label for="policy-is-active">
-          <translate :translate-context="'Content/Moderation/Checkbox.Label/Verb'">Block everything</translate>
+          <translate translate-context="Content/Moderation/Checkbox.Label/Verb">Block everything</translate>
           <tooltip :content="labels.blockAllHelp" />
         </label>
       </div>
     </div>
     <div class="ui horizontal divider">
-      <translate :translate-context="'Content/Moderation/Card.Title'">Or customize your rule</translate>
+      <translate translate-context="Content/Moderation/Card.Title">Or customize your rule</translate>
     </div>
     <div v-for="config in fieldConfig" :class="['field']">
       <div class="ui toggle checkbox">
@@ -52,22 +52,22 @@
     </div>
     <div class="ui hidden divider"></div>
     <button @click="$emit('cancel')" class="ui basic left floated button">
-      <translate :translate-context="'Content/Moderation/Card.Button.Label/Verb'">Cancel</translate>
+      <translate translate-context="Content/Moderation/Card.Button.Label/Verb">Cancel</translate>
     </button>
     <button :class="['ui', 'right', 'floated', 'green', {'disabled loading': isLoading}, 'button']" :disabled="isLoading">
-      <translate :translate-context="'Content/Moderation/Card.Button.Label/Verb'" v-if="object" key="1">Update</translate>
-      <translate :translate-context="'Content/Moderation/Card.Button.Label/Verb'" v-else key="2">Create</translate>
+      <translate translate-context="Content/Moderation/Card.Button.Label/Verb" v-if="object" key="1">Update</translate>
+      <translate translate-context="Content/Moderation/Card.Button.Label/Verb" v-else key="2">Create</translate>
     </button>
     <dangerous-button v-if="object" class="right floated basic button" color='red' @confirm="remove">
-      <translate :translate-context="'Content/Moderation/Card.Button.Label/Verb'">Delete</translate>
+      <translate translate-context="Content/Moderation/Card.Button.Label/Verb">Delete</translate>
       <p slot="modal-header">
-        <translate :translate-context="'Popup/Moderation/Title'">Delete this moderation rule?</translate>
+        <translate translate-context="Popup/Moderation/Title">Delete this moderation rule?</translate>
       </p>
       <p slot="modal-content">
-        <translate :translate-context="'Popup/Moderation/Paragraph'">This action is irreversible.</translate>
+        <translate translate-context="Popup/Moderation/Paragraph">This action is irreversible.</translate>
       </p>
       <div slot="modal-confirm">
-        <translate :translate-context="'Popup/Moderation/Button.Label/Verb'">Delete moderation rule</translate>
+        <translate translate-context="Popup/Moderation/Button.Label/Verb">Delete moderation rule</translate>
       </div>
     </dangerous-button>
   </form>
diff --git a/front/src/components/manage/users/InvitationForm.vue b/front/src/components/manage/users/InvitationForm.vue
index 32f1842735459908a994f49f1d94317677ec73aa..b9569a45196a197edf865df809cc6e036d316606 100644
--- a/front/src/components/manage/users/InvitationForm.vue
+++ b/front/src/components/manage/users/InvitationForm.vue
@@ -2,19 +2,19 @@
   <div>
     <form class="ui form" @submit.prevent="submit">
       <div v-if="errors.length > 0" class="ui negative message">
-        <div class="header"><translate :translate-context="'Content/Admin/Error message.Title'">Error while creating invitation</translate></div>
+        <div class="header"><translate translate-context="Content/Admin/Error message.Title">Error while creating invitation</translate></div>
         <ul class="list">
           <li v-for="error in errors">{{ error }}</li>
         </ul>
       </div>
       <div class="inline fields">
         <div class="ui field">
-          <label><translate :translate-context="'Content/Admin/Input.Label/Noun'">Invitation code</translate></label>
+          <label><translate translate-context="$1">Invitation code</translate></label>
           <input name="code" type="text" v-model="code" :placeholder="labels.placeholder" />
         </div>
         <div class="ui field">
           <button :class="['ui', {loading: isLoading}, 'button']" :disabled="isLoading" type="submit">
-            <translate :translate-context="'Content/Admin/Button.Label/Verb'">Get a new invitation</translate>
+            <translate translate-context="Content/Admin/Button.Label/Verb">Get a new invitation</translate>
           </button>
         </div>
       </div>
@@ -24,8 +24,8 @@
       <table class="ui ui basic table">
         <thead>
           <tr>
-            <th><translate :translate-context="'Content/Admin/Table.Label/Noun'">Code</translate></th>
-            <th><translate :translate-context="'Content/Admin/Table.Label/Noun'">Share link</translate></th>
+            <th><translate translate-context="Content/Admin/Table.Label/Noun">Code</translate></th>
+            <th><translate translate-context="Content/Admin/Table.Label/Noun">Share link</translate></th>
           </tr>
         </thead>
         <tbody>
@@ -35,7 +35,7 @@
           </tr>
         </tbody>
       </table>
-      <button class="ui basic button" @click="invitations = []"><translate :translate-context="'Content/Admin/Button.Label/Verb'">Clear</translate></button>
+      <button class="ui basic button" @click="invitations = []"><translate translate-context="Content/Admin/Button.Label/Verb">Clear</translate></button>
     </div>
   </div>
 </template>
diff --git a/front/src/components/manage/users/InvitationsTable.vue b/front/src/components/manage/users/InvitationsTable.vue
index 38cf15b77d92333a19fa09c3d5d89a9c98260ef7..446d2e55783e517b08bd2983b52c2a5771f527d7 100644
--- a/front/src/components/manage/users/InvitationsTable.vue
+++ b/front/src/components/manage/users/InvitationsTable.vue
@@ -3,11 +3,11 @@
     <div class="ui inline form">
       <div class="fields">
         <div class="ui field">
-          <label><translate :translate-context="'Content/Search/Input.Label/Verb'">Search</translate></label>
+          <label><translate translate-context="Content/Search/Input.Label/Verb">Search</translate></label>
           <input name="search" type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
         </div>
         <div class="field">
-          <label><translate :translate-context="'Content/Search/Input.Label/Noun'">Ordering</translate></label>
+          <label><translate translate-context="Content/Search/Input.Label/Noun">Ordering</translate></label>
           <select class="ui dropdown" v-model="ordering">
             <option v-for="option in orderingOptions" :value="option[0]">
               {{ sharedLabels.filters[option[1]] }}
@@ -15,11 +15,11 @@
           </select>
         </div>
         <div class="field">
-          <label><translate :translate-context="'Content/Admin/Dropdown.Label'">Status</translate></label>
+          <label><translate translate-context="Content/Admin/Dropdown.Label">Status</translate></label>
           <select class="ui dropdown" v-model="isOpen">
-            <option :value="null"><translate :translate-context="'Content/Admin/Dropdown'">All</translate></option>
-            <option :value="true"><translate :translate-context="'Content/Admin/Dropdown/Adjective'">Open</translate></option>
-            <option :value="false"><translate :translate-context="'Content/Admin/Dropdown/Adjective'">Expired/used</translate></option>
+            <option :value="null"><translate translate-context="Content/Admin/Dropdown">All</translate></option>
+            <option :value="true"><translate translate-context="Content/Admin/Dropdown/Adjective">Open</translate></option>
+            <option :value="false"><translate translate-context="Content/Admin/Dropdown/Adjective">Expired/used</translate></option>
           </select>
         </div>
       </div>
@@ -36,20 +36,20 @@
         :action-url="'manage/users/invitations/action/'"
         :filters="actionFilters">
         <template slot="header-cells">
-          <th><translate :translate-context="'Content/Admin/Table.Label'">Owner</translate></th>
-          <th><translate :translate-context="'Content/Admin/Table.Label'">Status</translate></th>
-          <th><translate :translate-context="'Content/Admin/Table.Label'">Creation date</translate></th>
-          <th><translate :translate-context="'Content/Admin/Table.Label'">Expiration date</translate></th>
-          <th><translate :translate-context="'Content/Admin/Table.Label'">Code</translate></th>
+          <th><translate translate-context="Content/Admin/Table.Label">Owner</translate></th>
+          <th><translate translate-context="Content/Admin/Table.Label">Status</translate></th>
+          <th><translate translate-context="Content/Admin/Table.Label">Creation date</translate></th>
+          <th><translate translate-context="Content/Admin/Table.Label">Expiration date</translate></th>
+          <th><translate translate-context="Content/Admin/Table.Label">Code</translate></th>
         </template>
         <template slot="row-cells" slot-scope="scope">
           <td>
             <router-link :to="{name: 'manage.users.users.detail', params: {id: scope.obj.id }}">{{ scope.obj.owner.username }}</router-link>
           </td>
           <td>
-            <span v-if="scope.obj.users.length > 0" class="ui green basic label"><translate :translate-context="'Content/Admin/Table'">Used</translate></span>
-            <span v-else-if="moment().isAfter(scope.obj.expiration_date)" class="ui red basic label"><translate :translate-context="'Content/Admin/Table'">Expired</translate></span>
-            <span v-else class="ui basic label"><translate :translate-context="'Content/Admin/Table'">Not used</translate></span>
+            <span v-if="scope.obj.users.length > 0" class="ui green basic label"><translate translate-context="Content/Admin/Table">Used</translate></span>
+            <span v-else-if="moment().isAfter(scope.obj.expiration_date)" class="ui red basic label"><translate translate-context="Content/Admin/Table">Expired</translate></span>
+            <span v-else class="ui basic label"><translate translate-context="Content/Admin/Table">Not used</translate></span>
           </td>
           <td>
             <human-date :date="scope.obj.creation_date"></human-date>
@@ -74,7 +74,7 @@
         ></pagination>
 
       <span v-if="result && result.results.length > 0">
-        <translate :translate-context="'Content/Admin/Paragraph'"
+        <translate translate-context="Content/Admin/Paragraph"
           :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
           Showing results %{ start }-%{ end } on %{ total }
         </translate>
diff --git a/front/src/components/manage/users/UsersTable.vue b/front/src/components/manage/users/UsersTable.vue
index 96015faf607eb15c3feec3ddcdf793e378f32f97..465c33c2374885fee55239686b9af1ba0287f1fc 100644
--- a/front/src/components/manage/users/UsersTable.vue
+++ b/front/src/components/manage/users/UsersTable.vue
@@ -3,11 +3,11 @@
     <div class="ui inline form">
       <div class="fields">
         <div class="ui field">
-          <label><translate :translate-context="'Content/Search/Input.Label/verb'">Search</translate></label>
+          <label><translate translate-context="Content/Search/Input.Label/verb">Search</translate></label>
           <input name="search" type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
         </div>
         <div class="field">
-          <label><translate :translate-context="'Content/Search/Input.Label/Noun'">Ordering</translate></label>
+          <label><translate translate-context="Content/Search/Input.Label/Noun">Ordering</translate></label>
           <select class="ui dropdown" v-model="ordering">
             <option v-for="option in orderingOptions" :value="option[0]">
               {{ sharedLabels.filters[option[1]] }}
@@ -15,10 +15,10 @@
           </select>
         </div>
         <div class="field">
-          <label><translate :translate-context="'Content/Search/Dropdown.Label/Noun'">Order</translate></label>
+          <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Order</translate></label>
           <select class="ui dropdown" v-model="orderingDirection">
-            <option value="+"><translate :translate-context="'Content/Search/Dropdown'">Ascending</translate></option>
-            <option value="-"><translate :translate-context="'Content/Search/Dropdown'">Descending</translate></option>
+            <option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option>
+            <option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option>
           </select>
         </div>
       </div>
@@ -35,13 +35,13 @@
         :action-url="'manage/library/uploads/action/'"
         :filters="actionFilters">
         <template slot="header-cells">
-          <th><translate :translate-context="'Content/Admin/Table.Label'">Username</translate></th>
-          <th><translate :translate-context="'Content/Admin/Table.Label'">Email</translate></th>
-          <th><translate :translate-context="'Content/Admin/Table.Label/Short, Noun'">Account status</translate></th>
-          <th><translate :translate-context="'Content/Admin/Table.Label/Short, Noun (Value is a date)'">Sign-up</translate></th>
-          <th><translate :translate-context="'Content/Admin/Table.Label/Short, Noun (Value is a date)'">Last activity</translate></th>
-          <th><translate :translate-context="'Content/Admin/Table.Label/Noun'">Permissions</translate></th>
-          <th><translate :translate-context="'Content/Admin/Table.Label/Noun'">Status</translate></th>
+          <th><translate translate-context="Content/Admin/Table.Label">Username</translate></th>
+          <th><translate translate-context="Content/Admin/Table.Label">Email</translate></th>
+          <th><translate translate-context="Content/Admin/Table.Label/Short, Noun">Account status</translate></th>
+          <th><translate translate-context="Content/Admin/Table.Label/Short, Noun (Value is a date)">Sign-up</translate></th>
+          <th><translate translate-context="Content/Admin/Table.Label/Short, Noun (Value is a date)">Last activity</translate></th>
+          <th><translate translate-context="Content/Admin/Table.Label/Noun">Permissions</translate></th>
+          <th><translate translate-context="Content/Admin/Table.Label/Noun">Status</translate></th>
         </template>
         <template slot="row-cells" slot-scope="scope">
           <td>
@@ -51,15 +51,15 @@
             <span>{{ scope.obj.email }}</span>
           </td>
           <td>
-            <span v-if="scope.obj.is_active" class="ui basic green label"><translate :translate-context="'Content/Admin/Table'">Active</translate></span>
-            <span v-else class="ui basic grey label"><translate :translate-context="'Content/Admin/Table'">Inactive</translate></span>
+            <span v-if="scope.obj.is_active" class="ui basic green label"><translate translate-context="Content/Admin/Table">Active</translate></span>
+            <span v-else class="ui basic grey label"><translate translate-context="Content/Admin/Table">Inactive</translate></span>
           </td>
           <td>
             <human-date :date="scope.obj.date_joined"></human-date>
           </td>
           <td>
             <human-date v-if="scope.obj.last_activity" :date="scope.obj.last_activity"></human-date>
-            <template v-else><translate :translate-context="'*/*/*'">N/A</translate></template>
+            <template v-else><translate translate-context="*/*/*">N/A</translate></template>
           </td>
           <td>
             <template v-for="p in permissions">
@@ -67,9 +67,9 @@
             </template>
           </td>
           <td>
-            <span v-if="scope.obj.is_superuser" class="ui pink label"><translate :translate-context="'Content/Admin/Table.User role'">Admin</translate></span>
-            <span v-else-if="scope.obj.is_staff" class="ui purple label"><translate :translate-context="'Content/Admin/Table.User role'">Staff member</translate></span>
-            <span v-else class="ui basic label"><translate :translate-context="'Content/Admin/Table, User role'">regular user</translate></span>
+            <span v-if="scope.obj.is_superuser" class="ui pink label"><translate translate-context="Content/Admin/Table.User role">Admin</translate></span>
+            <span v-else-if="scope.obj.is_staff" class="ui purple label"><translate translate-context="Content/Admin/Table.User role">Staff member</translate></span>
+            <span v-else class="ui basic label"><translate translate-context="Content/Admin/Table, User role">regular user</translate></span>
           </td>
         </template>
       </action-table>
@@ -85,7 +85,7 @@
         ></pagination>
 
       <span v-if="result && result.results.length > 0">
-        <translate :translate-context="'Content/Admin/Paragraph'"
+        <translate translate-context="Content/Admin/Paragraph"
           :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
           Showing results %{ start }-%{ end } on %{ total }
         </translate>
diff --git a/front/src/components/moderation/FilterModal.vue b/front/src/components/moderation/FilterModal.vue
index 5dcd4782504b7513fbced2b7c2daf5769c0db23c..cdcedb800a5daa9294f52c64d1ce9f5bbc5f3edf 100644
--- a/front/src/components/moderation/FilterModal.vue
+++ b/front/src/components/moderation/FilterModal.vue
@@ -4,32 +4,32 @@
       <translate
         v-if="type === 'artist'"
         key="1"
-        :translate-context="'Popup/Moderation/Title/Verb'"
+        translate-context="Popup/Moderation/Title/Verb"
         :translate-params="{name: target.name}">Do you want to hide content from artist "%{ name }"?</translate>
     </div>
     <div class="scrolling content">
       <div class="description">
 
         <div v-if="errors.length > 0" class="ui negative message">
-          <div class="header"><translate :translate-context="'Popup/Moderation/Error message'">Error while creating filter</translate></div>
+          <div class="header"><translate translate-context="Popup/Moderation/Error message">Error while creating filter</translate></div>
           <ul class="list">
             <li v-for="error in errors">{{ error }}</li>
           </ul>
         </div>
         <template v-if="type === 'artist'">
           <p>
-            <translate :translate-context="'Popup/Moderation/Paragraph'">
+            <translate translate-context="Popup/Moderation/Paragraph">
               You will not see tracks, albums and user activity linked to this artist anymore:
             </translate>
           </p>
           <ul>
-            <li><translate :translate-context="'Popup/Moderation/List item'">In other users favorites and listening history</translate></li>
-            <li><translate :translate-context="'Popup/Moderation/List item'">In "Recently added" widget</translate></li>
-            <li><translate :translate-context="'Popup/Moderation/List item'">In artists and album listings</translate></li>
-            <li><translate :translate-context="'Popup/Moderation/List item'">In radio suggestions</translate></li>
+            <li><translate translate-context="Popup/Moderation/List item">In other users favorites and listening history</translate></li>
+            <li><translate translate-context="Popup/Moderation/List item">In "Recently added" widget</translate></li>
+            <li><translate translate-context="Popup/Moderation/List item">In artists and album listings</translate></li>
+            <li><translate translate-context="Popup/Moderation/List item">In radio suggestions</translate></li>
           </ul>
           <p>
-            <translate :translate-context="'Popup/Moderation/Paragraph'">
+            <translate translate-context="Popup/Moderation/Paragraph">
               You can manage and update your filters anytime from your account settings.
             </translate>
           </p>
@@ -37,8 +37,8 @@
       </div>
     </div>
     <div class="actions">
-      <div class="ui cancel button"><translate :translate-context="'Popup/*/Button.Label'">Cancel</translate></div>
-      <div :class="['ui', 'green', {loading: isLoading}, 'button']" @click="hide"><translate :translate-context="'Popup/*/Button.Label'">Hide content</translate></div>
+      <div class="ui cancel button"><translate translate-context="Popup/*/Button.Label">Cancel</translate></div>
+      <div :class="['ui', 'green', {loading: isLoading}, 'button']" @click="hide"><translate translate-context="Popup/*/Button.Label">Hide content</translate></div>
     </div>
   </modal>
 </template>
diff --git a/front/src/components/playlists/Card.vue b/front/src/components/playlists/Card.vue
index 70ac34097aa176f39c59d2caf1ed3ca3e1fa0149..60a322ab4c86486842d79f176b6b536b6714041e 100644
--- a/front/src/components/playlists/Card.vue
+++ b/front/src/components/playlists/Card.vue
@@ -16,7 +16,7 @@
         <duration :seconds="playlist.duration" />
          |
         <i class="sound icon"></i>
-        <translate :translate-context="'Content/*/Card/List item'"
+        <translate translate-context="Content/*/Card/List item"
           translate-plural="%{ count } tracks"
           :translate-n="playlist.tracks_count"
           :translate-params="{count: playlist.tracks_count}">
diff --git a/front/src/components/playlists/Editor.vue b/front/src/components/playlists/Editor.vue
index d558ed38f7b1a8d5ccca361a9acb85b80e7c465a..4c983cfb9beaff7437c5dccb60d5326fd93d99ef 100644
--- a/front/src/components/playlists/Editor.vue
+++ b/front/src/components/playlists/Editor.vue
@@ -2,16 +2,16 @@
   <div class="ui text container">
     <playlist-form @updated="$emit('playlist-updated', $event)" :title="false" :playlist="playlist"></playlist-form>
     <h3 class="ui top attached header">
-      <translate :translate-context="'Content/Playlist/Title'">Playlist editor</translate>
+      <translate translate-context="Content/Playlist/Title">Playlist editor</translate>
     </h3>
     <div class="ui attached segment">
       <template v-if="status === 'loading'">
         <div class="ui active tiny inline loader"></div>
-        <translate :translate-context="'Content/Playlist/Paragraph'">Syncing changes to server…</translate>
+        <translate translate-context="Content/Playlist/Paragraph">Syncing changes to server…</translate>
       </template>
       <template v-else-if="status === 'errored'">
         <i class="red close icon"></i>
-        <translate :translate-context="'Content/Playlist/Error message.Title'">An error occured while saving your changes</translate>
+        <translate translate-context="Content/Playlist/Error message.Title">An error occured while saving your changes</translate>
         <div v-if="errors.length > 0" class="ui negative message">
           <ul class="list">
             <li v-for="error in errors">{{ error }}</li>
@@ -19,7 +19,7 @@
         </div>
       </template>
       <template v-else-if="status === 'saved'">
-        <i class="green check icon"></i> <translate :translate-context="'Content/Playlist/Paragraph'">Changes synced with server</translate>
+        <i class="green check icon"></i> <translate translate-context="Content/Playlist/Paragraph">Changes synced with server</translate>
       </template>
     </div>
     <div class="ui bottom attached segment">
@@ -29,7 +29,7 @@
         :class="['ui', {disabled: queueTracks.length === 0}, 'labeled', 'icon', 'button']"
         :title="labels.copyTitle">
           <i class="plus icon"></i>
-          <translate :translate-context="'Content/Playlist/Button.Label/Verb'"
+          <translate translate-context="Content/Playlist/Button.Label/Verb"
             translate-plural="Insert from queue (%{ count } tracks)"
             :translate-n="queueTracks.length"
             :translate-params="{count: queueTracks.length}">
@@ -38,16 +38,16 @@
         </div>
 
       <dangerous-button :disabled="plts.length === 0" class="labeled right floated icon" color='yellow' :action="clearPlaylist">
-        <i class="eraser icon"></i> <translate :translate-context="'Content/Playlist/Button.Label/Verb'">Clear playlist</translate>
+        <i class="eraser icon"></i> <translate translate-context="Content/Playlist/Button.Label/Verb">Clear playlist</translate>
         <p slot="modal-header">
-          <translate :translate-context="'Popup/Playlist/Title'" :translate-params="{playlist: playlist.name}">Do you want to clear the playlist "%{ playlist }"?</translate>
+          <translate translate-context="Popup/Playlist/Title" :translate-params="{playlist: playlist.name}">Do you want to clear the playlist "%{ playlist }"?</translate>
         </p>
-        <p slot="modal-content"><translate :translate-context="'Popup/Playlist/Paragraph'">This will remove all tracks from this playlist and cannot be undone.</translate></p>
-        <div slot="modal-confirm"><translate :translate-context="'Popup/Playlist/Button.Label'">Clear playlist</translate></div>
+        <p slot="modal-content"><translate translate-context="Popup/Playlist/Paragraph">This will remove all tracks from this playlist and cannot be undone.</translate></p>
+        <div slot="modal-confirm"><translate translate-context="Popup/Playlist/Button.Label">Clear playlist</translate></div>
       </dangerous-button>
       <div class="ui hidden divider"></div>
       <template v-if="plts.length > 0">
-        <p><translate :translate-context="'Content/Playlist/Paragraph/Call to action'">Drag and drop rows to reorder tracks in the playlist</translate></p>
+        <p><translate translate-context="Content/Playlist/Paragraph/Call to action">Drag and drop rows to reorder tracks in the playlist</translate></p>
         <div class="table-wrapper">
           <table class="ui compact very basic unstackable table">
             <draggable v-model="plts" element="tbody" @update="reorder">
diff --git a/front/src/components/playlists/Form.vue b/front/src/components/playlists/Form.vue
index 058a6fd114f0e46f32e05decdf324a5333360885..e7a761b371c09ac176cfebccb56dafca111a6930 100644
--- a/front/src/components/playlists/Form.vue
+++ b/front/src/components/playlists/Form.vue
@@ -1,29 +1,29 @@
 <template>
   <form class="ui form" @submit.prevent="submit()">
-    <h4 v-if="title" class="ui header"><translate :translate-context="'Popup/Playlist/Title/Verb'">Create a new playlist</translate></h4>
+    <h4 v-if="title" class="ui header"><translate translate-context="Popup/Playlist/Title/Verb">Create a new playlist</translate></h4>
     <div v-if="success" class="ui positive message">
       <div class="header">
         <template v-if="playlist">
-          <translate :translate-context="'Content/Playlist/Message'">Playlist updated</translate>
+          <translate translate-context="Content/Playlist/Message">Playlist updated</translate>
         </template>
         <template v-else>
-          <translate :translate-context="'Content/Playlist/Message'">Playlist created</translate>
+          <translate translate-context="Content/Playlist/Message">Playlist created</translate>
         </template>
       </div>
     </div>
     <div v-if="errors.length > 0" class="ui negative message">
-      <div class="header"><translate :translate-context="'Content/Playlist/Error message.Title'">The playlist could not be created</translate></div>
+      <div class="header"><translate translate-context="Content/Playlist/Error message.Title">The playlist could not be created</translate></div>
       <ul class="list">
         <li v-for="error in errors">{{ error }}</li>
       </ul>
     </div>
     <div class="three fields">
       <div class="field">
-        <label><translate :translate-context="'Content/Playlist/Input.Label'">Playlist name</translate></label>
+        <label><translate translate-context="Content/Playlist/Input.Label">Playlist name</translate></label>
         <input name="name" v-model="name" required type="text" :placeholder="labels.placeholder" />
       </div>
       <div class="field">
-        <label><translate :translate-context="'Content/Playlist/Dropdown.Label'">Playlist visibility</translate></label>
+        <label><translate translate-context="Content/Playlist/Dropdown.Label">Playlist visibility</translate></label>
         <select class="ui dropdown" v-model="privacyLevel">
           <option :value="c.value" v-for="c in privacyLevelChoices">{{ c.label }}</option>
         </select>
@@ -31,8 +31,8 @@
       <div class="field">
         <label>&nbsp;</label>
         <button :class="['ui', 'fluid', {'loading': isLoading}, 'button']" type="submit">
-          <template v-if="playlist"><translate :translate-context="'Content/Playlist/Button.Label/Verb'">Update playlist</translate></template>
-          <template v-else><translate :translate-context="'Content/Playlist/Button.Label/Verb'">Create playlist</translate></template>
+          <template v-if="playlist"><translate translate-context="Content/Playlist/Button.Label/Verb">Update playlist</translate></template>
+          <template v-else><translate translate-context="Content/Playlist/Button.Label/Verb">Create playlist</translate></template>
         </button>
       </div>
     </div>
diff --git a/front/src/components/playlists/PlaylistModal.vue b/front/src/components/playlists/PlaylistModal.vue
index 3707e3d2cba6837e96cc653a738e51c85d07c1a7..0e8ac26945fdd70f8d36bd22655f8e5fc0f0be3f 100644
--- a/front/src/components/playlists/PlaylistModal.vue
+++ b/front/src/components/playlists/PlaylistModal.vue
@@ -1,13 +1,13 @@
 <template>
   <modal @update:show="update" :show="$store.state.playlists.showModal">
     <div class="header">
-      <translate :translate-context="'Popup/Playlist/Title/Verb'">Manage playlists</translate>
+      <translate translate-context="Popup/Playlist/Title/Verb">Manage playlists</translate>
     </div>
     <div class="scrolling content">
       <div class="description">
         <template v-if="track">
-          <h4 class="ui header"><translate :translate-context="'Popup/Playlist/Title'">Current track</translate></h4>
-          <translate :translate-context="'Popup/Playlist/Paragraph'"
+          <h4 class="ui header"><translate translate-context="Popup/Playlist/Title">Current track</translate></h4>
+          <translate translate-context="Popup/Playlist/Paragraph"
             v-translate="{artist: track.artist.name, title: track.title}"
             :translate-params="{artist: track.artist.name, title: track.title}">
             "%{ title }", by %{ artist }
@@ -18,20 +18,20 @@
         <playlist-form :key="formKey"></playlist-form>
         <div class="ui divider"></div>
         <div v-if="errors.length > 0" class="ui negative message">
-          <div class="header"><translate :translate-context="'Popup/Playlist/Error message.Title'">The track can't be added to a playlist</translate></div>
+          <div class="header"><translate translate-context="Popup/Playlist/Error message.Title">The track can't be added to a playlist</translate></div>
           <ul class="list">
             <li v-for="error in errors">{{ error }}</li>
           </ul>
         </div>
         </div>
-        <h4 class="ui header"><translate :translate-context="'Popup/Playlist/Title'">Available playlists</translate></h4>
+        <h4 class="ui header"><translate translate-context="Popup/Playlist/Title">Available playlists</translate></h4>
         <table class="ui unstackable very basic table">
           <thead>
             <tr>
               <th></th>
-              <th><translate :translate-context="'*/*/Table.Label'">Name</translate></th>
-              <th class="sorted descending"><translate :translate-context="'Popup/Playlist/Table.Label/Short'">Last modification</translate></th>
-              <th><translate :translate-context="'*/*/Table.Label'">Tracks</translate></th>
+              <th><translate translate-context="*/*/Table.Label">Name</translate></th>
+              <th class="sorted descending"><translate translate-context="Popup/Playlist/Table.Label/Short">Last modification</translate></th>
+              <th><translate translate-context="*/*/Table.Label">Tracks</translate></th>
               <th></th>
             </tr>
           </thead>
@@ -52,7 +52,7 @@
                   class="ui green icon basic small right floated button"
                   :title="labels.addToPlaylist"
                   @click="addToPlaylist(playlist.id)">
-                  <i class="plus icon"></i> <translate :translate-context="'Popup/Playlist/Table.Button.Label/Verb'">Add track</translate>
+                  <i class="plus icon"></i> <translate translate-context="Popup/Playlist/Table.Button.Label/Verb">Add track</translate>
                 </div>
               </td>
             </tr>
@@ -61,7 +61,7 @@
       </div>
     </div>
     <div class="actions">
-      <div class="ui cancel button"><translate :translate-context="'Popup/Playlist/Button.Label'">Cancel</translate></div>
+      <div class="ui cancel button"><translate translate-context="Popup/Playlist/Button.Label">Cancel</translate></div>
     </div>
   </modal>
 </template>
diff --git a/front/src/components/playlists/TrackPlaylistIcon.vue b/front/src/components/playlists/TrackPlaylistIcon.vue
index e5dd7373149fd64e3c0b28565786318a4d2820a0..2f57eb163ab3c698bc4695ed69a1d2644a930e8b 100644
--- a/front/src/components/playlists/TrackPlaylistIcon.vue
+++ b/front/src/components/playlists/TrackPlaylistIcon.vue
@@ -4,7 +4,7 @@
     v-if="button"
     :class="['ui', 'icon', 'labeled', 'button']">
     <i class="list icon"></i>
-    <translate :translate-context="'Sidebar/Player/Icon.Tooltip/Verb'">Add to playlist…</translate>
+    <translate translate-context="Sidebar/Player/Icon.Tooltip/Verb">Add to playlist…</translate>
   </button>
   <button
     v-else
diff --git a/front/src/components/radios/Button.vue b/front/src/components/radios/Button.vue
index 6b26397d17a730ff56e528c6fc301d43f6e7a005..7662a5abeab214e743de268c5f607efe485b1577 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 :translate-context="'Content/Radio/Button.Label/Short, Verb'">Stop radio</translate></template>
-    <template v-else><translate :translate-context="'Content/Radio/Button.Label/Short, Verb'">Start radio</translate></template>
+    <template v-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 d83eb700604cd24e111a053e9f428bcb5f85b265..38996bec3c0faa90ae3eaf577c8c2dab710a1c74 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 :translate-context="'Content/Radio/Card.Button.Label/Short, Verb'">Edit…</translate>
+          <translate translate-context="Content/Radio/Card.Button.Label/Short, Verb">Edit…</translate>
         </router-link>
       </div>
     </div>
diff --git a/front/src/views/Notifications.vue b/front/src/views/Notifications.vue
index 3f262740c48445fd91c422e04358ac7ad64fdc31..435a35017d0a6c76ba8544ba17dce9eb329ada48 100644
--- a/front/src/views/Notifications.vue
+++ b/front/src/views/Notifications.vue
@@ -2,22 +2,22 @@
   <main class="main pusher" v-title="labels.title">
     <section class="ui vertical aligned stripe segment">
       <div class="ui container">
-        <h1 class="ui header"><translate :translate-context="'Content/Notifications/Title'">Your notifications</translate></h1>
+        <h1 class="ui header"><translate translate-context="Content/Notifications/Title">Your notifications</translate></h1>
         <div class="ui toggle checkbox">
           <input v-model="filters.is_read" type="checkbox">
-          <label><translate :translate-context="'Content/Notifications/Form.Label/Verb'">Show read notifications</translate></label>
+          <label><translate translate-context="Content/Notifications/Form.Label/Verb">Show read notifications</translate></label>
         </div>
         <div
           v-if="filters.is_read === false && notifications.count > 0"
           @click="markAllAsRead"
           class="ui basic labeled icon right floated button">
           <i class="ui check icon" />
-          <translate :translate-context="'Content/Notifications/Button.Label/Verb'">Mark all as read</translate>
+          <translate translate-context="Content/Notifications/Button.Label/Verb">Mark all as read</translate>
         </div>
         <div class="ui hidden divider" />
 
         <div v-if="isLoading" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']">
-          <div class="ui text loader"><translate :translate-context="'Content/Notifications/Paragraph'">Loading notifications…</translate></div>
+          <div class="ui text loader"><translate translate-context="Content/Notifications/Paragraph">Loading notifications…</translate></div>
         </div>
 
         <table v-else-if="notifications.count > 0" class="ui table">
@@ -26,7 +26,7 @@
           </tbody>
         </table>
         <p v-else>
-          <translate :translate-context="'Content/Notifications/Paragraph'">No notification to show.</translate>
+          <translate translate-context="Content/Notifications/Paragraph">No notification to show.</translate>
         </p>
       </div>
     </section>
diff --git a/front/src/views/admin/Settings.vue b/front/src/views/admin/Settings.vue
index 051d09d337445639b781e8aa6e94e3af0c02f61b..58031942d9b750257c7ea6bcb71f240b67bb1862 100644
--- a/front/src/views/admin/Settings.vue
+++ b/front/src/views/admin/Settings.vue
@@ -13,7 +13,7 @@
           </div>
           <div class="four wide column">
             <div class="ui sticky vertical secondary menu">
-              <div class="header item"><translate :translate-context="'Content/Admin/Menu.Title'">Sections</translate></div>
+              <div class="header item"><translate translate-context="Content/Admin/Menu.Title">Sections</translate></div>
               <a :class="['menu', {active: group.id === current}, 'item']"
                 @click.prevent="scrollTo(group.id)"
                 :href="'#' + group.id"
diff --git a/front/src/views/admin/library/Base.vue b/front/src/views/admin/library/Base.vue
index 293e569ef08906dd9c85c2916baa1f6065537b8a..efec7df66dd719b00f545a7f8a08574baa32cd7c 100644
--- a/front/src/views/admin/library/Base.vue
+++ b/front/src/views/admin/library/Base.vue
@@ -3,7 +3,7 @@
     <nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu">
       <router-link
         class="ui item"
-        :to="{name: 'manage.library.edits'}"><translate :translate-context="'Menu/Admin/Link'">Edits</translate></router-link>
+        :to="{name: 'manage.library.edits'}"><translate translate-context="Menu/Admin/Link">Edits</translate></router-link>
     </nav>
     <router-view :key="$route.fullPath"></router-view>
   </div>
diff --git a/front/src/views/admin/library/EditsList.vue b/front/src/views/admin/library/EditsList.vue
index b38732f4ae8e57e9a2196037ae5b19c700f65d07..e9b6d74d052ad408b0a13fea78f10013fa2aafd8 100644
--- a/front/src/views/admin/library/EditsList.vue
+++ b/front/src/views/admin/library/EditsList.vue
@@ -2,7 +2,7 @@
   <main v-title="labels.title">
     <section class="ui vertical stripe segment">
       <edits-card-list :update-url="true" :default-query="defaultQuery">
-        <h2 class="ui header"><translate :translate-context="'Content/Admin/Title/Noun'">Library edits</translate></h2>
+        <h2 class="ui header"><translate translate-context="Content/Admin/Title/Noun">Library edits</translate></h2>
       </edits-card-list>
     </section>
   </main>
diff --git a/front/src/views/admin/moderation/AccountsDetail.vue b/front/src/views/admin/moderation/AccountsDetail.vue
index 9632bdb68e8afb4ca65b41a07477d41af679d249..189a24cd944322ab038ce04913018a30eb7480ae 100644
--- a/front/src/views/admin/moderation/AccountsDetail.vue
+++ b/front/src/views/admin/moderation/AccountsDetail.vue
@@ -16,12 +16,12 @@
                     <template v-if="object.user">
                       <span class="ui tiny teal icon label">
                         <i class="home icon"></i>
-                        <translate :translate-context="'Content/Moderation/List item'">Local account</translate>
+                        <translate translate-context="Content/Moderation/List item">Local account</translate>
                       </span>
                       &nbsp;
                     </template>
                     <a :href="object.url || object.fid" target="_blank" rel="noopener noreferrer">
-                      <translate :translate-context="'Content/Moderation/Link/Verb'">Open profile</translate>&nbsp;
+                      <translate translate-context="Content/Moderation/Link/Verb">Open profile</translate>&nbsp;
                       <i class="external icon"></i>
                     </a>
                   </div>
@@ -44,16 +44,16 @@
                 <header class="ui header">
                   <h3>
                     <i class="shield icon"></i>
-                    <translate :translate-context="'Content/Moderation/Card.Title'">You don't have any rule in place for this account.</translate>
+                    <translate translate-context="Content/Moderation/Card.Title">You don't have any rule in place for this account.</translate>
                   </h3>
                 </header>
-                <p><translate :translate-context="'Content/Moderation/Card.Paragraph'">Moderation policies help you control how your instance interact with a given domain or account.</translate></p>
-                <button @click="showPolicyForm = true" class="ui primary button"><translate :translate-context="'Content/Moderation/Button/Verb'">Add a moderation policy</translate></button>
+                <p><translate translate-context="Content/Moderation/Card.Paragraph">Moderation policies help you control how your instance interact with a given domain or account.</translate></p>
+                <button @click="showPolicyForm = true" class="ui primary button"><translate translate-context="Content/Moderation/Button/Verb">Add a moderation policy</translate></button>
               </template>
               <instance-policy-card v-else-if="policy && !showPolicyForm" :object="policy" @update="showPolicyForm = true">
                 <header class="ui header">
                   <h3>
-                    <translate :translate-context="'Content/Moderation/Card.Title'">This domain is subject to specific moderation rules</translate>
+                    <translate translate-context="Content/Moderation/Card.Title">This domain is subject to specific moderation rules</translate>
                   </h3>
                 </header>
               </instance-policy-card>
@@ -76,14 +76,14 @@
               <h3 class="ui header">
                 <i class="info icon"></i>
                 <div class="content">
-                  <translate :translate-context="'Content/Moderation/Title'">Account data</translate>
+                  <translate translate-context="Content/Moderation/Title">Account data</translate>
                 </div>
               </h3>
               <table class="ui very basic table">
                 <tbody>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/*/*'">Username</translate>
+                      <translate translate-context="Content/*/*">Username</translate>
                     </td>
                     <td>
                       {{ object.preferred_username }}
@@ -91,7 +91,7 @@
                   </tr>
                   <tr v-if="!object.user">
                     <td>
-                      <translate :translate-context="'Content/*/*'">Domain</translate>
+                      <translate translate-context="Content/*/*">Domain</translate>
                     </td>
                     <td>
                       <router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}">
@@ -109,7 +109,7 @@
                   </tr>
                   <tr v-if="object.user">
                     <td>
-                      <translate :translate-context="'Content/*/*'">Email address</translate>
+                      <translate translate-context="Content/*/*">Email address</translate>
                     </td>
                     <td>
                       {{ object.user.email }}
@@ -117,7 +117,7 @@
                   </tr>
                   <tr v-if="object.user">
                     <td>
-                      <translate :translate-context="'Content/*/*/Noun'">Login status</translate>
+                      <translate translate-context="Content/*/*/Noun">Login status</translate>
                     </td>
                     <td>
                       <div class="ui toggle checkbox" v-if="object.user.username != $store.state.auth.profile.username">
@@ -125,17 +125,17 @@
                           @change="updateUser('is_active')"
                           v-model="object.user.is_active" type="checkbox">
                         <label>
-                          <translate v-if="object.user.is_active" key="1" :translate-context="'Content/*/Label'">Enabled</translate>
-                          <translate v-else key="2" :translate-context="'Content/*/Label'">Disabled</translate>
+                          <translate v-if="object.user.is_active" key="1" translate-context="Content/*/Label">Enabled</translate>
+                          <translate v-else key="2" translate-context="Content/*/Label">Disabled</translate>
                         </label>
                       </div>
-                      <translate v-else-if="object.user.is_active" key="1" :translate-context="'Content/*/Label'">Enabled</translate>
-                      <translate v-else key="2" :translate-context="'Content/*/Label'">Disabled</translate>
+                      <translate v-else-if="object.user.is_active" key="1" translate-context="Content/*/Label">Enabled</translate>
+                      <translate v-else key="2" translate-context="Content/*/Label">Disabled</translate>
                     </td>
                   </tr>
                   <tr v-if="object.user">
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label'">Permissions</translate>
+                      <translate translate-context="Content/Moderation/Table.Label">Permissions</translate>
                     </td>
                     <td>
                       <select
@@ -149,7 +149,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label/Noun'">Type</translate>
+                      <translate translate-context="Content/Moderation/Table.Label/Noun">Type</translate>
                     </td>
                     <td>
                       {{ object.type }}
@@ -157,7 +157,7 @@
                   </tr>
                   <tr v-if="!object.user">
                     <td>
-                      <translate :translate-context="'Content/*/Table.Label'">First seen</translate>
+                      <translate translate-context="Content/*/Table.Label">First seen</translate>
                     </td>
                     <td>
                       <human-date :date="object.creation_date"></human-date>
@@ -165,16 +165,16 @@
                   </tr>
                   <tr v-if="!object.user">
                     <td>
-                      <translate :translate-context="'Content/*/Table.Label'">Last checked</translate>
+                      <translate translate-context="Content/*/Table.Label">Last checked</translate>
                     </td>
                     <td>
                       <human-date v-if="object.last_fetch_date" :date="object.last_fetch_date"></human-date>
-                      <translate v-else :translate-context="'*/*/*'">N/A</translate>
+                      <translate v-else translate-context="*/*/*">N/A</translate>
                     </td>
                   </tr>
                   <tr v-if="object.user">
                     <td>
-                      <translate :translate-context="'Content/*/Table.Label'">Sign-up date</translate>
+                      <translate translate-context="Content/*/Table.Label">Sign-up date</translate>
                     </td>
                     <td>
                       <human-date :date="object.user.date_joined"></human-date>
@@ -182,7 +182,7 @@
                   </tr>
                   <tr v-if="object.user">
                     <td>
-                      <translate :translate-context="'Content/*/Table.Label'">Last activity</translate>
+                      <translate translate-context="Content/*/Table.Label">Last activity</translate>
                     </td>
                     <td>
                       <human-date :date="object.user.last_activity"></human-date>
@@ -197,7 +197,7 @@
               <h3 class="ui header">
                 <i class="feed icon"></i>
                 <div class="content">
-                  <translate :translate-context="'Content/Moderation/Title'">Activity</translate>&nbsp;
+                  <translate translate-context="Content/Moderation/Title">Activity</translate>&nbsp;
                   <span :data-tooltip="labels.statsWarning"><i class="question circle icon"></i></span>
 
                 </div>
@@ -212,7 +212,7 @@
                 <tbody>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label/Noun'">Emitted messages</translate>
+                      <translate translate-context="Content/Moderation/Table.Label/Noun">Emitted messages</translate>
                     </td>
                     <td>
                       {{ stats.outbox_activities}}
@@ -220,7 +220,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label/Noun'">Received library follows</translate>
+                      <translate translate-context="Content/Moderation/Table.Label/Noun">Received library follows</translate>
                     </td>
                     <td>
                       {{ stats.received_library_follows}}
@@ -228,7 +228,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label/Noun'">Emitted library follows</translate>
+                      <translate translate-context="Content/Moderation/Table.Label/Noun">Emitted library follows</translate>
                     </td>
                     <td>
                       {{ stats.emitted_library_follows}}
@@ -243,7 +243,7 @@
               <h3 class="ui header">
                 <i class="music icon"></i>
                 <div class="content">
-                  <translate :translate-context="'Content/Moderation/Title'">Audio content</translate>&nbsp;
+                  <translate translate-context="Content/Moderation/Title">Audio content</translate>&nbsp;
                   <span :data-tooltip="labels.statsWarning"><i class="question circle icon"></i></span>
 
                 </div>
@@ -259,7 +259,7 @@
 
                   <tr v-if="!object.user">
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label/Noun'">Cached size</translate>
+                      <translate translate-context="Content/Moderation/Table.Label/Noun">Cached size</translate>
                     </td>
                     <td>
                       {{ stats.media_downloaded_size | humanSize }}
@@ -267,7 +267,7 @@
                   </tr>
                   <tr v-if="object.user">
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label/Noun'" >Upload quota</translate>
+                      <translate translate-context="Content/Moderation/Table.Label/Noun" >Upload quota</translate>
                       <span :data-tooltip="labels.uploadQuota"><i class="question circle icon"></i></span>
                     </td>
                     <td>
@@ -279,14 +279,14 @@
                           step="100"
                           type="number" />
                         <div class="ui basic label">
-                          <translate :translate-context="'Content/*/*/Unit'">MB</translate>
+                          <translate translate-context="Content/*/*/Unit">MB</translate>
                         </div>
                       </div>
                     </td>
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/*/*'">Total size</translate>
+                      <translate translate-context="Content/*/*">Total size</translate>
                     </td>
                     <td>
                       {{ stats.media_total_size | humanSize }}
@@ -295,7 +295,7 @@
 
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label'">Libraries</translate>
+                      <translate translate-context="Content/Moderation/Table.Label">Libraries</translate>
                     </td>
                     <td>
                       {{ stats.libraries }}
@@ -303,7 +303,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label/Noun'">Uploads</translate>
+                      <translate translate-context="Content/Moderation/Table.Label/Noun">Uploads</translate>
                     </td>
                     <td>
                       {{ stats.uploads }}
@@ -311,7 +311,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/*/*'">Artists</translate>
+                      <translate translate-context="Content/*/*">Artists</translate>
                     </td>
                     <td>
                       {{ stats.artists }}
@@ -319,7 +319,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/*/*'">Albums</translate>
+                      <translate translate-context="Content/*/*">Albums</translate>
                     </td>
                     <td>
                       {{ stats.albums}}
@@ -327,7 +327,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/*/*'">Tracks</translate>
+                      <translate translate-context="Content/*/*">Tracks</translate>
                     </td>
                     <td>
                       {{ stats.tracks }}
diff --git a/front/src/views/admin/moderation/AccountsList.vue b/front/src/views/admin/moderation/AccountsList.vue
index 09c491faffc9717e72562d1f51d27e7ad135354d..1fd937be5290a21babce4cd77ce23ba38234749d 100644
--- a/front/src/views/admin/moderation/AccountsList.vue
+++ b/front/src/views/admin/moderation/AccountsList.vue
@@ -1,7 +1,7 @@
 <template>
   <main v-title="labels.accounts">
     <section class="ui vertical stripe segment">
-      <h2 class="ui header"><translate :translate-context="'Content/Moderation/Title'">Accounts</translate></h2>
+      <h2 class="ui header"><translate translate-context="Content/Moderation/Title">Accounts</translate></h2>
       <div class="ui hidden divider"></div>
       <accounts-table :update-url="true" :default-query="defaultQuery"></accounts-table>
     </section>
diff --git a/front/src/views/admin/moderation/Base.vue b/front/src/views/admin/moderation/Base.vue
index 9d7e76fdc6bdf4ffb566be92b66888047272d33d..19b87b5e4ed80cdfdd68635c1fbcf20f5c08c211 100644
--- a/front/src/views/admin/moderation/Base.vue
+++ b/front/src/views/admin/moderation/Base.vue
@@ -3,10 +3,10 @@
     <nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu">
       <router-link
         class="ui item"
-        :to="{name: 'manage.moderation.domains.list'}"><translate :translate-context="'Menu/Moderation/Tab'">Domains</translate></router-link>
+        :to="{name: 'manage.moderation.domains.list'}"><translate translate-context="Menu/Moderation/Tab">Domains</translate></router-link>
       <router-link
         class="ui item"
-        :to="{name: 'manage.moderation.accounts.list'}"><translate :translate-context="'Menu/Moderation/Tab'">Accounts</translate></router-link>
+        :to="{name: 'manage.moderation.accounts.list'}"><translate translate-context="Menu/Moderation/Tab">Accounts</translate></router-link>
 
     </nav>
     <router-view :key="$route.fullPath"></router-view>
diff --git a/front/src/views/admin/moderation/DomainsDetail.vue b/front/src/views/admin/moderation/DomainsDetail.vue
index e51fcd3074ade6ef7dd4dd2e30a898367b664c55..75355ea07a3c6b65044ae5928bc7caa4b934a201 100644
--- a/front/src/views/admin/moderation/DomainsDetail.vue
+++ b/front/src/views/admin/moderation/DomainsDetail.vue
@@ -14,7 +14,7 @@
                   {{ object.name }}
                   <div class="sub header">
                     <a :href="externalUrl" target="_blank" rel="noopener noreferrer" class="logo-wrapper">
-                      <translate :translate-context="'Content/Moderation/Link/Verb'">Open website</translate>&nbsp;
+                      <translate translate-context="Content/Moderation/Link/Verb">Open website</translate>&nbsp;
                       <i class="external icon"></i>
                     </a>
                   </div>
@@ -37,16 +37,16 @@
                 <header class="ui header">
                   <h3>
                     <i class="shield icon"></i>
-                    <translate :translate-context="'Content/Moderation/Card.Title'">You don't have any rule in place for this domain.</translate>
+                    <translate translate-context="Content/Moderation/Card.Title">You don't have any rule in place for this domain.</translate>
                   </h3>
                 </header>
-                <p><translate :translate-context="'Content/Moderation/Card.Paragraph'">Moderation policies help you control how your instance interact with a given domain or account.</translate></p>
+                <p><translate translate-context="Content/Moderation/Card.Paragraph">Moderation policies help you control how your instance interact with a given domain or account.</translate></p>
                 <button @click="showPolicyForm = true" class="ui primary button">Add a moderation policy</button>
               </template>
               <instance-policy-card v-else-if="policy && !showPolicyForm" :object="policy" @update="showPolicyForm = true">
                 <header class="ui header">
                   <h3>
-                    <translate :translate-context="'Content/Moderation/Card.Title'">This domain is subject to specific moderation rules</translate>
+                    <translate translate-context="Content/Moderation/Card.Title">This domain is subject to specific moderation rules</translate>
                   </h3>
                 </header>
               </instance-policy-card>
@@ -69,14 +69,14 @@
               <h3 class="ui header">
                 <i class="info icon"></i>
                 <div class="content">
-                  <translate :translate-context="'Content/Moderation/Title'">Instance data</translate>
+                  <translate translate-context="Content/Moderation/Title">Instance data</translate>
                 </div>
               </h3>
               <table class="ui very basic table">
                 <tbody>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/*/Table.Label'">First seen</translate>
+                      <translate translate-context="Content/*/Table.Label">First seen</translate>
                     </td>
                     <td>
                       <human-date :date="object.creation_date"></human-date>
@@ -84,18 +84,18 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/*/Table.Label'">Last checked</translate>
+                      <translate translate-context="Content/*/Table.Label">Last checked</translate>
                     </td>
                     <td>
                       <human-date v-if="object.nodeinfo_fetch_date" :date="object.nodeinfo_fetch_date"></human-date>
-                      <translate v-else :translate-context="'*/*/*'">N/A</translate>
+                      <translate v-else translate-context="*/*/*">N/A</translate>
                     </td>
                   </tr>
 
                   <template v-if="object.nodeinfo && object.nodeinfo.status === 'ok'">
                     <tr>
                       <td>
-                        <translate :translate-context="'Content/Moderation/Table.Label'">Software</translate>
+                        <translate translate-context="Content/Moderation/Table.Label">Software</translate>
                       </td>
                       <td>
                         {{ lodash.get(object, 'nodeinfo.payload.software.name', $gettext('N/A')) }} ({{ lodash.get(object, 'nodeinfo.payload.software.version', $gettext('N/A')) }})
@@ -103,7 +103,7 @@
                     </tr>
                     <tr>
                       <td>
-                        <translate :translate-context="'Content/Moderation/Table.Label'">Name</translate>
+                        <translate translate-context="Content/Moderation/Table.Label">Name</translate>
                       </td>
                       <td>
                         {{ lodash.get(object, 'nodeinfo.payload.metadata.nodeName', $gettext('N/A')) }}
@@ -111,7 +111,7 @@
                     </tr>
                     <tr>
                       <td>
-                        <translate :translate-context="'Content/*/*'">Total users</translate>
+                        <translate translate-context="Content/*/*">Total users</translate>
                       </td>
                       <td>
                         {{ lodash.get(object, 'nodeinfo.payload.usage.users.total', $gettext('N/A')) }}
@@ -121,10 +121,10 @@
                   <template v-if="object.nodeinfo && object.nodeinfo.status === 'error'">
                     <tr>
                       <td>
-                        <translate :translate-context="'Content/Moderation/Table.Label'">Status</translate>
+                        <translate translate-context="Content/Moderation/Table.Label">Status</translate>
                       </td>
                       <td>
-                        <translate :translate-context="'Content/Moderation/Table'">Error while fetching node info</translate>&nbsp;
+                        <translate translate-context="Content/Moderation/Table">Error while fetching node info</translate>&nbsp;
 
                         <span :data-tooltip="object.nodeinfo.error"><i class="question circle icon"></i></span>
                       </td>
@@ -133,7 +133,7 @@
                 </tbody>
               </table>
               <ajax-button @action-done="refreshNodeInfo" method="get" :url="'manage/federation/domains/' + object.name + '/nodeinfo/'">
-                <translate :translate-context="'Content/Moderation/Button.Label/Verb'">Refresh node info</translate>
+                <translate translate-context="Content/Moderation/Button.Label/Verb">Refresh node info</translate>
               </ajax-button>
             </section>
           </div>
@@ -142,7 +142,7 @@
               <h3 class="ui header">
                 <i class="feed icon"></i>
                 <div class="content">
-                  <translate :translate-context="'Content/Moderation/Title'">Activity</translate>&nbsp;
+                  <translate translate-context="Content/Moderation/Title">Activity</translate>&nbsp;
                   <span :data-tooltip="labels.statsWarning"><i class="question circle icon"></i></span>
 
                 </div>
@@ -159,7 +159,7 @@
                     <td>
                       <router-link
                         :to="{name: 'manage.moderation.accounts.list', query: {q: 'domain:' + object.name }}">
-                        <translate :translate-context="'Content/Moderation/Table.Label.Link'">Known accounts</translate>
+                        <translate translate-context="Content/Moderation/Table.Label.Link">Known accounts</translate>
                         </router-link>
 
                     </td>
@@ -169,7 +169,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label/Noun'">Emitted messages</translate>
+                      <translate translate-context="Content/Moderation/Table.Label/Noun">Emitted messages</translate>
                     </td>
                     <td>
                       {{ stats.outbox_activities}}
@@ -177,7 +177,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label/Noun'">Received library follows</translate>
+                      <translate translate-context="Content/Moderation/Table.Label/Noun">Received library follows</translate>
                     </td>
                     <td>
                       {{ stats.received_library_follows}}
@@ -185,7 +185,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label/Noun'">Emitted library follows</translate>
+                      <translate translate-context="Content/Moderation/Table.Label/Noun">Emitted library follows</translate>
                     </td>
                     <td>
                       {{ stats.emitted_library_follows}}
@@ -200,7 +200,7 @@
               <h3 class="ui header">
                 <i class="music icon"></i>
                 <div class="content">
-                  <translate :translate-context="'Content/Moderation/Title'">Audio content</translate>&nbsp;
+                  <translate translate-context="Content/Moderation/Title">Audio content</translate>&nbsp;
                   <span :data-tooltip="labels.statsWarning"><i class="question circle icon"></i></span>
 
                 </div>
@@ -215,7 +215,7 @@
                 <tbody>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label/Noun'">Cached size</translate>
+                      <translate translate-context="Content/Moderation/Table.Label/Noun">Cached size</translate>
                     </td>
                     <td>
                       {{ stats.media_downloaded_size | humanSize }}
@@ -223,7 +223,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label'">Total size</translate>
+                      <translate translate-context="Content/Moderation/Table.Label">Total size</translate>
                     </td>
                     <td>
                       {{ stats.media_total_size | humanSize }}
@@ -231,7 +231,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label'">Libraries</translate>
+                      <translate translate-context="Content/Moderation/Table.Label">Libraries</translate>
                     </td>
                     <td>
                       {{ stats.libraries }}
@@ -239,7 +239,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/Moderation/Table.Label/Noun'">Uploads</translate>
+                      <translate translate-context="Content/Moderation/Table.Label/Noun">Uploads</translate>
                     </td>
                     <td>
                       {{ stats.uploads }}
@@ -247,7 +247,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/*/*'">Artists</translate>
+                      <translate translate-context="Content/*/*">Artists</translate>
                     </td>
                     <td>
                       {{ stats.artists }}
@@ -255,7 +255,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/*/*'">Albums</translate>
+                      <translate translate-context="Content/*/*">Albums</translate>
                     </td>
                     <td>
                       {{ stats.albums}}
@@ -263,7 +263,7 @@
                   </tr>
                   <tr>
                     <td>
-                      <translate :translate-context="'Content/*/*'">Tracks</translate>
+                      <translate translate-context="Content/*/*">Tracks</translate>
                     </td>
                     <td>
                       {{ stats.tracks }}
diff --git a/front/src/views/admin/moderation/DomainsList.vue b/front/src/views/admin/moderation/DomainsList.vue
index 4b06b67e0aac1b18d6b0cb0a6dfaa408e874590d..f39d1bfbd45364c942541875e75d7ce25042dae3 100644
--- a/front/src/views/admin/moderation/DomainsList.vue
+++ b/front/src/views/admin/moderation/DomainsList.vue
@@ -1,22 +1,22 @@
 <template>
   <main v-title="labels.domains">
     <section class="ui vertical stripe segment">
-      <h2 class="ui left floated header"><translate :translate-context="'Content/Moderation/Title'">Domains</translate></h2>
+      <h2 class="ui left floated header"><translate translate-context="Content/Moderation/Title">Domains</translate></h2>
       <form class="ui right floated form" @submit.prevent="createDomain">
         <div v-if="errors && errors.length > 0" class="ui negative message">
-          <div class="header"><translate :translate-context="'Content/Moderation/Message.Title'">Error while creating domain</translate></div>
+          <div class="header"><translate translate-context="Content/Moderation/Message.Title">Error while creating domain</translate></div>
           <ul class="list">
             <li v-for="error in errors">{{ error }}</li>
           </ul>
         </div>
         <div class="inline fields">
           <div class="field">
-            <label for="domain"><translate :translate-context="'Content/Moderation/Form.Label/Verb'">Add a domain</translate></label>
+            <label for="domain"><translate translate-context="Content/Moderation/Form.Label/Verb">Add a domain</translate></label>
             <input type="text" name="domain" id="domain" v-model="domainName">
           </div>
           <div class="field">
             <button :class="['ui', {'loading': isCreating}, 'green', 'button']" type="submit" :disabled="isCreating">
-              <label for="domain"><translate :translate-context="'Content/Moderation/Button/Verb'">Add</translate></label>
+              <label for="domain"><translate translate-context="Content/Moderation/Button/Verb">Add</translate></label>
             </button>
           </div>
         </div>
diff --git a/front/src/views/admin/users/Base.vue b/front/src/views/admin/users/Base.vue
index 1c526d112e183b8ff811c1c978ee6d13b0848901..e1fa6f22e32eea65da64fbc30b5b662eb9d68964 100644
--- a/front/src/views/admin/users/Base.vue
+++ b/front/src/views/admin/users/Base.vue
@@ -3,10 +3,10 @@
     <nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu">
       <router-link
         class="ui item"
-        :to="{name: 'manage.users.users.list'}"><translate :translate-context="'*/Admin/Link'">Users</translate></router-link>
+        :to="{name: 'manage.users.users.list'}"><translate translate-context="*/Admin/Link">Users</translate></router-link>
       <router-link
         class="ui item"
-        :to="{name: 'manage.users.invitations.list'}"><translate :translate-context="'Menu/Admin/Link'">Invitations</translate></router-link>
+        :to="{name: 'manage.users.invitations.list'}"><translate translate-context="Menu/Admin/Link">Invitations</translate></router-link>
     </nav>
     <router-view :key="$route.fullPath"></router-view>
   </div>
diff --git a/front/src/views/admin/users/InvitationsList.vue b/front/src/views/admin/users/InvitationsList.vue
index 9dcb1f172ca1106f8313551d46e478213961133c..4e3920c50915478eda7004768a11f9a9fb9f4a49 100644
--- a/front/src/views/admin/users/InvitationsList.vue
+++ b/front/src/views/admin/users/InvitationsList.vue
@@ -1,7 +1,7 @@
 <template>
   <main v-title="labels.invitations">
     <section class="ui vertical stripe segment">
-      <h2 class="ui header"><translate :translate-context="'*/Admin/Title'">Invitations</translate></h2>
+      <h2 class="ui header"><translate translate-context="*/Admin/Title">Invitations</translate></h2>
       <invitation-form></invitation-form>
       <div class="ui hidden divider"></div>
       <invitations-table></invitations-table>
diff --git a/front/src/views/admin/users/UsersList.vue b/front/src/views/admin/users/UsersList.vue
index 38b9fd8e8f6bfb78220c13e0f6b6bf264368d15b..fc307074ca62bfc6e6b2070eb1b0e73eaa57bd41 100644
--- a/front/src/views/admin/users/UsersList.vue
+++ b/front/src/views/admin/users/UsersList.vue
@@ -1,7 +1,7 @@
 <template>
   <main v-title="labels.users">
     <section class="ui vertical stripe segment">
-      <h2 class="ui header"><translate :translate-context="'*/Admin/Title'">Users</translate></h2>
+      <h2 class="ui header"><translate translate-context="*/Admin/Title">Users</translate></h2>
       <div class="ui hidden divider"></div>
       <users-table></users-table>
     </section>
diff --git a/front/src/views/auth/EmailConfirm.vue b/front/src/views/auth/EmailConfirm.vue
index 554b424ae4e959eab56c3ec14f9f90303360f008..9b11c4efd2cefc64e2ab72f14d315470eae73bab 100644
--- a/front/src/views/auth/EmailConfirm.vue
+++ b/front/src/views/auth/EmailConfirm.vue
@@ -2,29 +2,29 @@
   <main class="main pusher" v-title="labels.confirm">
     <section class="ui vertical stripe segment">
       <div class="ui small text container">
-        <h2><translate :translate-context="'Content/Signup/Title'">Confirm your e-mail address</translate></h2>
+        <h2><translate translate-context="Content/Signup/Title">Confirm your e-mail address</translate></h2>
         <form v-if="!success" class="ui form" @submit.prevent="submit()">
           <div v-if="errors.length > 0" class="ui negative message">
-            <div class="header"><translate :translate-context="'Content/Signup/Paragraph'">Could not confirm your e-mail address</translate></div>
+            <div class="header"><translate translate-context="Content/Signup/Paragraph">Could not confirm your e-mail address</translate></div>
             <ul class="list">
               <li v-for="error in errors">{{ error }}</li>
             </ul>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/Signup/Form.Label'">Confirmation code</translate></label>
+            <label><translate translate-context="Content/Signup/Form.Label">Confirmation code</translate></label>
             <input name="confirmation-code" type="text" required v-model="key" />
           </div>
           <router-link :to="{path: '/login'}">
-            <translate :translate-context="'Content/Signup/Link/Verb'">Return to login</translate>
+            <translate translate-context="Content/Signup/Link/Verb">Return to login</translate>
           </router-link>
           <button :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit">
-            <translate :translate-context="'Content/Signup/Button.Label/Verb'">Confirm your e-mail address</translate></button>
+            <translate translate-context="Content/Signup/Button.Label/Verb">Confirm your e-mail address</translate></button>
         </form>
         <div v-else class="ui positive message">
-          <div class="header"><translate :translate-context="'Content/Signup/Message'">E-mail address confirmed</translate></div>
-          <p><translate :translate-context="'Content/Signup/Paragraph'">You can now use the service without limitations.</translate></p>
+          <div class="header"><translate translate-context="Content/Signup/Message">E-mail address confirmed</translate></div>
+          <p><translate translate-context="Content/Signup/Paragraph">You can now use the service without limitations.</translate></p>
           <router-link :to="{name: 'login'}">
-            <translate :translate-context="'Content/Signup/Link/Verb'">Proceed to login</translate>
+            <translate translate-context="Content/Signup/Link/Verb">Proceed to login</translate>
           </router-link>
         </div>
       </div>
diff --git a/front/src/views/auth/PasswordReset.vue b/front/src/views/auth/PasswordReset.vue
index 1cba54bce80ee85cb86b0dc5d7e87c7694744693..8b304fac476417a77928ad074b11162a961498bf 100644
--- a/front/src/views/auth/PasswordReset.vue
+++ b/front/src/views/auth/PasswordReset.vue
@@ -2,17 +2,17 @@
   <main class="main pusher" v-title="labels.reset">
     <section class="ui vertical stripe segment">
       <div class="ui small text container">
-        <h2><translate :translate-context="'Content/Signup/Title'">Reset your password</translate></h2>
+        <h2><translate translate-context="Content/Signup/Title">Reset your password</translate></h2>
         <form class="ui form" @submit.prevent="submit()">
           <div v-if="errors.length > 0" class="ui negative message">
-            <div class="header"><translate :translate-context="'Content/Signup/Card.Title'">Error while asking for a password reset</translate></div>
+            <div class="header"><translate translate-context="Content/Signup/Card.Title">Error while asking for a password reset</translate></div>
             <ul class="list">
               <li v-for="error in errors">{{ error }}</li>
             </ul>
           </div>
-          <p><translate :translate-context="'Content/Signup/Paragraph'">Use this form to request a password reset. We will send an email to the given address with instructions to reset your password.</translate></p>
+          <p><translate translate-context="Content/Signup/Paragraph">Use this form to request a password reset. We will send an email to the given address with instructions to reset your password.</translate></p>
           <div class="field">
-            <label><translate :translate-context="'Content/Signup/Input.Label'">Account's email</translate></label>
+            <label><translate translate-context="Content/Signup/Input.Label">Account's email</translate></label>
             <input
               required
               ref="email"
@@ -23,10 +23,10 @@
               v-model="email">
           </div>
           <router-link :to="{path: '/login'}">
-            <translate :translate-context="'Content/Signup/Link'">Back to login</translate>
+            <translate translate-context="Content/Signup/Link">Back to login</translate>
           </router-link>
           <button :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit">
-            <translate :translate-context="'Content/Signup/Button.Label/Verb'">Ask for a password reset</translate></button>
+            <translate translate-context="Content/Signup/Button.Label/Verb">Ask for a password reset</translate></button>
         </form>
       </div>
     </section>
diff --git a/front/src/views/auth/PasswordResetConfirm.vue b/front/src/views/auth/PasswordResetConfirm.vue
index 22f06ddba425b9522c4449111aca9adf4611efc8..2ed96a986c65fb4364481fce6882a7e4bf2f7cdb 100644
--- a/front/src/views/auth/PasswordResetConfirm.vue
+++ b/front/src/views/auth/PasswordResetConfirm.vue
@@ -2,34 +2,34 @@
   <main class="main pusher" v-title="labels.changePassword">
     <section class="ui vertical stripe segment">
       <div class="ui small text container">
-        <h2><translate :translate-context="'Content/Signup/Title'">Change your password</translate></h2>
+        <h2><translate translate-context="Content/Signup/Title">Change your password</translate></h2>
         <form v-if="!success" class="ui form" @submit.prevent="submit()">
           <div v-if="errors.length > 0" class="ui negative message">
-            <div class="header"><translate :translate-context="'Content/Signup/Card.Title'">Error while changing your password</translate></div>
+            <div class="header"><translate translate-context="Content/Signup/Card.Title">Error while changing your password</translate></div>
             <ul class="list">
               <li v-for="error in errors">{{ error }}</li>
             </ul>
           </div>
           <template v-if="token && uid">
             <div class="field">
-              <label><translate :translate-context="'Content/Signup/Input.Label'">New password</translate></label>
+              <label><translate translate-context="Content/Signup/Input.Label">New password</translate></label>
               <password-input v-model="newPassword" />
             </div>
             <router-link :to="{path: '/login'}">
-              <translate :translate-context="'Content/Signup/Link'">Back to login</translate>
+              <translate translate-context="Content/Signup/Link">Back to login</translate>
             </router-link>
             <button :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit">
-              <translate :translate-context="'Content/Signup/Button.Label'">Update your password</translate></button>
+              <translate translate-context="Content/Signup/Button.Label">Update your password</translate></button>
           </template>
           <template v-else>
-            <p><translate :translate-context="'Content/Signup/Paragraph'">If the email address provided in the previous step is valid and binded to a user account, you should receive an email with reset instructions in the next couple of minutes.</translate></p>
+            <p><translate translate-context="Content/Signup/Paragraph">If the email address provided in the previous step is valid and binded to a user account, you should receive an email with reset instructions in the next couple of minutes.</translate></p>
           </template>
         </form>
         <div v-else class="ui positive message">
-          <div class="header"><translate :translate-context="'Content/Signup/Card.Title'">Password updated successfully</translate></div>
-          <p><translate :translate-context="'Content/Signup/Card.Paragraph'">Your password has been updated successfully.</translate></p>
+          <div class="header"><translate translate-context="Content/Signup/Card.Title">Password updated successfully</translate></div>
+          <p><translate translate-context="Content/Signup/Card.Paragraph">Your password has been updated successfully.</translate></p>
           <router-link :to="{name: 'login'}">
-            <translate :translate-context="'Content/Signup/Link/Verb'">Proceed to login</translate>
+            <translate translate-context="Content/Signup/Link/Verb">Proceed to login</translate>
           </router-link>
         </div>
       </div>
diff --git a/front/src/views/content/Base.vue b/front/src/views/content/Base.vue
index daa45e4dc660b53ab3d342315f5a210da956b266..c6523b744a92917cbcbcd0a330005698c3db9742 100644
--- a/front/src/views/content/Base.vue
+++ b/front/src/views/content/Base.vue
@@ -3,10 +3,10 @@
     <nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu">
       <router-link
         class="ui item"
-        :to="{name: 'content.libraries.index'}"><translate :translate-context="'Menu/Library/Tab.Link'">Libraries</translate></router-link>
+        :to="{name: 'content.libraries.index'}"><translate translate-context="Menu/Library/Tab.Link">Libraries</translate></router-link>
       <router-link
         class="ui item"
-        :to="{name: 'content.libraries.files'}"><translate :translate-context="'Menu/Library/Tab.Link'">Tracks</translate></router-link>
+        :to="{name: 'content.libraries.files'}"><translate translate-context="Menu/Library/Tab.Link">Tracks</translate></router-link>
     </nav>
     <router-view :key="$route.fullPath"></router-view>
   </main>
diff --git a/front/src/views/content/Home.vue b/front/src/views/content/Home.vue
index d7753fd3ab86042cf02d39d1ea86778f4b2d50f0..de8a86e256e8b3d9d4bd092c58abb9afc6131895 100644
--- a/front/src/views/content/Home.vue
+++ b/front/src/views/content/Home.vue
@@ -2,22 +2,22 @@
   <section class="ui vertical aligned stripe segment" v-title="labels.title">
     <div class="ui text container">
       <h1>{{ labels.title }}</h1>
-      <p><translate :translate-context="'Content/Library/Paragraph'">There are various ways to grab new content and make it available here.</translate></p>
+      <p><translate translate-context="Content/Library/Paragraph">There are various ways to grab new content and make it available here.</translate></p>
       <div class="ui segment">
-        <h2><translate :translate-context="'Content/Library/Title/Verb'">Upload audio content</translate></h2>
-        <p><translate :translate-context="'Content/Library/Paragraph'">Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here.</translate></p>
+        <h2><translate translate-context="Content/Library/Title/Verb">Upload audio content</translate></h2>
+        <p><translate translate-context="Content/Library/Paragraph">Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here.</translate></p>
         <p>
-          <strong><translate :translate-context="'Content/Library/Paragraph'" :translate-params="{quota: defaultQuota}">This instance offers up to %{quota} of storage space for every user.</translate></strong>
+          <strong><translate translate-context="Content/Library/Paragraph" :translate-params="{quota: defaultQuota}">This instance offers up to %{quota} of storage space for every user.</translate></strong>
         </p>
         <router-link :to="{name: 'content.libraries.index'}" class="ui green button">
-          <translate :translate-context="'Content/Library/Button.Label/Verb'">Get started</translate>
+          <translate translate-context="Content/Library/Button.Label/Verb">Get started</translate>
         </router-link>
       </div>
       <div class="ui segment">
-        <h2><translate :translate-context="'Content/Library/Title/Verb'">Follow remote libraries</translate></h2>
-        <p><translate :translate-context="'Content/Library/Paragraph'">You can follow libraries from other users to get access to new music. Public libraries can be followed immediatly, while following a private library requires approval from its owner.</translate></p>
+        <h2><translate translate-context="Content/Library/Title/Verb">Follow remote libraries</translate></h2>
+        <p><translate translate-context="Content/Library/Paragraph">You can follow libraries from other users to get access to new music. Public libraries can be followed immediatly, while following a private library requires approval from its owner.</translate></p>
         <router-link :to="{name: 'content.remote.index'}" class="ui green button">
-          <translate :translate-context="'Content/Library/Button.Label/Verb'">Get started</translate>
+          <translate translate-context="Content/Library/Button.Label/Verb">Get started</translate>
         </router-link>
       </div>
 
diff --git a/front/src/views/content/libraries/Card.vue b/front/src/views/content/libraries/Card.vue
index b60c2c1b986c3f0643833862aacea9cb860b43b0..3eb44f72d48c8e486bd8578bfcf17f7ab9b37225 100644
--- a/front/src/views/content/libraries/Card.vue
+++ b/front/src/views/content/libraries/Card.vue
@@ -37,15 +37,15 @@
           {{ library.size | humanSize }}
         </span>
         <i class="music icon"></i>
-        <translate :translate-context="'Content/Library/Card.List item'" :translate-params="{count: library.uploads_count}" :translate-n="library.uploads_count" translate-plural="%{ count } tracks">%{ count } track</translate>
+        <translate translate-context="Content/Library/Card.List item" :translate-params="{count: library.uploads_count}" :translate-n="library.uploads_count" translate-plural="%{ count } tracks">%{ count } track</translate>
       </div>
     </div>
     <div class="ui bottom basic attached buttons">
       <router-link :to="{name: 'content.libraries.detail.upload', params: {id: library.uuid}}" class="ui button">
-        <translate :translate-context="'Content/Library/Card.Button.Label/Verb'">Upload</translate>
+        <translate translate-context="Content/Library/Card.Button.Label/Verb">Upload</translate>
       </router-link>
       <router-link :to="{name: 'content.libraries.detail', params: {id: library.uuid}}" exact class="ui button">
-        <translate :translate-context="'Content/Library/Card.Button.Label/Noun'">Details</translate>
+        <translate translate-context="Content/Library/Card.Button.Label/Noun">Details</translate>
       </router-link>
     </div>
   </div>
diff --git a/front/src/views/content/libraries/Detail.vue b/front/src/views/content/libraries/Detail.vue
index 651447f3625f9630e576bf54fe6d25fd620715f8..c3f6f0cb087e0a2284cebafcd2bbbd3ed79f004a 100644
--- a/front/src/views/content/libraries/Detail.vue
+++ b/front/src/views/content/libraries/Detail.vue
@@ -1,33 +1,33 @@
 <template>
   <section class="ui vertical aligned stripe segment">
     <div v-if="isLoadingLibrary" :class="['ui', {'active': isLoadingLibrary}, 'inverted', 'dimmer']">
-      <div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading library data…</translate></div>
+      <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading library data…</translate></div>
     </div>
     <detail-area v-else :library="library">
       <div class="ui top attached tabular menu">
-        <a :class="['item', {active: currentTab === 'follows'}]" @click="currentTab = 'follows'"><translate :translate-context="'Content/Library/Tab.Title'">Followers</translate></a>
-        <a :class="['item', {active: currentTab === 'tracks'}]" @click="currentTab = 'tracks'"><translate :translate-context="'*/*/*'">Tracks</translate></a>
-        <a :class="['item', {active: currentTab === 'edit'}]" @click="currentTab = 'edit'"><translate :translate-context="'*/*/*/Verb'">Edit</translate></a>
+        <a :class="['item', {active: currentTab === 'follows'}]" @click="currentTab = 'follows'"><translate translate-context="Content/Library/Tab.Title">Followers</translate></a>
+        <a :class="['item', {active: currentTab === 'tracks'}]" @click="currentTab = 'tracks'"><translate translate-context="*/*/*">Tracks</translate></a>
+        <a :class="['item', {active: currentTab === 'edit'}]" @click="currentTab = 'edit'"><translate translate-context="*/*/*/Verb">Edit</translate></a>
       </div>
       <div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'follows'}]">
         <div class="ui form">
           <div class="field">
-            <label><translate :translate-context="'Content/Library/Title'">Sharing link</translate></label>
-            <p><translate :translate-context="'Content/Library/Paragraph'">Share this link with other users so they can request access to your library.</translate></p>
+            <label><translate translate-context="Content/Library/Title">Sharing link</translate></label>
+            <p><translate translate-context="Content/Library/Paragraph">Share this link with other users so they can request access to your library.</translate></p>
             <copy-input :value="library.fid" />
           </div>
         </div>
         <div class="ui hidden divider"></div>
         <div v-if="isLoadingFollows" :class="['ui', {'active': isLoadingFollows}, 'inverted', 'dimmer']">
-          <div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading followers…</translate></div>
+          <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading followers…</translate></div>
         </div>
         <table v-else-if="follows && follows.count > 0" class="ui table">
           <thead>
             <tr>
-              <th><translate :translate-context="'Content/Library/Table.Label'">User</translate></th>
-              <th><translate :translate-context="'Content/Library/Table.Label'">Date</translate></th>
-              <th><translate :translate-context="'Content/Library/Table.Label'">Status</translate></th>
-              <th><translate :translate-context="'Content/Library/Table.Label'">Action</translate></th>
+              <th><translate translate-context="Content/Library/Table.Label">User</translate></th>
+              <th><translate translate-context="Content/Library/Table.Label">Date</translate></th>
+              <th><translate translate-context="Content/Library/Table.Label">Status</translate></th>
+              <th><translate translate-context="Content/Library/Table.Label">Action</translate></th>
             </tr>
           </thead>
           <tr v-for="follow in follows.results" :key="follow.fid">
@@ -35,27 +35,27 @@
             <td><human-date :date="follow.creation_date" /></td>
             <td>
               <span :class="['ui', 'yellow', 'basic', 'label']" v-if="follow.approved === null">
-                <translate :translate-context="'Content/Library/Table/Short'">Pending approval</translate>
+                <translate translate-context="Content/Library/Table/Short">Pending approval</translate>
               </span>
               <span :class="['ui', 'green', 'basic', 'label']" v-else-if="follow.approved === true">
-                <translate :translate-context="'Content/Library/Table/Short'">Accepted</translate>
+                <translate translate-context="Content/Library/Table/Short">Accepted</translate>
               </span>
               <span :class="['ui', 'red', 'basic', 'label']" v-else-if="follow.approved === false">
-                <translate :translate-context="'Content/Library/Table/Short'">Rejected</translate>
+                <translate translate-context="Content/Library/Table/Short">Rejected</translate>
               </span>
             </td>
             <td>
               <div @click="updateApproved(follow, true)" :class="['ui', 'mini', 'icon', 'labeled', 'green', 'button']" v-if="follow.approved === null || follow.approved === false">
-                <i class="ui check icon"></i> <translate :translate-context="'Content/Library/Button.Label'">Accept</translate>
+                <i class="ui check icon"></i> <translate translate-context="Content/Library/Button.Label">Accept</translate>
               </div>
               <div @click="updateApproved(follow, false)" :class="['ui', 'mini', 'icon', 'labeled', 'red', 'button']" v-if="follow.approved === null || follow.approved === true">
-                <i class="ui x icon"></i> <translate :translate-context="'Content/Library/Button.Label'">Reject</translate>
+                <i class="ui x icon"></i> <translate translate-context="Content/Library/Button.Label">Reject</translate>
               </div>
             </td>
           </tr>
 
         </table>
-        <p v-else><translate :translate-context="'Content/Library/Paragraph'">Nobody is following this library</translate></p>
+        <p v-else><translate translate-context="Content/Library/Paragraph">Nobody is following this library</translate></p>
       </div>
       <div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'tracks'}]">
         <library-files-table :filters="{library: library.uuid}"></library-files-table>
diff --git a/front/src/views/content/libraries/DetailArea.vue b/front/src/views/content/libraries/DetailArea.vue
index 42f6bac8987a2ef4585ea1294bd4cc6ebd35c723..0a73c90b927589c55bd1353a399febd67bb2309e 100644
--- a/front/src/views/content/libraries/DetailArea.vue
+++ b/front/src/views/content/libraries/DetailArea.vue
@@ -2,7 +2,7 @@
   <div>
     <div class="ui two column row">
       <div class="column">
-        <h3 class="ui header"><translate :translate-context="'Content/Library/Title'">Current library</translate></h3>
+        <h3 class="ui header"><translate translate-context="Content/Library/Title">Current library</translate></h3>
         <library-card :library="library" />
       </div>
     </div>
diff --git a/front/src/views/content/libraries/FilesTable.vue b/front/src/views/content/libraries/FilesTable.vue
index 17be3659327e6a039134ea848c023a6ed83a53d7..9d76607140d645f3df3d0203ab4d7b9797896dec 100644
--- a/front/src/views/content/libraries/FilesTable.vue
+++ b/front/src/views/content/libraries/FilesTable.vue
@@ -3,23 +3,23 @@
     <div class="ui inline form">
       <div class="fields">
         <div class="ui six wide field">
-          <label><translate :translate-context="'Content/Library/Input.Label/Verb'">Search</translate></label>
+          <label><translate translate-context="Content/Library/Input.Label/Verb">Search</translate></label>
           <form @submit.prevent="search.query = $refs.search.value">
             <input name="search" ref="search" type="text" :value="search.query" :placeholder="labels.searchPlaceholder" />
           </form>
         </div>
         <div class="field">
-          <label><translate :translate-context="'Content/Library/Dropdown.Label/Noun'">Import status</translate></label>
+          <label><translate translate-context="Content/Library/Dropdown.Label/Noun">Import status</translate></label>
           <select class="ui dropdown" @change="addSearchToken('status', $event.target.value)" :value="getTokenValue('status', '')">
-            <option value=""><translate :translate-context="'Content/Library/Dropdown'">All</translate></option>
-            <option value="pending"><translate :translate-context="'Content/Library/Dropdown'">Pending</translate></option>
-            <option value="skipped"><translate :translate-context="'Content/Library/Dropdown'">Skipped</translate></option>
-            <option value="errored"><translate :translate-context="'Content/Library/Dropdown'">Failed</translate></option>
-            <option value="finished"><translate :translate-context="'Content/Library/Dropdown'">Finished</translate></option>
+            <option value=""><translate translate-context="Content/Library/Dropdown">All</translate></option>
+            <option value="pending"><translate translate-context="Content/Library/Dropdown">Pending</translate></option>
+            <option value="skipped"><translate translate-context="Content/Library/Dropdown">Skipped</translate></option>
+            <option value="errored"><translate translate-context="Content/Library/Dropdown">Failed</translate></option>
+            <option value="finished"><translate translate-context="Content/Library/Dropdown">Finished</translate></option>
           </select>
         </div>
         <div class="field">
-          <label><translate :translate-context="'Content/Library/Dropdown.Label/Noun'">Ordering</translate></label>
+          <label><translate translate-context="Content/Library/Dropdown.Label/Noun">Ordering</translate></label>
           <select class="ui dropdown" v-model="ordering">
             <option v-for="option in orderingOptions" :value="option[0]">
               {{ sharedLabels.filters[option[1]] }}
@@ -27,10 +27,10 @@
           </select>
         </div>
         <div class="field">
-          <label><translate :translate-context="'Content/Library/Dropdown.Label/Noun'">Ordering direction</translate></label>
+          <label><translate translate-context="Content/Library/Dropdown.Label/Noun">Ordering direction</translate></label>
           <select class="ui dropdown" v-model="orderingDirection">
-            <option value="+"><translate :translate-context="'Content/Library/Dropdown'">Ascending</translate></option>
-            <option value="-"><translate :translate-context="'Content/Library/Dropdown'">Descending</translate></option>
+            <option value="+"><translate translate-context="Content/Library/Dropdown">Ascending</translate></option>
+            <option value="-"><translate translate-context="Content/Library/Dropdown">Descending</translate></option>
           </select>
         </div>
       </div>
@@ -52,13 +52,13 @@
         @refresh="fetchData"
         :filters="actionFilters">
         <template slot="header-cells">
-          <th><translate :translate-context="'*/*/*'">Title</translate></th>
-          <th><translate :translate-context="'*/*/*'">Artist</translate></th>
-          <th><translate :translate-context="'*/*/*'">Album</translate></th>
-          <th><translate :translate-context="'*/*/*/Noun'">Upload date</translate></th>
-          <th><translate :translate-context="'*/*/*/Noun'">Import status</translate></th>
-          <th><translate :translate-context="'*/*/*'">Duration</translate></th>
-          <th><translate :translate-context="'*/*/*'">Size</translate></th>
+          <th><translate translate-context="*/*/*">Title</translate></th>
+          <th><translate translate-context="*/*/*">Artist</translate></th>
+          <th><translate translate-context="*/*/*">Album</translate></th>
+          <th><translate translate-context="*/*/*/Noun">Upload date</translate></th>
+          <th><translate translate-context="*/*/*/Noun">Import status</translate></th>
+          <th><translate translate-context="*/*/*">Duration</translate></th>
+          <th><translate translate-context="*/*/*">Size</translate></th>
         </template>
         <template slot="row-cells" slot-scope="scope">
           <template v-if="scope.obj.track">
@@ -90,13 +90,13 @@
             {{ time.parse(scope.obj.duration) }}
           </td>
           <td v-else>
-            <translate :translate-context="'*/*/*'">N/A</translate>
+            <translate translate-context="*/*/*">N/A</translate>
           </td>
           <td v-if="scope.obj.size">
             {{ scope.obj.size | humanSize }}
           </td>
           <td v-else>
-            <translate :translate-context="'*/*/*'">N/A</translate>
+            <translate translate-context="*/*/*">N/A</translate>
           </td>
         </template>
       </action-table>
@@ -112,7 +112,7 @@
         ></pagination>
 
       <span v-if="result && result.results.length > 0">
-        <translate :translate-context="'Content/Library/Paragraph'"
+        <translate translate-context="Content/Library/Paragraph"
           :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
           Showing results %{ start }-%{ end } on %{ total }
         </translate>
diff --git a/front/src/views/content/libraries/Form.vue b/front/src/views/content/libraries/Form.vue
index 378ca9b06d9b700ee0dc865ca84dc3fa134e8075..00db423807ad555e747c461aaf1c76cac92fee6c 100644
--- a/front/src/views/content/libraries/Form.vue
+++ b/front/src/views/content/libraries/Form.vue
@@ -1,43 +1,43 @@
 <template>
   <form class="ui form" @submit.prevent="submit">
-    <p v-if="!library"><translate :translate-context="'Content/Library/Paragraph'">Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family.</translate></p>
+    <p v-if="!library"><translate translate-context="Content/Library/Paragraph">Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family.</translate></p>
     <div v-if="errors.length > 0" class="ui negative message">
-      <div class="header"><translate :translate-context="'Content/Library/Error message.Title'">Error</translate></div>
+      <div class="header"><translate translate-context="Content/Library/Error message.Title">Error</translate></div>
       <ul class="list">
         <li v-for="error in errors">{{ error }}</li>
       </ul>
     </div>
     <div class="required field">
-      <label><translate :translate-context="'Content/Library/Input.Label'">Name</translate></label>
+      <label><translate translate-context="Content/Library/Input.Label">Name</translate></label>
       <input name="name" v-model="currentName" :placeholder="labels.namePlaceholder" required maxlength="100">
     </div>
     <div class="field">
-      <label><translate :translate-context="'Content/Library/Input.Label'">Description</translate></label>
+      <label><translate translate-context="Content/Library/Input.Label">Description</translate></label>
       <textarea v-model="currentDescription" :placeholder="labels.descriptionPlaceholder" maxlength="2000"></textarea>
     </div>
     <div class="field">
-      <label><translate :translate-context="'Content/Library/Dropdown.Label'">Visibility</translate></label>
-      <p><translate :translate-context="'Content/Library/Paragraph'">You are able to share your library with other people, regardless of its visibility.</translate></p>
+      <label><translate translate-context="Content/Library/Dropdown.Label">Visibility</translate></label>
+      <p><translate translate-context="Content/Library/Paragraph">You are able to share your library with other people, regardless of its visibility.</translate></p>
       <select class="ui dropdown" v-model="currentVisibilityLevel">
         <option :value="c" v-for="c in ['me', 'instance', 'everyone']">{{ labels.visibility[c] }}</option>
       </select>
     </div>
     <button class="ui submit button" type="submit">
-      <translate :translate-context="'Content/Library/Button.Label/Verb'" v-if="library">Update library</translate>
-      <translate :translate-context="'Content/Library/Button.Label/Verb'" v-else>Create library</translate>
+      <translate translate-context="Content/Library/Button.Label/Verb" v-if="library">Update library</translate>
+      <translate translate-context="Content/Library/Button.Label/Verb" v-else>Create library</translate>
     </button>
     <dangerous-button v-if="library" class="right floated basic button" color='red' @confirm="remove()">
-      <translate :translate-context="'Content/Library/Button.Label/Verb'">Delete</translate>
+      <translate translate-context="Content/Library/Button.Label/Verb">Delete</translate>
       <p slot="modal-header">
-        <translate :translate-context="'Popup/Library/Title'">Delete this library?</translate>
+        <translate translate-context="Popup/Library/Title">Delete this library?</translate>
       </p>
       <p slot="modal-content">
-        <translate :translate-context="'Popup/Library/Paragraph'">
+        <translate translate-context="Popup/Library/Paragraph">
           The library and all its tracks will be deleted. This can not be undone.
         </translate>
       </p>
       <div slot="modal-confirm">
-        <translate :translate-context="'Popup/Library/Button.Label/Verb'">Delete library</translate>
+        <translate translate-context="Popup/Library/Button.Label/Verb">Delete library</translate>
       </div>
     </dangerous-button>
   </form>
diff --git a/front/src/views/content/libraries/Home.vue b/front/src/views/content/libraries/Home.vue
index 76ebc0ab200b98108379b0580c4f1b2a450894e8..69b4ce3a2863ed59aad101f3ccc2881c968bbdda 100644
--- a/front/src/views/content/libraries/Home.vue
+++ b/front/src/views/content/libraries/Home.vue
@@ -1,18 +1,18 @@
 <template>
   <section class="ui vertical aligned stripe segment">
     <div v-if="isLoading" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']">
-      <div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading Libraries…</translate></div>
+      <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading Libraries…</translate></div>
     </div>
     <div v-else class="ui text container">
-      <h1 class="ui header"><translate :translate-context="'Content/Library/Title'">My libraries</translate></h1>
+      <h1 class="ui header"><translate translate-context="Content/Library/Title">My libraries</translate></h1>
 
       <p v-if="libraries.length == 0">
-        <translate :translate-context="'Content/Library/Paragraph'">Looks like you don't have a library, it's time to create one.</translate>
+        <translate translate-context="Content/Library/Paragraph">Looks like you don't have a library, it's time to create one.</translate>
       </p>
       <a @click="hiddenForm = !hiddenForm">
         <i class="plus icon" v-if="hiddenForm" />
         <i class="minus icon" v-else />
-        <translate :translate-context="'Content/Library/Link/Verb'">Create a new library</translate>
+        <translate translate-context="Content/Library/Link/Verb">Create a new library</translate>
       </a>
       <library-form :library="null" v-if="!hiddenForm" @created="libraryCreated" />
       <div class="ui hidden divider"></div>
diff --git a/front/src/views/content/libraries/Quota.vue b/front/src/views/content/libraries/Quota.vue
index ddc304f771901632857284e77e70a6c833e04409..fc6a8db284d117e99cbf86f95bf386c90b2b3979 100644
--- a/front/src/views/content/libraries/Quota.vue
+++ b/front/src/views/content/libraries/Quota.vue
@@ -1,15 +1,15 @@
 <template>
   <div class="ui segment">
-    <h3 class="ui header"><translate :translate-context="'Content/Library/Title'">Current usage</translate></h3>
+    <h3 class="ui header"><translate translate-context="Content/Library/Title">Current usage</translate></h3>
     <div v-if="isLoading" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']">
-      <div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading usage data…</translate></div>
+      <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading usage data…</translate></div>
     </div>
     <div :class="['ui', {'success': progress < 60}, {'yellow': progress >= 60 && progress < 96}, {'error': progress >= 95}, 'progress']">
       <div class="bar" :style="{width: `${progress}%`}">
         <div class="progress">{{ progress }}%</div>
       </div>
       <div class="label" v-if="quotaStatus">
-        <translate :translate-context="'Content/Library/Paragraph'" :translate-params="{max: humanSize(quotaStatus.max * 1000 * 1000), current: humanSize(quotaStatus.current * 1000 * 1000)}">%{ current } used on %{ max } allowed</translate>
+        <translate translate-context="Content/Library/Paragraph" :translate-params="{max: humanSize(quotaStatus.max * 1000 * 1000), current: humanSize(quotaStatus.current * 1000 * 1000)}">%{ current } used on %{ max } allowed</translate>
       </div>
     </div>
     <div class="ui hidden divider"></div>
@@ -20,24 +20,24 @@
             {{ humanSize(quotaStatus.pending * 1000 * 1000) }}
           </div>
           <div class="label">
-            <translate :translate-context="'Content/Library/Label'">Pending files</translate>
+            <translate translate-context="Content/Library/Label">Pending files</translate>
           </div>
         </div>
         <div>
           <router-link
             class="ui basic blue tiny button"
             :to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'pending'}])}}">
-            <translate :translate-context="'Content/Library/Link/Verb'">View files</translate>
+            <translate translate-context="Content/Library/Link/Verb">View files</translate>
           </router-link>
 
           <dangerous-button
             color="grey"
             class="basic tiny"
             :action="purgePendingFiles">
-            <translate :translate-context="'Content/Library/Button.Label/Verb'">Purge</translate>
-            <p slot="modal-header"><translate :translate-context="'Popup/Library/Title'">Purge pending files?</translate></p>
-            <p slot="modal-content"><translate :translate-context="'Popup/Library/Paragraph'">Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota.</translate></p>
-            <div slot="modal-confirm"><translate :translate-context="'Popup/Library/Button.Label'">Purge</translate></div>
+            <translate translate-context="Content/Library/Button.Label/Verb">Purge</translate>
+            <p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge pending files?</translate></p>
+            <p slot="modal-content"><translate translate-context="Popup/Library/Paragraph">Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota.</translate></p>
+            <div slot="modal-confirm"><translate translate-context="Popup/Library/Button.Label">Purge</translate></div>
           </dangerous-button>
         </div>
       </div>
@@ -47,23 +47,23 @@
             {{ humanSize(quotaStatus.skipped * 1000 * 1000) }}
           </div>
           <div class="label">
-            <translate :translate-context="'Content/Library/Label'">Skipped files</translate>
+            <translate translate-context="Content/Library/Label">Skipped files</translate>
           </div>
         </div>
         <div>
           <router-link
             class="ui basic blue tiny button"
             :to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'skipped'}])}}">
-            <translate :translate-context="'Content/Library/Link/Verb'">View files</translate>
+            <translate translate-context="Content/Library/Link/Verb">View files</translate>
           </router-link>
           <dangerous-button
             color="grey"
             class="basic tiny"
             :action="purgeSkippedFiles">
-            <translate :translate-context="'Content/Library/Button.Label/Verb'">Purge</translate>
-            <p slot="modal-header"><translate :translate-context="'Popup/Library/Title'">Purge skipped files?</translate></p>
-            <p slot="modal-content"><translate :translate-context="'Popup/Library/Paragraph'">Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota.</translate></p>
-            <div slot="modal-confirm"><translate :translate-context="'Popup/Library/Button.Label'">Purge</translate></div>
+            <translate translate-context="Content/Library/Button.Label/Verb">Purge</translate>
+            <p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge skipped files?</translate></p>
+            <p slot="modal-content"><translate translate-context="Popup/Library/Paragraph">Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota.</translate></p>
+            <div slot="modal-confirm"><translate translate-context="Popup/Library/Button.Label">Purge</translate></div>
           </dangerous-button>
         </div>
       </div>
@@ -73,23 +73,23 @@
             {{ humanSize(quotaStatus.errored * 1000 * 1000) }}
           </div>
           <div class="label">
-            <translate :translate-context="'Content/Library/Label'">Errored files</translate>
+            <translate translate-context="Content/Library/Label">Errored files</translate>
           </div>
         </div>
         <div>
           <router-link
             class="ui basic blue tiny button"
             :to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'errored'}])}}">
-            <translate :translate-context="'Content/Library/Link/Verb'">View files</translate>
+            <translate translate-context="Content/Library/Link/Verb">View files</translate>
           </router-link>
           <dangerous-button
             color="grey"
             class="basic tiny"
             :action="purgeErroredFiles">
-            <translate :translate-context="'Content/Library/Button.Label/Verb'">Purge</translate>
-            <p slot="modal-header"><translate :translate-context="'Popup/Library/Title'">Purge errored files?</translate></p>
-            <p slot="modal-content"><translate :translate-context="'Popup/Library/Paragraph'">Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota.</translate></p>
-            <div slot="modal-confirm"><translate :translate-context="'Popup/Library/Button.Label'">Purge</translate></div>
+            <translate translate-context="Content/Library/Button.Label/Verb">Purge</translate>
+            <p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge errored files?</translate></p>
+            <p slot="modal-content"><translate translate-context="Popup/Library/Paragraph">Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota.</translate></p>
+            <div slot="modal-confirm"><translate translate-context="Popup/Library/Button.Label">Purge</translate></div>
           </dangerous-button>
         </div>
       </div>
diff --git a/front/src/views/content/libraries/Upload.vue b/front/src/views/content/libraries/Upload.vue
index f5c78f0b9021dcc6442bc0984ad097e1a87fac85..d4a3d824594c1e09536beb0500caef3be705c33f 100644
--- a/front/src/views/content/libraries/Upload.vue
+++ b/front/src/views/content/libraries/Upload.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="ui vertical aligned stripe segment">
     <div v-if="isLoadingLibrary" :class="['ui', {'active': isLoadingLibrary}, 'inverted', 'dimmer']">
-      <div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading library data…</translate></div>
+      <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading library data…</translate></div>
     </div>
     <detail-area v-else :library="library">
       <file-upload :default-import-reference="defaultImportReference" :library="library" />
diff --git a/front/src/views/content/remote/Card.vue b/front/src/views/content/remote/Card.vue
index f42d0b06b9dd95822c3dd3c88579e6212184c615..3bbdfa518ef12cc2c1a5f251749d7cb2547d0f7c 100644
--- a/front/src/views/content/remote/Card.vue
+++ b/front/src/views/content/remote/Card.vue
@@ -24,44 +24,44 @@
       </div>
       <div class="meta">
         <i class="music icon"></i>
-        <translate :translate-context="'Content/Library/Card.List item'" :translate-params="{count: library.uploads_count}" :translate-n="library.uploads_count" translate-plural="%{ count } tracks">%{ count } track</translate>
+        <translate translate-context="Content/Library/Card.List item" :translate-params="{count: library.uploads_count}" :translate-n="library.uploads_count" translate-plural="%{ count } tracks">%{ count } track</translate>
       </div>
       <div v-if="displayScan && latestScan" class="meta">
         <template v-if="latestScan.status === 'pending'">
           <i class="hourglass icon"></i>
-          <translate :translate-context="'Content/Library/Card.List item'">Scan pending</translate>
+          <translate translate-context="Content/Library/Card.List item">Scan pending</translate>
         </template>
         <template v-if="latestScan.status === 'scanning'">
           <i class="loading spinner icon"></i>
-          <translate :translate-context="'Content/Library/Card.List item'" :translate-params="{progress: scanProgress}">Scanning… (%{ progress }%)</translate>
+          <translate translate-context="Content/Library/Card.List item" :translate-params="{progress: scanProgress}">Scanning… (%{ progress }%)</translate>
         </template>
         <template v-else-if="latestScan.status === 'errored'">
           <i class="red download icon"></i>
-          <translate :translate-context="'Content/Library/Card.List item'">Problem during scanning</translate>
+          <translate translate-context="Content/Library/Card.List item">Problem during scanning</translate>
         </template>
         <template v-else-if="latestScan.status === 'finished' && latestScan.errored_files === 0">
           <i class="green download icon"></i>
-          <translate :translate-context="'Content/Library/Card.List item'">Scanned</translate>
+          <translate translate-context="Content/Library/Card.List item">Scanned</translate>
         </template>
         <template v-else-if="latestScan.status === 'finished' && latestScan.errored_files > 0">
           <i class="yellow download icon"></i>
-          <translate :translate-context="'Content/Library/Card.List item'">Scanned with errors</translate>
+          <translate translate-context="Content/Library/Card.List item">Scanned with errors</translate>
         </template>
         <span class="link right floated" @click="showScan = !showScan">
-          <translate :translate-context="'Content/Library/Card.Link'">Details</translate>
+          <translate translate-context="Content/Library/Card.Link">Details</translate>
           <i v-if="showScan" class="angle down icon" />
           <i v-else class="angle right icon" />
         </span>
         <div v-if="showScan">
           <template v-if="latestScan.modification_date">
-            <translate :translate-context="'Content/Library/Card.List item/Noun'">Last update:</translate><human-date :date="latestScan.modification_date" /><br />
+            <translate translate-context="Content/Library/Card.List item/Noun">Last update:</translate><human-date :date="latestScan.modification_date" /><br />
           </template>
-          <translate :translate-context="'Content/Library/Card.List item/Noun'">Failed tracks:</translate> {{ latestScan.errored_files }}
+          <translate translate-context="Content/Library/Card.List item/Noun">Failed tracks:</translate> {{ latestScan.errored_files }}
         </div>
       </div>
       <div v-if="displayScan && canLaunchScan" class="clearfix">
         <span class="right floated link" @click="launchScan">
-          <translate :translate-context="'Content/Library/Card.Button.Label/Verb'">Scan now</translate> <i class="paper plane icon" />
+          <translate translate-context="Content/Library/Card.Button.Label/Verb">Scan now</translate> <i class="paper plane icon" />
         </span>
       </div>
     </div>
@@ -71,7 +71,7 @@
     <div v-if="displayCopyFid" class="extra content">
       <div class="ui form">
         <div class="field">
-          <label><translate :translate-context="'Content/Library/Title'">Sharing link</translate></label>
+          <label><translate translate-context="Content/Library/Title">Sharing link</translate></label>
           <copy-input :button-classes="'basic'" :value="library.fid" />
         </div>
       </div>
@@ -81,29 +81,29 @@
         v-if="!library.follow"
         @click="follow()"
         :class="['ui', 'green', {'loading': isLoadingFollow}, 'button']">
-        <translate :translate-context="'Content/Library/Card.Button.Label/Verb'">Follow</translate>
+        <translate translate-context="Content/Library/Card.Button.Label/Verb">Follow</translate>
       </button>
       <button
         v-else-if="!library.follow.approved"
         class="ui disabled button"><i class="hourglass icon"></i>
-        <translate :translate-context="'Content/Library/Card.Paragraph'">Follow request pending approval</translate>
+        <translate translate-context="Content/Library/Card.Paragraph">Follow request pending approval</translate>
       </button>
       <button
         v-else-if="!library.follow.approved"
         class="ui disabled button"><i class="check icon"></i>
-        <translate :translate-context="'Content/Library/Card.Paragraph'">Following</translate>
+        <translate translate-context="Content/Library/Card.Paragraph">Following</translate>
       </button>
       <dangerous-button
         v-else-if="library.follow.approved"
         color=""
         :class="['ui', 'button']"
         :action="unfollow">
-        <translate :translate-context="'Content/Library/Card.Button.Label/Verb'">Unfollow</translate>
-        <p slot="modal-header"><translate :translate-context="'Popup/Library/Title'">Unfollow this library?</translate></p>
+        <translate translate-context="Content/Library/Card.Button.Label/Verb">Unfollow</translate>
+        <p slot="modal-header"><translate translate-context="Popup/Library/Title">Unfollow this library?</translate></p>
         <div slot="modal-content">
-          <p><translate :translate-context="'Popup/Library/Paragraph'">By unfollowing this library, you loose access to its content.</translate></p>
+          <p><translate translate-context="Popup/Library/Paragraph">By unfollowing this library, you loose access to its content.</translate></p>
         </div>
-        <div slot="modal-confirm"><translate :translate-context="'Popup/Library/Button.Label'">Unfollow</translate></div>
+        <div slot="modal-confirm"><translate translate-context="Popup/Library/Button.Label">Unfollow</translate></div>
       </dangerous-button>
     </div>
   </div>
diff --git a/front/src/views/content/remote/Home.vue b/front/src/views/content/remote/Home.vue
index 4e813a5ba14a746fe92af03d62f21064c33b662c..1e74ff6a3a5439c1fb78c64c45d1058598492866 100644
--- a/front/src/views/content/remote/Home.vue
+++ b/front/src/views/content/remote/Home.vue
@@ -1,19 +1,19 @@
 <template>
   <div class="ui vertical aligned stripe segment">
     <div v-if="isLoading" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']">
-      <div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading remote libraries…</translate></div>
+      <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading remote libraries…</translate></div>
     </div>
     <div v-else class="ui text container">
-      <h1 class="ui header"><translate :translate-context="'Content/Library/Title/Noun'">Remote libraries</translate></h1>
-      <p><translate :translate-context="'Content/Library/Paragraph'">Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access.</translate></p>
+      <h1 class="ui header"><translate translate-context="Content/Library/Title/Noun">Remote libraries</translate></h1>
+      <p><translate translate-context="Content/Library/Paragraph">Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access.</translate></p>
       <scan-form @scanned="scanResult = $event"></scan-form>
       <div class="ui hidden divider"></div>
       <div v-if="scanResult && scanResult.results.length > 0" class="ui two cards">
         <library-card :library="library" v-for="library in scanResult.results" :key="library.fid" />
       </div>
       <template v-if="existingFollows && existingFollows.count > 0">
-        <h2><translate :translate-context="'Content/Library/Title'">Known libraries</translate></h2>
-        <i @click="fetch()" :class="['ui', 'circular', 'refresh', 'icon']" /> <translate :translate-context="'Content/Library/Button.Label'">Refresh</translate>
+        <h2><translate translate-context="Content/Library/Title">Known libraries</translate></h2>
+        <i @click="fetch()" :class="['ui', 'circular', 'refresh', 'icon']" /> <translate translate-context="Content/Library/Button.Label">Refresh</translate>
         <div class="ui hidden divider"></div>
         <div class="ui two cards">
           <library-card
diff --git a/front/src/views/content/remote/ScanForm.vue b/front/src/views/content/remote/ScanForm.vue
index 31bc803184120f04e493da9176d7275929fa177f..5c68bf130872da28041ac950a25fe9a063f8280b 100644
--- a/front/src/views/content/remote/ScanForm.vue
+++ b/front/src/views/content/remote/ScanForm.vue
@@ -1,13 +1,13 @@
 <template>
   <form class="ui form" @submit.prevent="scan">
     <div v-if="errors.length > 0" class="ui negative message">
-      <div class="header"><translate :translate-context="'Content/Library/Error message.Title'">Could not fetch remote library</translate></div>
+      <div class="header"><translate translate-context="Content/Library/Error message.Title">Could not fetch remote library</translate></div>
       <ul class="list">
         <li v-for="error in errors">{{ error }}</li>
       </ul>
     </div>
     <div class="ui field">
-      <label><translate :translate-context="'Content/Library/Input.Label/Verb'">Search a remote library</translate></label>
+      <label><translate translate-context="Content/Library/Input.Label/Verb">Search a remote library</translate></label>
       <div :class="['ui', 'action', {loading: isLoading}, 'input']">
         <input name="url" v-model="query" :placeholder="labels.placeholder" type="url">
         <button type="submit" class="ui icon button">
diff --git a/front/src/views/playlists/Detail.vue b/front/src/views/playlists/Detail.vue
index afaa2a9142c71681b06eacfe3dc36fc4f5ee3f7c..a2430433fccf1a957c7569c99cc8f2f44d5be361 100644
--- a/front/src/views/playlists/Detail.vue
+++ b/front/src/views/playlists/Detail.vue
@@ -14,7 +14,7 @@
                 translate-plural="Playlist containing %{ count } tracks, by %{ username }"
                 :translate-n="playlist.tracks_count"
                 :translate-params="{count: playlist.tracks_count, username: playlist.user.username}"
-                :translate-context="'Content/Playlist/Header.Subtitle'">
+                translate-context="Content/Playlist/Header.Subtitle">
                 Playlist containing %{ count } track, by %{ username }
               </translate><br>
               <duration :seconds="playlist.duration" />
@@ -22,22 +22,22 @@
           </div>
         </h2>
         <div class="ui hidden divider"></div>
-        <play-button class="orange" :is-playable="playlist.is_playable" :tracks="tracks"><translate :translate-context="'Content/*/Button.Label/Verb, Short'">Play all</translate></play-button>
+        <play-button class="orange" :is-playable="playlist.is_playable" :tracks="tracks"><translate translate-context="Content/*/Button.Label/Verb, Short">Play all</translate></play-button>
         <button
           class="ui icon labeled button"
           v-if="$store.state.auth.profile && playlist.user.id === $store.state.auth.profile.id"
           @click="edit = !edit">
           <i class="pencil icon"></i>
-          <template v-if="edit"><translate :translate-context="'Content/Playlist/Button.Label/Verb'">End edition</translate></template>
-          <template v-else><translate :translate-context="'Content/*/Button.Label/Verb'">Edit…</translate></template>
+          <template v-if="edit"><translate translate-context="Content/Playlist/Button.Label/Verb">End edition</translate></template>
+          <template v-else><translate translate-context="Content/*/Button.Label/Verb">Edit…</translate></template>
         </button>
         <dangerous-button v-if="$store.state.auth.profile && playlist.user.id === $store.state.auth.profile.id" class="labeled icon" :action="deletePlaylist">
-          <i class="trash icon"></i> <translate :translate-context="'Content/*/Button.Label/Verb'">Delete</translate>
+          <i class="trash icon"></i> <translate translate-context="Content/*/Button.Label/Verb">Delete</translate>
           <p slot="modal-header">
-            <translate :translate-params="{playlist: playlist.name}" :translate-context="'Popup/Playlist/Title/Call to action'">Do you want to delete the playlist "%{ playlist }"?</translate>
+            <translate :translate-params="{playlist: playlist.name}" translate-context="Popup/Playlist/Title/Call to action">Do you want to delete the playlist "%{ playlist }"?</translate>
           </p>
-          <p slot="modal-content"><translate :translate-context="'Popup/Playlist/Paragraph'">This will completely delete this playlist and cannot be undone.</translate></p>
-          <div slot="modal-confirm"><translate :translate-context="'Popup/Playlist/Button.Label/Verb'">Delete playlist</translate></div>
+          <p slot="modal-content"><translate translate-context="Popup/Playlist/Paragraph">This will completely delete this playlist and cannot be undone.</translate></p>
+          <div slot="modal-confirm"><translate translate-context="Popup/Playlist/Button.Label/Verb">Delete playlist</translate></div>
         </dangerous-button>
       </div>
     </section>
@@ -49,7 +49,7 @@
           :playlist="playlist" :playlist-tracks="playlistTracks"></playlist-editor>
       </template>
       <template v-else>
-        <h2><translate :translate-context="'Content/*/Title/Name'">Tracks</translate></h2>
+        <h2><translate translate-context="Content/*/Title/Name">Tracks</translate></h2>
         <track-table :display-position="true" :tracks="tracks"></track-table>
       </template>
     </section>
diff --git a/front/src/views/playlists/List.vue b/front/src/views/playlists/List.vue
index 9745079c0e3c406921625e7348daf61e94625ce4..74b584f96b3029f38a377492846869843c50e7c9 100644
--- a/front/src/views/playlists/List.vue
+++ b/front/src/views/playlists/List.vue
@@ -1,21 +1,21 @@
 <template>
   <main v-title="labels.playlists">
     <section class="ui vertical stripe segment">
-      <h2 class="ui header"><translate :translate-context="'Content/Playlist/Title'">Browsing playlists</translate></h2>
+      <h2 class="ui header"><translate translate-context="Content/Playlist/Title">Browsing playlists</translate></h2>
       <div :class="['ui', {'loading': isLoading}, 'form']">
         <template v-if="$store.state.auth.authenticated">
           <button
             @click="$store.commit('playlists/chooseTrack', null)"
-            class="ui basic green button"><translate :translate-context="'Content/Playlist/Button.Label/Verb'">Manage your playlists</translate></button>
+            class="ui basic green button"><translate translate-context="Content/Playlist/Button.Label/Verb">Manage your playlists</translate></button>
           <div class="ui hidden divider"></div>
         </template>
         <div class="fields">
           <div class="field">
-            <label><translate :translate-context="'Content/*/Form.Label/Short, Noun'">Search</translate></label>
+            <label><translate translate-context="Content/*/Form.Label/Short, Noun">Search</translate></label>
             <input type="text" name="search" v-model="query" :placeholder="labels.searchPlaceholder"/>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/*/Dropdown.Label/Short, Noun'">Ordering</translate></label>
+            <label><translate translate-context="Content/*/Dropdown.Label/Short, Noun">Ordering</translate></label>
             <select class="ui dropdown" v-model="ordering">
               <option v-for="option in orderingOptions" :value="option[0]">
                 {{ sharedLabels.filters[option[1]] }}
@@ -23,14 +23,14 @@
             </select>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/*/Dropdown.Label/Short, Noun'">Order</translate></label>
+            <label><translate translate-context="Content/*/Dropdown.Label/Short, Noun">Order</translate></label>
             <select class="ui dropdown" v-model="orderingDirection">
-              <option value="+"><translate :translate-context="'Content/*/Dropdown/Short'">Ascending</translate></option>
-              <option value="-"><translate :translate-context="'Content/*/Dropdown/Short'">Descending</translate></option>
+              <option value="+"><translate translate-context="Content/*/Dropdown/Short">Ascending</translate></option>
+              <option value="-"><translate translate-context="Content/*/Dropdown/Short">Descending</translate></option>
             </select>
           </div>
           <div class="field">
-            <label><translate :translate-context="'Content/*/Dropdown.Label/Short, Noun'">Results per page</translate></label>
+            <label><translate translate-context="Content/*/Dropdown.Label/Short, Noun">Results per page</translate></label>
             <select class="ui dropdown" v-model="paginateBy">
               <option :value="parseInt(12)">12</option>
               <option :value="parseInt(25)">25</option>
diff --git a/front/src/views/radios/Detail.vue b/front/src/views/radios/Detail.vue
index 5669c7eec4a02685627f2c886efb7ebf9eaf5c48..615265ac969ada00eb13044ff8ab722962237c58 100644
--- a/front/src/views/radios/Detail.vue
+++ b/front/src/views/radios/Detail.vue
@@ -24,15 +24,15 @@
           </router-link>
           <dangerous-button class="labeled icon" :action="deleteRadio">
             <i class="trash icon"></i> Delete
-            <p slot="modal-header"><translate :translate-context="'Popup/Radio/Title'" :translate-params="{radio: radio.name}">Do you want to delete the radio "%{ radio }"?</translate></p>
-            <p slot="modal-content"><translate :translate-context="'Popup/Radio/Paragraph'">This will completely delete this radio and cannot be undone.</translate></p>
-            <div slot="modal-confirm"><translate :translate-context="'Popup/Radio/Button.Label/Verb'">Delete radio</translate></div>
+            <p slot="modal-header"><translate translate-context="Popup/Radio/Title" :translate-params="{radio: radio.name}">Do you want to delete the radio "%{ radio }"?</translate></p>
+            <p slot="modal-content"><translate translate-context="Popup/Radio/Paragraph">This will completely delete this radio and cannot be undone.</translate></p>
+            <div slot="modal-confirm"><translate translate-context="Popup/Radio/Button.Label/Verb">Delete radio</translate></div>
           </dangerous-button>
         </template>
       </div>
     </section>
     <section class="ui vertical stripe segment">
-      <h2><translate :translate-context="'Content/*/*'">Tracks</translate></h2>
+      <h2><translate translate-context="Content/*/*">Tracks</translate></h2>
       <track-table :tracks="tracks"></track-table>
       <div class="ui center aligned basic segment">
         <pagination