diff --git a/.env.dev b/.env.dev
index 7037b1dbd48279ab3316d919d61b1a6e284d90a6..5b686560067818991668b0947fca99fc585d9817 100644
--- a/.env.dev
+++ b/.env.dev
@@ -10,5 +10,4 @@ PYTHONDONTWRITEBYTECODE=true
 WEBPACK_DEVSERVER_PORT=8080
 MUSIC_DIRECTORY_PATH=/music
 BROWSABLE_API_ENABLED=True
-CACHEOPS_ENABLED=False
 FORWARDED_PROTO=http
diff --git a/.gitignore b/.gitignore
index 2582cc534fa5fb6be2667c879fd6a0342168432d..d5870db7e67b69103605caae09627fb2466f2ab3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -91,3 +91,5 @@ data/
 po/*.po
 docs/swagger
 _build
+front/src/translations.json
+front/locales/en_US/LC_MESSAGES/app.po
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 684e3233a4c860470d21521299e4b40952bb84dc..57e258e9387f3225ffbfd576e828d84fb048db71 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,7 +4,8 @@ variables:
   IMAGE_LATEST: $IMAGE_NAME:latest
   PIP_CACHE_DIR: "$CI_PROJECT_DIR/pip-cache"
   PYTHONDONTWRITEBYTECODE: "true"
-
+  REVIEW_DOMAIN: preview.funkwhale.audio
+  REVIEW_INSTANCE_URL: https://demo.funkwhale.audio
 
 stages:
   - review
@@ -19,37 +20,42 @@ review_front:
   when: manual
   allow_failure: true
   before_script:
+    - curl -L -o /usr/local/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64
+    - chmod +x /usr/local/bin/jq
     - cd front
   script:
     - yarn install
+    - yarn run i18n-compile
     # this is to ensure we don't have any errors in the output,
     # cf https://code.eliotberriot.com/funkwhale/funkwhale/issues/169
     - INSTANCE_URL=$REVIEW_INSTANCE_URL yarn run build | tee /dev/stderr | (! grep -i 'ERROR in')
-    - mkdir -p /static/front/$CI_BUILD_REF_SLUG
-    - cp -r dist/* /static/front/$CI_BUILD_REF_SLUG
+    - mkdir -p /static/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
+    - cp -r dist/* /static/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
   cache:
-    key: "$CI_PROJECT_ID__front_dependencies"
+    key: "funkwhale__front_dependencies"
     paths:
       - front/node_modules
       - front/yarn.lock
   environment:
-    name: review/front-$CI_BUILD_REF_NAME
-    url: http://front-$CI_BUILD_REF_SLUG.$REVIEW_DOMAIN
+    name: review/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
+    url: http://front-$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG.$REVIEW_DOMAIN
     on_stop: stop_front_review
   only:
-    - branches@funkwhale/funkwhale
+    - branches
   tags:
     - funkwhale-review
 
 stop_front_review:
   stage: review
   script:
-    - rm -rf /static/front/$CI_BUILD_REF_SLUG/
+    - rm -rf /static/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG/
   variables:
     GIT_STRATEGY: none
   when: manual
+  only:
+    - branches
   environment:
-    name: review/front-$CI_BUILD_REF_NAME
+    name: review/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
     action: stop
   tags:
     - funkwhale-review
@@ -63,33 +69,38 @@ review_docs:
     BUILD_PATH: "../public"
   before_script:
     - cd docs
+    - apt-get update
+    - apt-get install -y graphviz
+    - pip install sphinx
+
   cache:
     key: "$CI_PROJECT_ID__sphinx"
     paths:
       - "$PIP_CACHE_DIR"
   script:
-    - pip install sphinx
     - ./build_docs.sh
-    - mkdir -p /static/docs/$CI_BUILD_REF_SLUG
-    - cp -r $CI_PROJECT_DIR/public/* /static/docs/$CI_BUILD_REF_SLUG
+    - mkdir -p /static/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
+    - cp -r $CI_PROJECT_DIR/public/* /static/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
   environment:
-    name: review/docs-$CI_BUILD_REF_NAME
-    url: http://docs-$CI_BUILD_REF_SLUG.$REVIEW_DOMAIN
+    name: review/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
+    url: http://docs-$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG.$REVIEW_DOMAIN
     on_stop: stop_docs_review
   only:
-    - branches@funkwhale/funkwhale
+    - branches
   tags:
     - funkwhale-review
 
 stop_docs_review:
   stage: review
   script:
-    - rm -rf /static/docs/$CI_BUILD_REF_SLUG/
+    - rm -rf /static/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG/
   variables:
     GIT_STRATEGY: none
   when: manual
+  only:
+    - branches
   environment:
-    name: review/docs-$CI_BUILD_REF_NAME
+    name: review/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
     action: stop
   tags:
     - funkwhale-review
@@ -132,9 +143,9 @@ test_api:
     DJANGO_ALLOWED_HOSTS: "localhost"
     DATABASE_URL: "postgresql://postgres@postgres/postgres"
     FUNKWHALE_URL: "https://funkwhale.ci"
-    CACHEOPS_ENABLED: "false"
     DJANGO_SETTINGS_MODULE: config.settings.local
-
+  only:
+    - branches
   before_script:
     - cd api
     - pip install -r requirements/base.txt
@@ -151,12 +162,13 @@ test_front:
   image: node:9
   before_script:
     - cd front
-
+  only:
+    - branches
   script:
     - yarn install
     - yarn run unit
   cache:
-    key: "$CI_PROJECT_ID__front_dependencies"
+    key: "funkwhale__front_dependencies"
     paths:
       - front/node_modules
       - front/yarn.lock
@@ -172,17 +184,18 @@ build_front:
   stage: build
   image: node:9
   before_script:
+    - curl -L -o /usr/local/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64
+    - chmod +x /usr/local/bin/jq
     - cd front
-
   script:
     - yarn install
-    - yarn run i18n-extract
     - yarn run i18n-compile
     # this is to ensure we don't have any errors in the output,
     # cf https://code.eliotberriot.com/funkwhale/funkwhale/issues/169
     - yarn run build | tee /dev/stderr | (! grep -i 'ERROR in')
+    - chmod -R 750 dist
   cache:
-    key: "$CI_PROJECT_ID__front_dependencies"
+    key: "funkwhale__front_dependencies"
     paths:
       - front/node_modules
       - front/yarn.lock
@@ -205,8 +218,10 @@ pages:
     BUILD_PATH: "../public"
   before_script:
     - cd docs
-  script:
+    - apt-get update
+    - apt-get install -y graphviz
     - pip install sphinx
+  script:
     - ./build_docs.sh
   cache:
     key: "$CI_PROJECT_ID__sphinx"
@@ -243,7 +258,9 @@ build_api:
     name: "api_${CI_COMMIT_REF_NAME}"
     paths:
       - api
-  script: echo Done!
+  script:
+    - chmod -R 750 api
+    - echo Done!
   only:
     - tags@funkwhale/funkwhale
     - master@funkwhale/funkwhale
diff --git a/CHANGELOG b/CHANGELOG
index 3c26a5e9211144f1caedb0cb18076deea23cab17..e5c811fc80694768b804b176c7f2689fab3e4a71 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,12 +4,245 @@ Changelog
 You can subscribe to release announcements by:
 
 - Following `funkwhale@mastodon.eliotberriot.com <https://mastodon.eliotberriot.com/@funkwhale>`_ on Mastodon
-- Subscribing to the following Atom feed: https://code.eliotberriot.com/funkwhale/funkwhale/commits/develop?format=atom&search=tag
+- Subscribing to the following Atom feed: https://code.eliotberriot.com/funkwhale/funkwhale/commits/develop?format=atom&search=Merge+tag
 
 This changelog is viewable on the web at https://docs.funkwhale.audio/changelog.html.
 
 .. towncrier
 
+0.16 (unreleased)
+-----------------
+
+Upgrade instructions are available at
+https://docs.funkwhale.audio/upgrading.html
+
+Features:
+
+- Complete redesign of the library home and playlist pages (#284)
+- Expose ActivityPub actors for users (#317)
+- Implemented a basic but functionnal Github-like search on federated tracks
+  list (#344)
+- Internationalized interface as well as translations for Arabic, French,
+  Esperanto, Italian, Occitan, Polish, Portuguese and Swedish (#161, #167)
+- Users can now upload an avatar in their settings page (#257)
+
+
+Enhancements:
+
+- Added feedback when creating/updating radio (#302)
+- Apply restrictions to username characters during signup
+- Autoselect best language based on browser configuration (#386)
+- Can now order tracks on federated track list (#326)
+- Can now relaunch pending import jobs from the web interface (#323)
+- Ensure we do not display pagination on single pages (#334)
+- Ensure we have sane defaults for MEDIA_ROOT, STATIC_ROOT and
+  MUSIC_DIRECTORY_PATH in the deployment .env file (#350)
+- Make some space for the volume slider to allow precise control (#318)
+- Removed django-cacheops dependency
+- Store track artist and album artist separately (#237) Better handling of
+  tracks with a different artist than the album artist
+- The navigation bar of Library is now fixed (#375)
+- Use thumbnails for avatars and covers to reduce bandwidth
+
+
+Bugfixes:
+
+- Ensure 750 permissions on CI artifacts (#332)
+- Ensure images are not cropped in queue (#337)
+- Ensure we do not import artists with empty names (#351)
+- Fix notifications not closing when clicking on the cross (#366)
+- Fix the most annoying offset in the whole fediverse (#369)
+- Fixed persistent message in playlist modal (#304)
+- Fixed unfiltered results in favorites API (#384)
+- Raise a warning instead of crashing when getting a broken path in file import
+  (#138)
+- Remove parallelization of uploads during import to avoid crashing small
+  servers (#382)
+- Subsonic API login is now case insensitive (#339)
+- Validate Date header in HTTP Signatures (#328)
+
+
+Documentation:
+
+- Added troubleshotting and technical overview documentation (#256)
+- Arch Linux installation steps
+- Document that users can use Ultrasonic on Android (#316)
+- Fixed a couple of typos
+- Some cosmetic improvements to the doc
+
+
+i18n:
+
+- Arabic translation (!302)
+- Polish translation (!304)
+
+
+Library home and playlist page overhaul
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The library home page have been completely redesigned to include:
+
+- other users activity (listenings, playlists and favorites)
+- recently imported albums
+
+We think this new version showcases more music in a more useful way, let us know
+what you think about it!
+
+The playlist page have been updated as well.
+
+
+Internationalized interface
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+After months of work, we're proud to announce our interface is now ready
+for internationalization.
+
+Translators have already started the work of translating Funkwhale in 8 different languages,
+and we're ready to add more as needed.
+
+You can easily get involved at https://translate.funkwhale.audio/engage/funkwhale/
+
+
+Better handling of tracks with a different artist than the album artist
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Some tracks involve a different artist than the album artist (e.g. a featuring)
+and Funkwhale has been known to do weird things when importing such tracks, resulting
+in albums that contained a single track, for instance.
+
+The situation should be improved with this release, as Funkwhale is now able to
+store separately the track and album artist, and display it properly in the interface.
+
+
+Users now have an ActivityPub Actor [Manual action required]
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+In the process of implementing federation for user activity such as listening
+history, we are now making user profiles (a.k.a. ActivityPub actors) available through federation.
+
+This does not means the federation is working, but this is a needed step to implement it.
+
+Those profiles will be created automatically for new users, but you have to run a command
+to create them for existing users.
+
+On docker setups::
+
+    docker-compose run --rm api python manage.py script create_actors --no-input
+
+On non-docker setups::
+
+    python manage.py script create_actors --no-input
+
+This should only take a few seconds to run. It is safe to interrupt the process or rerun it multiple times.
+
+
+Image thumbnails [Manual action required]
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To reduce bandwidth usage on slow or limited connexions and improve performance
+in general, we now use smaller images in the front-end. For instance, if you have
+an album cover with a 1000x1000 pixel size, we will create smaller
+versions of this image (50x50, 200x200, 400x400) and reference those resized version
+when we don't actually need the original image.
+
+Thumbnail will be created automatically for new objects, however, you have
+to launch a manual command to deal with existing ones.
+
+On docker setups::
+
+    docker-compose run --rm api python manage.py script create_image_variations --no-input
+
+On non-docker setups::
+
+    python manage.py script create_image_variations --no-input
+
+This should be quite fast but may take up to a few minutes depending on the number
+of albums you have in database. It is safe to interrupt the process or rerun it multiple times.
+
+
+Improved search on federated tracks list
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Having a powerful but easy-to-use search is important but difficult to achieve, especially
+if you do not want to have a real complex search interface.
+
+Github does a pretty good job with that, using a structured but simple query system
+(See https://help.github.com/articles/searching-issues-and-pull-requests/#search-only-issues-or-pull-requests).
+
+This release implements a limited but working subset of this query system. You can use it only on the federated
+tracks list (/manage/federation/tracks) at the moment, but depending on feedback it will be rolled-out on other pages as well.
+
+This is the type of query you can run:
+
+- ``hello world``: search for "hello" and "world" in all the available fields
+- ``hello in:artist`` search for results where artist name is "hello"
+- ``spring in:artist,album`` search for results where artist name or album title contain "spring"
+- ``artist:hello`` search for results where artist name equals "hello"
+- ``artist:"System of a Down" domain:instance.funkwhale`` search for results where artist name equals "System of a Down" and inside "instance.funkwhale" library
+
+
+Ensure MEDIA_ROOT, STATIC_ROOT and MUSIC_DIRECTORY_* are set explicitely [Manual action required]
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+In our default .env file, MEDIA_ROOT and STATIC_ROOT were commented by default, causing
+some deployment issues on non-docker setups when people forgot to uncomment them.
+
+From now on, those variables are uncommented, and will also be used on docker setups
+to mount the volumes automatically in the docker-compose.yml file. This has been a source
+of headache as well in some deployments, where you had to update both the .env file and
+the compose file.
+
+This also applies to in-place paths (MUSIC_DIRECTORY_PATH and MUSIC_DIRECTORY_SERVE_PATH),
+whose values are now used directly to set up the proper Docker volumes.
+
+This will only affect new deployments though. If you want to benefit from this on an
+existing instance, do a backup of your ``.env`` and ``docker-compose.yml`` files and apply the following changes:
+
+- Ensure ``MEDIA_ROOT`` is uncommented in your .env file and match the absolute path where media files are stored
+  on your host (``/srv/funkwhale/data/media`` by default)
+- Ensure ``STATIC_ROOT`` is uncommented in your .env file and match the absolute path where static files are stored
+  on your host (``/srv/funkwhale/data/static`` by default)
+- If you use in-place import:
+    - Ensure MUSIC_DIRECTORY_PATH is uncommented and set to ``/music``
+    - Ensure MUSIC_DIRECTORY_SERVE_PATH is uncommented and set to the absolute path on your host were your music files
+      are stored (``/srv/funkwhale/data/music`` by default)
+- Edit your docker-compose.yml file to reflect the changes:
+    - Search for volumes (there should be two occurences) that contains ``/app/funkwhale_api/media`` on the right side, and
+      replace the whole line with ``- "${MEDIA_ROOT}:${MEDIA_ROOT}"``
+    - Search for a volume that contains ``/app/staticfiles`` on the right side, and
+      replace the whole line with ``- "${STATIC_ROOT}:${STATIC_ROOT}"``
+    - If you use in-place import, search for volumes (there should be two occurences) that contains ``/music:ro`` on the right side, and
+      replace the whole line with ``- "${MUSIC_DIRECTORY_SERVE_PATH}:${MUSIC_DIRECTORY_PATH}:ro"``
+
+In the end, the ``volumes`` directives of your containers should look like that::
+
+    ...
+    celeryworker
+      volumes:
+        - "${MUSIC_DIRECTORY_SERVE_PATH}:${MUSIC_DIRECTORY_PATH}:ro"
+        - "${MEDIA_ROOT}:${MEDIA_ROOT}"
+    ...
+    api:
+      volumes:
+        - "${MUSIC_DIRECTORY_SERVE_PATH}:${MUSIC_DIRECTORY_PATH}:ro"
+        - "${MEDIA_ROOT}:${MEDIA_ROOT}"
+        - "${STATIC_ROOT}:${STATIC_ROOT}"
+        - ./front/dist:/frontend
+    ...
+
+
+Removed Cacheops dependency
+---------------------------
+
+We removed one of our dependency named django-cacheops. It was unly used in a few places,
+and not playing nice with other dependencies.
+
+You can safely remove this dependency in your environment with ``pip uninstall django-cacheops`` if you're
+not using docker.
+
+You can also safely remove any ``CACHEOPS_ENABLED`` setting from your environment file.
+
+
 0.15 (2018-06-24)
 -----------------
 
@@ -1346,7 +1579,7 @@ Basic transcoding is now available to/from the following formats : ogg and mp3.
 
 This relies internally on FFMPEG and can put some load on your server.
 It's definitely recommended you setup some caching for the transcoded files
-at your webserver level. Check the the exemple nginx file at deploy/nginx.conf
+at your webserver level. Check the the exemple nginx file at deploy/nginx.conf
 for an implementation.
 
 On the frontend, usage of transcoding should be transparent in the player.
diff --git a/CONTRIBUTING b/CONTRIBUTING
index 6fb76a56c08d0699dc4f69318552d7ef0f5b3de8..18d877b66868865a1bd187f1d76e51aaf3803be4 100644
--- a/CONTRIBUTING
+++ b/CONTRIBUTING
@@ -1,5 +1,5 @@
 Contribute to Funkwhale development
-==================================
+===================================
 
 First of all, thank you for your interest in the project! We really
 appreciate the fact that you're about to take some time to read this
@@ -82,7 +82,7 @@ Visit https://code.eliotberriot.com/funkwhale/funkwhale and clone the repository
 A note about branches
 ^^^^^^^^^^^^^^^^^^^^^
 
-Next release development occurs on the "develop" branch, and releases are made on the "master" branch. Therefor, when submitting Merge Requests, ensure you are merging on the develop branch.
+Next release development occurs on the "develop" branch, and releases are made on the "master" branch. Therefore, when submitting Merge Requests, ensure you are merging on the develop branch.
 
 
 Working with docker
@@ -111,7 +111,7 @@ Create it like this::
 
 
 Create docker network
-^^^^^^^^^^^^^^^^^^^^
+^^^^^^^^^^^^^^^^^^^^^
 
 Create the federation network::
 
@@ -280,7 +280,7 @@ Typical workflow for a contribution
 3. Create a dedicated branch for your work ``42-awesome-fix``. It is good practice to prefix your branch name with the ID of the issue you are solving.
 4. Work on your stuff
 5. Commit small, atomic changes to make it easier to review your contribution
-6. Add a changelog fragment to summarize your changes: ``echo "Implemented awesome stuff (#42)" > changes/changelog.d/42.feature"``
+6. Add a changelog fragment to summarize your changes: ``echo "Implemented awesome stuff (#42)" > changes/changelog.d/42.feature``
 7. Push your branch
 8. Create your merge request
 9. Take a step back and enjoy, we're really grateful you did all of this and took the time to contribute!
@@ -289,8 +289,9 @@ Typical workflow for a contribution
 Internationalization
 --------------------
 
+We're using https://github.com/Polyconseil/vue-gettext to manage i18n in the project.
 When working on the front-end, any end-user string should be translated
-using either ``<i18next path="yourstring">`` or the ``$t('yourstring')``
+using either ``<translate>yourstring</translate>`` or ``$gettext('yourstring')``
 function.
 
 Extraction is done by calling ``yarn run i18n-extract``, which
diff --git a/README.rst b/README.rst
index ef3998d117949f6fb1109393a864f0c73a3ffd9c..d882a35c8b660922b10cb5a53be44f9cd2e3733d 100644
--- a/README.rst
+++ b/README.rst
@@ -14,8 +14,8 @@ Getting help
 
 We offer various Matrix.org rooms to discuss about Funkwhale:
 
-- `#funkwhale:matrix.org <https://riot.im/app/#/room/#funkwhale:matrix.org>`_ for general questions about funkwhale
-- `#funkwhale-dev:matrix.org <https://riot.im/app/#/room/#funkwhale-dev:matrix.org>`_ for development-focused discussion
+- `#funkwhale:matrix.org <https://matrix.to/#/#funkwhale:matrix.org>`_ for general questions about funkwhale
+- `#funkwhale-dev:matrix.org <https://matrix.to/#/#funkwhale-dev:matrix.org>`_ for development-focused discussion
 
 Please join those rooms if you have any questions!
 
@@ -26,4 +26,9 @@ Contribute
 ----------
 
 Contribution guidelines as well as development installation instructions
-are outlined in `CONTRIBUTING <CONTRIBUTING>`_
+are outlined in `CONTRIBUTING <CONTRIBUTING>`_.
+
+Translate
+^^^^^^^^^
+
+Translators willing to help can refer to `TRANSLATORS <TRANSLATORS>`_ for instructions.
diff --git a/TRANSLATORS.rst b/TRANSLATORS.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f2015099590b54f0405408972356eebc8c187d75
--- /dev/null
+++ b/TRANSLATORS.rst
@@ -0,0 +1,28 @@
+Translating Funkwhale
+=====================
+
+Thank you for reading this! If you want to help translate Funkwhale,
+you found the proper place :)
+
+Translation is done via our own Weblate instance at https://translate.funkwhale.audio/projects/funkwhale/front/.
+
+You can signup/login using your Gitlab account (from https://code.eliotberriot.com).
+
+Translation workflow
+--------------------
+
+Once you're logged-in on the Weblate instance, you can suggest translations. Your suggestions will then be reviewer
+by the project maintainer or other translators to ensure consistency.
+
+Guidelines
+----------
+
+Respecting those guidelines is mandatory if you want your translation to be included:
+
+- Use gender-neutral language and wording
+
+Requesting a new language
+-------------------------
+
+If you'd like to see a new language in Funkwhale, please open an issue here:
+https://code.eliotberriot.com/funkwhale/funkwhale/issues
diff --git a/api/config/settings/common.py b/api/config/settings/common.py
index b74c2bdfe499af75053748ddb8d90b96b8b42760..013c7ae431af6cb3abab4381673dc1d15c8845bc 100644
--- a/api/config/settings/common.py
+++ b/api/config/settings/common.py
@@ -92,8 +92,8 @@ THIRD_PARTY_APPS = (
     "rest_auth.registration",
     "dynamic_preferences",
     "django_filters",
-    "cacheops",
     "django_cleanup",
+    "versatileimagefield",
 )
 
 
@@ -302,6 +302,7 @@ SESSION_COOKIE_HTTPONLY = False
 ACCOUNT_AUTHENTICATION_METHOD = "username_email"
 ACCOUNT_EMAIL_REQUIRED = True
 ACCOUNT_EMAIL_VERIFICATION = "mandatory"
+ACCOUNT_USERNAME_VALIDATORS = "funkwhale_api.users.serializers.username_validators"
 
 # Custom user app defaults
 # Select the correct user model
@@ -420,15 +421,6 @@ PROTECT_FILES_PATH = env("PROTECT_FILES_PATH", default="/_protected")
 # use this setting to tweak for how long you want to cache
 # musicbrainz results. (value is in seconds)
 MUSICBRAINZ_CACHE_DURATION = env.int("MUSICBRAINZ_CACHE_DURATION", default=300)
-CACHEOPS_REDIS = env("CACHE_URL", default=CACHE_DEFAULT)
-CACHEOPS_ENABLED = env.bool("CACHEOPS_ENABLED", default=True)
-CACHEOPS = {
-    "music.artist": {"ops": "all", "timeout": 60 * 60},
-    "music.album": {"ops": "all", "timeout": 60 * 60},
-    "music.track": {"ops": "all", "timeout": 60 * 60},
-    "music.trackfile": {"ops": "all", "timeout": 60 * 60},
-    "taggit.tag": {"ops": "all", "timeout": 60 * 60},
-}
 
 # Custom Admin URL, use {% url 'admin:index' %}
 ADMIN_URL = env("DJANGO_ADMIN_URL", default="^api/admin/")
@@ -441,6 +433,7 @@ PLAYLISTS_MAX_TRACKS = env.int("PLAYLISTS_MAX_TRACKS", default=250)
 ACCOUNT_USERNAME_BLACKLIST = [
     "funkwhale",
     "library",
+    "instance",
     "test",
     "status",
     "root",
@@ -449,6 +442,11 @@ ACCOUNT_USERNAME_BLACKLIST = [
     "superuser",
     "staff",
     "service",
+    "me",
+    "ghost",
+    "_",
+    "hello",
+    "contact",
 ] + env.list("ACCOUNT_USERNAME_BLACKLIST", default=[])
 
 EXTERNAL_REQUESTS_VERIFY_SSL = env.bool("EXTERNAL_REQUESTS_VERIFY_SSL", default=True)
@@ -465,3 +463,13 @@ MUSIC_DIRECTORY_SERVE_PATH = env(
 USERS_INVITATION_EXPIRATION_DAYS = env.int(
     "USERS_INVITATION_EXPIRATION_DAYS", default=14
 )
+
+VERSATILEIMAGEFIELD_RENDITION_KEY_SETS = {
+    "square": [
+        ("original", "url"),
+        ("square_crop", "crop__400x400"),
+        ("medium_square_crop", "crop__200x200"),
+        ("small_square_crop", "crop__50x50"),
+    ]
+}
+VERSATILEIMAGEFIELD_SETTINGS = {"create_images_on_demand": False}
diff --git a/api/config/settings/local.py b/api/config/settings/local.py
index 9f0119cee54f51ec10377e662bdc8e8fa2bf32b2..b8df4bdb7c894fc0b0f3a85dcbfaca2676f16885 100644
--- a/api/config/settings/local.py
+++ b/api/config/settings/local.py
@@ -39,6 +39,7 @@ DEBUG_TOOLBAR_CONFIG = {
     "DISABLE_PANELS": ["debug_toolbar.panels.redirects.RedirectsPanel"],
     "SHOW_TEMPLATE_CONTEXT": True,
     "SHOW_TOOLBAR_CALLBACK": lambda request: True,
+    "JQUERY_URL": "",
 }
 
 # django-extensions
diff --git a/api/config/settings/production.py b/api/config/settings/production.py
index 72b08aa3c867efa475efb3dd8b5f502eed775abb..26def9fd036c3077721862dbd505af6aabfb56d2 100644
--- a/api/config/settings/production.py
+++ b/api/config/settings/production.py
@@ -51,12 +51,6 @@ CSRF_TRUSTED_ORIGINS = ALLOWED_HOSTS
 
 # END SITE CONFIGURATION
 
-# STORAGE CONFIGURATION
-# ------------------------------------------------------------------------------
-# Uploaded Media Files
-# ------------------------
-DEFAULT_FILE_STORAGE = "django.core.files.storage.FileSystemStorage"
-
 # Static Assets
 # ------------------------
 STATICFILES_STORAGE = "django.contrib.staticfiles.storage.StaticFilesStorage"
diff --git a/api/demo/demo-user.py b/api/demo/demo-user.py
deleted file mode 100644
index 94757d2faab203b7938278e4f4f6a2289fad77f2..0000000000000000000000000000000000000000
--- a/api/demo/demo-user.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from funkwhale_api.users.models import User
-
-
-u = User.objects.create(email="demo@demo.com", username="demo", is_staff=True)
-u.set_password("demo")
-u.subsonic_api_token = "demo"
-u.save()
diff --git a/api/demo/load-demo-data.sh b/api/demo/load-demo-data.sh
deleted file mode 100755
index fab0de8b3318966d06e0cca5e88acd90cd2b1178..0000000000000000000000000000000000000000
--- a/api/demo/load-demo-data.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#! /bin/bash
-
-echo "Loading demo data..."
-
-python manage.py migrate --noinput
-
-echo "Creating demo user..."
-
-cat demo/demo-user.py | python manage.py shell -i python
-
-echo "Importing demo tracks..."
-
-python manage.py import_files "/music/**/*.ogg" --recursive --noinput --username demo
diff --git a/api/funkwhale_api/__init__.py b/api/funkwhale_api/__init__.py
index fd35fd34dabe1f3272f55d2f687fe50fb445891f..7c227503395ae908b0041881131563252b1c461e 100644
--- a/api/funkwhale_api/__init__.py
+++ b/api/funkwhale_api/__init__.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-__version__ = "0.15"
+__version__ = "0.16"
 __version_info__ = tuple(
     [
         int(num) if num.isdigit() else num
diff --git a/api/funkwhale_api/common/fields.py b/api/funkwhale_api/common/fields.py
index 890aee42566ffd7883857f90ac1a7ec70f19358b..a0f10efe3a22cb2c903336a073b905f06994e69c 100644
--- a/api/funkwhale_api/common/fields.py
+++ b/api/funkwhale_api/common/fields.py
@@ -1,7 +1,7 @@
 import django_filters
 from django.db import models
 
-from funkwhale_api.music import utils
+from . import search
 
 PRIVACY_LEVEL_CHOICES = [
     ("me", "Only me"),
@@ -34,5 +34,17 @@ class SearchFilter(django_filters.CharFilter):
     def filter(self, qs, value):
         if not value:
             return qs
-        query = utils.get_query(value, self.search_fields)
+        query = search.get_query(value, self.search_fields)
         return qs.filter(query)
+
+
+class SmartSearchFilter(django_filters.CharFilter):
+    def __init__(self, *args, **kwargs):
+        self.config = kwargs.pop("config")
+        super().__init__(*args, **kwargs)
+
+    def filter(self, qs, value):
+        if not value:
+            return qs
+        cleaned = self.config.clean(value)
+        return search.apply(qs, cleaned)
diff --git a/api/funkwhale_api/common/management/commands/script.py b/api/funkwhale_api/common/management/commands/script.py
index b46a4327b0996a97aadd49a6b3066e99644c6e7c..7f8d5c15df223e31edb779e2d0eaac5111d5cb4c 100644
--- a/api/funkwhale_api/common/management/commands/script.py
+++ b/api/funkwhale_api/common/management/commands/script.py
@@ -19,7 +19,7 @@ class Command(BaseCommand):
     def handle(self, *args, **options):
         name = options["script_name"]
         if not name:
-            self.show_help()
+            return self.show_help()
 
         available_scripts = self.get_scripts()
         try:
@@ -50,7 +50,7 @@ class Command(BaseCommand):
             self.stdout.write(self.style.SUCCESS(name))
             self.stdout.write("")
             for line in script["help"].splitlines():
-                self.stdout.write("     {}".format(line))
+                self.stdout.write("     {}".format(line))
         self.stdout.write("")
 
     def get_scripts(self):
diff --git a/api/funkwhale_api/common/preferences.py b/api/funkwhale_api/common/preferences.py
index acda9a90c31882a32c043edf9d3c8e44d2ea7c3e..527d00c0424c6e006d905be5e37d816f0e4eacbe 100644
--- a/api/funkwhale_api/common/preferences.py
+++ b/api/funkwhale_api/common/preferences.py
@@ -14,6 +14,11 @@ def get(pref):
     return manager[pref]
 
 
+def set(pref, value):
+    manager = global_preferences_registry.manager()
+    manager[pref] = value
+
+
 class StringListSerializer(serializers.BaseSerializer):
     separator = ","
     sort = True
diff --git a/api/funkwhale_api/common/scripts/__init__.py b/api/funkwhale_api/common/scripts/__init__.py
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..769fd00e445693247600ae5809d01dd8f83f8c12 100644
--- a/api/funkwhale_api/common/scripts/__init__.py
+++ b/api/funkwhale_api/common/scripts/__init__.py
@@ -0,0 +1,12 @@
+from . import create_actors
+from . import create_image_variations
+from . import django_permissions_to_user_permissions
+from . import test
+
+
+__all__ = [
+    "create_actors",
+    "create_image_variations",
+    "django_permissions_to_user_permissions",
+    "test",
+]
diff --git a/api/funkwhale_api/common/scripts/create_actors.py b/api/funkwhale_api/common/scripts/create_actors.py
new file mode 100644
index 0000000000000000000000000000000000000000..93100540f45e91f153b67748a5c10c92c237b381
--- /dev/null
+++ b/api/funkwhale_api/common/scripts/create_actors.py
@@ -0,0 +1,23 @@
+"""
+Compute different sizes of image used for Album covers and User avatars
+"""
+from django.db.utils import IntegrityError
+
+from funkwhale_api.users.models import User, create_actor
+
+
+def main(command, **kwargs):
+    qs = User.objects.filter(actor__isnull=True).order_by("username")
+    total = len(qs)
+    command.stdout.write("{} users found without actors".format(total))
+    for i, user in enumerate(qs):
+        command.stdout.write(
+            "{}/{} creating actor for {}".format(i + 1, total, user.username)
+        )
+        try:
+            user.actor = create_actor(user)
+        except IntegrityError as e:
+            # somehow, an actor with the the url exists in the database
+            command.stderr.write("Error while creating actor: {}".format(str(e)))
+            continue
+        user.save(update_fields=["actor"])
diff --git a/api/funkwhale_api/common/scripts/create_image_variations.py b/api/funkwhale_api/common/scripts/create_image_variations.py
new file mode 100644
index 0000000000000000000000000000000000000000..5e941ce1fe7c731eca94b3885d24ac7d68d02030
--- /dev/null
+++ b/api/funkwhale_api/common/scripts/create_image_variations.py
@@ -0,0 +1,30 @@
+"""
+Compute different sizes of image used for Album covers and User avatars
+"""
+
+from versatileimagefield.image_warmer import VersatileImageFieldWarmer
+
+from funkwhale_api.music.models import Album
+from funkwhale_api.users.models import User
+
+
+MODELS = [(Album, "cover", "square"), (User, "avatar", "square")]
+
+
+def main(command, **kwargs):
+    for model, attribute, key_set in MODELS:
+        qs = model.objects.exclude(**{"{}__isnull".format(attribute): True})
+        qs = qs.exclude(**{attribute: ""})
+        warmer = VersatileImageFieldWarmer(
+            instance_or_queryset=qs,
+            rendition_key_set=key_set,
+            image_attr=attribute,
+            verbose=True,
+        )
+        command.stdout.write(
+            "Creating images for {} / {}".format(model.__name__, attribute)
+        )
+        num_created, failed_to_create = warmer.warm()
+        command.stdout.write(
+            "  {} created, {} in error".format(num_created, len(failed_to_create))
+        )
diff --git a/api/funkwhale_api/common/search.py b/api/funkwhale_api/common/search.py
new file mode 100644
index 0000000000000000000000000000000000000000..5fc6f6804ca4c5e5289fb224c6e9adce503be978
--- /dev/null
+++ b/api/funkwhale_api/common/search.py
@@ -0,0 +1,130 @@
+import re
+
+from django.db.models import Q
+
+
+QUERY_REGEX = re.compile('(((?P<key>\w+):)?(?P<value>"[^"]+"|[\S]+))')
+
+
+def parse_query(query):
+    """
+    Given a search query such as "hello is:issue status:opened",
+    returns a list of dictionnaries discribing each query token
+    """
+    matches = [m.groupdict() for m in QUERY_REGEX.finditer(query.lower())]
+    for m in matches:
+        if m["value"].startswith('"') and m["value"].endswith('"'):
+            m["value"] = m["value"][1:-1]
+    return matches
+
+
+def normalize_query(
+    query_string,
+    findterms=re.compile(r'"([^"]+)"|(\S+)').findall,
+    normspace=re.compile(r"\s{2,}").sub,
+):
+    """ Splits the query string in invidual keywords, getting rid of unecessary spaces
+        and grouping quoted words together.
+        Example:
+
+        >>> normalize_query('  some random  words "with   quotes  " and   spaces')
+        ['some', 'random', 'words', 'with quotes', 'and', 'spaces']
+
+    """
+    return [normspace(" ", (t[0] or t[1]).strip()) for t in findterms(query_string)]
+
+
+def get_query(query_string, search_fields):
+    """ Returns a query, that is a combination of Q objects. That combination
+        aims to search keywords within a model by testing the given search fields.
+
+    """
+    query = None  # Query to search for every search term
+    terms = normalize_query(query_string)
+    for term in terms:
+        or_query = None  # Query to search for a given term in each field
+        for field_name in search_fields:
+            q = Q(**{"%s__icontains" % field_name: term})
+            if or_query is None:
+                or_query = q
+            else:
+                or_query = or_query | q
+        if query is None:
+            query = or_query
+        else:
+            query = query & or_query
+    return query
+
+
+def filter_tokens(tokens, valid):
+    return [t for t in tokens if t["key"] in valid]
+
+
+def apply(qs, config_data):
+    for k in ["filter_query", "search_query"]:
+        q = config_data.get(k)
+        if q:
+            qs = qs.filter(q)
+    return qs
+
+
+class SearchConfig:
+    def __init__(self, search_fields={}, filter_fields={}, types=[]):
+        self.filter_fields = filter_fields
+        self.search_fields = search_fields
+        self.types = types
+
+    def clean(self, query):
+        tokens = parse_query(query)
+        cleaned_data = {}
+
+        cleaned_data["types"] = self.clean_types(filter_tokens(tokens, ["is"]))
+        cleaned_data["search_query"] = self.clean_search_query(
+            filter_tokens(tokens, [None, "in"])
+        )
+        unhandled_tokens = [t for t in tokens if t["key"] not in [None, "is", "in"]]
+        cleaned_data["filter_query"] = self.clean_filter_query(unhandled_tokens)
+        return cleaned_data
+
+    def clean_search_query(self, tokens):
+        if not self.search_fields or not tokens:
+            return
+
+        fields_subset = {
+            f for t in filter_tokens(tokens, ["in"]) for f in t["value"].split(",")
+        } or set(self.search_fields.keys())
+        fields_subset = set(self.search_fields.keys()) & fields_subset
+        to_fields = [self.search_fields[k]["to"] for k in fields_subset]
+        query_string = " ".join([t["value"] for t in filter_tokens(tokens, [None])])
+        return get_query(query_string, sorted(to_fields))
+
+    def clean_filter_query(self, tokens):
+        if not self.filter_fields or not tokens:
+            return
+
+        matching = [t for t in tokens if t["key"] in self.filter_fields]
+        queries = [
+            Q(**{self.filter_fields[t["key"]]["to"]: t["value"]}) for t in matching
+        ]
+        query = None
+        for q in queries:
+            if not query:
+                query = q
+            else:
+                query = query & q
+        return query
+
+    def clean_types(self, tokens):
+        if not self.types:
+            return []
+
+        if not tokens:
+            # no filtering on type, we return all types
+            return [t for key, t in self.types]
+        types = []
+        for token in tokens:
+            for key, t in self.types:
+                if key.lower() == token["value"]:
+                    types.append(t)
+
+        return types
diff --git a/api/funkwhale_api/common/utils.py b/api/funkwhale_api/common/utils.py
index 221d2336b753322e5f40ad028c15fe157d218a00..bba4702b0957fea0c1a246fc512caa15ea0e30d2 100644
--- a/api/funkwhale_api/common/utils.py
+++ b/api/funkwhale_api/common/utils.py
@@ -1,5 +1,9 @@
+from django.utils.deconstruct import deconstructible
+
 import os
 import shutil
+import uuid
+
 from urllib.parse import parse_qs, urlencode, urlsplit, urlunsplit
 
 from django.db import transaction
@@ -41,3 +45,22 @@ def set_query_parameter(url, **kwargs):
     new_query_string = urlencode(query_params, doseq=True)
 
     return urlunsplit((scheme, netloc, path, new_query_string, fragment))
+
+
+@deconstructible
+class ChunkedPath(object):
+    def __init__(self, root, preserve_file_name=True):
+        self.root = root
+        self.preserve_file_name = preserve_file_name
+
+    def __call__(self, instance, filename):
+        uid = str(uuid.uuid4())
+        chunk_size = 2
+        chunks = [uid[i : i + chunk_size] for i in range(0, len(uid), chunk_size)]
+        if self.preserve_file_name:
+            parts = chunks[:3] + [filename]
+        else:
+            ext = os.path.splitext(filename)[1][1:].lower()
+            new_filename = "".join(chunks[3:]) + ".{}".format(ext)
+            parts = chunks[:3] + [new_filename]
+        return os.path.join(self.root, *parts)
diff --git a/api/funkwhale_api/common/validators.py b/api/funkwhale_api/common/validators.py
new file mode 100644
index 0000000000000000000000000000000000000000..b5f26cac5421450fccaac039720e1238cf118ca8
--- /dev/null
+++ b/api/funkwhale_api/common/validators.py
@@ -0,0 +1,152 @@
+import mimetypes
+from os.path import splitext
+
+from django.core.exceptions import ValidationError
+from django.core.files.images import get_image_dimensions
+from django.template.defaultfilters import filesizeformat
+from django.utils.deconstruct import deconstructible
+from django.utils.translation import ugettext_lazy as _
+
+
+@deconstructible
+class ImageDimensionsValidator:
+    """
+    ImageField dimensions validator.
+
+    from https://gist.github.com/emilio-rst/4f81ea2718736a6aaf9bdb64d5f2ea6c
+    """
+
+    def __init__(
+        self,
+        width=None,
+        height=None,
+        min_width=None,
+        max_width=None,
+        min_height=None,
+        max_height=None,
+    ):
+        """
+        Constructor
+
+        Args:
+            width (int): exact width
+            height (int): exact height
+            min_width (int): minimum width
+            min_height (int): minimum height
+            max_width (int): maximum width
+            max_height (int): maximum height
+        """
+
+        self.width = width
+        self.height = height
+        self.min_width = min_width
+        self.max_width = max_width
+        self.min_height = min_height
+        self.max_height = max_height
+
+    def __call__(self, image):
+        w, h = get_image_dimensions(image)
+
+        if self.width is not None and w != self.width:
+            raise ValidationError(_("Width must be %dpx.") % (self.width,))
+
+        if self.height is not None and h != self.height:
+            raise ValidationError(_("Height must be %dpx.") % (self.height,))
+
+        if self.min_width is not None and w < self.min_width:
+            raise ValidationError(_("Minimum width must be %dpx.") % (self.min_width,))
+
+        if self.min_height is not None and h < self.min_height:
+            raise ValidationError(
+                _("Minimum height must be %dpx.") % (self.min_height,)
+            )
+
+        if self.max_width is not None and w > self.max_width:
+            raise ValidationError(_("Maximum width must be %dpx.") % (self.max_width,))
+
+        if self.max_height is not None and h > self.max_height:
+            raise ValidationError(
+                _("Maximum height must be %dpx.") % (self.max_height,)
+            )
+
+
+@deconstructible
+class FileValidator(object):
+    """
+    Taken from https://gist.github.com/jrosebr1/2140738
+    Validator for files, checking the size, extension and mimetype.
+    Initialization parameters:
+        allowed_extensions: iterable with allowed file extensions
+            ie. ('txt', 'doc')
+        allowd_mimetypes: iterable with allowed mimetypes
+            ie. ('image/png', )
+        min_size: minimum number of bytes allowed
+            ie. 100
+        max_size: maximum number of bytes allowed
+            ie. 24*1024*1024 for 24 MB
+    Usage example::
+        MyModel(models.Model):
+            myfile = FileField(validators=FileValidator(max_size=24*1024*1024), ...)
+    """
+
+    extension_message = _(
+        "Extension '%(extension)s' not allowed. Allowed extensions are: '%(allowed_extensions)s.'"
+    )
+    mime_message = _(
+        "MIME type '%(mimetype)s' is not valid. Allowed types are: %(allowed_mimetypes)s."
+    )
+    min_size_message = _(
+        "The current file %(size)s, which is too small. The minumum file size is %(allowed_size)s."
+    )
+    max_size_message = _(
+        "The current file %(size)s, which is too large. The maximum file size is %(allowed_size)s."
+    )
+
+    def __init__(self, *args, **kwargs):
+        self.allowed_extensions = kwargs.pop("allowed_extensions", None)
+        self.allowed_mimetypes = kwargs.pop("allowed_mimetypes", None)
+        self.min_size = kwargs.pop("min_size", 0)
+        self.max_size = kwargs.pop("max_size", None)
+
+    def __call__(self, value):
+        """
+        Check the extension, content type and file size.
+        """
+
+        # Check the extension
+        ext = splitext(value.name)[1][1:].lower()
+        if self.allowed_extensions and ext not in self.allowed_extensions:
+            message = self.extension_message % {
+                "extension": ext,
+                "allowed_extensions": ", ".join(self.allowed_extensions),
+            }
+
+            raise ValidationError(message)
+
+        # Check the content type
+        mimetype = mimetypes.guess_type(value.name)[0]
+        if self.allowed_mimetypes and mimetype not in self.allowed_mimetypes:
+            message = self.mime_message % {
+                "mimetype": mimetype,
+                "allowed_mimetypes": ", ".join(self.allowed_mimetypes),
+            }
+
+            raise ValidationError(message)
+
+        # Check the file size
+        filesize = len(value)
+        if self.max_size and filesize > self.max_size:
+            message = self.max_size_message % {
+                "size": filesizeformat(filesize),
+                "allowed_size": filesizeformat(self.max_size),
+            }
+
+            raise ValidationError(message)
+
+        elif filesize < self.min_size:
+            message = self.min_size_message % {
+                "size": filesizeformat(filesize),
+                "allowed_size": filesizeformat(self.min_size),
+            }
+
+            raise ValidationError(message)
diff --git a/api/funkwhale_api/favorites/filters.py b/api/funkwhale_api/favorites/filters.py
new file mode 100644
index 0000000000000000000000000000000000000000..a355593d91bea643277086fe98d7e81a1653e998
--- /dev/null
+++ b/api/funkwhale_api/favorites/filters.py
@@ -0,0 +1,15 @@
+from django_filters import rest_framework as filters
+
+from funkwhale_api.common import fields
+
+from . import models
+
+
+class TrackFavoriteFilter(filters.FilterSet):
+    q = fields.SearchFilter(
+        search_fields=["track__title", "track__artist__name", "track__album__title"]
+    )
+
+    class Meta:
+        model = models.TrackFavorite
+        fields = ["user", "q"]
diff --git a/api/funkwhale_api/favorites/serializers.py b/api/funkwhale_api/favorites/serializers.py
index 3cafb80f021488cf0c64244a7dc1b5607d185497..16171aa34bd05eea4991969de09d46f5b76a0508 100644
--- a/api/funkwhale_api/favorites/serializers.py
+++ b/api/funkwhale_api/favorites/serializers.py
@@ -2,8 +2,8 @@
 from rest_framework import serializers
 
 from funkwhale_api.activity import serializers as activity_serializers
-from funkwhale_api.music.serializers import TrackActivitySerializer
-from funkwhale_api.users.serializers import UserActivitySerializer
+from funkwhale_api.music.serializers import TrackActivitySerializer, TrackSerializer
+from funkwhale_api.users.serializers import UserActivitySerializer, UserBasicSerializer
 
 from . import models
 
@@ -26,6 +26,15 @@ class TrackFavoriteActivitySerializer(activity_serializers.ModelSerializer):
 
 
 class UserTrackFavoriteSerializer(serializers.ModelSerializer):
+    track = TrackSerializer(read_only=True)
+    user = UserBasicSerializer(read_only=True)
+
+    class Meta:
+        model = models.TrackFavorite
+        fields = ("id", "user", "track", "creation_date")
+
+
+class UserTrackFavoriteWriteSerializer(serializers.ModelSerializer):
     class Meta:
         model = models.TrackFavorite
         fields = ("id", "track", "creation_date")
diff --git a/api/funkwhale_api/favorites/views.py b/api/funkwhale_api/favorites/views.py
index 4d1c1e756af1bf5ca01345ad0fba172c316ac152..dae90ebbdcfeb3719a915f125bc26f76208d431b 100644
--- a/api/funkwhale_api/favorites/views.py
+++ b/api/funkwhale_api/favorites/views.py
@@ -1,12 +1,13 @@
 from rest_framework import mixins, status, viewsets
 from rest_framework.decorators import list_route
+from rest_framework.permissions import IsAuthenticatedOrReadOnly
 from rest_framework.response import Response
 
 from funkwhale_api.activity import record
-from funkwhale_api.common.permissions import ConditionalAuthentication
+from funkwhale_api.common import fields, permissions
 from funkwhale_api.music.models import Track
 
-from . import models, serializers
+from . import filters, models, serializers
 
 
 class TrackFavoriteViewSet(
@@ -16,9 +17,24 @@ class TrackFavoriteViewSet(
     viewsets.GenericViewSet,
 ):
 
+    filter_class = filters.TrackFavoriteFilter
     serializer_class = serializers.UserTrackFavoriteSerializer
-    queryset = models.TrackFavorite.objects.all()
-    permission_classes = [ConditionalAuthentication]
+    queryset = (
+        models.TrackFavorite.objects.all()
+        .select_related("track__artist", "track__album__artist", "user")
+        .prefetch_related("track__files")
+    )
+    permission_classes = [
+        permissions.ConditionalAuthentication,
+        permissions.OwnerPermission,
+        IsAuthenticatedOrReadOnly,
+    ]
+    owner_checks = ["write"]
+
+    def get_serializer_class(self):
+        if self.request.method.lower() in ["head", "get", "options"]:
+            return serializers.UserTrackFavoriteSerializer
+        return serializers.UserTrackFavoriteWriteSerializer
 
     def create(self, request, *args, **kwargs):
         serializer = self.get_serializer(data=request.data)
@@ -32,7 +48,10 @@ class TrackFavoriteViewSet(
         )
 
     def get_queryset(self):
-        return self.queryset.filter(user=self.request.user)
+        queryset = super().get_queryset()
+        return queryset.filter(
+            fields.privacy_level_query(self.request.user, "user__privacy_level")
+        )
 
     def perform_create(self, serializer):
         track = Track.objects.get(pk=serializer.data["track"])
diff --git a/api/funkwhale_api/federation/factories.py b/api/funkwhale_api/federation/factories.py
index 7370ebd77d73694178a326ede77a2d0269ed16e6..4a13842da3b668b7aeed409b042192e238c6f42b 100644
--- a/api/funkwhale_api/federation/factories.py
+++ b/api/funkwhale_api/federation/factories.py
@@ -5,6 +5,7 @@ import requests
 import requests_http_signature
 from django.conf import settings
 from django.utils import timezone
+from django.utils.http import http_date
 
 from funkwhale_api.factories import registry
 
@@ -39,7 +40,7 @@ class SignedRequestFactory(factory.Factory):
         default_headers = {
             "User-Agent": "Test",
             "Host": "test.host",
-            "Date": "Right now",
+            "Date": http_date(timezone.now().timestamp()),
             "Content-Type": "application/activity+json",
         }
         if extracted:
@@ -170,6 +171,7 @@ class LibraryTrackFactory(factory.DjangoModelFactory):
     audio_url = factory.Faker("url")
     audio_mimetype = "audio/ogg"
     metadata = factory.SubFactory(LibraryTrackMetadataFactory)
+    published_date = factory.LazyFunction(timezone.now)
 
     class Meta:
         model = models.LibraryTrack
diff --git a/api/funkwhale_api/federation/filters.py b/api/funkwhale_api/federation/filters.py
index 3b5bfd7395782f2285a8b7451888078119e8cf10..ff7575ba5a006aee54826ed86ea62875dc215e15 100644
--- a/api/funkwhale_api/federation/filters.py
+++ b/api/funkwhale_api/federation/filters.py
@@ -1,6 +1,7 @@
 import django_filters
 
 from funkwhale_api.common import fields
+from funkwhale_api.common import search
 
 from . import models
 
@@ -23,8 +24,21 @@ class LibraryFilter(django_filters.FilterSet):
 class LibraryTrackFilter(django_filters.FilterSet):
     library = django_filters.CharFilter("library__uuid")
     status = django_filters.CharFilter(method="filter_status")
-    q = fields.SearchFilter(
-        search_fields=["artist_name", "title", "album_title", "library__actor__domain"]
+    q = fields.SmartSearchFilter(
+        config=search.SearchConfig(
+            search_fields={
+                "domain": {"to": "library__actor__domain"},
+                "artist": {"to": "artist_name"},
+                "album": {"to": "album_title"},
+                "title": {"to": "title"},
+            },
+            filter_fields={
+                "domain": {"to": "library__actor__domain"},
+                "artist": {"to": "artist_name__iexact"},
+                "album": {"to": "album_title__iexact"},
+                "title": {"to": "title__iexact"},
+            },
+        )
     )
 
     def filter_status(self, queryset, field_name, value):
diff --git a/api/funkwhale_api/federation/models.py b/api/funkwhale_api/federation/models.py
index 979b0674a94848dd7c0edb79f041900951629494..17ae0137657415243581afe4fdce57edfd1f5be5 100644
--- a/api/funkwhale_api/federation/models.py
+++ b/api/funkwhale_api/federation/models.py
@@ -1,4 +1,3 @@
-import os
 import tempfile
 import uuid
 
@@ -9,6 +8,7 @@ from django.db import models
 from django.utils import timezone
 
 from funkwhale_api.common import session
+from funkwhale_api.common import utils as common_utils
 from funkwhale_api.music import utils as music_utils
 
 TYPE_CHOICES = [
@@ -20,6 +20,11 @@ TYPE_CHOICES = [
 ]
 
 
+class ActorQuerySet(models.QuerySet):
+    def local(self, include=True):
+        return self.exclude(user__isnull=include)
+
+
 class Actor(models.Model):
     ap_type = "Actor"
 
@@ -47,6 +52,8 @@ class Actor(models.Model):
         related_name="following",
     )
 
+    objects = ActorQuerySet.as_manager()
+
     class Meta:
         unique_together = ["domain", "preferred_username"]
 
@@ -141,12 +148,7 @@ class Library(models.Model):
     )
 
 
-def get_file_path(instance, filename):
-    uid = str(uuid.uuid4())
-    chunk_size = 2
-    chunks = [uid[i : i + chunk_size] for i in range(0, len(uid), chunk_size)]
-    parts = chunks[:3] + [filename]
-    return os.path.join("federation_cache", *parts)
+get_file_path = common_utils.ChunkedPath("federation_cache")
 
 
 class LibraryTrack(models.Model):
diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py
index 44de5d3129536e0c18a5617007a99694b1aa2864..fc694c598d49668799a2af4fd81588f216195898 100644
--- a/api/funkwhale_api/federation/serializers.py
+++ b/api/funkwhale_api/federation/serializers.py
@@ -1,6 +1,8 @@
 import logging
+import mimetypes
 import urllib.parse
 
+from django.core.exceptions import ObjectDoesNotExist
 from django.core.paginator import Paginator
 from django.db import transaction
 from rest_framework import serializers
@@ -63,6 +65,15 @@ class ActorSerializer(serializers.Serializer):
         ret["endpoints"] = {}
         if instance.shared_inbox_url:
             ret["endpoints"]["sharedInbox"] = instance.shared_inbox_url
+        try:
+            if instance.user.avatar:
+                ret["icon"] = {
+                    "type": "Image",
+                    "mediaType": mimetypes.guess_type(instance.user.avatar.path)[0],
+                    "url": utils.full_url(instance.user.avatar.crop["400x400"].url),
+                }
+        except ObjectDoesNotExist:
+            pass
         return ret
 
     def prepare_missing_fields(self):
diff --git a/api/funkwhale_api/federation/signing.py b/api/funkwhale_api/federation/signing.py
index 15525b3e513b2ccc861cbf34b693b30aa0850d29..1bb2b9d5de04fc54e5557a6097b2f3215cd73efe 100644
--- a/api/funkwhale_api/federation/signing.py
+++ b/api/funkwhale_api/federation/signing.py
@@ -1,4 +1,10 @@
+import datetime
 import logging
+import pytz
+
+from django import forms
+from django.utils import timezone
+from django.utils.http import parse_http_date
 
 import requests
 import requests_http_signature
@@ -7,8 +13,33 @@ from . import exceptions, utils
 
 logger = logging.getLogger(__name__)
 
+#  the request Date should be between now - 30s and now + 30s
+DATE_HEADER_VALID_FOR = 30
+
+
+def verify_date(raw_date):
+    if not raw_date:
+        raise forms.ValidationError("Missing date header")
+
+    try:
+        ts = parse_http_date(raw_date)
+    except ValueError as e:
+        raise forms.ValidationError(str(e))
+    dt = datetime.datetime.utcfromtimestamp(ts)
+    dt = dt.replace(tzinfo=pytz.utc)
+    delta = datetime.timedelta(seconds=DATE_HEADER_VALID_FOR)
+    now = timezone.now()
+    if dt < now - delta or dt > now + delta:
+        raise forms.ValidationError(
+            "Request Date is too far in the future or in the past"
+        )
+
+    return dt
+
 
 def verify(request, public_key):
+    verify_date(request.headers.get("Date"))
+
     return requests_http_signature.HTTPSignatureAuth.verify(
         request, key_resolver=lambda **kwargs: public_key, use_auth_header=False
     )
diff --git a/api/funkwhale_api/federation/urls.py b/api/funkwhale_api/federation/urls.py
index 2594f554992779a5eef5c286fee4ba96e3f6393f..319e37bedbb2ba0ebb5ccd59d545613234e74c55 100644
--- a/api/funkwhale_api/federation/urls.py
+++ b/api/funkwhale_api/federation/urls.py
@@ -8,6 +8,7 @@ music_router = routers.SimpleRouter(trailing_slash=False)
 router.register(
     r"federation/instance/actors", views.InstanceActorViewSet, "instance-actors"
 )
+router.register(r"federation/actors", views.ActorViewSet, "actors")
 router.register(r".well-known", views.WellKnownViewSet, "well-known")
 
 music_router.register(r"files", views.MusicFilesViewSet, "files")
diff --git a/api/funkwhale_api/federation/utils.py b/api/funkwhale_api/federation/utils.py
index e09870223dedf596e220b49a665f84fe99acb6c6..71f2274642d9875c37eec36d7c4bf768f1888c7b 100644
--- a/api/funkwhale_api/federation/utils.py
+++ b/api/funkwhale_api/federation/utils.py
@@ -5,6 +5,8 @@ def full_url(path):
     """
     Given a relative path, return a full url usable for federation purpose
     """
+    if path.startswith("http://") or path.startswith("https://"):
+        return path
     root = settings.FUNKWHALE_URL
     if path.startswith("/") and root.endswith("/"):
         return root + path[1:]
diff --git a/api/funkwhale_api/federation/views.py b/api/funkwhale_api/federation/views.py
index 63a1d7b7126d22138c50334d6305c7d03ae9495a..29f5663092562ee02fdd8c1c4c18ef0250745e4d 100644
--- a/api/funkwhale_api/federation/views.py
+++ b/api/funkwhale_api/federation/views.py
@@ -32,6 +32,24 @@ class FederationMixin(object):
         return super().dispatch(request, *args, **kwargs)
 
 
+class ActorViewSet(FederationMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
+    lookup_field = "user__username"
+    lookup_value_regex = ".*"
+    authentication_classes = [authentication.SignatureAuthentication]
+    permission_classes = []
+    renderer_classes = [renderers.ActivityPubRenderer]
+    queryset = models.Actor.objects.local().select_related("user")
+    serializer_class = serializers.ActorSerializer
+
+    @detail_route(methods=["get", "post"])
+    def inbox(self, request, *args, **kwargs):
+        return response.Response({}, status=200)
+
+    @detail_route(methods=["get", "post"])
+    def outbox(self, request, *args, **kwargs):
+        return response.Response({}, status=200)
+
+
 class InstanceActorViewSet(FederationMixin, viewsets.GenericViewSet):
     lookup_field = "actor"
     lookup_value_regex = "[a-z]*"
@@ -100,6 +118,8 @@ class WellKnownViewSet(viewsets.GenericViewSet):
             resource_type, resource = webfinger.clean_resource(request.GET["resource"])
             cleaner = getattr(webfinger, "clean_{}".format(resource_type))
             result = cleaner(resource)
+            handler = getattr(self, "handler_{}".format(resource_type))
+            data = handler(result)
         except forms.ValidationError as e:
             return response.Response({"errors": {"resource": e.message}}, status=400)
         except KeyError:
@@ -107,14 +127,19 @@ class WellKnownViewSet(viewsets.GenericViewSet):
                 {"errors": {"resource": "This field is required"}}, status=400
             )
 
-        handler = getattr(self, "handler_{}".format(resource_type))
-        data = handler(result)
-
         return response.Response(data)
 
     def handler_acct(self, clean_result):
         username, hostname = clean_result
-        actor = actors.SYSTEM_ACTORS[username].get_actor_instance()
+
+        if username in actors.SYSTEM_ACTORS:
+            actor = actors.SYSTEM_ACTORS[username].get_actor_instance()
+        else:
+            try:
+                actor = models.Actor.objects.local().get(user__username=username)
+            except models.Actor.DoesNotExist:
+                raise forms.ValidationError("Invalid username")
+
         return serializers.ActorWebfingerSerializer(actor).data
 
 
diff --git a/api/funkwhale_api/federation/webfinger.py b/api/funkwhale_api/federation/webfinger.py
index b899fe20725ec929e8a81088e8e1600d9124678e..874b3c15874efbc97081b318a4f774985fd0ec5c 100644
--- a/api/funkwhale_api/federation/webfinger.py
+++ b/api/funkwhale_api/federation/webfinger.py
@@ -3,7 +3,7 @@ from django.conf import settings
 
 from funkwhale_api.common import session
 
-from . import actors, serializers
+from . import serializers
 
 VALID_RESOURCE_TYPES = ["acct"]
 
@@ -32,9 +32,6 @@ def clean_acct(acct_string, ensure_local=True):
     if ensure_local and hostname.lower() != settings.FEDERATION_HOSTNAME:
         raise forms.ValidationError("Invalid hostname {}".format(hostname))
 
-    if ensure_local and username not in actors.SYSTEM_ACTORS:
-        raise forms.ValidationError("Invalid username")
-
     return username, hostname
 
 
diff --git a/api/funkwhale_api/history/serializers.py b/api/funkwhale_api/history/serializers.py
index e493227988a7d608910db46d2ebd01b0a95a96db..2254aee8cee370f4124c82acf59ad4c2c0d3148f 100644
--- a/api/funkwhale_api/history/serializers.py
+++ b/api/funkwhale_api/history/serializers.py
@@ -1,8 +1,8 @@
 from rest_framework import serializers
 
 from funkwhale_api.activity import serializers as activity_serializers
-from funkwhale_api.music.serializers import TrackActivitySerializer
-from funkwhale_api.users.serializers import UserActivitySerializer
+from funkwhale_api.music.serializers import TrackActivitySerializer, TrackSerializer
+from funkwhale_api.users.serializers import UserActivitySerializer, UserBasicSerializer
 
 from . import models
 
@@ -25,6 +25,20 @@ class ListeningActivitySerializer(activity_serializers.ModelSerializer):
 
 
 class ListeningSerializer(serializers.ModelSerializer):
+    track = TrackSerializer(read_only=True)
+    user = UserBasicSerializer(read_only=True)
+
+    class Meta:
+        model = models.Listening
+        fields = ("id", "user", "track", "creation_date")
+
+    def create(self, validated_data):
+        validated_data["user"] = self.context["user"]
+
+        return super().create(validated_data)
+
+
+class ListeningWriteSerializer(serializers.ModelSerializer):
     class Meta:
         model = models.Listening
         fields = ("id", "user", "track", "creation_date")
diff --git a/api/funkwhale_api/history/views.py b/api/funkwhale_api/history/views.py
index e104a2aa3dc44f3c538bc747df63a6e5d630f10d..6c7ef39914bf9fdbdda9a896d59347ac27eb3666 100644
--- a/api/funkwhale_api/history/views.py
+++ b/api/funkwhale_api/history/views.py
@@ -1,17 +1,36 @@
-from rest_framework import mixins, permissions, viewsets
+from rest_framework import mixins, viewsets
+from rest_framework.permissions import IsAuthenticatedOrReadOnly
 
 from funkwhale_api.activity import record
+from funkwhale_api.common import fields, permissions
 
 from . import models, serializers
 
 
 class ListeningViewSet(
-    mixins.CreateModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet
+    mixins.CreateModelMixin,
+    mixins.ListModelMixin,
+    mixins.RetrieveModelMixin,
+    viewsets.GenericViewSet,
 ):
 
     serializer_class = serializers.ListeningSerializer
-    queryset = models.Listening.objects.all()
-    permission_classes = [permissions.IsAuthenticated]
+    queryset = (
+        models.Listening.objects.all()
+        .select_related("track__artist", "track__album__artist", "user")
+        .prefetch_related("track__files")
+    )
+    permission_classes = [
+        permissions.ConditionalAuthentication,
+        permissions.OwnerPermission,
+        IsAuthenticatedOrReadOnly,
+    ]
+    owner_checks = ["write"]
+
+    def get_serializer_class(self):
+        if self.request.method.lower() in ["head", "get", "options"]:
+            return serializers.ListeningSerializer
+        return serializers.ListeningWriteSerializer
 
     def perform_create(self, serializer):
         r = super().perform_create(serializer)
@@ -20,7 +39,9 @@ class ListeningViewSet(
 
     def get_queryset(self):
         queryset = super().get_queryset()
-        return queryset.filter(user=self.request.user)
+        return queryset.filter(
+            fields.privacy_level_query(self.request.user, "user__privacy_level")
+        )
 
     def get_serializer_context(self):
         context = super().get_serializer_context()
diff --git a/api/funkwhale_api/music/filters.py b/api/funkwhale_api/music/filters.py
index 1f73fc9b0638df2d15520f5522fb13c013989de0..87537b675ed95dcfe0b3cfa48d792a5ddb7063ce 100644
--- a/api/funkwhale_api/music/filters.py
+++ b/api/funkwhale_api/music/filters.py
@@ -6,19 +6,9 @@ from funkwhale_api.common import fields
 from . import models
 
 
-class ListenableMixin(filters.FilterSet):
-    listenable = filters.BooleanFilter(name="_", method="filter_listenable")
-
-    def filter_listenable(self, queryset, name, value):
-        queryset = queryset.annotate(files_count=Count("tracks__files"))
-        if value:
-            return queryset.filter(files_count__gt=0)
-        else:
-            return queryset.filter(files_count=0)
-
-
-class ArtistFilter(ListenableMixin):
+class ArtistFilter(filters.FilterSet):
     q = fields.SearchFilter(search_fields=["name"])
+    listenable = filters.BooleanFilter(name="_", method="filter_listenable")
 
     class Meta:
         model = models.Artist
@@ -27,6 +17,13 @@ class ArtistFilter(ListenableMixin):
             "listenable": "exact",
         }
 
+    def filter_listenable(self, queryset, name, value):
+        queryset = queryset.annotate(files_count=Count("albums__tracks__files"))
+        if value:
+            return queryset.filter(files_count__gt=0)
+        else:
+            return queryset.filter(files_count=0)
+
 
 class TrackFilter(filters.FilterSet):
     q = fields.SearchFilter(search_fields=["title", "album__title", "artist__name"])
@@ -72,10 +69,17 @@ class ImportJobFilter(filters.FilterSet):
         }
 
 
-class AlbumFilter(ListenableMixin):
+class AlbumFilter(filters.FilterSet):
     listenable = filters.BooleanFilter(name="_", method="filter_listenable")
     q = fields.SearchFilter(search_fields=["title", "artist__name" "source"])
 
     class Meta:
         model = models.Album
         fields = ["listenable", "q", "artist"]
+
+    def filter_listenable(self, queryset, name, value):
+        queryset = queryset.annotate(files_count=Count("tracks__files"))
+        if value:
+            return queryset.filter(files_count__gt=0)
+        else:
+            return queryset.filter(files_count=0)
diff --git a/api/funkwhale_api/music/importers.py b/api/funkwhale_api/music/importers.py
index ce7ded02b48822c2740c6c9e57765ea8b458dccc..fc4a98241e151bb3325d3dbd685511074ef3fc66 100644
--- a/api/funkwhale_api/music/importers.py
+++ b/api/funkwhale_api/music/importers.py
@@ -3,12 +3,19 @@ def load(model, *args, **kwargs):
     return importer.load(*args, **kwargs)
 
 
+EXCLUDE_VALIDATION = {"Track": ["artist"]}
+
+
 class Importer(object):
     def __init__(self, model):
         self.model = model
 
     def load(self, cleaned_data, raw_data, import_hooks):
         mbid = cleaned_data.pop("mbid")
+        # let's validate data, just in case
+        instance = self.model(**cleaned_data)
+        exclude = EXCLUDE_VALIDATION.get(self.model.__name__, [])
+        instance.full_clean(exclude=["mbid", "uuid"] + exclude)
         m = self.model.objects.update_or_create(mbid=mbid, defaults=cleaned_data)[0]
         for hook in import_hooks:
             hook(m, cleaned_data, raw_data)
diff --git a/api/funkwhale_api/music/management/commands/fix_track_files.py b/api/funkwhale_api/music/management/commands/fix_track_files.py
index 988f9bed36e605c9417021314482c132008680c4..c61972db873821ce66a96cbab604a37a714574f7 100644
--- a/api/funkwhale_api/music/management/commands/fix_track_files.py
+++ b/api/funkwhale_api/music/management/commands/fix_track_files.py
@@ -1,4 +1,3 @@
-import cacheops
 from django.core.management.base import BaseCommand
 from django.db import transaction
 from django.db.models import Q
@@ -24,7 +23,6 @@ class Command(BaseCommand):
         self.fix_mimetypes(**options)
         self.fix_file_data(**options)
         self.fix_file_size(**options)
-        cacheops.invalidate_model(models.TrackFile)
 
     @transaction.atomic
     def fix_mimetypes(self, dry_run, **kwargs):
diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py
index d533d852588ac401288c070ada67cb9fcea2b7eb..c8dd61313df9e94d392847c5855efe783c2e6775 100644
--- a/api/funkwhale_api/music/models.py
+++ b/api/funkwhale_api/music/models.py
@@ -15,7 +15,9 @@ from django.dispatch import receiver
 from django.urls import reverse
 from django.utils import timezone
 from taggit.managers import TaggableManager
+
 from versatileimagefield.fields import VersatileImageField
+from versatileimagefield.image_warmer import VersatileImageFieldWarmer
 
 from funkwhale_api import downloader, musicbrainz
 from funkwhale_api.federation import utils as federation_utils
@@ -319,9 +321,10 @@ class Track(APIModelMixin):
         "mbid": {"musicbrainz_field_name": "id"},
         "title": {"musicbrainz_field_name": "title"},
         "artist": {
-            # we use the artist from the release to avoid #237
-            "musicbrainz_field_name": "release-list",
-            "converter": get_artist,
+            "musicbrainz_field_name": "artist-credit",
+            "converter": lambda v: Artist.get_or_create_from_api(
+                mbid=v[0]["artist"]["id"]
+            )[0],
         },
         "album": {"musicbrainz_field_name": "release-list", "converter": import_album},
     }
@@ -389,19 +392,37 @@ class Track(APIModelMixin):
         tracks = [t for m in data["release"]["medium-list"] for t in m["track-list"]]
         track_data = None
         for track in tracks:
-            if track["recording"]["id"] == mbid:
+            if track["recording"]["id"] == str(mbid):
                 track_data = track
                 break
         if not track_data:
             raise ValueError("No track found matching this ID")
 
+        track_artist_mbid = None
+        for ac in track_data["recording"]["artist-credit"]:
+            try:
+                ac_mbid = ac["artist"]["id"]
+            except TypeError:
+                # it's probably a string, like "feat."
+                continue
+
+            if ac_mbid == str(album.artist.mbid):
+                continue
+
+            track_artist_mbid = ac_mbid
+            break
+        track_artist_mbid = track_artist_mbid or album.artist.mbid
+        if track_artist_mbid == str(album.artist.mbid):
+            track_artist = album.artist
+        else:
+            track_artist = Artist.get_or_create_from_api(track_artist_mbid)[0]
         return cls.objects.update_or_create(
             mbid=mbid,
             defaults={
                 "position": int(track["position"]),
                 "title": track["recording"]["title"],
                 "album": album,
-                "artist": album.artist,
+                "artist": track_artist,
             },
         )
 
@@ -622,3 +643,13 @@ def update_request_status(sender, instance, created, **kwargs):
         # let's mark the request as imported since the import is over
         instance.import_request.status = "imported"
         return instance.import_request.save(update_fields=["status"])
+
+
+@receiver(models.signals.post_save, sender=Album)
+def warm_album_covers(sender, instance, **kwargs):
+    if not instance.cover:
+        return
+    album_covers_warmer = VersatileImageFieldWarmer(
+        instance_or_queryset=instance, rendition_key_set="square", image_attr="cover"
+    )
+    num_created, failed_to_create = album_covers_warmer.warm()
diff --git a/api/funkwhale_api/music/serializers.py b/api/funkwhale_api/music/serializers.py
index c34970d0b5cbcf29155c7b008c0ba4acd6246f1c..0661eb8f4dcd8dadc27c52dacec793d3ba9bab9b 100644
--- a/api/funkwhale_api/music/serializers.py
+++ b/api/funkwhale_api/music/serializers.py
@@ -1,6 +1,7 @@
 from django.db.models import Q
 from rest_framework import serializers
 from taggit.models import Tag
+from versatileimagefield.serializers import VersatileImageFieldSerializer
 
 from funkwhale_api.activity import serializers as activity_serializers
 from funkwhale_api.users.serializers import UserBasicSerializer
@@ -8,8 +9,12 @@ from funkwhale_api.users.serializers import UserBasicSerializer
 from . import models, tasks
 
 
+cover_field = VersatileImageFieldSerializer(allow_null=True, sizes="square")
+
+
 class ArtistAlbumSerializer(serializers.ModelSerializer):
     tracks_count = serializers.SerializerMethodField()
+    cover = cover_field
 
     class Meta:
         model = models.Album
@@ -60,8 +65,15 @@ class TrackFileSerializer(serializers.ModelSerializer):
         return url
 
 
+class ArtistSimpleSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = models.Artist
+        fields = ("id", "mbid", "name", "creation_date")
+
+
 class AlbumTrackSerializer(serializers.ModelSerializer):
     files = TrackFileSerializer(many=True, read_only=True)
+    artist = ArtistSimpleSerializer(read_only=True)
 
     class Meta:
         model = models.Track
@@ -77,15 +89,10 @@ class AlbumTrackSerializer(serializers.ModelSerializer):
         )
 
 
-class ArtistSimpleSerializer(serializers.ModelSerializer):
-    class Meta:
-        model = models.Artist
-        fields = ("id", "mbid", "name", "creation_date")
-
-
 class AlbumSerializer(serializers.ModelSerializer):
     tracks = serializers.SerializerMethodField()
     artist = ArtistSimpleSerializer(read_only=True)
+    cover = cover_field
 
     class Meta:
         model = models.Album
@@ -110,6 +117,7 @@ class AlbumSerializer(serializers.ModelSerializer):
 
 class TrackAlbumSerializer(serializers.ModelSerializer):
     artist = ArtistSimpleSerializer(read_only=True)
+    cover = cover_field
 
     class Meta:
         model = models.Album
@@ -155,6 +163,8 @@ class TagSerializer(serializers.ModelSerializer):
 
 
 class SimpleAlbumSerializer(serializers.ModelSerializer):
+    cover = cover_field
+
     class Meta:
         model = models.Album
         fields = ("id", "mbid", "title", "release_date", "cover")
diff --git a/api/funkwhale_api/music/utils.py b/api/funkwhale_api/music/utils.py
index 3080c1c6c056b84aa29842d1040087d3f0492ad6..30f62f3485838f2a6b626e5d0b24a44144fb885c 100644
--- a/api/funkwhale_api/music/utils.py
+++ b/api/funkwhale_api/music/utils.py
@@ -1,47 +1,9 @@
 import mimetypes
-import re
 
 import magic
 import mutagen
-from django.db.models import Q
-
-
-def normalize_query(
-    query_string,
-    findterms=re.compile(r'"([^"]+)"|(\S+)').findall,
-    normspace=re.compile(r"\s{2,}").sub,
-):
-    """ Splits the query string in invidual keywords, getting rid of unecessary spaces
-        and grouping quoted words together.
-        Example:
-
-        >>> normalize_query('  some random  words "with   quotes  " and   spaces')
-        ['some', 'random', 'words', 'with quotes', 'and', 'spaces']
-
-    """
-    return [normspace(" ", (t[0] or t[1]).strip()) for t in findterms(query_string)]
-
-
-def get_query(query_string, search_fields):
-    """ Returns a query, that is a combination of Q objects. That combination
-        aims to search keywords within a model by testing the given search fields.
-
-    """
-    query = None  # Query to search for every search term
-    terms = normalize_query(query_string)
-    for term in terms:
-        or_query = None  # Query to search for a given term in each field
-        for field_name in search_fields:
-            q = Q(**{"%s__icontains" % field_name: term})
-            if or_query is None:
-                or_query = q
-            else:
-                or_query = or_query | q
-        if query is None:
-            query = or_query
-        else:
-            query = query & or_query
-    return query
+
+from funkwhale_api.common.search import normalize_query, get_query  # noqa
 
 
 def guess_mimetype(f):
diff --git a/api/funkwhale_api/playlists/filters.py b/api/funkwhale_api/playlists/filters.py
index ae9f0226f265c41e1db2c185aa9c609fed635478..144b0f049b23e78002fc3f79a87d395c87b141d1 100644
--- a/api/funkwhale_api/playlists/filters.py
+++ b/api/funkwhale_api/playlists/filters.py
@@ -1,3 +1,4 @@
+from django.db.models import Count
 from django_filters import rest_framework as filters
 
 from funkwhale_api.music import utils
@@ -7,10 +8,23 @@ from . import models
 
 class PlaylistFilter(filters.FilterSet):
     q = filters.CharFilter(name="_", method="filter_q")
+    listenable = filters.BooleanFilter(name="_", method="filter_listenable")
 
     class Meta:
         model = models.Playlist
-        fields = {"user": ["exact"], "name": ["exact", "icontains"], "q": "exact"}
+        fields = {
+            "user": ["exact"],
+            "name": ["exact", "icontains"],
+            "q": "exact",
+            "listenable": "exact",
+        }
+
+    def filter_listenable(self, queryset, name, value):
+        queryset = queryset.annotate(plts_count=Count("playlist_tracks"))
+        if value:
+            return queryset.filter(plts_count__gt=0)
+        else:
+            return queryset.filter(plts_count=0)
 
     def filter_q(self, queryset, name, value):
         query = utils.get_query(value, ["name", "user__username"])
diff --git a/api/funkwhale_api/playlists/models.py b/api/funkwhale_api/playlists/models.py
index e9df4624de9b32d9ef45a1599f545f3cccf72e98..d2504d84846509198f20054844a844b9c0670917 100644
--- a/api/funkwhale_api/playlists/models.py
+++ b/api/funkwhale_api/playlists/models.py
@@ -3,12 +3,41 @@ from django.utils import timezone
 from rest_framework import exceptions
 
 from funkwhale_api.common import fields, preferences
+from funkwhale_api.music import models as music_models
 
 
 class PlaylistQuerySet(models.QuerySet):
     def with_tracks_count(self):
         return self.annotate(_tracks_count=models.Count("playlist_tracks"))
 
+    def with_duration(self):
+        return self.annotate(
+            duration=models.Sum("playlist_tracks__track__files__duration")
+        )
+
+    def with_covers(self):
+        album_prefetch = models.Prefetch(
+            "album", queryset=music_models.Album.objects.only("cover")
+        )
+        track_prefetch = models.Prefetch(
+            "track",
+            queryset=music_models.Track.objects.prefetch_related(album_prefetch).only(
+                "id", "album_id"
+            ),
+        )
+
+        plt_prefetch = models.Prefetch(
+            "playlist_tracks",
+            queryset=PlaylistTrack.objects.all()
+            .exclude(track__album__cover=None)
+            .exclude(track__album__cover="")
+            .order_by("index")
+            .only("id", "playlist_id", "track_id")
+            .prefetch_related(track_prefetch),
+            to_attr="plts_for_cover",
+        )
+        return self.prefetch_related(plt_prefetch)
+
 
 class Playlist(models.Model):
     name = models.CharField(max_length=50)
diff --git a/api/funkwhale_api/playlists/serializers.py b/api/funkwhale_api/playlists/serializers.py
index 17cc06b10bdab8f17fb4f3cc246a5e5e26d12fab..a60a349387020a2dd110c9f101fef0bdfce0510a 100644
--- a/api/funkwhale_api/playlists/serializers.py
+++ b/api/funkwhale_api/playlists/serializers.py
@@ -65,6 +65,8 @@ class PlaylistTrackWriteSerializer(serializers.ModelSerializer):
 
 class PlaylistSerializer(serializers.ModelSerializer):
     tracks_count = serializers.SerializerMethodField(read_only=True)
+    duration = serializers.SerializerMethodField(read_only=True)
+    album_covers = serializers.SerializerMethodField(read_only=True)
     user = UserBasicSerializer(read_only=True)
 
     class Meta:
@@ -72,11 +74,13 @@ class PlaylistSerializer(serializers.ModelSerializer):
         fields = (
             "id",
             "name",
-            "tracks_count",
             "user",
             "modification_date",
             "creation_date",
             "privacy_level",
+            "tracks_count",
+            "album_covers",
+            "duration",
         )
         read_only_fields = ["id", "modification_date", "creation_date"]
 
@@ -87,6 +91,36 @@ class PlaylistSerializer(serializers.ModelSerializer):
             # no annotation?
             return obj.playlist_tracks.count()
 
+    def get_duration(self, obj):
+        try:
+            return obj.duration
+        except AttributeError:
+            # no annotation?
+            return 0
+
+    def get_album_covers(self, obj):
+        try:
+            plts = obj.plts_for_cover
+        except AttributeError:
+            return []
+
+        covers = []
+        max_covers = 5
+        for plt in plts:
+            url = plt.track.album.cover.crop["200x200"].url
+            if url in covers:
+                continue
+            covers.append(url)
+            if len(covers) >= max_covers:
+                break
+
+        full_urls = []
+        for url in covers:
+            if "request" in self.context:
+                url = self.context["request"].build_absolute_uri(url)
+            full_urls.append(url)
+        return full_urls
+
 
 class PlaylistAddManySerializer(serializers.Serializer):
     tracks = serializers.PrimaryKeyRelatedField(
diff --git a/api/funkwhale_api/playlists/views.py b/api/funkwhale_api/playlists/views.py
index 21e35f50a8c711fa2a7cdee401d8eba7b9986023..8db076a8608fa388d8a8fedda646836c2df20ef5 100644
--- a/api/funkwhale_api/playlists/views.py
+++ b/api/funkwhale_api/playlists/views.py
@@ -24,6 +24,8 @@ class PlaylistViewSet(
         models.Playlist.objects.all()
         .select_related("user")
         .annotate(tracks_count=Count("playlist_tracks"))
+        .with_covers()
+        .with_duration()
     )
     permission_classes = [
         permissions.ConditionalAuthentication,
diff --git a/api/funkwhale_api/providers/audiofile/management/commands/import_files.py b/api/funkwhale_api/providers/audiofile/management/commands/import_files.py
index b59c0046fa154e2e8f8c1e62aba6ce283416e232..2aba0c145d1034e48aee3e706558731730dd2e9c 100644
--- a/api/funkwhale_api/providers/audiofile/management/commands/import_files.py
+++ b/api/funkwhale_api/providers/audiofile/management/commands/import_files.py
@@ -82,10 +82,31 @@ class Command(BaseCommand):
         try:
             for import_path in options["path"]:
                 matching += glob.glob(import_path, **glob_kwargs)
-            matching = sorted(list(set(matching)))
+            raw_matching = sorted(list(set(matching)))
         except TypeError:
             raise Exception("You need Python 3.5 to use the --recursive flag")
 
+        matching = []
+        for m in raw_matching:
+            # In some situations, the path is encoded incorrectly on the filesystem
+            # so we filter out faulty paths and display a warning to the user.
+            # see https://code.eliotberriot.com/funkwhale/funkwhale/issues/138
+            try:
+                m.encode("utf-8")
+                matching.append(m)
+            except UnicodeEncodeError:
+                try:
+                    previous = matching[-1]
+                except IndexError:
+                    previous = None
+                self.stderr.write(
+                    self.style.WARNING(
+                        "[warning] Ignoring undecodable path. Previous ok file was {}".format(
+                            previous
+                        )
+                    )
+                )
+
         if options["in_place"]:
             self.stdout.write(
                 "Checking imported paths against settings.MUSIC_DIRECTORY_PATH"
diff --git a/api/funkwhale_api/subsonic/authentication.py b/api/funkwhale_api/subsonic/authentication.py
index a573a109249972e5a1e693d2c84edfe66efd0f46..d6edb90cdb14a3c80fc7c89214c008dbbd20c001 100644
--- a/api/funkwhale_api/subsonic/authentication.py
+++ b/api/funkwhale_api/subsonic/authentication.py
@@ -19,7 +19,7 @@ def authenticate(username, password):
             password = password.replace("enc:", "", 1)
             password = binascii.unhexlify(password).decode("utf-8")
         user = User.objects.get(
-            username=username, is_active=True, subsonic_api_token=password
+            username__iexact=username, is_active=True, subsonic_api_token=password
         )
     except (User.DoesNotExist, binascii.Error):
         raise exceptions.AuthenticationFailed("Wrong username or password.")
diff --git a/api/funkwhale_api/users/admin.py b/api/funkwhale_api/users/admin.py
index 205c7c36703ebfa153dab7b2a393f4432152e162..365db615efe10518cc207dbd05fd657065a64b85 100644
--- a/api/funkwhale_api/users/admin.py
+++ b/api/funkwhale_api/users/admin.py
@@ -56,7 +56,10 @@ class UserAdmin(AuthUserAdmin):
 
     fieldsets = (
         (None, {"fields": ("username", "password", "privacy_level")}),
-        (_("Personal info"), {"fields": ("first_name", "last_name", "email")}),
+        (
+            _("Personal info"),
+            {"fields": ("first_name", "last_name", "email", "avatar")},
+        ),
         (
             _("Permissions"),
             {
diff --git a/api/funkwhale_api/users/factories.py b/api/funkwhale_api/users/factories.py
index 5fceb57bbc17bdd8ac70e95bc81e672869b4abe8..9bef1da1c909c38797a3dc5430cc8861d804d501 100644
--- a/api/funkwhale_api/users/factories.py
+++ b/api/funkwhale_api/users/factories.py
@@ -4,6 +4,8 @@ from django.utils import timezone
 
 from funkwhale_api.factories import ManyToManyFromList, registry
 
+from . import models
+
 
 @registry.register
 class GroupFactory(factory.django.DjangoModelFactory):
@@ -47,6 +49,7 @@ class UserFactory(factory.django.DjangoModelFactory):
     password = factory.PostGenerationMethodCall("set_password", "test")
     subsonic_api_token = None
     groups = ManyToManyFromList("groups")
+    avatar = factory.django.ImageField()
 
     class Meta:
         model = "users.User"
@@ -71,6 +74,14 @@ class UserFactory(factory.django.DjangoModelFactory):
             # A list of permissions were passed in, use them
             self.user_permissions.add(*perms)
 
+    @factory.post_generation
+    def with_actor(self, create, extracted, **kwargs):
+        if not create or not extracted:
+            return
+        self.actor = models.create_actor(self)
+        self.save(update_fields=["actor"])
+        return self.actor
+
 
 @registry.register(name="users.SuperUser")
 class SuperUserFactory(UserFactory):
diff --git a/api/funkwhale_api/users/migrations/0010_user_avatar.py b/api/funkwhale_api/users/migrations/0010_user_avatar.py
new file mode 100644
index 0000000000000000000000000000000000000000..da60439becbe72c694129bc9f372927727810751
--- /dev/null
+++ b/api/funkwhale_api/users/migrations/0010_user_avatar.py
@@ -0,0 +1,20 @@
+# Generated by Django 2.0.6 on 2018-07-10 20:09
+
+from django.db import migrations, models
+import funkwhale_api.common.utils
+import funkwhale_api.common.validators
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('users', '0009_auto_20180619_2024'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='user',
+            name='avatar',
+            field=models.ImageField(blank=True, max_length=150, null=True, upload_to=funkwhale_api.common.utils.ChunkedPath('users/avatars'), validators=[funkwhale_api.common.validators.ImageDimensionsValidator(max_height=400, max_width=400, min_height=50, min_width=50)]),
+        ),
+    ]
diff --git a/api/funkwhale_api/users/migrations/0011_auto_20180721_1317.py b/api/funkwhale_api/users/migrations/0011_auto_20180721_1317.py
new file mode 100644
index 0000000000000000000000000000000000000000..5b5a1cabc163e2a77679683a98c08e80a9ac9144
--- /dev/null
+++ b/api/funkwhale_api/users/migrations/0011_auto_20180721_1317.py
@@ -0,0 +1,28 @@
+# Generated by Django 2.0.7 on 2018-07-21 13:17
+
+from django.db import migrations, models
+import django.db.models.deletion
+import funkwhale_api.common.utils
+import funkwhale_api.common.validators
+import versatileimagefield.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('federation', '0006_auto_20180521_1702'),
+        ('users', '0010_user_avatar'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='user',
+            name='actor',
+            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='user', to='federation.Actor'),
+        ),
+        migrations.AlterField(
+            model_name='user',
+            name='avatar',
+            field=versatileimagefield.fields.VersatileImageField(blank=True, max_length=150, null=True, upload_to=funkwhale_api.common.utils.ChunkedPath('users/avatars', preserve_file_name=False), validators=[funkwhale_api.common.validators.ImageDimensionsValidator(min_height=50, min_width=50), funkwhale_api.common.validators.FileValidator(allowed_extensions=['png', 'jpg', 'jpeg', 'gif'], max_size=2097152)]),
+        ),
+    ]
diff --git a/api/funkwhale_api/users/models.py b/api/funkwhale_api/users/models.py
index ec9c39fd69a47d08f08f2a59ba20f480e8cfdb9c..26ffb5a948ec807e7f2633b191ce3ea1f6032be3 100644
--- a/api/funkwhale_api/users/models.py
+++ b/api/funkwhale_api/users/models.py
@@ -11,12 +11,21 @@ import uuid
 from django.conf import settings
 from django.contrib.auth.models import AbstractUser
 from django.db import models
+from django.dispatch import receiver
 from django.urls import reverse
 from django.utils import timezone
 from django.utils.encoding import python_2_unicode_compatible
 from django.utils.translation import ugettext_lazy as _
 
+from versatileimagefield.fields import VersatileImageField
+from versatileimagefield.image_warmer import VersatileImageFieldWarmer
+
 from funkwhale_api.common import fields, preferences
+from funkwhale_api.common import utils as common_utils
+from funkwhale_api.common import validators as common_validators
+from funkwhale_api.federation import keys
+from funkwhale_api.federation import models as federation_models
+from funkwhale_api.federation import utils as federation_utils
 
 
 def get_token():
@@ -39,6 +48,9 @@ PERMISSIONS_CONFIGURATION = {
 PERMISSIONS = sorted(PERMISSIONS_CONFIGURATION.keys())
 
 
+get_file_path = common_utils.ChunkedPath("users/avatars", preserve_file_name=False)
+
+
 @python_2_unicode_compatible
 class User(AbstractUser):
 
@@ -88,6 +100,26 @@ class User(AbstractUser):
         blank=True,
         on_delete=models.SET_NULL,
     )
+    avatar = VersatileImageField(
+        upload_to=get_file_path,
+        null=True,
+        blank=True,
+        max_length=150,
+        validators=[
+            common_validators.ImageDimensionsValidator(min_width=50, min_height=50),
+            common_validators.FileValidator(
+                allowed_extensions=["png", "jpg", "jpeg", "gif"],
+                max_size=1024 * 1024 * 2,
+            ),
+        ],
+    )
+    actor = models.OneToOneField(
+        "federation.Actor",
+        related_name="user",
+        on_delete=models.SET_NULL,
+        null=True,
+        blank=True,
+    )
 
     def __str__(self):
         return self.username
@@ -185,3 +217,41 @@ class Invitation(models.Model):
             )
 
         return super().save(**kwargs)
+
+
+def create_actor(user):
+    username = user.username
+    private, public = keys.get_key_pair()
+    args = {
+        "preferred_username": username,
+        "domain": settings.FEDERATION_HOSTNAME,
+        "type": "Person",
+        "name": username,
+        "manually_approves_followers": False,
+        "url": federation_utils.full_url(
+            reverse("federation:actors-detail", kwargs={"user__username": username})
+        ),
+        "shared_inbox_url": federation_utils.full_url(
+            reverse("federation:actors-inbox", kwargs={"user__username": username})
+        ),
+        "inbox_url": federation_utils.full_url(
+            reverse("federation:actors-inbox", kwargs={"user__username": username})
+        ),
+        "outbox_url": federation_utils.full_url(
+            reverse("federation:actors-outbox", kwargs={"user__username": username})
+        ),
+    }
+    args["private_key"] = private.decode("utf-8")
+    args["public_key"] = public.decode("utf-8")
+
+    return federation_models.Actor.objects.create(**args)
+
+
+@receiver(models.signals.post_save, sender=User)
+def warm_user_avatar(sender, instance, **kwargs):
+    if not instance.avatar:
+        return
+    user_avatar_warmer = VersatileImageFieldWarmer(
+        instance_or_queryset=instance, rendition_key_set="square", image_attr="avatar"
+    )
+    num_created, failed_to_create = user_avatar_warmer.warm()
diff --git a/api/funkwhale_api/users/serializers.py b/api/funkwhale_api/users/serializers.py
index 4389512650327a2da66fcd35fee362106814d43a..2f227158448ac69a13ec4fe503219b33408a036b 100644
--- a/api/funkwhale_api/users/serializers.py
+++ b/api/funkwhale_api/users/serializers.py
@@ -1,13 +1,33 @@
+import re
+
 from django.conf import settings
+from django.core import validators
+from django.utils.deconstruct import deconstructible
+from django.utils.translation import gettext_lazy as _
+
 from rest_auth.serializers import PasswordResetSerializer as PRS
 from rest_auth.registration.serializers import RegisterSerializer as RS
 from rest_framework import serializers
+from versatileimagefield.serializers import VersatileImageFieldSerializer
 
 from funkwhale_api.activity import serializers as activity_serializers
 
 from . import models
 
 
+@deconstructible
+class ASCIIUsernameValidator(validators.RegexValidator):
+    regex = r"^[\w]+$"
+    message = _(
+        "Enter a valid username. This value may contain only English letters, "
+        "numbers, and _ characters."
+    )
+    flags = re.ASCII
+
+
+username_validators = [ASCIIUsernameValidator()]
+
+
 class RegisterSerializer(RS):
     invitation = serializers.CharField(
         required=False, allow_null=True, allow_blank=True
@@ -27,6 +47,9 @@ class RegisterSerializer(RS):
         if self.validated_data.get("invitation"):
             user.invitation = self.validated_data.get("invitation")
             user.save(update_fields=["invitation"])
+        user.actor = models.create_actor(user)
+        user.save(update_fields=["actor"])
+
         return user
 
 
@@ -43,21 +66,29 @@ class UserActivitySerializer(activity_serializers.ModelSerializer):
         return "Person"
 
 
+avatar_field = VersatileImageFieldSerializer(allow_null=True, sizes="square")
+
+
 class UserBasicSerializer(serializers.ModelSerializer):
+    avatar = avatar_field
+
     class Meta:
         model = models.User
-        fields = ["id", "username", "name", "date_joined"]
+        fields = ["id", "username", "name", "date_joined", "avatar"]
 
 
 class UserWriteSerializer(serializers.ModelSerializer):
+    avatar = avatar_field
+
     class Meta:
         model = models.User
-        fields = ["name", "privacy_level"]
+        fields = ["name", "privacy_level", "avatar"]
 
 
 class UserReadSerializer(serializers.ModelSerializer):
 
     permissions = serializers.SerializerMethodField()
+    avatar = avatar_field
 
     class Meta:
         model = models.User
@@ -71,6 +102,7 @@ class UserReadSerializer(serializers.ModelSerializer):
             "permissions",
             "date_joined",
             "privacy_level",
+            "avatar",
         ]
 
     def get_permissions(self, o):
diff --git a/api/requirements.pac b/api/requirements.pac
new file mode 100644
index 0000000000000000000000000000000000000000..7e7cb8a0d314b759c4f3c6d90250b7d64d70ffe8
--- /dev/null
+++ b/api/requirements.pac
@@ -0,0 +1,6 @@
+curl
+file
+ffmpeg
+libjpeg-turbo
+libpqxx
+python
diff --git a/api/requirements/base.txt b/api/requirements/base.txt
index 13c0efdbc7df9547a6991fc589d37312de98909d..e4a85d99fae020cf9d64ede59500d3e96132cb20 100644
--- a/api/requirements/base.txt
+++ b/api/requirements/base.txt
@@ -37,7 +37,7 @@ oauth2client<4
 google-api-python-client>=1.6,<1.7
 arrow>=0.12,<0.13
 persisting-theory>=0.2,<0.3
-django-versatileimagefield>=1.8,<1.9
+django-versatileimagefield>=1.9,<1.10
 django-filter>=1.1,<1.2
 django-rest-auth>=0.9,<0.10
 beautifulsoup4>=4.6,<4.7
@@ -58,7 +58,6 @@ python-magic==0.4.15
 ffmpeg-python==0.1.10
 channels>=2,<2.1
 channels_redis>=2.1,<2.2
-django-cacheops>=4,<4.1
 
 daphne==2.0.4
 cryptography>=2,<3
diff --git a/api/setup.cfg b/api/setup.cfg
index 18e34bc3543290d54135c6757f1a64ca6c560c5c..aa9a57abb82f0ce78ff2a927880daa9b49f212d1 100644
--- a/api/setup.cfg
+++ b/api/setup.cfg
@@ -18,5 +18,4 @@ env =
     EMAIL_CONFIG=consolemail://
     CELERY_BROKER_URL=memory://
     CELERY_TASK_ALWAYS_EAGER=True
-    CACHEOPS_ENABLED=False
     FEDERATION_HOSTNAME=test.federation
diff --git a/api/tests/common/test_search.py b/api/tests/common/test_search.py
new file mode 100644
index 0000000000000000000000000000000000000000..e5be7bc900f0d215f27909603390dd115fbb68d8
--- /dev/null
+++ b/api/tests/common/test_search.py
@@ -0,0 +1,83 @@
+import pytest
+
+from django.db.models import Q
+
+from funkwhale_api.common import search
+from funkwhale_api.music import models as music_models
+
+
+@pytest.mark.parametrize(
+    "query,expected",
+    [
+        ("", [music_models.Album, music_models.Artist]),
+        ("is:album", [music_models.Album]),
+        ("is:artist is:album", [music_models.Artist, music_models.Album]),
+    ],
+)
+def test_search_config_is(query, expected):
+    s = search.SearchConfig(
+        types=[("album", music_models.Album), ("artist", music_models.Artist)]
+    )
+
+    cleaned = s.clean(query)
+    assert cleaned["types"] == expected
+
+
+@pytest.mark.parametrize(
+    "query,expected",
+    [
+        ("", None),
+        ("hello world", search.get_query("hello world", ["f1", "f2", "f3"])),
+        ("hello in:field2", search.get_query("hello", ["f2"])),
+        ("hello in:field1,field2", search.get_query("hello", ["f1", "f2"])),
+    ],
+)
+def test_search_config_query(query, expected):
+    s = search.SearchConfig(
+        search_fields={
+            "field1": {"to": "f1"},
+            "field2": {"to": "f2"},
+            "field3": {"to": "f3"},
+        }
+    )
+
+    cleaned = s.clean(query)
+    assert cleaned["search_query"] == expected
+
+
+@pytest.mark.parametrize(
+    "query,expected",
+    [
+        ("", None),
+        ("status:pending", Q(status="pending")),
+        ('user:"silent bob"', Q(user__username__iexact="silent bob")),
+        (
+            "user:me status:pending",
+            Q(user__username__iexact="me") & Q(status="pending"),
+        ),
+    ],
+)
+def test_search_config_filter(query, expected):
+    s = search.SearchConfig(
+        filter_fields={
+            "user": {"to": "user__username__iexact"},
+            "status": {"to": "status"},
+        }
+    )
+
+    cleaned = s.clean(query)
+    assert cleaned["filter_query"] == expected
+
+
+def test_apply():
+    cleaned = {
+        "filter_query": Q(batch__submitted_by__username__iexact="me"),
+        "search_query": Q(source="test"),
+    }
+    result = search.apply(music_models.ImportJob.objects.all(), cleaned)
+
+    assert str(result.query) == str(
+        music_models.ImportJob.objects.filter(
+            Q(batch__submitted_by__username__iexact="me"), Q(source="test")
+        ).query
+    )
diff --git a/api/tests/conftest.py b/api/tests/conftest.py
index aa36e1f76f60d836a33b0c82a44be55a4f3cb372..fc7e11947c84ed72bbf9446d22d08a6c41e737f9 100644
--- a/api/tests/conftest.py
+++ b/api/tests/conftest.py
@@ -1,4 +1,7 @@
 import datetime
+import io
+import PIL
+import random
 import shutil
 import tempfile
 
@@ -258,3 +261,14 @@ def now(mocker):
     now = timezone.now()
     mocker.patch("django.utils.timezone.now", return_value=now)
     return now
+
+
+@pytest.fixture()
+def avatar():
+    i = PIL.Image.new("RGBA", (400, 400), random.choice(["red", "blue", "yellow"]))
+    f = io.BytesIO()
+    i.save(f, "png")
+    f.name = "avatar.png"
+    f.seek(0)
+    yield f
+    f.close()
diff --git a/api/tests/favorites/test_favorites.py b/api/tests/favorites/test_favorites.py
index cd75b0d26e3bf77a866eea745105a41642bcf828..0b99c93409a7ca1eb542fe2607d29a3b54c1293c 100644
--- a/api/tests/favorites/test_favorites.py
+++ b/api/tests/favorites/test_favorites.py
@@ -4,6 +4,8 @@ import pytest
 from django.urls import reverse
 
 from funkwhale_api.favorites.models import TrackFavorite
+from funkwhale_api.music import serializers as music_serializers
+from funkwhale_api.users import serializers as users_serializers
 
 
 def test_user_can_add_favorite(factories):
@@ -15,21 +17,26 @@ def test_user_can_add_favorite(factories):
     assert f.user == user
 
 
-def test_user_can_get_his_favorites(factories, logged_in_client, client):
+def test_user_can_get_his_favorites(api_request, factories, logged_in_client, client):
+    r = api_request.get("/")
     favorite = factories["favorites.TrackFavorite"](user=logged_in_client.user)
+    factories["favorites.TrackFavorite"]()
     url = reverse("api:v1:favorites:tracks-list")
-    response = logged_in_client.get(url)
-
+    response = logged_in_client.get(url, {"user": logged_in_client.user.pk})
     expected = [
         {
-            "track": favorite.track.pk,
+            "user": users_serializers.UserBasicSerializer(
+                favorite.user, context={"request": r}
+            ).data,
+            "track": music_serializers.TrackSerializer(
+                favorite.track, context={"request": r}
+            ).data,
             "id": favorite.id,
             "creation_date": favorite.creation_date.isoformat().replace("+00:00", "Z"),
         }
     ]
-    parsed_json = json.loads(response.content.decode("utf-8"))
-
-    assert expected == parsed_json["results"]
+    assert response.status_code == 200
+    assert response.data["results"] == expected
 
 
 def test_user_can_add_favorite_via_api(factories, logged_in_client, activity_muted):
diff --git a/api/tests/favorites/test_views.py b/api/tests/favorites/test_views.py
new file mode 100644
index 0000000000000000000000000000000000000000..7c3aed402a29125bfccfb773a0508fd65a45e070
--- /dev/null
+++ b/api/tests/favorites/test_views.py
@@ -0,0 +1,13 @@
+import pytest
+
+from django.urls import reverse
+
+
+@pytest.mark.parametrize("level", ["instance", "me", "followers"])
+def test_privacy_filter(preferences, level, factories, api_client):
+    preferences["common__api_authentication_required"] = False
+    factories["favorites.TrackFavorite"](user__privacy_level=level)
+    url = reverse("api:v1:favorites:tracks-list")
+    response = api_client.get(url)
+    assert response.status_code == 200
+    assert response.data["count"] == 0
diff --git a/api/tests/federation/test_serializers.py b/api/tests/federation/test_serializers.py
index e966d1711ba3f4f847a7b081560a9901f610b67f..6b14656ba988834a3ce2e05a2321f2b897c48105 100644
--- a/api/tests/federation/test_serializers.py
+++ b/api/tests/federation/test_serializers.py
@@ -681,3 +681,56 @@ def test_tapi_library_track_serializer_import_pending(factories):
     serializer = serializers.APILibraryTrackSerializer(lt)
 
     assert serializer.get_status(lt) == "import_pending"
+
+
+def test_local_actor_serializer_to_ap(factories):
+    expected = {
+        "@context": [
+            "https://www.w3.org/ns/activitystreams",
+            "https://w3id.org/security/v1",
+            {},
+        ],
+        "id": "https://test.federation/user",
+        "type": "Person",
+        "following": "https://test.federation/user/following",
+        "followers": "https://test.federation/user/followers",
+        "inbox": "https://test.federation/user/inbox",
+        "outbox": "https://test.federation/user/outbox",
+        "preferredUsername": "user",
+        "name": "Real User",
+        "summary": "Hello world",
+        "manuallyApprovesFollowers": False,
+        "publicKey": {
+            "id": "https://test.federation/user#main-key",
+            "owner": "https://test.federation/user",
+            "publicKeyPem": "yolo",
+        },
+        "endpoints": {"sharedInbox": "https://test.federation/inbox"},
+    }
+    ac = models.Actor.objects.create(
+        url=expected["id"],
+        inbox_url=expected["inbox"],
+        outbox_url=expected["outbox"],
+        shared_inbox_url=expected["endpoints"]["sharedInbox"],
+        followers_url=expected["followers"],
+        following_url=expected["following"],
+        public_key=expected["publicKey"]["publicKeyPem"],
+        preferred_username=expected["preferredUsername"],
+        name=expected["name"],
+        domain="test.federation",
+        summary=expected["summary"],
+        type="Person",
+        manually_approves_followers=False,
+    )
+    user = factories["users.User"]()
+    user.actor = ac
+    user.save()
+    ac.refresh_from_db()
+    expected["icon"] = {
+        "type": "Image",
+        "mediaType": "image/jpeg",
+        "url": utils.full_url(user.avatar.crop["400x400"].url),
+    }
+    serializer = serializers.ActorSerializer(ac)
+
+    assert serializer.data == expected
diff --git a/api/tests/federation/test_signing.py b/api/tests/federation/test_signing.py
index 159f31cd96fdce747cd48120d4999940de5dd66c..298462142ffeab15a3e020c8baaef6ae3de1811a 100644
--- a/api/tests/federation/test_signing.py
+++ b/api/tests/federation/test_signing.py
@@ -1,4 +1,7 @@
 import cryptography.exceptions
+import datetime
+from django.utils.http import http_date
+from django import forms
 import pytest
 
 from funkwhale_api.federation import keys, signing
@@ -36,6 +39,20 @@ def test_verify_fails_with_wrong_key(nodb_factories):
         signing.verify(prepared_request, wrong_public)
 
 
+def test_verify_fails_with_wrong_date(nodb_factories, now):
+    too_old = now - datetime.timedelta(seconds=31)
+    too_old = http_date(too_old.timestamp())
+    private, public = nodb_factories["federation.KeyPair"]()
+    auth = nodb_factories["federation.SignatureAuth"](key=private)
+    request = nodb_factories["federation.SignedRequest"](
+        auth=auth, headers={"Date": too_old}
+    )
+    prepared_request = request.prepare()
+
+    with pytest.raises(forms.ValidationError):
+        signing.verify(prepared_request, public)
+
+
 def test_can_verify_django_request(factories, fake_request):
     private_key, public_key = keys.get_key_pair()
     signed_request = factories["federation.SignedRequest"](
@@ -95,14 +112,18 @@ def test_can_verify_django_request_digest_failure(factories, fake_request):
         signing.verify_django(django_request, public_key)
 
 
-def test_can_verify_django_request_failure(factories, fake_request):
+def test_can_verify_django_request_failure(factories, fake_request, now):
     private_key, public_key = keys.get_key_pair()
     signed_request = factories["federation.SignedRequest"](
         auth__key=private_key, auth__headers=["date"]
     )
     prepared = signed_request.prepare()
     django_request = fake_request.get(
-        "/", **{"HTTP_DATE": "Wrong", "HTTP_SIGNATURE": prepared.headers["signature"]}
+        "/",
+        **{
+            "HTTP_DATE": http_date((now + datetime.timedelta(seconds=31)).timestamp()),
+            "HTTP_SIGNATURE": prepared.headers["signature"],
+        }
     )
-    with pytest.raises(cryptography.exceptions.InvalidSignature):
+    with pytest.raises(forms.ValidationError):
         signing.verify_django(django_request, public_key)
diff --git a/api/tests/federation/test_views.py b/api/tests/federation/test_views.py
index 9e2d66a620241d384ca1546c690c2836f4820c1a..3a67a9f2a5e781ffe38805ccb1475d4e8d52236b 100644
--- a/api/tests/federation/test_views.py
+++ b/api/tests/federation/test_views.py
@@ -417,3 +417,28 @@ def test_library_track_action_import(factories, superuser_api_client, mocker):
     for i, job in enumerate(batch.jobs.all()):
         assert job.library_track == imported_lts[i]
     mocked_run.assert_called_once_with(import_batch_id=batch.pk)
+
+
+def test_local_actor_detail(factories, api_client):
+    user = factories["users.User"](with_actor=True)
+    url = reverse("federation:actors-detail", kwargs={"user__username": user.username})
+    serializer = serializers.ActorSerializer(user.actor)
+    response = api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data == serializer.data
+
+
+def test_wellknown_webfinger_local(factories, api_client, settings, mocker):
+    user = factories["users.User"](with_actor=True)
+    url = reverse("federation:well-known-webfinger")
+    response = api_client.get(
+        url,
+        data={"resource": "acct:{}".format(user.actor.webfinger_subject)},
+        HTTP_ACCEPT="application/jrd+json",
+    )
+    serializer = serializers.ActorWebfingerSerializer(user.actor)
+
+    assert response.status_code == 200
+    assert response["Content-Type"] == "application/jrd+json"
+    assert response.data == serializer.data
diff --git a/api/tests/history/test_views.py b/api/tests/history/test_views.py
new file mode 100644
index 0000000000000000000000000000000000000000..8ec9277103825fcc863478e05ad44bc8ae344f23
--- /dev/null
+++ b/api/tests/history/test_views.py
@@ -0,0 +1,13 @@
+import pytest
+
+from django.urls import reverse
+
+
+@pytest.mark.parametrize("level", ["instance", "me", "followers"])
+def test_privacy_filter(preferences, level, factories, api_client):
+    preferences["common__api_authentication_required"] = False
+    factories["history.Listening"](user__privacy_level=level)
+    url = reverse("api:v1:history:listenings-list")
+    response = api_client.get(url)
+    assert response.status_code == 200
+    assert response.data["count"] == 0
diff --git a/api/tests/music/test_import.py b/api/tests/music/test_import.py
index 2be267cffd28f9d9ab1b85fbe2b5f8e5834ed5a7..12185f88805db6d5191e39f1c9bb510a91c91d32 100644
--- a/api/tests/music/test_import.py
+++ b/api/tests/music/test_import.py
@@ -1,10 +1,15 @@
 import json
 import os
+import pytest
+import uuid
 
+from django import forms
 from django.urls import reverse
 
 from funkwhale_api.federation import actors
 from funkwhale_api.federation import serializers as federation_serializers
+from funkwhale_api.music import importers
+from funkwhale_api.music import models
 from funkwhale_api.music import tasks
 
 DATA_DIR = os.path.dirname(os.path.abspath(__file__))
@@ -237,3 +242,9 @@ def test__do_import_in_place_mbid(factories, tmpfile):
     assert bool(tf.audio_file) is False
     assert tf.source == "file://{}".format(path)
     assert tf.mimetype == "audio/ogg"
+
+
+def test_importer_cleans():
+    importer = importers.Importer(models.Artist)
+    with pytest.raises(forms.ValidationError):
+        importer.load({"name": "", "mbid": uuid.uuid4()}, {}, [])
diff --git a/api/tests/music/test_models.py b/api/tests/music/test_models.py
index df18a09096fc147454f4fbf1905a84ff185213b2..1bd4282fe36b9bde03094a8e6304283ea97e9b59 100644
--- a/api/tests/music/test_models.py
+++ b/api/tests/music/test_models.py
@@ -44,6 +44,7 @@ def test_import_album_stores_release_group(factories):
 
 def test_import_track_from_release(factories, mocker):
     album = factories["music.Album"](mbid="430347cb-0879-3113-9fde-c75b658c298e")
+    artist = factories["music.Artist"](mbid="a5211c65-2465-406b-93ec-213588869dc1")
     album_data = {
         "release": {
             "id": album.mbid,
@@ -64,6 +65,9 @@ def test_import_track_from_release(factories, mocker):
                                 "id": "2109e376-132b-40ad-b993-2bb6812e19d4",
                                 "title": "Teen Age Riot",
                                 "length": "417973",
+                                "artist-credit": [
+                                    {"artist": {"id": artist.mbid, "name": artist.name}}
+                                ],
                             },
                             "track_or_recording_length": "417973",
                         }
@@ -84,10 +88,66 @@ def test_import_track_from_release(factories, mocker):
     assert track.title == track_data["recording"]["title"]
     assert track.mbid == track_data["recording"]["id"]
     assert track.album == album
-    assert track.artist == album.artist
+    assert track.artist == artist
     assert track.position == int(track_data["position"])
 
 
+def test_import_track_with_different_artist_than_release(factories, mocker):
+    album = factories["music.Album"](mbid="430347cb-0879-3113-9fde-c75b658c298e")
+    recording_data = {
+        "recording": {
+            "id": "94ab07eb-bdf3-4155-b471-ba1dc85108bf",
+            "title": "Flaming Red Hair",
+            "length": "159000",
+            "artist-credit": [
+                {
+                    "artist": {
+                        "id": "a5211c65-2465-406b-93ec-213588869dc1",
+                        "name": "Plan 9",
+                        "sort-name": "Plan 9",
+                        "disambiguation": "New Zealand group",
+                    }
+                }
+            ],
+            "release-list": [
+                {
+                    "id": album.mbid,
+                    "title": "The Lord of the Rings: The Fellowship of the Ring - The Complete Recordings",
+                    "status": "Official",
+                    "quality": "normal",
+                    "text-representation": {"language": "eng", "script": "Latn"},
+                    "artist-credit": [
+                        {
+                            "artist": {
+                                "id": "9b58672a-e68e-4972-956e-a8985a165a1f",
+                                "name": "Howard Shore",
+                                "sort-name": "Shore, Howard",
+                            }
+                        }
+                    ],
+                    "date": "2005-12-13",
+                    "country": "US",
+                    "release-event-count": 1,
+                    "barcode": "093624945420",
+                    "artist-credit-phrase": "Howard Shore",
+                }
+            ],
+            "release-count": 3,
+            "artist-credit-phrase": "Plan 9",
+        }
+    }
+    artist = factories["music.Artist"](mbid="a5211c65-2465-406b-93ec-213588869dc1")
+    mocker.patch(
+        "funkwhale_api.musicbrainz.api.recordings.get", return_value=recording_data
+    )
+
+    track = models.Track.get_or_create_from_api(recording_data["recording"]["id"])[0]
+    assert track.title == recording_data["recording"]["title"]
+    assert track.mbid == recording_data["recording"]["id"]
+    assert track.album == album
+    assert track.artist == artist
+
+
 def test_import_job_is_bound_to_track_file(factories, mocker):
     track = factories["music.Track"]()
     job = factories["music.ImportJob"](mbid=track.mbid)
diff --git a/api/tests/music/test_serializers.py b/api/tests/music/test_serializers.py
index 51ca96b5d713af1c1e39f2c1872a9bbea9809216..8705354f7b2090bb756690c7d9283c96e6e33da7 100644
--- a/api/tests/music/test_serializers.py
+++ b/api/tests/music/test_serializers.py
@@ -12,7 +12,12 @@ def test_artist_album_serializer(factories, to_api_date):
         "artist": album.artist.id,
         "creation_date": to_api_date(album.creation_date),
         "tracks_count": 1,
-        "cover": album.cover.url,
+        "cover": {
+            "original": album.cover.url,
+            "square_crop": album.cover.crop["400x400"].url,
+            "medium_square_crop": album.cover.crop["200x200"].url,
+            "small_square_crop": album.cover.crop["50x50"].url,
+        },
         "release_date": to_api_date(album.release_date),
     }
     serializer = serializers.ArtistAlbumSerializer(album)
@@ -43,7 +48,7 @@ def test_album_track_serializer(factories, to_api_date):
 
     expected = {
         "id": track.id,
-        "artist": track.artist.id,
+        "artist": serializers.ArtistSimpleSerializer(track.artist).data,
         "album": track.album.id,
         "mbid": str(track.mbid),
         "title": track.title,
@@ -83,7 +88,12 @@ def test_album_serializer(factories, to_api_date):
         "title": album.title,
         "artist": serializers.ArtistSimpleSerializer(album.artist).data,
         "creation_date": to_api_date(album.creation_date),
-        "cover": album.cover.url,
+        "cover": {
+            "original": album.cover.url,
+            "square_crop": album.cover.crop["400x400"].url,
+            "medium_square_crop": album.cover.crop["200x200"].url,
+            "small_square_crop": album.cover.crop["50x50"].url,
+        },
         "release_date": to_api_date(album.release_date),
         "tracks": serializers.AlbumTrackSerializer([track2, track1], many=True).data,
     }
diff --git a/api/tests/playlists/test_serializers.py b/api/tests/playlists/test_serializers.py
index 677288070082872453325d2bf7ad8a8fd5072cca..79765a24bd71b76bb121c20ba5b0026d49851013 100644
--- a/api/tests/playlists/test_serializers.py
+++ b/api/tests/playlists/test_serializers.py
@@ -63,3 +63,40 @@ def test_update_insert_is_called_when_index_is_provided(factories, mocker):
     insert.assert_called_once_with(playlist, plt, 0)
     assert plt.index == 0
     assert first.index == 1
+
+
+def test_playlist_serializer_include_covers(factories, api_request):
+    playlist = factories["playlists.Playlist"]()
+    t1 = factories["music.Track"]()
+    t2 = factories["music.Track"]()
+    t3 = factories["music.Track"](album__cover=None)
+    t4 = factories["music.Track"]()
+    t5 = factories["music.Track"]()
+    t6 = factories["music.Track"]()
+    t7 = factories["music.Track"]()
+
+    playlist.insert_many([t1, t2, t3, t4, t5, t6, t7])
+    request = api_request.get("/")
+    qs = playlist.__class__.objects.with_covers().with_tracks_count()
+
+    expected = [
+        request.build_absolute_uri(t1.album.cover.crop["200x200"].url),
+        request.build_absolute_uri(t2.album.cover.crop["200x200"].url),
+        request.build_absolute_uri(t4.album.cover.crop["200x200"].url),
+        request.build_absolute_uri(t5.album.cover.crop["200x200"].url),
+        request.build_absolute_uri(t6.album.cover.crop["200x200"].url),
+    ]
+
+    serializer = serializers.PlaylistSerializer(qs.get(), context={"request": request})
+    assert serializer.data["album_covers"] == expected
+
+
+def test_playlist_serializer_include_duration(factories, api_request):
+    playlist = factories["playlists.Playlist"]()
+    tf1 = factories["music.TrackFile"](duration=15)
+    tf2 = factories["music.TrackFile"](duration=30)
+    playlist.insert_many([tf1.track, tf2.track])
+    qs = playlist.__class__.objects.with_duration().with_tracks_count()
+
+    serializer = serializers.PlaylistSerializer(qs.get())
+    assert serializer.data["duration"] == 45
diff --git a/api/tests/subsonic/test_authentication.py b/api/tests/subsonic/test_authentication.py
index b2d2c04001d694bacff2e4e2f816240944e4d2fa..b0c6b1b3287c930045a2b984253cb0a3a5970cf6 100644
--- a/api/tests/subsonic/test_authentication.py
+++ b/api/tests/subsonic/test_authentication.py
@@ -63,3 +63,15 @@ def test_auth_with_inactive_users(api_request, factories):
     authenticator = authentication.SubsonicAuthentication()
     with pytest.raises(exceptions.AuthenticationFailed):
         authenticator.authenticate(request)
+
+
+def test_auth_case_insensitive(api_request, factories):
+    user = factories["users.User"](username="Hello")
+    user.subsonic_api_token = "password"
+    user.save()
+    request = api_request.get("/", {"u": "hello", "p": "password"})
+
+    authenticator = authentication.SubsonicAuthentication()
+    u, _ = authenticator.authenticate(request)
+
+    assert user == u
diff --git a/api/tests/test_import_audio_file.py b/api/tests/test_import_audio_file.py
index 43e596ff7c14a27b6b2db69f1ab7c7206632355c..f63e69b635cad1b4534a8f7c1a3aabc6b636fd15 100644
--- a/api/tests/test_import_audio_file.py
+++ b/api/tests/test_import_audio_file.py
@@ -37,6 +37,7 @@ def test_can_create_track_from_file_metadata_no_mbid(db, mocker):
 
 def test_can_create_track_from_file_metadata_mbid(factories, mocker):
     album = factories["music.Album"]()
+    artist = factories["music.Artist"]()
     mocker.patch(
         "funkwhale_api.music.models.Album.get_or_create_from_api",
         return_value=(album, True),
@@ -55,6 +56,9 @@ def test_can_create_track_from_file_metadata_mbid(factories, mocker):
                             "recording": {
                                 "id": "2109e376-132b-40ad-b993-2bb6812e19d4",
                                 "title": "Teen Age Riot",
+                                "artist-credit": [
+                                    {"artist": {"id": artist.mbid, "name": artist.name}}
+                                ],
                             },
                         }
                     ],
@@ -79,7 +83,7 @@ def test_can_create_track_from_file_metadata_mbid(factories, mocker):
     assert track.mbid == track_data["recording"]["id"]
     assert track.position == 4
     assert track.album == album
-    assert track.artist == album.artist
+    assert track.artist == artist
 
 
 def test_management_command_requires_a_valid_username(factories, mocker):
diff --git a/api/tests/users/test_models.py b/api/tests/users/test_models.py
index ea760cc6c6b5a49f39903f1d641bd3d664819348..39a5bd326646abd2454b931c122be8851931738e 100644
--- a/api/tests/users/test_models.py
+++ b/api/tests/users/test_models.py
@@ -1,7 +1,10 @@
 import datetime
 import pytest
 
+from django.urls import reverse
+
 from funkwhale_api.users import models
+from funkwhale_api.federation import utils as federation_utils
 
 
 def test__str__(factories):
@@ -126,4 +129,27 @@ def test_can_filter_closed_invitations(factories):
     used = factories["users.User"](invited=True).invitation
 
     assert models.Invitation.objects.count() == 3
-    assert list(models.Invitation.objects.open(False)) == [expired, used]
+    assert list(models.Invitation.objects.order_by("id").open(False)) == [expired, used]
+
+
+def test_creating_actor_from_user(factories, settings):
+    user = factories["users.User"]()
+    actor = models.create_actor(user)
+
+    assert actor.preferred_username == user.username
+    assert actor.domain == settings.FEDERATION_HOSTNAME
+    assert actor.type == "Person"
+    assert actor.name == user.username
+    assert actor.manually_approves_followers is False
+    assert actor.url == federation_utils.full_url(
+        reverse("federation:actors-detail", kwargs={"user__username": user.username})
+    )
+    assert actor.shared_inbox_url == federation_utils.full_url(
+        reverse("federation:actors-inbox", kwargs={"user__username": user.username})
+    )
+    assert actor.inbox_url == federation_utils.full_url(
+        reverse("federation:actors-inbox", kwargs={"user__username": user.username})
+    )
+    assert actor.outbox_url == federation_utils.full_url(
+        reverse("federation:actors-outbox", kwargs={"user__username": user.username})
+    )
diff --git a/api/tests/users/test_views.py b/api/tests/users/test_views.py
index fca66d302efc499cb7ef7cf0c2d8124ec7b5668b..92e9922bf0a6679641e10835a1b22c6eb2160ddb 100644
--- a/api/tests/users/test_views.py
+++ b/api/tests/users/test_views.py
@@ -20,6 +20,22 @@ def test_can_create_user_via_api(preferences, api_client, db):
     assert u.username == "test1"
 
 
+@pytest.mark.parametrize("username", ["wrong.name", "wrong-name", "éaeu", "wrong name"])
+def test_username_only_accepts_letters_and_underscores(
+    username, preferences, api_client, db
+):
+    url = reverse("rest_register")
+    data = {
+        "username": username,
+        "email": "test1@test.com",
+        "password1": "testtest",
+        "password2": "testtest",
+    }
+    preferences["users__registration_enabled"] = True
+    response = api_client.post(url, data)
+    assert response.status_code == 400
+
+
 def test_can_restrict_usernames(settings, preferences, db, api_client):
     url = reverse("rest_register")
     preferences["users__registration_enabled"] = True
@@ -235,3 +251,39 @@ def test_user_cannot_patch_another_user(method, logged_in_api_client, factories)
     response = handler(url, payload)
 
     assert response.status_code == 403
+
+
+def test_user_can_patch_their_own_avatar(logged_in_api_client, avatar):
+    user = logged_in_api_client.user
+    url = reverse("api:v1:users:users-detail", kwargs={"username": user.username})
+    content = avatar.read()
+    avatar.seek(0)
+    payload = {"avatar": avatar}
+    response = logged_in_api_client.patch(url, payload)
+
+    assert response.status_code == 200
+    user.refresh_from_db()
+
+    assert user.avatar.read() == content
+
+
+def test_creating_user_creates_actor_as_well(
+    api_client, factories, mocker, preferences
+):
+    actor = factories["federation.Actor"]()
+    url = reverse("rest_register")
+    data = {
+        "username": "test1",
+        "email": "test1@test.com",
+        "password1": "testtest",
+        "password2": "testtest",
+    }
+    preferences["users__registration_enabled"] = True
+    mocker.patch("funkwhale_api.users.models.create_actor", return_value=actor)
+    response = api_client.post(url, data)
+
+    assert response.status_code == 201
+
+    user = User.objects.get(username="test1")
+
+    assert user.actor == actor
diff --git a/demo/README.md b/demo/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..1fb13b5a1734dfb334203951b41a628e232baf85
--- /dev/null
+++ b/demo/README.md
@@ -0,0 +1,61 @@
+# Setup the demo
+
+We assume you want to store the demo data in `/srv/funkwhale-demo`.
+This setup requires Docker and docker-compose.
+
+## Create the necessary directories
+
+`mkdir /srv/funkwhale-demo`
+
+## Get some music
+
+You can use your own music (put it in `/usr/share/music`, this is the directory the demo will look into by default).
+
+If you don't have any music, you can use the repository https://code.eliotberriot.com/funkwhale/catalog, which
+requires Git LFS.
+
+## Create an env file
+
+Copy the `env.sample` file to ``/srv/funkwhale-demo/.env`.
+
+Edit the file according to your needs.
+
+## Copy the setup script
+
+Copy the `setup.sh` script to ``/srv/funkwhale-demo/setup.sh`.
+
+Ensure it's executable with `chmod +x setup.sh`.
+
+## Setup your nginx vhost
+
+Setup your reverse proxy for the demo as described in https://docs.funkwhale.audio/installation/index.html#nginx.
+
+This is outside of the scope of this guide, as you will probably want some SSL certificates, however,
+ensure you point the vhost configuration to the proper static files:
+
+- `root` should point to `/srv/funkwhale-demo/demo/front/dist`
+- `/media` and `/_protected/media` should point to `/srv/funkwhale-demo/demo/data/media/`
+- `/staticfiles` should point to `/srv/funkwhale-demo/demo/data/static`
+
+## Launch
+
+Setup the demo:
+
+```
+cd /srv/funkwhale-demo
+sudo ENV_FILE=/srv/funkwhale-demo/.env ./setup.sh
+```
+
+## Automate
+
+You'll probaby want to reset the demo every now and then. You can do that
+using a cronjob:
+
+```
+sudo crontab -e
+# in the crontab, put this:
+SHELL=/bin/bash
+0 */3 * * * cd /srv/funkwhale-demo && ENV_FILE=/srv/funkwhale-demo/env ./setup.sh > /srv/funkwhale-demo/crontab.log 2>&1
+```
+
+This will reset and restart the demo every 3 hours.
diff --git a/demo/download-tracks.sh b/demo/download-tracks.sh
deleted file mode 100755
index 448b445920a46afbdadd7f93acfc6c2f91665d23..0000000000000000000000000000000000000000
--- a/demo/download-tracks.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#! /bin/bash
-set -e
-[ -z $1 ] && echo "Path to list file missing" && exit 1
-
-echo "This will download tracks from zip archives listed in $1"
-
-LIST_CONTENT=$(cat $1)
-mkdir -p data/music
-cd data/music
-
-echo "Downloading files..."
-echo "$LIST_CONTENT" | grep "^[^#;]" | xargs -n 1 curl -LO
-
-echo "Unzipping archives..."
-find . -name "*.zip" | while read filename; do
-    dirname="${filename%.*}"
-    mkdir $dirname
-    unzip -o -d "$dirname" "$filename";
-done;
-
-echo "Done!"
diff --git a/demo/env.sample b/demo/env.sample
new file mode 100644
index 0000000000000000000000000000000000000000..0c9668765d31e9742a76398d7bfde3f313c52c8e
--- /dev/null
+++ b/demo/env.sample
@@ -0,0 +1,6 @@
+FUNKWHALE_URL=https://demo.funkwhale.audio/
+DJANGO_ALLOWED_HOSTS=demo.funkwhale.audio
+FUNKWHALE_API_PORT=5001
+DJANGO_SECRET_KEY=demo
+DATABASE_URL=postgresql://postgres@postgres/postgres
+CACHE_URL=redis://redis:6379/0
diff --git a/demo/music.txt b/demo/music.txt
deleted file mode 100644
index 26a83c4e84b220d1f0d76b42912433cd762910d1..0000000000000000000000000000000000000000
--- a/demo/music.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-# You can get a pretty list of open music here: https://archive.org/details/jamendo-albums
-https://archive.org/compress/jamendo-069098/formats=OGG%20VORBIS&file=/jamendo-069098.zip
-https://archive.org/compress/jamendo-001144/formats=OGG%20VORBIS&file=/jamendo-001144.zip
-https://archive.org/compress/jamendo-027690/formats=OGG%20VORBIS&file=/jamendo-027690.zip
-https://archive.org/compress/jamendo-001469/formats=OGG%20VORBIS&file=/jamendo-001469.zip
-https://archive.org/compress/jamendo-106323/formats=OGG%20VORBIS&file=/jamendo-106323.zip
-https://archive.org/compress/jamendo-071149/formats=OGG%20VORBIS&file=/jamendo-071149.zip
-https://archive.org/compress/jamendo-085030/formats=OGG%20VORBIS&file=/jamendo-085030.zip
diff --git a/demo/setup.sh b/demo/setup.sh
old mode 100644
new mode 100755
index e33bdf290ea74dfacb9e5eccdaa399816a8bde3a..5edbd692c7740975d4223a2bf17553ef61f505a2
--- a/demo/setup.sh
+++ b/demo/setup.sh
@@ -1,30 +1,114 @@
 #!/bin/bash -eux
-version="develop"
-music_path="/usr/share/music"
-demo_path="/srv/funkwhale-demo/demo"
-
+version=${VERSION:-develop}
+music_path=${MUSIC_PATH:-/usr/share/music}
+demo_path=${DEMO_PATH:-/srv/funkwhale-demo/demo}
+env_file=${ENV_FILE}
 echo 'Cleaning everything...'
+mkdir -p $demo_path
 cd $demo_path
 /usr/local/bin/docker-compose down -v || echo 'Nothing to stop'
-rm -rf /srv/funkwhale-demo/demo/*
+sudo rm -rf $demo_path/*
 mkdir -p $demo_path
 echo 'Downloading demo files...'
 curl -L -o docker-compose.yml "https://code.eliotberriot.com/funkwhale/funkwhale/raw/$version/deploy/docker-compose.yml"
 curl -L -o .env "https://code.eliotberriot.com/funkwhale/funkwhale/raw/$version/deploy/env.prod.sample"
 
 mkdir data/
-cp -r $music_path data/music
-
 curl -L -o front.zip "https://code.eliotberriot.com/funkwhale/funkwhale/-/jobs/artifacts/$version/download?job=build_front"
 unzip front.zip
 
-echo "FUNKWHALE_URL=https://demo.funkwhale.audio/" >> .env
-echo "DJANGO_SECRET_KEY=demo" >> .env
-echo "DJANGO_ALLOWED_HOSTS=demo.funkwhale.audio" >> .env
+cat $env_file >> .env
 echo "FUNKWHALE_VERSION=$version" >> .env
-echo "FUNKWHALE_API_PORT=5001" >> .env
-/usr/local/bin/docker-compose pull
+echo "MUSIC_DIRECTORY_SERVE_PATH=$music_path" >> .env
+echo "MUSIC_DIRECTORY_PATH=$music_path" >> .env
+echo "MEDIA_ROOT=$demo_path/data/media/" >> .env
+echo "STATIC_ROOT=$demo_path/data/static/" >> .env
+
+# /usr/local/bin/docker-compose pull
 /usr/local/bin/docker-compose up -d postgres redis
 sleep 5
-/usr/local/bin/docker-compose run --rm api demo/load-demo-data.sh
+cat .env
+cat <<EOF | /usr/local/bin/docker-compose run --rm api python manage.py shell -i python
+import subprocess
+subprocess.call("pip install factory-boy", shell=True)
+
+from django.core.management import call_command
+
+call_command("migrate", interactive=False)
+
+from funkwhale_api.users.models import User
+
+print("Creating dummy user")
+u = User.objects.create(email="demo@demo.com", username="demo", is_staff=True, is_superuser=True, privacy_level="everyone")
+u.set_password("demo")
+u.subsonic_api_token = "demo"
+u.save()
+
+from funkwhale_api.common import preferences
+
+manager = preferences.global_preferences_registry.manager()
+manager['common__api_authentication_required'] = False
+manager['federation__music_needs_approval'] = False
+manager['instance__name'] = "Login: demo / password: demo"
+
+paths = [
+    "$music_path/**/*.ogg",
+    "$music_path/**/*.mp3",
+    "$music_path/**/*.flac",
+]
+print(paths)
+call_command("import_files", *paths, username="demo", recursive=True, interactive=False)
+
+print('Creating some dummy data...')
+
+import random
+import datetime
+from funkwhale_api.music.models import Album, Track
+from funkwhale_api.history.factories import ListeningFactory
+from funkwhale_api.favorites.factories import TrackFavorite as TrackFavoriteFactory
+from funkwhale_api.users.factories import UserFactory
+from funkwhale_api.playlists.factories import PlaylistFactory
+
+users = UserFactory.create_batch(size=15, privacy_level="everyone")
+available_tracks = list(Track.objects.all())
+available_albums = list(Album.objects.all())
+
+def get_random_datetime():
+    from django.utils import timezone
+    import datetime
+    import random
+    now = timezone.now()
+    return now - datetime.timedelta(seconds=random.randint(1, 3600 * 24 * 7))
+
+print('Updating album dates to have random sorting...')
+for album in available_albums:
+    album.creation_date = get_random_datetime()
+    album.save(update_fields=['creation_date'])
+
+for i in range(30):
+    print('Creating playlist {}'.format(i))
+    playlist = PlaylistFactory(user=random.choice(users), privacy_level="everyone", creation_date=get_random_datetime())
+    tracks = set()
+
+    for i in range(random.randint(5, 35)):
+        tracks.add(random.choice(available_tracks))
+
+    playlist.insert_many(tracks)
+
+for user in users:
+    for i in range(random.randint(5, 35)):
+        print('Adding favorite {} for user {}'.format(i, user.username))
+        try:
+            TrackFavoriteFactory(user=user, track=random.choice(available_tracks), creation_date=get_random_datetime())
+        except:
+            pass
+    for i in range(random.randint(5, 35)):
+        print('Adding listening {} for user {}'.format(i, user.username))
+        try:
+            ListeningFactory(user=user, track=random.choice(available_tracks), creation_date=get_random_datetime())
+        except:
+            pass
+EOF
+
+chmod 777 -R front
 /usr/local/bin/docker-compose up -d
diff --git a/deploy/apache.conf b/deploy/apache.conf
index 5f86db7bd533846577dc6ae140249b1239a4387e..b74e04b33387a265b730d7d58a315ca4b95079b0 100644
--- a/deploy/apache.conf
+++ b/deploy/apache.conf
@@ -34,7 +34,7 @@ Define MUSIC_DIRECTORY_PATH /srv/funkwhale/data/music
    # TLS
    # Feel free to use your own configuration for SSL here or simply remove the
    # lines and move the configuration to the previous server block if you
-   # don't want to run funkwhale behind https (this is not recommanded)
+   # don't want to run funkwhale behind https (this is not recommended)
    # have a look here for let's encrypt configuration:
    # https://certbot.eff.org/lets-encrypt/debianstretch-apache.html
    SSLEngine on
diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml
index 3bcd2f6d508a7b41747ba10ee85306adf9aa6619..302e6da21ffd597da33ebdc6515e131b055175c1 100644
--- a/deploy/docker-compose.yml
+++ b/deploy/docker-compose.yml
@@ -35,8 +35,8 @@ services:
     environment:
       - C_FORCE_ROOT=true
     volumes:
-      - ./data/music:/music:ro
-      - ./data/media:/app/funkwhale_api/media
+      - "${MUSIC_DIRECTORY_SERVE_PATH-/srv/funkwhale/data/music}:${MUSIC_DIRECTORY_PATH-/music}:ro"
+      - "${MEDIA_ROOT}:${MEDIA_ROOT}"
 
   celerybeat:
     restart: unless-stopped
@@ -52,9 +52,9 @@ services:
     image: funkwhale/funkwhale:${FUNKWHALE_VERSION:-latest}
     env_file: .env
     volumes:
-      - ./data/music:/music:ro
-      - ./data/media:/app/funkwhale_api/media
-      - ./data/static:/app/staticfiles
+      - "${MUSIC_DIRECTORY_SERVE_PATH-/srv/funkwhale/data/music}:${MUSIC_DIRECTORY_PATH-/music}:ro"
+      - "${MEDIA_ROOT}:${MEDIA_ROOT}"
+      - "${STATIC_ROOT}:${STATIC_ROOT}"
       - ./front/dist:/frontend
     ports:
       - "${FUNKWHALE_API_IP:-127.0.0.1}:${FUNKWHALE_API_PORT:-5000}:5000"
diff --git a/deploy/env.prod.sample b/deploy/env.prod.sample
index 64ff3d4dfb7c1bdeaf7841a24c19aa668f9ad2f3..838e8fef4bb29431b92c8e1264f941bc2a0781fa 100644
--- a/deploy/env.prod.sample
+++ b/deploy/env.prod.sample
@@ -10,14 +10,13 @@
 # On non-docker setup **only**, you'll also have to tweak/uncomment those variables:
 # - DATABASE_URL
 # - CACHE_URL
-# - STATIC_ROOT
-# - MEDIA_ROOT
 #
 # You **don't** need to update those variables on pure docker setups.
 #
 # Additional options you may want to check:
 # - MUSIC_DIRECTORY_PATH and MUSIC_DIRECTORY_SERVE_PATH if you plan to use
 #   in-place import
+#
 # Docker only
 # -----------
 
@@ -25,7 +24,6 @@
 # (it will be interpolated in docker-compose file)
 # You can comment or ignore this if you're not using docker
 FUNKWHALE_VERSION=latest
-MUSIC_DIRECTORY_PATH=/music
 
 # End of Docker-only configuration
 
@@ -79,12 +77,12 @@ REVERSE_PROXY_TYPE=nginx
 # Where media files (such as album covers or audio tracks) should be stored
 # on your system?
 # (Ensure this directory actually exists)
-# MEDIA_ROOT=/srv/funkwhale/data/media
+MEDIA_ROOT=/srv/funkwhale/data/media
 
 # Where static files (such as API css or icons) should be compiled
 # on your system?
 # (Ensure this directory actually exists)
-# STATIC_ROOT=/srv/funkwhale/data/static
+STATIC_ROOT=/srv/funkwhale/data/static
 
 # Update it to match the domain that will be used to reach your funkwhale
 # instance
@@ -112,5 +110,9 @@ RAVEN_DSN=https://44332e9fdd3d42879c7d35bf8562c6a4:0062dc16a22b41679cd5765e5342f
 # In-place import settings
 # You can safely leave those settings uncommented if you don't plan to use
 # in place imports.
-# MUSIC_DIRECTORY_PATH=
-# MUSIC_DIRECTORY_SERVE_PATH=  # docker-only
+# Typical docker setup:
+#   MUSIC_DIRECTORY_PATH=/srv/funkwhale/data/music
+#   MUSIC_DIRECTORY_SERVE_PATH=/music  # docker-only
+# Typical non-docker setup:
+#   MUSIC_DIRECTORY_PATH=/srv/funkwhale/data/music
+#   # MUSIC_DIRECTORY_SERVE_PATH= # stays commented, not needed
diff --git a/deploy/nginx.conf b/deploy/nginx.conf
index c8f64cc384eb14cb4fb15dd4d0a1c42c716fb8b2..2d8412edb45a0f828f844af0553cc85b300e8cae 100644
--- a/deploy/nginx.conf
+++ b/deploy/nginx.conf
@@ -31,7 +31,7 @@ server {
     # TLS
     # Feel free to use your own configuration for SSL here or simply remove the
     # lines and move the configuration to the previous server block if you
-    # don't want to run funkwhale behind https (this is not recommanded)
+    # don't want to run funkwhale behind https (this is not recommended)
     # have a look here for let's encrypt configuration:
     # https://certbot.eff.org/all-instructions/#debian-9-stretch-nginx
     ssl_protocols TLSv1.2;
diff --git a/docs/Dockerfile b/docs/Dockerfile
index 1067eb8be427bcb66cb4ad824993ef300ba04cb6..76147bb6d0f75d08ed9d26106425ab0175187c76 100644
--- a/docs/Dockerfile
+++ b/docs/Dockerfile
@@ -1,4 +1,5 @@
-FROM python:3.6-alpine
+FROM python:3.6
 
+RUN apt-get update && apt-get install -y graphviz
 RUN pip install sphinx livereload
 WORKDIR /app/docs
diff --git a/docs/architecture.rst b/docs/architecture.rst
new file mode 100644
index 0000000000000000000000000000000000000000..ef52b3b38d693d2a59be857e24532f82f27fd998
--- /dev/null
+++ b/docs/architecture.rst
@@ -0,0 +1,118 @@
+Architecture
+============
+
+Funkwhale is made of several components, each of them fulfilling a specific mission:
+
+.. graphviz::
+
+    digraph {
+        node [shape=record];
+        rankdir=TB
+        concentrate=true
+        user [group="frontend" label="User" fontsize="9"]
+        webui [group="frontend" label="Web interface (VueJS SPA)" fontsize="9"]
+        subapps [group="frontend" label="Subsonic-compatible apps (DSub, Clementine)" fontsize="9"]
+        proxy [label="Reverse proxy (Nginx/Apache)" fontsize="9"]
+        api [label="API Server (Django)" fontsize="9"]
+        db [label="Database (PostgreSQL)" fontsize="9"]
+        cache [label="Cache and message queue (Redis)" fontsize="9"]
+        worker [label="Worker (Celery)" fontsize="9"]
+        scheduler [label="Task scheduler (Celery Beat)" fontsize="9"]
+
+        user -> subapps -> proxy
+        user -> webui -> proxy
+        cache -> worker
+        proxy -> api
+        api -> cache
+        api -> db
+        scheduler -> cache
+        worker -> cache
+        worker -> db
+    }
+
+This graph may looks a bit scary, so we'll detail the role of each component below.
+
+The user
+--------
+
+Funkwhale users can interact with your instance using:
+
+- The official web interface
+- Third-party apps
+
+The web interface
+-----------------
+
+This refers to Funkwhale's built-in web interface, which is a Single Page application
+written in Vue JS. This application will interact with Funkwhale's API to retrieve
+or persist data.
+
+Third-party apps
+----------------
+
+Since Funkwhale implements a subset of the Subsonic API, it's compatible with existing apps such
+as DSub, Ultrasonic or Clementine that support this API. Those apps can be used as a replacement
+or in conjunction of the web interface, but the underlying data is the same.
+
+The reverse proxy
+-----------------
+
+Funkwhale's API server should never be exposed directly to the internet, as we require
+a reverse proxy (Apache or Nginx) for performance and security reasons. The reverse proxy
+will receive client HTTP requests, and:
+
+- Proxy them to the API server
+- Serve requested static files (Audio files, stylesheets, javascript, fonts...)
+
+The API server
+--------------
+
+Funkwhale's API server is the central piece of the project. This component is responsible
+for answering and processing user requests, manipulate data from the database, send long-running
+tasks to workers, etc.
+
+It's a Python/Django application.
+
+The database
+------------
+
+Most of the data such as user accounts, favorites, music metadata or playlist is stored
+in a PostgreSQL database.
+
+The cache/message queue
+-----------------------
+
+Fetching data from the database is sometimes slow or resource hungry. To reduce
+the load, Redis act as a cache for data that is considerably faster than a database.
+
+It is also a message queue that will deliver tasks to the worker.
+
+The worker
+----------
+
+Some operations are too long to live in the HTTP request/response cycle. Typically,
+importing a bunch of uploaded tracks could take a minute or two.
+
+To keep the API response time as fast as possible, we offload long-running tasks
+to a background process, also known as the Celery worker.
+
+Typical tasks include:
+
+- Handling music imports
+- Handling federation/ActivityPub messages
+- Scanning other instances libraries
+
+This worker is also able to retry failed tasks, or spawn automatically
+more process when the number of received tasks increase.
+
+The scheduler
+-------------
+
+Some long-running tasks are not triggered by user or external input, but on a recurring
+basis instead. The scheduler is responsible for triggering those tasks and put the corresponding
+messages in the message queue so the worker can process them.
+
+Recurring tasks include:
+
+- Cache cleaning
+- Music metadata refreshing
diff --git a/docs/conf.py b/docs/conf.py
index 01da9bc05b473b280e53c6d29101a01b6027d6ab..8b1a3d41aab24e2d2e51cf594ed8be904ca46c26 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -20,7 +20,7 @@
 import os
 import sys
 
-sys.path.insert(0, os.path.abspath('../api'))
+sys.path.insert(0, os.path.abspath("../api"))
 
 import funkwhale_api  # NOQA
 
@@ -33,24 +33,24 @@ import funkwhale_api  # NOQA
 # Add any Sphinx extension module names here, as strings. They can be
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
-extensions = []
+extensions = ["sphinx.ext.graphviz"]
 
 # Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
+templates_path = ["_templates"]
 
 # The suffix(es) of source filenames.
 # You can specify multiple suffix as a list of string:
 #
 # source_suffix = ['.rst', '.md']
-source_suffix = '.rst'
+source_suffix = ".rst"
 
 # The master toctree document.
-master_doc = 'index'
+master_doc = "index"
 
 # General information about the project.
-project = 'funkwhale'
-copyright = '2017, Eliot Berriot'
-author = 'Eliot Berriot'
+project = "funkwhale"
+copyright = "2017, Eliot Berriot"
+author = "Eliot Berriot"
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
@@ -71,10 +71,10 @@ language = None
 # List of patterns, relative to source directory, that match files and
 # directories to ignore when looking for source files.
 # This patterns also effect to html_static_path and html_extra_path
-exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
 
 # The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
+pygments_style = "sphinx"
 
 # If true, `todo` and `todoList` produce output, else they produce nothing.
 todo_include_todos = False
@@ -85,7 +85,7 @@ todo_include_todos = False
 # The theme to use for HTML and HTML Help pages.  See the documentation for
 # a list of builtin themes.
 #
-html_theme = 'alabaster'
+html_theme = "alabaster"
 
 # Theme options are theme-specific and customize the look and feel of a theme
 # further.  For a list of options available for each theme, see the
@@ -96,13 +96,13 @@ html_theme = 'alabaster'
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
 # so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
+html_static_path = ["_static"]
 
 
 # -- Options for HTMLHelp output ------------------------------------------
 
 # Output file base name for HTML help builder.
-htmlhelp_basename = 'funkwhaledoc'
+htmlhelp_basename = "funkwhaledoc"
 
 
 # -- Options for LaTeX output ---------------------------------------------
@@ -111,15 +111,12 @@ latex_elements = {
     # The paper size ('letterpaper' or 'a4paper').
     #
     # 'papersize': 'letterpaper',
-
     # The font size ('10pt', '11pt' or '12pt').
     #
     # 'pointsize': '10pt',
-
     # Additional stuff for the LaTeX preamble.
     #
     # 'preamble': '',
-
     # Latex figure (float) alignment
     #
     # 'figure_align': 'htbp',
@@ -129,8 +126,7 @@ latex_elements = {
 # (source start file, target name, title,
 #  author, documentclass [howto, manual, or own class]).
 latex_documents = [
-    (master_doc, 'funkwhale.tex', 'funkwhale Documentation',
-     'Eliot Berriot', 'manual'),
+    (master_doc, "funkwhale.tex", "funkwhale Documentation", "Eliot Berriot", "manual")
 ]
 
 
@@ -138,10 +134,7 @@ latex_documents = [
 
 # One entry per manual page. List of tuples
 # (source start file, name, description, authors, manual section).
-man_pages = [
-    (master_doc, 'funkwhale', 'funkwhale Documentation',
-     [author], 1)
-]
+man_pages = [(master_doc, "funkwhale", "funkwhale Documentation", [author], 1)]
 
 
 # -- Options for Texinfo output -------------------------------------------
@@ -150,7 +143,13 @@ man_pages = [
 # (source start file, target name, title, author,
 #  dir menu entry, description, category)
 texinfo_documents = [
-    (master_doc, 'funkwhale', 'funkwhale Documentation',
-     author, 'funkwhale', 'One line description of project.',
-     'Miscellaneous'),
+    (
+        master_doc,
+        "funkwhale",
+        "funkwhale Documentation",
+        author,
+        "funkwhale",
+        "One line description of project.",
+        "Miscellaneous",
+    )
 ]
diff --git a/docs/configuration.rst b/docs/configuration.rst
index 7b7751fc61ee9827fb2f1267060e114682f32907..3e7b5aa25df89add324d1aab753b2303504c9efb 100644
--- a/docs/configuration.rst
+++ b/docs/configuration.rst
@@ -88,7 +88,7 @@ Default: ``Funkwhale <noreply@yourdomain>``
 Default: ``None``
 
 The path on your server where Funwkhale can import files using :ref:`in-place import
-<in-place-import>`. It must be readable by the webserver and funkwhale
+<in-place-import>`. It must be readable by the webserver and Funkwhale
 api and worker processes.
 
 On docker installations, we recommend you use the default of ``/music``
@@ -124,6 +124,16 @@ On non-docker setup, you don't need to configure this setting.
 
 .. note:: This path should not include any trailing slash
 
+.. _setting-REVERSE_PROXY_TYPE:
+
+``REVERSE_PROXY_TYPE``
+^^^^^^^^^^^^^^^^^^^^^^
+
+Default: ``nginx``
+
+The type of reverse-proxy behind which Funkwhale is served. Either ``apache2``
+or ``nginx``. This is only used if you are using in-place import.
+
 User permissions
 ----------------
 
diff --git a/docs/features.rst b/docs/features.rst
index e0f490e4b741676085e2bc6cbeae01c8e5d19f85..c57e229fa6772acf9a390f471d06434896c70111 100644
--- a/docs/features.rst
+++ b/docs/features.rst
@@ -9,12 +9,12 @@ Funkwhale is a web based music server. It is similar in term of goals and featur
 A social platform
 ------------------
 
-However, funkwhale is better-suited for small to medium communities and was designed to be not only a music server and player, but also a place to socialize around music and discover new content. While some of these features are not currently implemented, our roadmap includes:
+However, Funkwhale is better-suited for small to medium communities and was designed to be not only a music server and player, but also a place to socialize around music and discover new content. While some of these features are not currently implemented, our roadmap includes:
 
 - Radios, to discover the music of a given user, artist, genre...
 - Playlists
 - Favorites
-- Broadcasts, as they existed in Grooveshark, for exemple
+- Broadcasts, as they existed in Grooveshark, for example
 - Recommendations
 
 Music acquisition
diff --git a/docs/federation.rst b/docs/federation.rst
index 0f016ada9acfb1dd2942ad8cfb53b55ae56531d1..08658b12e47aec99386e3740e6939c7a76eb5254 100644
--- a/docs/federation.rst
+++ b/docs/federation.rst
@@ -22,7 +22,7 @@ Acquire music via federation
 ----------------------------
 
 Instance libraries are protected by default. To access another instance
-library, you have to follow it. Each funkwhale instance gets a dedicated
+library, you have to follow it. Each Funkwhale instance gets a dedicated
 ActivityPub Actor you can follow via the username "library@yourinstance.domain".
 
 When submitted, a follow request will be sent to
diff --git a/docs/importing-music.rst b/docs/importing-music.rst
index b40eb7b88843b39eff40d2cad7d2cf6bbe91510c..4b4ea7c1dcde0f957be1280a27687df8e372edb2 100644
--- a/docs/importing-music.rst
+++ b/docs/importing-music.rst
@@ -4,8 +4,8 @@ Importing music
 From music directory on the server
 ----------------------------------
 
-You can import music files in funkwhale assuming they are located on the server
-and readable by the funkwhale application. Your music files should contain at
+You can import music files in Funkwhale assuming they are located on the server
+and readable by the Funkwhale application. Your music files should contain at
 least an ``artist``, ``album`` and ``title`` tags, but we recommend you tag
 it extensively using a proper tool, such as Beets or Musicbrainz Picard.
 
@@ -59,7 +59,7 @@ to import and don't want to double your disk usage.
 The CLI importer supports an additional ``--in-place`` option that triggers the
 following behaviour during import:
 
-1. Imported files are not store in funkwhale anymore
+1. Imported files are not store in Funkwhale anymore
 2. Instead, Funkwhale will store the file path and use it to serve the music
 
 Because those files are not managed by Funkwhale, we offer additional
@@ -98,14 +98,14 @@ directory is mounted as a volume as well::
       volumes:
       - ./data/music:/music:ro
       - ./data/media:/app/funkwhale_api/media
-      # add your symlinked dirs here
+      # add your symlinked dirs here
       - /media/nfsshare:/media/nfsshare:ro
 
     api:
       volumes:
       - ./data/music:/music:ro
       - ./data/media:/app/funkwhale_api/media
-      # add your symlinked dirs here
+      # add your symlinked dirs here
       - /media/nfsshare:/media/nfsshare:ro
 
 
diff --git a/docs/index.rst b/docs/index.rst
index f177a42403895c07c300acb74cfec11aeb2b50d7..b107739aeee0e51ef2a90df4de6d1d7b92be3b23 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -13,14 +13,17 @@ Funkwhale is a self-hosted, modern free and open-source music server, heavily in
 
    users/index
    features
+   architecture
    installation/index
    upgrading
    configuration
+   troubleshooting
    importing-music
    federation
    api
    third-party
    contributing
+   translators
    changelog
 
 Indices and tables
diff --git a/docs/installation/debian.rst b/docs/installation/debian.rst
index be17ab1e07aabe944389180fcef8771dfb2f3ca7..407f71dd7128814df12fbafbfc2c172912ebe618 100644
--- a/docs/installation/debian.rst
+++ b/docs/installation/debian.rst
@@ -1,15 +1,15 @@
-Debian installation
-===================
+Debian and Arch Linux installation
+==================================
 
 .. note::
 
-    This guide targets Debian 9 (Stretch), which is the latest Debian.
+    This guide targets Debian 9 (Stretch), which is the latest Debian, as well as Arch Linux.
 
 External dependencies
 ---------------------
 
-The guides will focus on installing funkwhale-specific components and
-dependencies. However, funkwhale requires a
+The guides will focus on installing Funkwhale-specific components and
+dependencies. However, Funkwhale requires a
 :doc:`few external dependencies <./external_dependencies>` for which
 documentation is outside of this document scope.
 
@@ -17,18 +17,23 @@ Install utilities
 -----------------
 
 You'll need a few utilities during this guide that are not always present by
-default on system. You can install them using:
+default on system. On Debian-like systems, you can install them using:
 
 .. code-block:: shell
 
     sudo apt-get update
     sudo apt-get install curl python3-pip python3-venv git unzip
 
+On Arch Linux and its derivatives:
+
+.. code-block:: shell
+
+    sudo pacman -S curl python-pip python-virtualenv git unzip
 
 Layout
 -------
 
-All funkwhale-related files will be located under ``/srv/funkwhale`` apart
+All Funkwhale-related files will be located under ``/srv/funkwhale`` apart
 from database files and a few configuration files. We will also have a
 dedicated ``funkwhale`` user to launch the processes we need and own those files.
 
@@ -41,7 +46,7 @@ Create the user and the directory:
 
 .. code-block:: shell
 
-    sudo adduser --system --home /srv/funkwhale funkwhale
+    sudo useradd -r -s /usr/bin/nologin -d /srv/funkwhale -m funkwhale
     cd /srv/funkwhale
 
 Log in as the newly created user from now on:
@@ -57,7 +62,7 @@ Now let's setup our directory layout. Here is how it will look like::
     ├── api         # api code of your instance
     ├── data        # persistent data, such as music files
     ├── front       # frontend files for the web user interface
-    └── virtualenv  # python dependencies for funkwhale
+    └── virtualenv  # python dependencies for Funkwhale
 
 Create the aforementionned directories:
 
@@ -67,7 +72,7 @@ Create the aforementionned directories:
 
 The ``virtualenv`` directory is a bit special and will be created separately.
 
-Download latest funkwhale release
+Download latest Funkwhale release
 ----------------------------------
 
 Funkwhale is splitted in two components:
@@ -79,7 +84,7 @@ Those components are packaged in subsequent releases, such as 0.1, 0.2, etc.
 You can browse the :doc:`changelog </changelog>` for a list of available releases
 and pick the one you want to install, usually the latest one should be okay.
 
-In this guide, we'll assume you want to install the latest version of funkwhale,
+In this guide, we'll assume you want to install the latest version of Funkwhale,
 which is |version|:
 
 First, we'll download the latest api release.
@@ -101,6 +106,24 @@ Then we'll download the frontend files:
     mv extracted/front .
     rm -rf extracted
 
+.. note::
+
+    You can also choose to get the code directly from the git repo. In this
+    case, run
+
+        cd /srv
+        rm -r funkwhale
+        git clone https://code.eliotberriot.com/funkwhale/funkwhale funkwhale
+        cd funkwhale
+
+    You'll also need to re-create the folders we make earlier:
+
+        mkdir -p config data/static data/media data/music front
+
+    You will still need to get the frontend files as specified before, because
+    we're not going to build them.
+
+
 You can leave the ZIP archives in the directory, this will help you know
 which version you've installed next time you want to upgrade your installation.
 
@@ -113,22 +136,20 @@ First, switch to the api directory:
 
     cd api
 
-A few OS packages are required in order to run funkwhale. The list is available
-in ``api/requirements.apt`` or by running
-``./install_os_dependencies.sh list``.
+A few OS packages are required in order to run Funkwhale. On Debian-like
+systems, they can be installed with
 
-.. note::
+.. code-block:: shell
 
-    Ensure you are running the next commands as root or using sudo
-    (and not as the funkwhale) user.
+    sudo apt install build-essential ffmpeg libjpeg-dev libmagic-dev libpq-dev postgresql-client python3-dev
 
-You can install those packages all at once:
+On Arch, run
 
 .. code-block:: shell
 
-    ./install_os_dependencies.sh install
+    pacman -S $(cat api/requirements.pac)
 
-From now on you can switch back to the funkwhale user.
+From now on, you should use the funkwhale user for all commands.
 
 Python dependencies
 --------------------
@@ -143,11 +164,12 @@ To avoid collisions with other software on your system, Python dependencies
 will be installed in a dedicated
 `virtualenv <https://docs.python.org/3/library/venv.html>`_.
 
-First, create the virtualenv:
+First, create the virtualenv and install wheel:
 
 .. code-block:: shell
 
     python3 -m venv /srv/funkwhale/virtualenv
+    pip3 install wheel
 
 This will result in a ``virtualenv`` directory being created in
 ``/srv/funkwhale/virtualenv``.
@@ -165,12 +187,11 @@ Finally, install the python dependencies:
 
 .. code-block:: shell
 
-    pip install wheel
     pip install -r api/requirements.txt
 
 .. important::
 
-    further commands involving python should always be run after you activated
+    Further commands involving python should always be run after you activated
     the virtualenv, as described earlier, otherwise those commands will raise
     errors
 
@@ -178,7 +199,7 @@ Finally, install the python dependencies:
 Environment file
 ----------------
 
-You can now start to configure funkwhale. The main way to achieve that is by
+You can now start to configure Funkwhale. The main way to achieve that is by
 adding an environment file that will host settings that are relevant to your
 installation.
 
@@ -188,8 +209,15 @@ Download the sample environment file:
 
     curl -L -o config/.env "https://code.eliotberriot.com/funkwhale/funkwhale/raw/|version|/deploy/env.prod.sample"
 
+.. note::
+
+    if you used git to get the latest version of the code earlier, you can instead do
+
+        cp /srv/funkwhale/deploy/env.prod.sample /srv/funkwhale/config/.env
+
+
 You can then edit it: the file is heavily commented, and the most relevant
-configuration options are mentionned at the top of the file.
+configuration options are mentioned at the top of the file.
 
 Especially, populate the ``DATABASE_URL`` and ``CACHE_URL`` values based on
 how you configured your PostgreSQL and Redis servers in
@@ -198,30 +226,15 @@ how you configured your PostgreSQL and Redis servers in
 
 When you want to run command on the API server, such as to create the
 database or compile static files, you have to ensure you source
-the environment variables.
+the environment variables in that file.
 
 This can be done like this::
 
     export $(cat config/.env | grep -v ^# | xargs)
 
-The easier thing to do is to store this in a script::
-
-    cat > /srv/funkwhale/load_env <<'EOL'
-    #!/bin/bash
-    export $(cat /srv/funkwhale/config/.env | grep -v ^# | xargs)
-    EOL
-    chmod +x /srv/funkwhale/load_env
-
-You should now be able to run the following to populate your environment
-variables easily:
-
-.. code-block:: shell
-
-    source /srv/funkwhale/load_env
-
 .. note::
 
-    Remember to source ``load_env`` whenever you edit your .env file.
+    Remember to reload these variables whenever you edit your .env file.
 
 Database setup
 ---------------
@@ -267,7 +280,7 @@ Collect static files
 --------------------
 
 Static files are the static assets used by the API server (icon PNGs, CSS, etc.).
-We need to collect them explicitely, so they can be served by the webserver:
+We need to collect them explicitly, so they can be served by the webserver:
 
 .. code-block:: shell
 
diff --git a/docs/installation/docker.rst b/docs/installation/docker.rst
index e0520180064473d9362c85e0107f2dbdba23dad3..065cfd27e0f48f34b41bd3e54b98b60f429be07f 100644
--- a/docs/installation/docker.rst
+++ b/docs/installation/docker.rst
@@ -1,7 +1,7 @@
 Docker installation
 ====================
 
-Docker is the easiest way to get a funkwhale instance up and running.
+Docker is the easiest way to get a Funkwhale instance up and running.
 
 First, ensure you have `Docker <https://docs.docker.com/engine/installation/>`_ and `docker-compose <https://github.com/docker/compose/releases>`_ installed.
 
diff --git a/docs/installation/external_dependencies.rst b/docs/installation/external_dependencies.rst
index adfb90e72e9f2011dc5d3334a6c3fdfa2a3aef9e..98199720730579bacc1cc8e9aa1aa1979da89455 100644
--- a/docs/installation/external_dependencies.rst
+++ b/docs/installation/external_dependencies.rst
@@ -14,12 +14,20 @@ Funkwhale requires a PostgreSQL database to work properly. Please refer
 to the `PostgreSQL documentation <https://www.postgresql.org/download/>`_
 for installation instructions specific to your os.
 
-On debian-like systems, you would install the database server like this:
+On Debian-like systems, you would install the database server like this:
 
 .. code-block:: shell
 
     sudo apt-get install postgresql postgresql-contrib
 
+On Arch Linux and its derivatives:
+
+.. code-block:: shell
+
+    sudo pacman -S postgresql
+
+On Arch, you'll also need to initialize the database. See `the Arch Linux wiki <https://wiki.archlinux.org/index.php/Postgresql#Initial_configuration>`_.
+
 The remaining steps are heavily inspired from `this Digital Ocean guide <https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04>`_.
 
 Open a database shell:
@@ -37,22 +45,23 @@ Create the project database and user:
     CREATE USER funkwhale;
     GRANT ALL PRIVILEGES ON DATABASE funkwhale TO funkwhale;
 
-Assuming you already have :ref:`created your funkwhale user <create-funkwhale-user>`,
-you should now be able to open a postgresql shell:
-
 .. warning::
 
-    It's importing that you use utf-8 encoding for your database,
+    It's important that you use utf-8 encoding for your database,
     otherwise you'll end up with errors and crashes later on when dealing
     with music metedata that contains non-ascii chars.
 
+
+Assuming you already have :ref:`created your funkwhale user <create-funkwhale-user>`,
+you should now be able to open a postgresql shell:
+
 .. code-block:: shell
 
     sudo -u funkwhale -H psql
 
 Unless you give a superuser access to the database user, you should also
 enable some extensions on your database server, as those are required
-for funkwhale to work properly:
+for Funkwhale to work properly:
 
 .. code-block:: shell
 
@@ -68,11 +77,17 @@ Funkwhale also requires a cache server:
   queries
 - To handle asynchronous tasks such as music import
 
-On debian-like distributions, a redis package is available, and you can
+On Debian-like distributions, a redis package is available, and you can
 install it:
 
 .. code-block:: shell
 
     sudo apt-get install redis-server
 
+On Arch Linux and its derivatives:
+
+.. code-block:: shell
+
+    sudo pacman -S redis
+
 This should be enough to have your redis server set up.
diff --git a/docs/installation/index.rst b/docs/installation/index.rst
index 83c47a101e5e7c37a7d89871c24ab985e61796ad..aba6d55a2f54e83baf30bf499f936dfaa85d78b2 100644
--- a/docs/installation/index.rst
+++ b/docs/installation/index.rst
@@ -56,7 +56,7 @@ Available installation methods
 -------------------------------
 
 Docker is the recommended and easiest way to setup your Funkwhale instance.
-We also maintain an installation guide for Debian 9.
+We also maintain an installation guide for Debian 9 and Arch Linux.
 
 .. toctree::
    :maxdepth: 1
@@ -96,17 +96,23 @@ Files for the web frontend are purely static and can simply be downloaded, unzip
 Reverse proxy
 --------------
 
-In order to make funkwhale accessible from outside your server and to play nicely with other applications on your machine, you should configure a reverse proxy.
+In order to make Funkwhale accessible from outside your server and to play nicely with other applications on your machine, you should configure a reverse proxy.
 
 Nginx
 ^^^^^
 
-Ensure you have a recent version of nginx on your server. On debian-like system, you would have to run the following:
+Ensure you have a recent version of nginx on your server. On Debian-like system, you would have to run the following:
 
 .. code-block:: bash
 
-    apt-get update
-    apt-get install nginx
+    sudo apt-get update
+    sudo apt-get install nginx
+
+On Arch Linux and its derivatives:
+
+.. code-block:: bash
+
+    sudo pacman -S nginx
 
 Then, download our sample virtualhost file and proxy conf:
 
@@ -129,10 +135,15 @@ If everything is fine, you can restart your nginx server with ``service nginx re
 Apache2
 ^^^^^^^
 
-Ensure you have a recent version of apache2 installed on your server.
+.. note::
+
+    These instructions are for Debian only.
+    For Arch Linux please refer to the `Arch Linux wiki <https://wiki.archlinux.org/index.php/Apache>`_.
+
+Ensure you have a recent version of Apache2 installed on your server.
 You'll also need the following dependencies::
 
-   apt install libapache2-mod-xsendfile
+   sudo apt-get install libapache2-mod-xsendfile
 
 Then, download our sample virtualhost file:
 
diff --git a/docs/installation/optimization.rst b/docs/installation/optimization.rst
index f873795e2693525878eb66ebb233ba38e4d5334d..9ff8ffadf8d1b2bfe21549fe660c20cf71e399fe 100644
--- a/docs/installation/optimization.rst
+++ b/docs/installation/optimization.rst
@@ -2,7 +2,7 @@ Optimizing your Funkwhale instance
 ==================================
 
 Depending on your requirements, you may want to reduce as much as possible
-Funkwhale's footprint.
+Funkwhale's memory footprint.
 
 Reduce workers concurrency
 --------------------------
@@ -14,9 +14,9 @@ memory usage.
 You can control this behaviour using the ``--concurrency`` flag.
 For instance, setting ``--concurrency=1`` will spawn only one worker.
 
-This flag should be appended after the ``celery -A funkwhale_api.taskapp worker``
-command in your :file:`docker-compose.yml` file if your using Docker, or in your
-:file:`/etc/systemd/system/funkwhale-worker.service` otherwise.
+This flag should be appended after the ``celery -A funkwhale_api.taskapp
+worker`` command in your :file:`docker-compose.yml` file if your using Docker,
+or in your :file:`/etc/systemd/system/funkwhale-worker.service` otherwise.
 
 .. note::
 
@@ -33,5 +33,5 @@ Using the ``solo`` pool type should reduce your memory consumption.
 You can control this behaviour using the ``--pool=solo`` flag.
 
 This flag should be appended after the ``celery -A funkwhale_api.taskapp worker``
-command in your :file:`docker-compose.yml` file if your using Docker, or in your
-:file:`/etc/systemd/system/funkwhale-worker.service` otherwise.
+command in your :file:`docker-compose.yml` file if you're using Docker, or in
+your :file:`/etc/systemd/system/funkwhale-worker.service` otherwise.
diff --git a/docs/installation/systemd.rst b/docs/installation/systemd.rst
index 27781c447291cfcbc0ab9279bf3eb801336ff704..f162cac7dc31fbf2960bbc5b81f46cad64a61fe1 100644
--- a/docs/installation/systemd.rst
+++ b/docs/installation/systemd.rst
@@ -1,10 +1,10 @@
 Systemd configuration
 ----------------------
 
-Systemd offers a convenient way to manage your funkwhale instance if you're
+Systemd offers a convenient way to manage your Funkwhale instance if you're
 not using docker.
 
-We'll see how to setup systemd to proprely start a funkwhale instance.
+We'll see how to setup systemd to proprely start a Funkwhale instance.
 
 First, download the sample unitfiles:
 
@@ -17,9 +17,9 @@ First, download the sample unitfiles:
 
 This will download three unitfiles:
 
-- ``funkwhale-server.service`` to launch the funkwhale web server
-- ``funkwhale-worker.service`` to launch the funkwhale task worker
-- ``funkwhale-beat.service`` to launch the funkwhale task beat (this is for recurring tasks)
+- ``funkwhale-server.service`` to launch the Funkwhale web server
+- ``funkwhale-worker.service`` to launch the Funkwhale task worker
+- ``funkwhale-beat.service`` to launch the Funkwhale task beat (this is for recurring tasks)
 - ``funkwhale.target`` to easily stop and start all of the services at once
 
 You can of course review and edit them to suit your deployment scenario
diff --git a/docs/translators.rst b/docs/translators.rst
new file mode 100644
index 0000000000000000000000000000000000000000..6728e9ad449d4a7e0fc239ab02c92193173d1b9d
--- /dev/null
+++ b/docs/translators.rst
@@ -0,0 +1 @@
+.. include:: ../TRANSLATORS.rst
diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst
new file mode 100644
index 0000000000000000000000000000000000000000..61fa4c68aec28e9518ea7d3b57d478e529f7d27f
--- /dev/null
+++ b/docs/troubleshooting.rst
@@ -0,0 +1,212 @@
+Troubleshooting
+===============
+
+Various errors and issues can arise on your Funkwhale instance, caused by configuration errors,
+deployment/environment specific issues, or bugs in the software itself.
+
+On this document, you'll find:
+
+- Tools and commands you can use to better understand the issues
+- A list of common pitfalls and errors and how to solve them
+- A collection of links and advice to get help from the community and report new issues
+
+Diagnose problems
+^^^^^^^^^^^^^^^^^
+
+Funkwhale is made of several components, each one being a potential cause for failure. Having an even basic overview
+of Funkwhale's technical architecture can help you understand what is going on. You can refer to :doc:`the technical architecture </architecture>` for that.
+
+Problems usually fall into one of those categories:
+
+- **Frontend**: Funkwhale's interface is not loading, not behaving as expected, music is not playing
+- **API**: the interface do not display any data or show errors
+- **Import**: uploaded/imported tracks are not imported correctly or at all
+- **Federation**: you cannot contact other Funkwhale servers, access their library, play federated tracks
+- **Everything else**
+
+Each category comes with its own set of diagnose tools and/or commands we will detail below. We'll also give you simple
+steps for each type of problem. Please try those to see if it fix your issues. If none of those works, please report your issue on our
+issue tracker.
+
+Frontend issues
+^^^^^^^^^^^^^^^
+
+Diagnostic tools:
+
+- Javascript and network logs from your browser console (see instructions on how to open it in `Chrome <https://developers.google.com/web/tools/chrome-devtools/console/>`_ and  `Firefox <https://developer.mozilla.org/en-US/docs/Tools/Web_Console/Opening_the_Web_Console>`_
+- Proxy and API access and error logs (see :ref:`access-logs`)
+- The same operation works from a different browser
+
+Common problems
+***************
+
+The front-end is completely blank
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You are visiting Funkwhale, but you don't see anything.
+
+- Try from a different browser
+- Check network errors in your browser console. If you see responses with 40X or 50X statuses, there is probably an issue with the webserver configuration
+- If you don't see anything wrong in the network console, check the Javascript console
+- Disable your browser extensions (like adblockers)
+
+Music is not playing
+~~~~~~~~~~~~~~~~~~~~
+
+You have some tracks in your queue that don't play, or the queue is jumping from one track to the next until
+there is no more track available:
+
+- Try with other tracks. If it works with some tracks but not other tracks, this may means that the failing tracks are not probably imported
+  or that your browser does not support a specific audio format
+- Check the network and javascript console for potential errors
+
+Tracks are not appending to the queue
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When clicking on "Play", "Play all albums" or "Play all" buttons, some tracks are not appended to the queue. This is
+actually a feature of Funkwhale: those tracks have no file associated with them, so we cannot play them.
+
+Specific pages are loading forever or blank
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When viewing a given page, the page load never ends (you continue to see the spinner), or nothing seems to appear at all:
+
+- Ensure your internet connection is up and running
+- Ensure your instance is up and running
+- Check the network and javascript console for potential errors
+
+
+Backend issues
+^^^^^^^^^^^^^^
+
+Diagnostic tools:
+
+- Reverse proxy logs:
+    - Apache logs should be available at :file:`/var/log/apache/access.log` and :file:`/var/log/apache/error.log`
+    - Nginx logs should be available at :file:`/var/log/nginx/access.log` and :file:`/var/log/nginx/error.log`
+- API logs:
+    - Docker setup: ``docker-compose logs -f --tail=50 api`` (remove the ``--tail`` flag to get the full logs)
+    - Non-docker setup: ``journalctl -xn -u funkwhale-server``
+
+.. note::
+
+    If you edit your .env file to test a new configuration, you have to restart your services to pick up the changes:
+
+    - Docker setup: ``docker-compose up -d``
+    - Non-docker setup: ``systemctl restart funkwhale.target``
+
+Common problems
+***************
+
+Instance work properly, but audio files are not served (404 error)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- If you're using docker, ensure the ``MEDIA_ROOT`` variable is commented in your env file
+- Ensure the ``_protected/media`` block points toward the path where media files are stored (``/srv/funkwhale/data/media``, by default)
+- If you're using in-place import, ensure :ref:`setting-MUSIC_DIRECTORY_PATH`, :ref:`setting-MUSIC_DIRECTORY_SERVE_PATH` and :ref:`setting-REVERSE_PROXY_TYPE` are configured properly, and that the files are readable by the webserver
+
+Weakref error when running ``python manage.py <command>``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+On Python <3.6, you may see this kind of errors when running commands like ``python manage.py migrate``::
+
+    Exception ignored in: <function WeakValueDictionary.__init__.<locals>.remove at 0x107e7a6a8>
+    Traceback (most recent call last):
+    File "/srv/funkwhale/venv/lib/python3.5/weakref.py", line 117, in remove
+    TypeError: 'NoneType' object is not callable
+
+This is caused by a bug in Python (cf https://github.com/celery/celery/issues/3818), and is not affecting in any way
+the command you execute. You can safely ignore this error.
+
+``Your models have changes that are not yet reflected in a migration`` warning
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When running ``python manage.py migrate`` (both in docker or non-docker), you may end-up with this::
+
+    Operations to perform:
+    Apply all migrations: account, admin, auth, authtoken, common, contenttypes, dynamic_preferences, favorites, federation, history, music, playlists, radios, requests, sessions, sites, socialaccount, taggit, users
+    Running migrations:
+    No migrations to apply.
+
+    Your models have changes that are not yet reflected in a migration, and so won't be applied.
+    Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
+
+This warning can be safely ignored. You should not run the suggested ``manage.py makemigrations`` command.
+
+File import issues
+^^^^^^^^^^^^^^^^^^
+
+Unless you are using the CLI to import files, imports are send as tasks in a queue to a celery worker that will process them.
+
+Diagnostic tools:
+
+- Celery worker logs:
+    - Docker setup: ``docker-compose logs -f --tail=50 celeryworker`` (remove the ``--tail`` flag to get the full logs)
+    - Non-docker setup: ``journalctl -xn -u funkwhale-worker``
+
+Federation issues
+^^^^^^^^^^^^^^^^^
+
+Received federations messages are sent to a dedicated task queue and processed asynchronously by a celery worker.
+
+Diagnostic tools:
+
+- API logs:
+    - Docker setup: ``docker-compose logs -f --tail=50 api`` (remove the ``--tail`` flag to get the full logs)
+    - Non-docker setup: ``journalctl -xn -u funkwhale-server``
+- Celery worker logs:
+    - Docker setup: ``docker-compose logs -f --tail=50 celeryworker`` (remove the ``--tail`` flag to get the full logs)
+    - Non-docker setup: ``journalctl -xn -u funkwhale-worker``
+
+Common problems
+***************
+
+I have no access to another instance library
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Check if it works with the demo library (library@demo.funkwhale.audio)
+- Check if the remote library received your follow request and approved it
+- Trigger a scan via the interface
+- Have a look in the celery logs for potential errors during the scan
+
+Other problems
+^^^^^^^^^^^^^^
+
+It's a bit hard to give targeted advice about problems that do not fit in the previous categories. However, we can recommend to:
+
+- Try to identify the scope of the issue and reproduce it reliably
+- Ensure your instance is configured as detailed in the installation documentation, and if you did not use the default
+  values, to check what you changed
+- To read the .env file carefuly, as most of the options are described in the comments
+
+
+Report an issue or get help
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Well be more than happy to help you to debug installation and configuration issues. The main channel
+for receiving support about your Funkwhale installation is the `#funkwhale-troubleshooting:matrix.org <https://riot.im/app/#/room/#funkwhale-troubleshooting:matrix.org>`_ Matrix channel.
+
+Before asking for help, we'd really appreciate if you took the time to go through this document and try to diagnose the problem yourself. But if you don't find
+anything relevant or don't have the time, we'll be there for you!
+
+Here are a few recommendations on how to structure and what to include in your help requests:
+
+- Give us as much context as possible about your installation (OS, version, Docker/non-docker, reverse-proxy type, relevant logs and errors, etc.)
+- Including screenshots or small gifs or videos can help us considerably when debugging front-end issues
+
+You can also open issues on our `issue tracker <https://code.eliotberriot.com/funkwhale/funkwhale/issues>`_. Please have a quick look for
+similar issues before doing that, and use the issue tracker only to report bugs, suggest enhancements (both in the software and the documentation) or new features.
+
+.. warning::
+
+    If you ever need to share screenshots or urls with someone else, ensure those do not include your personnal token.
+    This token is binded to your account and can be used to connect and use your account.
+
+    Urls that includes your token looks like: ``https://your.instance/api/v1/trackfiles/42/serve/?jwt=yoursecrettoken``
+
+Improving this documentation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If you feel like something should be improved in this document (and in the documentation in general), feel free to `edit
+it <https://code.eliotberriot.com/funkwhale/funkwhale/tree/develop/docs>`_ and open a Merge Request. If you lack time or skills
+to do that, you can open an issue to discuss that, and someone else will do it.
diff --git a/docs/upgrading.rst b/docs/upgrading.rst
index 85a2b50577efbc5fc49659c0bb31ad870aecd656..49ea558818c894c114be0159264a6ec9de044895 100644
--- a/docs/upgrading.rst
+++ b/docs/upgrading.rst
@@ -1,4 +1,4 @@
-Upgrading your funkwhale instance to a newer version
+Upgrading your Funkwhale instance to a newer version
 ====================================================
 
 .. note::
@@ -7,7 +7,7 @@ Upgrading your funkwhale instance to a newer version
     the database and the media files.
 
     We're commited to make upgrade as easy and straightforward as possible,
-    however, funkwhale is still in development and you'll be safer with a backup.
+    however, Funkwhale is still in development and you'll be safer with a backup.
 
 
 Reading the release notes
@@ -72,7 +72,7 @@ Upgrading the API
 ^^^^^^^^^^^^^^^^^
 
 On non-docker, upgrade involves a few more commands. We assume your setup
-match what is described in :doc:`debian`:
+match what is described in :doc:`/installation/debian`:
 
 .. parsed-literal::
 
diff --git a/docs/users/apps.rst b/docs/users/apps.rst
index f01af9266c9bbcbb66e13edbf332957810e5c106..f3e412d56cd31368c48b8645b83e4ed932652552 100644
--- a/docs/users/apps.rst
+++ b/docs/users/apps.rst
@@ -61,6 +61,22 @@ Then, when using a client, you'll have to input some information about your serv
 In your client configuration, please double check the "ID3" or "Browse with tags"
 setting is enabled.
 
+Ultrasonic (Android)
+^^^^^^^^^^^^^^^^^^^^
+
+- Price: free
+- F-Droid: https://f-droid.org/en/packages/org.moire.ultrasonic/
+- Google Play: https://play.google.com/store/apps/details?id=org.moire.ultrasonic
+- Sources: https://github.com/ultrasonic/ultrasonic
+
+
+Ultrasonic is a full-featured Subsonic client with Playlists, Stars, Search,
+Offline mode, etc.
+
+It's one of the recommended Android client to use with Funkwhale, as we are doing
+our Android tests on this one.
+
+
 DSub (Android)
 ^^^^^^^^^^^^^^
 
@@ -76,7 +92,7 @@ DSub is a full-featured Subsonic client that works great, and has a lot of featu
 - Search
 - Offline cache (with configurable size, playlist download, queue prefetching, etc.)
 
-It's the recommended Android client to use with Funkwhale, as we are doing
+It's one of the recommended Android client to use with Funkwhale, as we are doing
 our Android tests on this one.
 
 Clementine (Desktop)
diff --git a/front/Dockerfile b/front/Dockerfile
index 3d4c65e6418514a3db595bce3896655edaac82a7..69771c326d6fc61ae8a9b57e590d9a5c6b54eda6 100644
--- a/front/Dockerfile
+++ b/front/Dockerfile
@@ -1,5 +1,8 @@
 FROM node:9
 
+# needed to compile translations
+RUN curl -L -o /usr/local/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 && chmod +x /usr/local/bin/jq
+
 EXPOSE 8080
 WORKDIR /app/
 ADD package.json .
diff --git a/front/build/dev-server.js b/front/build/dev-server.js
index f9c389e729867b266904026454b5c676ea0df1da..634a6d41e76af052331174198af1fd5e0669fd06 100644
--- a/front/build/dev-server.js
+++ b/front/build/dev-server.js
@@ -14,8 +14,6 @@ var webpackConfig = process.env.NODE_ENV === 'testing'
   ? require('./webpack.prod.conf')
   : require('./webpack.dev.conf')
 
-require('./i18n')
-
 // default port where dev server listens for incoming traffic
 var port = process.env.PORT || config.dev.port
 var host = process.env.HOST || config.dev.host
diff --git a/front/build/i18n.js b/front/build/i18n.js
deleted file mode 100644
index ef31070c7d913acd8ebe769ac1a10a6faf558288..0000000000000000000000000000000000000000
--- a/front/build/i18n.js
+++ /dev/null
@@ -1,49 +0,0 @@
-const fs = require('fs');
-const path = require('path');
-const { gettextToI18next } = require('i18next-conv');
-
-const poDir = path.join(__dirname, '..', '..', 'po')
-const outDir = path.join(__dirname, '..', 'static', 'translations')
-if (!fs.existsSync(outDir) || !fs.statSync(outDir).isDirectory()) {
-    fs.mkdirSync(outDir)
-}
-
-// Convert .po files to i18next files
-fs.readdir(poDir, (err, files) => {
-    if (err) {
-        return console.log(err)
-    }
-
-    for (const file of files) {
-        if (file.endsWith('.po')) {
-            const lang = file.replace(/\.po$/, '')
-            const output = path.join(outDir, `${lang}.json`)
-            fs.readFile(path.join(poDir, file), (err, content) => {
-                if (err) {
-                    return console.log(err)
-                }
-
-                gettextToI18next(lang, content).then(res => {
-                    fs.writeFile(output, res, err => {
-                        if (err) {
-                            console.log(err)
-                        } else {
-                            console.log(`Wrote translation file: ${output}`)
-                            if (lang === 'en') {
-                                // for english, we need to specify that json values are equal to the keys.
-                                // otherwise we end up with empty strings on the front end for english
-                                var contents = fs.readFileSync(output)
-                                var jsonContent = JSON.parse(contents)
-                                var finalContent = {}
-                                Object.keys(jsonContent).forEach(function(key) {
-                                    finalContent[key] = key
-                                })
-                                fs.writeFile(output, JSON.stringify(finalContent))
-                            }
-                        }
-                    })
-                })
-            })
-        }
-    }
-})
diff --git a/front/locales/app.pot b/front/locales/app.pot
new file mode 100644
index 0000000000000000000000000000000000000000..9eb4a2a7d32f40fa3d66ad1f1e06fe26c995c459
--- /dev/null
+++ b/front/locales/app.pot
@@ -0,0 +1,2411 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the front package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: front 1.0.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-07-22 14:12+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: front/src/components/playlists/PlaylistModal.vue:9
+msgid "\"%{ title }\", by %{ artist }"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:24
+msgid "(%{ index } of %{ length })"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:22
+msgid "(empty)"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:43
+#: front/src/components/common/ActionTable.vue:51
+msgid "%{ count } on %{ total } selected"
+msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/Sidebar.vue:116 src/views/federation/LibraryDetail.vue:87
+msgid "%{ count } track"
+msgid_plural "%{ count } tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/Artist.vue:13
+msgid "%{ count } track in %{ albumsCount } albums"
+msgid_plural "%{ count } tracks in %{ albumsCount } albums"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/radios/Builder.vue:76
+msgid "%{ count } track matching combined filters"
+msgid_plural "%{ count } tracks matching combined filters"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/playlists/Card.vue:18
+msgid "%{ count} track"
+msgid_plural "%{ count } tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/common/Duration.vue:2
+msgid "%{ hours } h %{ minutes } min"
+msgstr ""
+
+#: front/src/components/common/Duration.vue:5
+msgid "%{ minutes } min"
+msgstr ""
+
+#: front/src/components/activity/Like.vue:7
+msgid "%{ user } favorited a track"
+msgstr ""
+
+#: front/src/components/activity/Listen.vue:7
+msgid "%{ user } listened to a track"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:49
+msgid "%{ username }'s profile"
+msgstr ""
+
+#: front/src/components/audio/artist/Card.vue:41
+msgid "1 album"
+msgid_plural "%{ count } albums"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/favorites/List.vue:10
+msgid "1 favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/audio/album/Card.vue:54
+#: front/src/components/federation/LibraryCard.vue:25
+msgid "1 track"
+msgid_plural "%{ count } tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/About.vue:5
+msgid "About %{ instance }"
+msgstr ""
+
+#: front/src/App.vue:54
+msgid "About Funkwhale"
+msgstr ""
+
+#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55
+msgid "About this instance"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:28
+#: front/src/components/manage/library/RequestsTable.vue:62
+msgid "Accepted"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:111
+msgid "Access disabled"
+msgstr ""
+
+#: front/src/components/Home.vue:109
+msgid "Access your music from a clean interface that focus on what really matters"
+msgstr ""
+
+#: front/src/views/admin/users/UsersDetail.vue:54
+msgid "Account active"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:5
+msgid "Account settings"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:257
+msgid "Account Settings"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:39
+msgid "Account status"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:14
+msgid "Account's email"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:82
+msgid "Action %{ action } was launched successfully on %{ count } element"
+msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/common/ActionTable.vue:8
+#: front/src/components/federation/LibraryFollowTable.vue:24
+#: front/src/components/library/radios/Builder.vue:60
+#: front/src/components/manage/library/RequestsTable.vue:54
+msgid "Actions"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:53
+msgid "Active"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:60
+msgid "Activity"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:21
+msgid "Actor"
+msgstr ""
+
+#: front/src/views/federation/LibraryList.vue:8
+msgid "Add a new library"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:46
+msgid "Add filter"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:36
+msgid "Add filters to customize your radio"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:53
+msgid "Add to current queue"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:4
+#: front/src/components/favorites/TrackFavoriteIcon.vue:21
+msgid "Add to favorites"
+msgstr ""
+
+#: front/src/components/playlists/TrackPlaylistIcon.vue:6
+#: front/src/components/playlists/TrackPlaylistIcon.vue:32
+msgid "Add to playlist..."
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:14
+msgid "Add to queue"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:116
+msgid "Add to this playlist"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:54
+msgid "Add track"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:69
+msgid "Admin"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:64
+msgid "Administration"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:26 src/components/audio/track/Table.vue:8
+#: front/src/components/federation/LibraryTrackTable.vue:49
+#: front/src/components/library/Album.vue:91
+#: front/src/components/manage/library/FilesTable.vue:39
+#: front/src/components/metadata/Search.vue:134
+msgid "Album"
+msgstr ""
+
+#: front/src/components/library/import/ReleaseImport.vue:3
+msgid "Album %{ title } (%{ count } track) by %{ artist }"
+msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/Album.vue:12
+msgid "Album containing %{ count } track, by %{ artist }"
+msgid_plural "Album containing %{ count } tracks, by %{ artist }"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/Track.vue:20
+msgid "Album page"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:19 src/components/instance/Stats.vue:48
+#: front/src/components/manage/library/RequestsTable.vue:50
+#: front/src/components/requests/Form.vue:9
+msgid "Albums"
+msgstr ""
+
+#: front/src/components/library/Artist.vue:44
+msgid "Albums by this artist"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:19
+msgid "All"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:13
+msgid "An error occured while saving your changes"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:10
+msgid "An unknown error happend, this can mean the server is down or cannot be reached"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:11
+#: front/src/components/library/import/BatchDetail.vue:68
+#: front/src/components/library/import/BatchList.vue:13
+#: front/src/components/library/import/BatchList.vue:22
+msgid "Any"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:24
+msgid "API"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:68
+#: front/src/components/federation/LibraryFollowTable.vue:78
+msgid "Approve"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:70
+msgid "Approve access?"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:38
+msgid "Approved"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:5
+msgid "Are you sure you want to log out?"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:25 src/components/audio/track/Table.vue:7
+#: front/src/components/federation/LibraryTrackTable.vue:48
+#: front/src/components/library/Artist.vue:119
+#: front/src/components/manage/library/FilesTable.vue:38
+#: front/src/components/manage/library/RequestsTable.vue:49
+#: front/src/components/metadata/Search.vue:130
+msgid "Artist"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:5
+msgid "Artist name"
+msgstr ""
+
+#: front/src/components/library/Album.vue:22 src/components/library/Track.vue:23
+msgid "Artist page"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:65
+msgid "Artist, album, track..."
+msgstr ""
+
+#: front/src/components/audio/Search.vue:10 src/components/instance/Stats.vue:42
+#: front/src/components/library/Artists.vue:119 src/components/library/Library.vue:7
+msgid "Artists"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:33
+#: front/src/components/federation/LibraryTrackTable.vue:28
+#: front/src/components/library/Artists.vue:25 src/components/library/Radios.vue:44
+#: front/src/components/manage/library/FilesTable.vue:19
+#: front/src/components/manage/library/RequestsTable.vue:19
+#: front/src/components/manage/users/UsersTable.vue:19
+#: front/src/views/federation/LibraryList.vue:28 src/views/playlists/List.vue:27
+msgid "Ascending"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:27
+msgid "Ask for a password reset"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:56
+msgid "Auto importing"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:26
+msgid "Available playlists"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:34
+msgid "Avatar"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24
+#: front/src/views/auth/PasswordResetConfirm.vue:18
+msgid "Back to login"
+msgstr ""
+
+#: front/src/views/federation/LibraryFollowersList.vue:5
+msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library."
+msgstr ""
+
+#: front/src/components/library/Track.vue:80
+#: front/src/components/manage/library/FilesTable.vue:42
+msgid "Bitrate"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
+msgid "Browse"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:50
+msgid "Browse library"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:4
+msgid "Browsing artists"
+msgstr ""
+
+#: front/src/views/federation/LibraryTrackList.vue:3
+msgid "Browsing federated tracks"
+msgstr ""
+
+#: front/src/views/federation/LibraryFollowersList.vue:3
+msgid "Browsing followers"
+msgstr ""
+
+#: front/src/views/federation/LibraryList.vue:3
+msgid "Browsing libraries"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:3
+msgid "Browsing playlists"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:4
+msgid "Browsing radios"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:5
+msgid "Builder"
+msgstr ""
+
+#: front/src/components/audio/album/Card.vue:13
+msgid "By %{ artist }"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:57
+msgid "By confirming, %{ username } will be denied access to your library."
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:73
+msgid "By confirming, %{ username } will be granted access to your library."
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:43
+#: front/src/components/common/DangerousButton.vue:17
+#: front/src/components/library/radios/Filter.vue:53
+#: front/src/components/playlists/PlaylistModal.vue:63
+msgid "Cancel"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:59
+msgid "Candidates"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:76
+msgid "Cannot change your password"
+msgstr ""
+
+#: front/src/App.vue:66
+msgid "Change language"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:67
+msgid "Change my password"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:95
+msgid "Change password"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:4
+#: front/src/views/auth/PasswordResetConfirm.vue:62
+msgid "Change your password"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:96
+msgid "Change your password?"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:21
+msgid "Changes synced with server"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:70
+msgid "Changing your password will also change your Subsonic API password if you have requested one."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:98
+msgid "Changing your password will have the following consequences"
+msgstr ""
+
+#: front/src/App.vue:4
+msgid "Choose your instance"
+msgstr ""
+
+#: front/src/components/Home.vue:64
+msgid "Clean library"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:37
+msgid "Clear"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:40
+#: front/src/components/playlists/Editor.vue:45
+msgid "Clear playlist"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:270
+msgid "Clear your queue"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:23
+msgid "CLI"
+msgstr ""
+
+#: front/src/components/Home.vue:44
+msgid "Click once, listen for hours using built-in radios"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:30
+#: front/src/components/manage/library/RequestsTable.vue:64
+msgid "Closed"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:42
+msgid "Code"
+msgstr ""
+
+#: front/src/components/audio/album/Card.vue:43
+#: front/src/components/audio/artist/Card.vue:33
+#: front/src/components/discussion/Comment.vue:20
+msgid "Collapse"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:51
+#: front/src/components/requests/Form.vue:14
+msgid "Comment"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:58
+msgid "Config"
+msgstr ""
+
+#: front/src/components/common/DangerousButton.vue:21
+msgid "Confirm"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20
+#: front/src/views/auth/EmailConfirm.vue:51
+msgid "Confirm your email"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:13
+msgid "Confirmation code"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:163
+msgid "Copy tracks from current queue to playlist"
+msgstr ""
+
+#: front/src/components/Home.vue:88
+msgid "Covers, lyrics, our goal is to have them all ;)"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:4
+msgid "Create a funkwhale account"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:2
+msgid "Create a new playlist"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:17
+msgid "Create an account"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:88
+#: front/src/components/requests/Card.vue:25
+msgid "Create import"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:51
+msgid "Create my account"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:34
+msgid "Create playlist"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:23
+msgid "Create your own radio"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:22
+#: front/src/components/manage/library/RequestsTable.vue:52
+#: front/src/components/manage/users/InvitationsTable.vue:40
+msgid "Creation date"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:54
+msgid "Current avatar"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:8
+msgid "Current track"
+msgstr ""
+
+#: front/src/components/manage/library/FilesTable.vue:189
+#: front/src/components/manage/library/RequestsTable.vue:195
+#: front/src/components/manage/users/InvitationsTable.vue:166
+#: front/src/views/playlists/Detail.vue:33
+msgid "Delete"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:38
+msgid "Delete playlist"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:28
+msgid "Delete radio"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:52
+#: front/src/components/federation/LibraryFollowTable.vue:63
+msgid "Deny"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:54
+msgid "Deny access?"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:34
+#: front/src/components/federation/LibraryTrackTable.vue:29
+#: front/src/components/library/Artists.vue:26 src/components/library/Radios.vue:47
+#: front/src/components/manage/library/FilesTable.vue:20
+#: front/src/components/manage/library/RequestsTable.vue:20
+#: front/src/components/manage/users/UsersTable.vue:20
+#: front/src/views/federation/LibraryList.vue:29 src/views/playlists/List.vue:28
+msgid "Descending"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:50
+msgid "Detail"
+msgstr ""
+
+#: front/src/views/admin/users/UsersDetail.vue:146
+msgid "Determine if the user account is active or not. Inactive users cannot login or use the service."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:104
+#: front/src/components/auth/SubsonicTokenForm.vue:52
+msgid "Disable access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:49
+msgid "Disable Subsonic access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:50
+msgid "Disable Subsonic API access?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:14
+msgid "Discover how to use Funkwhale from other apps"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:26
+msgid "Display publicly"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:42
+msgid "Do you want to clear the playlist \"%{ playlist }\"?"
+msgstr ""
+
+#: front/src/components/common/DangerousButton.vue:7
+msgid "Do you want to confirm this action?"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:35
+msgid "Do you want to delete the playlist \"%{ playlist }\"?"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:26
+msgid "Do you want to delete the radio \"%{ radio }\"?"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:29
+msgid "Do you want to launch %{ action } on %{ count } element?"
+msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/Sidebar.vue:113
+msgid "Do you want to restore your previous queue?"
+msgstr ""
+
+#: front/src/App.vue:38
+msgid "Documentation"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:24 src/components/library/Track.vue:48
+msgid "Download"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:27
+msgid "Download tracks"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:49
+msgid "Drag and drop rows to reorder tracks in the playlist"
+msgstr ""
+
+#: front/src/components/library/Track.vue:58
+#: front/src/components/manage/library/FilesTable.vue:43
+msgid "Duration"
+msgstr ""
+
+#: front/src/components/Home.vue:96
+msgid "Easy to use"
+msgstr ""
+
+#: front/src/components/About.vue:21
+msgid "Edit instance info"
+msgstr ""
+
+#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30
+msgid "Edit..."
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:29
+#: front/src/components/manage/users/UsersTable.vue:38
+msgid "Email"
+msgstr ""
+
+#: front/src/views/admin/users/UsersDetail.vue:29
+msgid "Email address"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:23
+msgid "Email confirmed"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:29
+msgid "End edition"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:4
+msgid "Ensure your music files are properly tagged before uploading them."
+msgstr ""
+
+#: front/src/components/library/Radios.vue:140
+msgid "Enter a radio name..."
+msgstr ""
+
+#: front/src/components/library/Artists.vue:118
+msgid "Enter an artist name..."
+msgstr ""
+
+#: front/src/views/federation/LibraryList.vue:122
+msgid "Enter an library domain name..."
+msgstr ""
+
+#: front/src/views/playlists/List.vue:104
+msgid "Enter an playlist name..."
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:98
+msgid "Enter your email"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:96
+msgid "Enter your invitation code (case insensitive)"
+msgstr ""
+
+#: front/src/components/metadata/Search.vue:114
+msgid "Enter your search query..."
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:97
+msgid "Enter your username"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:77
+msgid "Enter your username or email"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:20
+msgid "Error"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:87
+msgid "Error reporting"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:75
+msgid "Error while applying action"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:7
+msgid "Error while asking for a password reset"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:7
+msgid "Error while changing your password"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:7
+msgid "Error while confirming your email"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:4
+msgid "Error while creating invitation"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:5
+msgid "Error while saving settings"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:10
+msgid "Error while scanning library"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:41
+#: front/src/components/library/import/BatchDetail.vue:70
+#: front/src/components/library/import/BatchList.vue:15
+msgid "Errored"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:89
+msgid "Everyone"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:85
+msgid "Everyone on this instance"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:57
+msgid "Exclude"
+msgstr ""
+
+#: front/src/components/discussion/Comment.vue:14
+msgid "Expand"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:41
+msgid "Expiration date"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:50
+msgid "Expired"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:21
+msgid "Expired/used"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:65
+msgid "External source. Supported backends"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:51
+msgid "Favorites"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:3
+msgid "Federate with a new instance"
+msgstr ""
+
+#: front/src/views/federation/LibraryTrackList.vue:21
+msgid "Federated tracks"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:87 src/components/library/import/BatchList.vue:25
+#: front/src/components/manage/users/UsersTable.vue:180
+#: front/src/views/admin/Settings.vue:84 src/views/admin/users/UsersDetail.vue:161
+#: front/src/views/federation/Base.vue:35 src/views/federation/LibraryDetail.vue:40
+msgid "Federation"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:3
+msgid "File mirroring"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:43
+msgid "File name"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:76
+msgid "File upload"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:5 src/views/admin/library/FilesList.vue:21
+msgid "Files"
+msgstr ""
+
+#: front/src/components/library/import/ArtistImport.vue:7
+msgid "Filter album types"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:56
+msgid "Filter name"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:52
+msgid "Finish import"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:54
+msgid "Finished"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:59
+msgid "First, choose where you want to import the music from"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:44
+msgid "Follow"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:36
+msgid "Follow request pending approval"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:21
+msgid "Follow status"
+msgstr ""
+
+#: front/src/views/federation/Base.vue:13
+#: front/src/views/federation/LibraryFollowersList.vue:24
+msgid "Followers"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:18
+msgid "Followers only"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:15
+#: front/src/views/federation/LibraryDetail.vue:29
+msgid "Following"
+msgstr ""
+
+#: front/src/components/activity/Like.vue:12 src/components/activity/Listen.vue:12
+msgid "from %{ album } by %{ artist }"
+msgstr ""
+
+#: front/src/components/library/Track.vue:13
+msgid "From album %{ album } by %{ artist }"
+msgstr ""
+
+#: front/src/App.vue:56
+msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgid "Funkwhale is compatible with other music players that support the Subsonic API."
+msgstr ""
+
+#: front/src/components/Home.vue:98
+msgid "Funkwhale is dead simple to use."
+msgstr ""
+
+#: front/src/components/Home.vue:39
+msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists."
+msgstr ""
+
+#: front/src/components/Home.vue:119
+msgid "Funkwhale is free and gives you control on your music."
+msgstr ""
+
+#: front/src/components/Home.vue:66
+msgid "Funkwhale takes care of handling your music"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:16
+msgid "Get a new invitation"
+msgstr ""
+
+#: front/src/components/Home.vue:13
+msgid "Get me to the library"
+msgstr ""
+
+#: front/src/components/Home.vue:77
+msgid ""
+"Get quality metadata about your music thanks to\n"
+"              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:21
+#: front/src/components/common/ActionTable.vue:27
+msgid "Go"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:14
+msgid "Go to home page"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:13
+msgid "Grab corresponding metadata"
+msgstr ""
+
+#: front/src/App.vue:74
+msgid "Help us translate Funkwhale"
+msgstr ""
+
+#: front/src/components/library/Home.vue:65
+msgid "Home"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:36
+msgid "Hours of music"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:11
+msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:34
+msgid "ID"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:24
+msgid "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."
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:196
+#: front/src/components/library/Library.vue:17
+msgid "Import"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:57
+msgid "Import #%{ id } launched"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:38
+msgid "Import %{ count } track"
+msgid_plural "Import %{ count } tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/import/BatchDetail.vue:10
+msgid "Import batch"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:185
+msgid "Import Batch #%{ id }"
+msgstr ""
+
+#: front/src/components/library/Library.vue:20
+msgid "Import batches"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:117
+msgid "Import Batches"
+msgstr ""
+
+#: front/src/components/manage/library/FilesTable.vue:40
+#: front/src/components/manage/library/RequestsTable.vue:53
+msgid "Import date"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:38
+msgid "Import detail page"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:81
+msgid "Import music"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:267
+msgid "Import Music"
+msgstr ""
+
+#: front/src/components/Home.vue:71
+msgid "Import music from various platforms, such as YouTube or SoundCloud"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:14
+#: front/src/components/federation/LibraryTrackTable.vue:66
+msgid "Import pending"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:9
+#: front/src/views/admin/library/RequestsList.vue:3
+#: front/src/views/admin/library/RequestsList.vue:21
+msgid "Import requests"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:20
+#: front/src/components/library/import/Main.vue:6
+msgid "Import source"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:9
+msgid "Import status"
+msgstr ""
+
+#: front/src/components/library/import/ReleaseImport.vue:14
+msgid "Import this release"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:11
+msgid "Import this track"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:12
+#: front/src/components/manage/library/RequestsTable.vue:29
+#: front/src/components/manage/library/RequestsTable.vue:61
+msgid "Imported"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:44
+msgid "Imported URL"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:82
+msgid "Imports"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:3
+msgid "In favorites"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:65
+msgid "In library"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:54
+msgid "Inactive"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:96
+msgid "Input a MusicBrainz ID manually:"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:53
+msgid "Input the email address binded to your account"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:31
+msgid "Insert from queue (%{ count } track)"
+msgid_plural "Insert from queue (%{ count } tracks)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/views/admin/Settings.vue:80
+msgid "Instance information"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:9
+msgid "Instance radios"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:75
+msgid "Instance settings"
+msgstr ""
+
+#: front/src/views/instance/Timeline.vue:57
+msgid "Instance Timeline"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:42
+#: front/src/components/manage/users/InvitationForm.vue:11
+msgid "Invitation code"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:43
+msgid "Invitation code (optional)"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:8 src/views/admin/users/InvitationsList.vue:3
+#: front/src/views/admin/users/InvitationsList.vue:24
+msgid "Invitations"
+msgstr ""
+
+#: front/src/App.vue:43
+msgid "Issue tracker"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:80
+msgid "Job ID"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:36
+msgid "Jobs"
+msgstr ""
+
+#: front/src/components/Home.vue:50
+msgid "Keep a track of your favorite songs"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:33
+msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:41
+#: front/src/views/admin/users/UsersDetail.vue:45
+msgid "Last activity"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:101
+msgid "Last fetched"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:32
+msgid "Last modification"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:39
+msgid "Launch"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:18
+#: front/src/components/library/import/BatchList.vue:35
+msgid "Launch date"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:31
+msgid "Launch scan"
+msgstr ""
+
+#: front/src/components/Home.vue:10
+msgid "Learn more about this instance"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:58
+msgid "Leave empty for a random code"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:10
+msgid "Leave this field empty if you're requesting the whole discography."
+msgstr ""
+
+#: front/src/views/federation/Base.vue:5 src/views/federation/LibraryList.vue:123
+msgid "Libraries"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:70
+#: front/src/components/federation/LibraryTrackTable.vue:51
+#: front/src/components/instance/Stats.vue:30
+#: front/src/components/manage/users/UsersTable.vue:176
+#: front/src/views/admin/users/UsersDetail.vue:157
+#: front/src/views/federation/LibraryDetail.vue:194
+msgid "Library"
+msgstr ""
+
+#: front/src/views/admin/library/FilesList.vue:3
+msgid "Library files"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:20
+msgid "Library name"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:84
+msgid "Library size"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:96
+msgid "library@demo.funkwhale.audio"
+msgstr ""
+
+#: front/src/App.vue:29
+msgid "Links"
+msgstr ""
+
+#: front/src/views/instance/Timeline.vue:4
+msgid "Loading timeline..."
+msgstr ""
+
+#: front/src/components/favorites/List.vue:5
+msgid "Loading your favorites..."
+msgstr ""
+
+#: front/src/components/auth/Login.vue:78
+msgid "Log In"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:4
+msgid "Log in to your Funkwhale account"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:20
+msgid "Log Out"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:38
+msgid "Logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41
+msgid "Login"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:43
+msgid "Logout"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:266
+msgid "Looping disabled. Click to switch to single-track looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:267
+msgid "Looping on a single track. Click to switch to whole queue looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:268
+msgid "Looping on whole queue. Click to disable looping."
+msgstr ""
+
+#: front/src/components/library/Track.vue:94
+msgid "Lyrics"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:25
+msgid "Manage library"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:3
+msgid "Manage playlists"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:20
+msgid "Manage users"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:8
+msgid "Manage your playlists"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:197
+msgid "Mark as closed"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:196
+msgid "Mark as imported"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:12
+msgid "Metadata"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:115
+msgid ""
+"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n"
+"            <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"              MusicBrainz\n"
+"            </a>\n"
+"            project, which you can think about as the Wikipedia of music."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:48 src/components/library/import/Main.vue:18
+msgid "Music"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:147
+msgid "Music request"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:265
+msgid "Mute"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:34
+msgid "My account"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:74
+msgid "My awesome playlist"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:227
+msgid "My awesome radio"
+msgstr ""
+
+#: front/src/components/library/Track.vue:64 src/components/library/Track.vue:75
+#: front/src/components/library/Track.vue:86
+#: front/src/components/manage/library/FilesTable.vue:63
+#: front/src/components/manage/library/FilesTable.vue:69
+#: front/src/components/manage/library/FilesTable.vue:75
+#: front/src/components/manage/library/FilesTable.vue:81
+#: front/src/components/manage/library/RequestsTable.vue:71
+#: front/src/components/manage/library/RequestsTable.vue:75
+#: front/src/components/manage/library/RequestsTable.vue:82
+#: front/src/components/manage/users/UsersTable.vue:61
+#: front/src/views/admin/users/UsersDetail.vue:49
+msgid "N/A"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/views/admin/users/UsersDetail.vue:21
+msgid "Name"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:88
+#: front/src/views/auth/PasswordResetConfirm.vue:14
+msgid "New password"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:158
+msgid "New tracks will be appended here automatically."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:29
+msgid "Next step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:263
+msgid "Next track"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:125
+msgid "No"
+msgstr ""
+
+#: front/src/components/Home.vue:103
+msgid "No add-ons, no plugins : you only need a web library"
+msgstr ""
+
+#: front/src/components/library/Track.vue:102
+msgid "No lyrics available for this track."
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:81
+msgid "Nobody except me"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:32
+msgid "Not following"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:13
+#: front/src/components/federation/LibraryTrackTable.vue:67
+msgid "Not imported"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:51
+msgid "Not used"
+msgstr ""
+
+#: front/src/App.vue:37
+msgid "Official website"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:83
+msgid "Old password"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:36
+msgid "Once all your files are uploaded, simply click the following button to check the import status."
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:21
+#: front/src/components/manage/users/InvitationsTable.vue:20
+msgid "Open"
+msgstr ""
+
+#: front/src/App.vue:63
+msgid "Options"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:93
+msgid "Or"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:18
+#: front/src/components/library/Artists.vue:15 src/components/library/Radios.vue:33
+#: front/src/components/manage/library/FilesTable.vue:9
+#: front/src/components/manage/library/RequestsTable.vue:9
+#: front/src/components/manage/users/InvitationsTable.vue:9
+#: front/src/components/manage/users/UsersTable.vue:9
+#: front/src/views/federation/LibraryList.vue:18 src/views/playlists/List.vue:17
+msgid "Ordering"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:31
+#: front/src/components/federation/LibraryTrackTable.vue:26
+#: front/src/components/library/Artists.vue:23 src/components/library/Radios.vue:41
+#: front/src/components/manage/library/FilesTable.vue:17
+#: front/src/components/manage/library/RequestsTable.vue:17
+#: front/src/components/manage/users/UsersTable.vue:17
+#: front/src/views/federation/LibraryList.vue:26 src/views/playlists/List.vue:25
+msgid "Ordering direction"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:38
+msgid "Owner"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:33
+msgid "Page Not Found"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:7
+msgid "Page not found!"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38
+msgid "Password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:95
+msgid "Password updated"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:28
+msgid "Password updated successfully"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:262
+msgid "Pause track"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:33
+#: front/src/components/library/import/BatchDetail.vue:69
+#: front/src/components/library/import/BatchList.vue:14
+#: front/src/components/library/import/FileUpload.vue:59
+#: front/src/components/manage/library/RequestsTable.vue:27
+#: front/src/components/manage/library/RequestsTable.vue:63
+msgid "Pending"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:11
+#: front/src/views/federation/LibraryDetail.vue:26
+msgid "Pending approval"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:217
+msgid "Pending follow requests"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26
+msgid "Pending import requests"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36
+msgid "Pending requests"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:42
+#: front/src/views/admin/users/UsersDetail.vue:68
+msgid "Permissions"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:9 src/components/library/Track.vue:30
+msgid "Play"
+msgstr ""
+
+#: front/src/components/audio/album/Card.vue:50
+#: front/src/components/audio/artist/Card.vue:44 src/components/library/Album.vue:28
+#: front/src/views/playlists/Detail.vue:23
+msgid "Play all"
+msgstr ""
+
+#: front/src/components/library/Artist.vue:26
+msgid "Play all albums"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:58
+msgid "Play immediatly"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:15
+msgid "Play next"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:16
+msgid "Play now"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:261
+msgid "Play track"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:90
+msgid "Playlist"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:12
+msgid "Playlist containing %{ count } track, by %{ username }"
+msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/playlists/Form.vue:9
+msgid "Playlist created"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:4
+msgid "Playlist editor"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:21
+msgid "Playlist name"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:6
+msgid "Playlist updated"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:25
+msgid "Playlist visibility"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16
+#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83
+#: front/src/views/playlists/List.vue:103
+msgid "Playlists"
+msgstr ""
+
+#: front/src/components/Home.vue:56
+msgid "Playlists? We got them"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
+msgid "Please double-check your password is correct"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:9
+msgid "Please double-check your username/password couple is correct"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:46
+msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:26
+msgid "Previous step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:260
+msgid "Previous track"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:26
+#: front/src/views/auth/PasswordResetConfirm.vue:31
+msgid "Proceed to login"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:50
+msgid "Published date"
+msgstr ""
+
+#: front/src/components/library/import/ArtistImport.vue:17
+msgid "Query template"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:20
+msgid "Queue"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:203
+msgid "Queue shuffled!"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:80
+msgid "Radio"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:226
+msgid "Radio Builder"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:15
+msgid "Radio created"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:21
+msgid "Radio name"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:12
+msgid "Radio updated"
+msgstr ""
+
+#: front/src/components/library/Library.vue:10 src/components/library/Radios.vue:141
+msgid "Radios"
+msgstr ""
+
+#: front/src/views/instance/Timeline.vue:7
+msgid "Recent activity on this instance"
+msgstr ""
+
+#: front/src/components/library/Home.vue:24
+msgid "Recently added"
+msgstr ""
+
+#: front/src/components/library/Home.vue:11
+msgid "Recently favorited"
+msgstr ""
+
+#: front/src/components/library/Home.vue:6
+msgid "Recently listened"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:81
+msgid "Recording MusicBrainz ID"
+msgstr ""
+
+#: front/src/views/admin/users/UsersDetail.vue:84
+#: front/src/views/federation/LibraryDetail.vue:122
+msgid "Refresh"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:42
+msgid "Refused"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:12
+msgid "Registered since %{ date }"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:9
+msgid "Registration are closed on this instance, you will need an invitation code to signup."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:71
+msgid "regular user"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:59
+msgid "Remove"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:58
+msgid "Remove avatar"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:19
+msgid "Remove from favorites"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:34
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+msgid "Request a new password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:35
+msgid "Request a new Subsonic API password?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:43
+msgid "Request a password"
+msgstr ""
+
+#: front/src/App.vue:35
+msgid "Request music"
+msgstr ""
+
+#: front/src/views/library/MusicRequest.vue:4 src/views/library/MusicRequest.vue:21
+msgid "Request some music"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:20
+msgid "Request submitted!"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:49
+msgid "Rerun errored jobs"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:187
+msgid "Rerun job"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4
+#: front/src/views/auth/PasswordReset.vue:52
+msgid "Reset your password"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:31
+msgid "Result %{ current }/%{ total }"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:38 src/components/library/Artists.vue:30
+#: front/src/components/library/Radios.vue:52 src/views/federation/LibraryList.vue:33
+#: front/src/views/playlists/List.vue:32
+msgid "Results per page"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:63
+#: front/src/components/library/radios/Builder.vue:29
+msgid "Save"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:112
+msgid "Scan triggered!"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:5
+#: front/src/components/library/Artists.vue:10 src/components/library/Radios.vue:29
+#: front/src/components/library/import/BatchDetail.vue:62
+#: front/src/components/library/import/BatchList.vue:7
+#: front/src/components/manage/library/FilesTable.vue:5
+#: front/src/components/manage/library/RequestsTable.vue:5
+#: front/src/components/manage/users/InvitationsTable.vue:5
+#: front/src/components/manage/users/UsersTable.vue:5
+#: front/src/views/federation/LibraryList.vue:14 src/views/playlists/List.vue:13
+msgid "Search"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:85
+msgid "Search an entity you want to import:"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:180
+msgid "Search by artist, username, comment..."
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:188
+msgid "Search by source..."
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:116
+msgid "Search by submitter, source..."
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:182
+#: front/src/components/manage/library/FilesTable.vue:175
+msgid "Search by title, artist, domain..."
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:140
+msgid "Search by username, domain..."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:152
+msgid "Search by username, email, code..."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:162
+msgid "Search by username, email, name..."
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:20
+msgid "Search for artists, albums, tracks..."
+msgstr ""
+
+#: front/src/components/audio/Search.vue:2
+msgid "Search for some music"
+msgstr ""
+
+#: front/src/components/library/Track.vue:105
+msgid "Search on lyrics.wikia.com"
+msgstr ""
+
+#: front/src/components/library/Album.vue:33 src/components/library/Artist.vue:31
+#: front/src/components/library/Track.vue:40
+msgid "Search on Wikipedia"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:42
+msgid "Search query"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:15
+msgid "Sections"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:41
+msgid "Select a filter"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:61
+msgid "Select all %{ total } elements"
+msgid_plural "Select all %{ total } elements"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/import/FileUpload.vue:22
+msgid "Select files to upload..."
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:69
+msgid "Select only current page"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:19
+msgid "Select relevant sources or files for import"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:43
+msgid "Send a follow request"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:97 src/components/manage/users/UsersTable.vue:184
+#: front/src/views/admin/users/UsersDetail.vue:165
+msgid "Settings"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:10
+msgid "Settings updated"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:11
+msgid "Settings updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:24
+msgid "Settings..."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:27
+msgid "Share link"
+msgstr ""
+
+#: front/src/components/audio/artist/Card.vue:30
+msgid "Show 1 more album"
+msgid_plural "Show %{ count } more albums"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/audio/album/Card.vue:40
+msgid "Show 1 more track"
+msgid_plural "Show %{ count } more tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/forms/PasswordInput.vue:25
+msgid "Show/hide password"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:97
+#: front/src/components/federation/LibraryTrackTable.vue:98
+#: front/src/components/library/import/BatchDetail.vue:128
+#: front/src/components/library/import/BatchList.vue:73
+#: front/src/components/manage/library/FilesTable.vue:97
+#: front/src/components/manage/library/RequestsTable.vue:104
+#: front/src/components/manage/users/InvitationsTable.vue:76
+#: front/src/components/manage/users/UsersTable.vue:87
+msgid "Showing results %{ start }-%{ end } on %{ total }"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:269
+msgid "Shuffle your queue"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:95
+msgid "Sign Up"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:40
+#: front/src/views/admin/users/UsersDetail.vue:37
+msgid "Sign-up"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:31
+msgid "Simply copy paste the snippet below into a terminal to launch the download."
+msgstr ""
+
+#: front/src/components/library/Track.vue:69
+#: front/src/components/library/import/FileUpload.vue:44
+#: front/src/components/manage/library/FilesTable.vue:44
+msgid "Size"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:37
+#: front/src/components/library/import/BatchDetail.vue:72
+msgid "Skipped"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:3
+msgid "Something's missing in the library? Let us know what you would like to listen!"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:25
+msgid "Sorry, we did not found any album matching your query"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:16
+msgid "Sorry, we did not found any artist matching your query"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:82
+#: front/src/components/library/import/BatchList.vue:38
+#: front/src/components/library/import/TrackImport.vue:17
+msgid "Source"
+msgstr ""
+
+#: front/src/App.vue:41
+msgid "Source code"
+msgstr ""
+
+#: front/src/App.vue:40
+msgid "Source code (%{version})"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:20
+#: front/src/components/manage/users/UsersTable.vue:70
+msgid "Staff member"
+msgstr ""
+
+#: front/src/components/radios/Button.vue:4
+msgid "Start"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:28
+msgid "Start Upload"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:86
+msgid "Statistics"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:66
+#: front/src/components/library/import/BatchDetail.vue:83
+#: front/src/components/library/import/BatchList.vue:11
+#: front/src/components/library/import/BatchList.vue:37
+#: front/src/components/library/import/FileUpload.vue:45
+#: front/src/components/manage/library/RequestsTable.vue:24
+#: front/src/components/manage/library/RequestsTable.vue:48
+#: front/src/components/manage/users/InvitationsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:39
+#: front/src/components/manage/users/UsersTable.vue:43
+msgid "Status"
+msgstr ""
+
+#: front/src/components/radios/Button.vue:3
+msgid "Stop"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:159
+msgid "Stop radio"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:32
+msgid "Stop Upload"
+msgstr ""
+
+#: front/src/App.vue:9 src/components/requests/Form.vue:17
+msgid "Submit"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:22
+msgid "Submit another request"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:26
+#: front/src/components/library/import/BatchList.vue:39
+msgid "Submitted by"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:85
+msgid "Subsonic"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:2
+msgid "Subsonic API password"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:71
+#: front/src/components/library/import/BatchList.vue:16
+#: front/src/components/library/import/FileUpload.vue:56
+msgid "Success"
+msgstr ""
+
+#: front/src/App.vue:11
+msgid "Suggested choices"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:9
+msgid "Syncing changes to server..."
+msgstr ""
+
+#: front/src/components/Home.vue:26
+msgid "That's simple: we loved Grooveshark and we want to build something even better."
+msgstr ""
+
+#: front/src/components/requests/Form.vue:73
+msgid "The Beatles, Mickael Jackson…"
+msgstr ""
+
+#: front/src/App.vue:59
+msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
+msgstr ""
+
+#: front/src/components/Home.vue:124
+msgid "The plaform is free and open-source, you can install it and modify it without worries"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:4
+msgid "The Subsonic API is not available on this Funkwhale instance."
+msgstr ""
+
+#: front/src/components/requests/Form.vue:74
+msgid "The White Album, Thriller…"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:30
+msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:149
+msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled."
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:195
+msgid "This indicate if the remote library granted you access"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:16
+msgid "This is you!"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:37
+msgid "This may affect a lot of elements, please double check this is really what you want."
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:61
+msgid "This track is not imported and cannot be played"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:37
+msgid "This will completely delete this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:27
+msgid "This will completely delete this radio and cannot be undone."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:51
+msgid "This will completely disable access to the Subsonic API using from account."
+msgstr ""
+
+#: front/src/App.vue:137
+msgid "This will erase your local data and disconnect you, do you want to continue?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:36
+msgid "This will log you out from existing devices that use the current password."
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:44
+msgid "This will remove all tracks from this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:6
+#: front/src/components/federation/LibraryTrackTable.vue:47
+#: front/src/components/manage/library/FilesTable.vue:37
+msgid "Title"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:27 src/components/library/Track.vue:174
+#: front/src/components/library/import/BatchDetail.vue:84
+#: front/src/components/metadata/Search.vue:138
+msgid "Track"
+msgstr ""
+
+#: front/src/components/library/Track.vue:53
+msgid "Track information"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:44
+msgid "Track matching filter"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:54
+msgid "tracks"
+msgstr ""
+
+#: front/src/components/library/Album.vue:43
+#: front/src/components/playlists/PlaylistModal.vue:33
+#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50
+#: front/src/views/radios/Detail.vue:34
+msgid "Tracks"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:125
+msgid "Tracks available in this library"
+msgstr ""
+
+#: front/src/components/library/Artist.vue:54
+msgid "Tracks by this artist"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:25
+msgid "Tracks favorited"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:19
+msgid "tracks listened"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:109
+msgid "Trigger scan"
+msgstr ""
+
+#: front/src/components/manage/library/FilesTable.vue:41
+msgid "Type"
+msgstr ""
+
+#: front/src/components/About.vue:15
+msgid "Unfortunately, owners of this instance did not yet take the time to complete this page."
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:95
+msgid "Unknown"
+msgstr ""
+
+#: front/src/components/Home.vue:37
+msgid "Unlimited music"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:264
+msgid "Unmute"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:50
+msgid "Update avatar"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:33
+msgid "Update playlist"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:27
+msgid "Update settings"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:21
+msgid "Update your password"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:172
+#: front/src/views/admin/users/UsersDetail.vue:153
+msgid "Upload"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:45
+msgid "Upload a new avatar"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:7
+msgid "Uploaded files or external source"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:57
+msgid "Uploading..."
+msgstr ""
+
+#: front/src/App.vue:45
+msgid "Use another instance"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:75
+msgid "Use this comment box to add details to your request if needed"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:196
+msgid "Use this flag to enable/disable federation with this library"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:12
+msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:6
+msgid "Use this form to scan an instance and setup federation."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:49
+msgid "Used"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:47
+msgid "User"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:5
+msgid "User activity"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:20
+msgid "User radios"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:19
+#: front/src/components/manage/users/UsersTable.vue:37
+msgid "Username"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:15
+msgid "Username or email"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:13
+msgid "users"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81
+#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3
+#: front/src/views/admin/users/UsersList.vue:21
+msgid "Users"
+msgstr ""
+
+#: front/src/components/library/Album.vue:37 src/components/library/Artist.vue:35
+#: front/src/components/library/Track.vue:44
+#: front/src/components/library/import/ArtistImport.vue:131
+#: front/src/components/metadata/ArtistCard.vue:49
+#: front/src/components/metadata/ReleaseCard.vue:53
+msgid "View on MusicBrainz"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:20
+msgid "We cannot add the track to a playlist"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:14
+msgid "We cannot create the playlist"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:13
+msgid "We cannot create your account"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:7
+msgid "We cannot log you in"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:38
+msgid "We cannot save your avatar"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:14
+msgid "We cannot save your settings"
+msgstr ""
+
+#: front/src/components/Home.vue:130
+msgid "We do not track you or bother you with ads"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:5
+msgid "We recommend using Picard for that purpose."
+msgstr ""
+
+#: front/src/components/Home.vue:7
+msgid "We think listening to music should be simple."
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:10
+msgid "We're sorry, the page you asked for does not exist:"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:21
+msgid "We've received your request, you'll get some groove soon ;)"
+msgstr ""
+
+#: front/src/components/Home.vue:152
+msgid "Welcome"
+msgstr ""
+
+#: front/src/components/Home.vue:5
+msgid "Welcome on Funkwhale"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:114
+msgid "What is metadata?"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:197
+msgid "When enabled, auto importing will automatically import new tracks published in this library"
+msgstr ""
+
+#: front/src/components/Home.vue:24
+msgid "Why funkwhale?"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:124
+msgid "Yes"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:8
+msgid "Yes, log me out!"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:7
+msgid "You are currently logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:111
+msgid "You can also skip this step and enter metadata manually."
+msgstr ""
+
+#: front/src/components/Home.vue:136
+msgid "You can invite friends and family to your instance so they can enjoy your music"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:7
+msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:8
+msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:156
+msgid "You have a radio playing"
+msgstr ""
+
+#: front/src/App.vue:6
+msgid "You need to select an instance in order to continue"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:100
+msgid "You will be logged out from this session and have to log in with the new one"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:71
+msgid "You will have to update your password on your clients that use this password."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:103
+msgid "You will import:"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:24
+msgid "Your email address was confirmed, you can now use the service without limitations."
+msgstr ""
+
+#: front/src/components/favorites/List.vue:109
+msgid "Your Favorites"
+msgstr ""
+
+#: front/src/components/Home.vue:117
+msgid "Your music, your way"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:29
+msgid "Your password has been updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:101
+msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:156
+msgid "%{ count } track was added to your queue"
+msgid_plural "%{ count } tracks were added to your queue"
+msgstr[0] ""
+msgstr[1] ""
diff --git a/front/locales/ar/LC_MESSAGES/app.po b/front/locales/ar/LC_MESSAGES/app.po
new file mode 100644
index 0000000000000000000000000000000000000000..b027ab1eea4c7c012f9632b91059eff25477a0e0
--- /dev/null
+++ b/front/locales/ar/LC_MESSAGES/app.po
@@ -0,0 +1,2536 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Arabic (FunkWhale)\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-07-22 14:12+0200\n"
+"PO-Revision-Date: 2018-07-22 15:50+0000\n"
+"Last-Translator: ButterflyOfFire <butterflyoffire+funkwhale@protonmail.com>\n"
+"Language-Team: Arabic <https://translate.funkwhale.audio/projects/funkwhale/"
+"funkwhale/front/ar/>\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
+"X-Generator: Weblate 2.20\n"
+
+#: front/src/components/playlists/PlaylistModal.vue:9
+msgid "\"%{ title }\", by %{ artist }"
+msgstr "\"%{ title }\"، لِـ %{ artist }"
+
+#: front/src/components/Sidebar.vue:24
+msgid "(%{ index } of %{ length })"
+msgstr "(%{ index } مِن %{ length })"
+
+#: front/src/components/Sidebar.vue:22
+msgid "(empty)"
+msgstr "(فارغ)"
+
+#: front/src/components/common/ActionTable.vue:43
+#: front/src/components/common/ActionTable.vue:51
+msgid "%{ count } on %{ total } selected"
+msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: front/src/components/Sidebar.vue:116
+#: src/views/federation/LibraryDetail.vue:87
+msgid "%{ count } track"
+msgid_plural "%{ count } tracks"
+msgstr[0] ""
+msgstr[1] "%{ count } مَقطَع"
+msgstr[2] ""
+msgstr[3] "%{ count } مَقاطِع"
+msgstr[4] "%{ count } مَقاطِع"
+msgstr[5] "%{ count } مَقاطِع"
+
+#: front/src/components/library/Artist.vue:13
+msgid "%{ count } track in %{ albumsCount } albums"
+msgid_plural "%{ count } tracks in %{ albumsCount } albums"
+msgstr[0] ""
+msgstr[1] "%{ count } مَقطَع في %{ albumsCount } ألبومات"
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] "%{ count } مَقاطِع في %{ albumsCount } ألبومات"
+msgstr[5] "%{ count } مَقاطِع في %{ albumsCount } ألبومات"
+
+#: front/src/components/library/radios/Builder.vue:76
+msgid "%{ count } track matching combined filters"
+msgid_plural "%{ count } tracks matching combined filters"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: front/src/components/playlists/Card.vue:18
+msgid "%{ count} track"
+msgid_plural "%{ count } tracks"
+msgstr[0] ""
+msgstr[1] "%{ count } مَقطَع"
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] "%{ count } مَقاطِع"
+msgstr[5] "%{ count } مَقاطِع"
+
+#: front/src/components/common/Duration.vue:2
+msgid "%{ hours } h %{ minutes } min"
+msgstr ""
+
+#: front/src/components/common/Duration.vue:5
+msgid "%{ minutes } min"
+msgstr ""
+
+#: front/src/components/activity/Like.vue:7
+msgid "%{ user } favorited a track"
+msgstr ""
+
+#: front/src/components/activity/Listen.vue:7
+msgid "%{ user } listened to a track"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:49
+msgid "%{ username }'s profile"
+msgstr "الملف الشخصي لِـ %{ username }"
+
+#: front/src/components/audio/artist/Card.vue:41
+msgid "1 album"
+msgid_plural "%{ count } albums"
+msgstr[0] "ألبوم واحد"
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] "%{ count } ألبومات"
+msgstr[5] "%{ count } ألبومات"
+
+#: front/src/components/favorites/List.vue:10
+msgid "1 favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "مفضّلة واحدة"
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] "%{ count } مفضّلات"
+msgstr[4] "%{ count } مفضّلات"
+msgstr[5] "%{ count } مفضّلات"
+
+#: front/src/components/audio/album/Card.vue:54
+#: front/src/components/federation/LibraryCard.vue:25
+msgid "1 track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "مَقطَع واحد"
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] "%{ count } مَقاطِع"
+msgstr[5] "%{ count } مَقاطِع"
+
+#: front/src/components/About.vue:5
+#, fuzzy
+msgid "About %{ instance }"
+msgstr "عن مثيل الخادوم هذا"
+
+#: front/src/App.vue:54
+msgid "About Funkwhale"
+msgstr "عن فانك وايل Funkwhale"
+
+#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55
+msgid "About this instance"
+msgstr "عن مثيل الخادوم هذا"
+
+#: front/src/components/manage/library/RequestsTable.vue:28
+#: front/src/components/manage/library/RequestsTable.vue:62
+msgid "Accepted"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:111
+msgid "Access disabled"
+msgstr ""
+
+#: front/src/components/Home.vue:109
+msgid "Access your music from a clean interface that focus on what really matters"
+msgstr "صِلوا إلى موسيقاكم عبر واجهة نظيفة التصميم تُركّز فعلًا على الأهمّ"
+
+#: front/src/views/admin/users/UsersDetail.vue:54
+msgid "Account active"
+msgstr "الحساب نشِط"
+
+#: front/src/components/auth/Settings.vue:5
+msgid "Account settings"
+msgstr "إعدادات الحساب"
+
+#: front/src/components/auth/Settings.vue:257
+msgid "Account Settings"
+msgstr "إعدادات الحساب"
+
+#: front/src/components/manage/users/UsersTable.vue:39
+msgid "Account status"
+msgstr "حالة الحساب"
+
+#: front/src/views/auth/PasswordReset.vue:14
+msgid "Account's email"
+msgstr "البريد الإلكتروني الخاص بالحساب"
+
+#: front/src/components/common/ActionTable.vue:82
+msgid "Action %{ action } was launched successfully on %{ count } element"
+msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: front/src/components/common/ActionTable.vue:8
+#: front/src/components/federation/LibraryFollowTable.vue:24
+#: front/src/components/library/radios/Builder.vue:60
+#: front/src/components/manage/library/RequestsTable.vue:54
+msgid "Actions"
+msgstr "الإجراءات"
+
+#: front/src/components/manage/users/UsersTable.vue:53
+msgid "Active"
+msgstr "النشاط"
+
+#: front/src/components/Sidebar.vue:60
+msgid "Activity"
+msgstr "النشاط"
+
+#: front/src/components/federation/LibraryFollowTable.vue:21
+msgid "Actor"
+msgstr ""
+
+#: front/src/views/federation/LibraryList.vue:8
+msgid "Add a new library"
+msgstr "إضافة مكتبة جديدة"
+
+#: front/src/components/library/radios/Builder.vue:46
+msgid "Add filter"
+msgstr "إضافة عامل تصفية"
+
+#: front/src/components/library/radios/Builder.vue:36
+msgid "Add filters to customize your radio"
+msgstr "قم بإضافة عوامل تصفية لتخصيص إذاعتك"
+
+#: front/src/components/audio/PlayButton.vue:53
+msgid "Add to current queue"
+msgstr "إضافة إلى قائمة الانتظار الحالية"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:4
+#: front/src/components/favorites/TrackFavoriteIcon.vue:21
+msgid "Add to favorites"
+msgstr "إضافة إلى المفضلة"
+
+#: front/src/components/playlists/TrackPlaylistIcon.vue:6
+#: front/src/components/playlists/TrackPlaylistIcon.vue:32
+msgid "Add to playlist..."
+msgstr "إضافة إلى قائمة المقاطع الموسيقية …"
+
+#: front/src/components/audio/PlayButton.vue:14
+msgid "Add to queue"
+msgstr "أضِف إلى قائمة الانتظار"
+
+#: front/src/components/playlists/PlaylistModal.vue:116
+msgid "Add to this playlist"
+msgstr "أضفه إلى قائمة التشغيل هذه"
+
+#: front/src/components/playlists/PlaylistModal.vue:54
+msgid "Add track"
+msgstr "إضافة مقطع موسيقي"
+
+#: front/src/components/manage/users/UsersTable.vue:69
+msgid "Admin"
+msgstr "المدير"
+
+#: front/src/components/Sidebar.vue:64
+msgid "Administration"
+msgstr "الإدارة"
+
+#: front/src/components/audio/SearchBar.vue:26
+#: src/components/audio/track/Table.vue:8
+#: front/src/components/federation/LibraryTrackTable.vue:49
+#: front/src/components/library/Album.vue:91
+#: front/src/components/manage/library/FilesTable.vue:39
+#: front/src/components/metadata/Search.vue:134
+msgid "Album"
+msgstr "الألبوم"
+
+#: front/src/components/library/import/ReleaseImport.vue:3
+msgid "Album %{ title } (%{ count } track) by %{ artist }"
+msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }"
+msgstr[0] ""
+msgstr[1] "ألبوم %{ title } (%{ count } tracks) لِـ %{ artist }"
+msgstr[2] ""
+msgstr[3] "ألبوم %{ title } (%{ count } tracks) لِـ %{ artist }"
+msgstr[4] "ألبوم %{ title } (%{ count } tracks) لِـ %{ artist }"
+msgstr[5] "ألبوم %{ title } (%{ count } tracks) لِـ %{ artist }"
+
+#: front/src/components/library/Album.vue:12
+msgid "Album containing %{ count } track, by %{ artist }"
+msgid_plural "Album containing %{ count } tracks, by %{ artist }"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: front/src/components/library/Track.vue:20
+msgid "Album page"
+msgstr "صفحة الألبوم"
+
+#: front/src/components/audio/Search.vue:19
+#: src/components/instance/Stats.vue:48
+#: front/src/components/manage/library/RequestsTable.vue:50
+#: front/src/components/requests/Form.vue:9
+msgid "Albums"
+msgstr "الألبومات"
+
+#: front/src/components/library/Artist.vue:44
+msgid "Albums by this artist"
+msgstr "مِن ألبومات هذا الفنان"
+
+#: front/src/components/manage/library/RequestsTable.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:19
+msgid "All"
+msgstr "الكل"
+
+#: front/src/components/playlists/Editor.vue:13
+msgid "An error occured while saving your changes"
+msgstr "حدث خطأ أثناء عملية حفظ التغييرات"
+
+#: front/src/components/auth/Login.vue:10
+msgid "An unknown error happend, this can mean the server is down or cannot be reached"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:11
+#: front/src/components/library/import/BatchDetail.vue:68
+#: front/src/components/library/import/BatchList.vue:13
+#: front/src/components/library/import/BatchList.vue:22
+msgid "Any"
+msgstr "الكل"
+
+#: front/src/components/library/import/BatchList.vue:24
+msgid "API"
+msgstr "واجهة برمجة التطبيقات API"
+
+#: front/src/components/federation/LibraryFollowTable.vue:68
+#: front/src/components/federation/LibraryFollowTable.vue:78
+msgid "Approve"
+msgstr "وافق"
+
+#: front/src/components/federation/LibraryFollowTable.vue:70
+msgid "Approve access?"
+msgstr "ترخيص النفاذ ؟"
+
+#: front/src/components/federation/LibraryFollowTable.vue:38
+msgid "Approved"
+msgstr "مرخّص"
+
+#: front/src/components/auth/Logout.vue:5
+msgid "Are you sure you want to log out?"
+msgstr "أمتأكد من أنك تريد الخروج ؟"
+
+#: front/src/components/audio/SearchBar.vue:25
+#: src/components/audio/track/Table.vue:7
+#: front/src/components/federation/LibraryTrackTable.vue:48
+#: front/src/components/library/Artist.vue:119
+#: front/src/components/manage/library/FilesTable.vue:38
+#: front/src/components/manage/library/RequestsTable.vue:49
+#: front/src/components/metadata/Search.vue:130
+msgid "Artist"
+msgstr "الفنان"
+
+#: front/src/components/requests/Form.vue:5
+msgid "Artist name"
+msgstr "إسم الفنان"
+
+#: front/src/components/library/Album.vue:22
+#: src/components/library/Track.vue:23
+msgid "Artist page"
+msgstr "صفحة الفنان"
+
+#: front/src/components/audio/Search.vue:65
+msgid "Artist, album, track..."
+msgstr "فنان ، ألبوم ، مقطع موسيقي ..."
+
+#: front/src/components/audio/Search.vue:10
+#: src/components/instance/Stats.vue:42
+#: front/src/components/library/Artists.vue:119
+#: src/components/library/Library.vue:7
+msgid "Artists"
+msgstr "الفنانون"
+
+#: front/src/components/favorites/List.vue:33
+#: front/src/components/federation/LibraryTrackTable.vue:28
+#: front/src/components/library/Artists.vue:25
+#: src/components/library/Radios.vue:44
+#: front/src/components/manage/library/FilesTable.vue:19
+#: front/src/components/manage/library/RequestsTable.vue:19
+#: front/src/components/manage/users/UsersTable.vue:19
+#: front/src/views/federation/LibraryList.vue:28
+#: src/views/playlists/List.vue:27
+msgid "Ascending"
+msgstr "تصاعدي"
+
+#: front/src/views/auth/PasswordReset.vue:27
+msgid "Ask for a password reset"
+msgstr "أطلب إعادة تعيين كلمة المرور"
+
+#: front/src/views/federation/LibraryDetail.vue:56
+msgid "Auto importing"
+msgstr "إستيراد تلقائي"
+
+#: front/src/components/playlists/PlaylistModal.vue:26
+msgid "Available playlists"
+msgstr "قوائم المقاطع الموسيقية المتوفرة"
+
+#: front/src/components/auth/Settings.vue:34
+msgid "Avatar"
+msgstr "الصورة الرمزية"
+
+#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24
+#: front/src/views/auth/PasswordResetConfirm.vue:18
+msgid "Back to login"
+msgstr "العودة إلى صفحة تسجيل الدخول"
+
+#: front/src/views/federation/LibraryFollowersList.vue:5
+msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library."
+msgstr ""
+
+#: front/src/components/library/Track.vue:80
+#: front/src/components/manage/library/FilesTable.vue:42
+msgid "Bitrate"
+msgstr "معدل البت"
+
+#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
+msgid "Browse"
+msgstr "تصفّح"
+
+#: front/src/components/Sidebar.vue:50
+msgid "Browse library"
+msgstr "تصفح المكتبة"
+
+#: front/src/components/library/Artists.vue:4
+msgid "Browsing artists"
+msgstr "استعراض الفنانين"
+
+#: front/src/views/federation/LibraryTrackList.vue:3
+msgid "Browsing federated tracks"
+msgstr "تصفح المَقاطع الموسيقية المتحدة"
+
+#: front/src/views/federation/LibraryFollowersList.vue:3
+msgid "Browsing followers"
+msgstr "إستكشاف المُشاركين"
+
+#: front/src/views/federation/LibraryList.vue:3
+msgid "Browsing libraries"
+msgstr "تصفّح المكتبات"
+
+#: front/src/views/playlists/List.vue:3
+msgid "Browsing playlists"
+msgstr "تصفّح قوائم المَقاطِع الموسيقية"
+
+#: front/src/components/library/Radios.vue:4
+msgid "Browsing radios"
+msgstr "تصفّح الإذاعات"
+
+#: front/src/components/library/radios/Builder.vue:5
+msgid "Builder"
+msgstr "المحرّر"
+
+#: front/src/components/audio/album/Card.vue:13
+msgid "By %{ artist }"
+msgstr "حسب %{ artist }"
+
+#: front/src/components/federation/LibraryFollowTable.vue:57
+msgid "By confirming, %{ username } will be denied access to your library."
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:73
+msgid "By confirming, %{ username } will be granted access to your library."
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:43
+#: front/src/components/common/DangerousButton.vue:17
+#: front/src/components/library/radios/Filter.vue:53
+#: front/src/components/playlists/PlaylistModal.vue:63
+msgid "Cancel"
+msgstr "إلغاء"
+
+#: front/src/components/library/radios/Builder.vue:59
+msgid "Candidates"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:76
+msgid "Cannot change your password"
+msgstr "لا يمكن تغيير كلمة المرور"
+
+#: front/src/App.vue:66
+msgid "Change language"
+msgstr "تغيير اللغة"
+
+#: front/src/components/auth/Settings.vue:67
+msgid "Change my password"
+msgstr "تغيير الكلمة السرية"
+
+#: front/src/components/auth/Settings.vue:95
+msgid "Change password"
+msgstr "تغيير كلمة المرور"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:4
+#: front/src/views/auth/PasswordResetConfirm.vue:62
+msgid "Change your password"
+msgstr "عدّل كلمتك السرية"
+
+#: front/src/components/auth/Settings.vue:96
+msgid "Change your password?"
+msgstr "هل تريد تغيير كلمتك السريّة ؟"
+
+#: front/src/components/playlists/Editor.vue:21
+msgid "Changes synced with server"
+msgstr "تمت مزامنة التعديلات مع السيرفر"
+
+#: front/src/components/auth/Settings.vue:70
+msgid "Changing your password will also change your Subsonic API password if you have requested one."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:98
+msgid "Changing your password will have the following consequences"
+msgstr ""
+
+#: front/src/App.vue:4
+msgid "Choose your instance"
+msgstr "اختر خادومك"
+
+#: front/src/components/Home.vue:64
+msgid "Clean library"
+msgstr "مكتبة موسيقية ذات جودة عالية"
+
+#: front/src/components/manage/users/InvitationForm.vue:37
+msgid "Clear"
+msgstr "امسح"
+
+#: front/src/components/playlists/Editor.vue:40
+#: front/src/components/playlists/Editor.vue:45
+msgid "Clear playlist"
+msgstr "مسح قائمة المَقاطع الموسيقية"
+
+#: front/src/components/audio/Player.vue:270
+msgid "Clear your queue"
+msgstr "مسح قائمة الانتظار الخاصة بك"
+
+#: front/src/components/library/import/BatchList.vue:23
+msgid "CLI"
+msgstr "واجهة إدخال سطر الأوامر CLI"
+
+#: front/src/components/Home.vue:44
+msgid "Click once, listen for hours using built-in radios"
+msgstr "إضغط مرة واحدة و استمع لساعات مِن الموسيقى عبر الإذاعات المُدمَجة"
+
+#: front/src/components/manage/library/RequestsTable.vue:30
+#: front/src/components/manage/library/RequestsTable.vue:64
+msgid "Closed"
+msgstr "مُغلَقة"
+
+#: front/src/components/manage/users/InvitationForm.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:42
+msgid "Code"
+msgstr "الرمز"
+
+#: front/src/components/audio/album/Card.vue:43
+#: front/src/components/audio/artist/Card.vue:33
+#: front/src/components/discussion/Comment.vue:20
+msgid "Collapse"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:51
+#: front/src/components/requests/Form.vue:14
+msgid "Comment"
+msgstr "تعليق"
+
+#: front/src/components/library/radios/Builder.vue:58
+msgid "Config"
+msgstr ""
+
+#: front/src/components/common/DangerousButton.vue:21
+msgid "Confirm"
+msgstr "تأكيد"
+
+#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20
+#: front/src/views/auth/EmailConfirm.vue:51
+msgid "Confirm your email"
+msgstr "تأكيد بريدك الإلكتروني"
+
+#: front/src/views/auth/EmailConfirm.vue:13
+msgid "Confirmation code"
+msgstr "رمز التأكيد"
+
+#: front/src/components/playlists/Editor.vue:163
+msgid "Copy tracks from current queue to playlist"
+msgstr "نسخ المَقاطِع مِن قائمة الإنتظار الحالية إلى قائمة التشغيل"
+
+#: front/src/components/Home.vue:88
+msgid "Covers, lyrics, our goal is to have them all ;)"
+msgstr "أغلِفة الألبومات و كلمات الأغاني، هدفنا هو دمجها جميعا ;)"
+
+#: front/src/components/auth/Signup.vue:4
+msgid "Create a funkwhale account"
+msgstr "أنشئ حسابا على فانك وايل"
+
+#: front/src/components/playlists/Form.vue:2
+msgid "Create a new playlist"
+msgstr "أنشئ قائمة مَقاطِع موسيقية جديدة"
+
+#: front/src/components/auth/Login.vue:17
+msgid "Create an account"
+msgstr "أنشئ حسابا"
+
+#: front/src/components/manage/library/RequestsTable.vue:88
+#: front/src/components/requests/Card.vue:25
+msgid "Create import"
+msgstr "إنشاء استيراد"
+
+#: front/src/components/auth/Signup.vue:51
+msgid "Create my account"
+msgstr "أنشئ حسابي"
+
+#: front/src/components/playlists/Form.vue:34
+msgid "Create playlist"
+msgstr "أنشئ قائمة مَقاطع موسيقية"
+
+#: front/src/components/library/Radios.vue:23
+msgid "Create your own radio"
+msgstr "أنشئ إذاعتك"
+
+#: front/src/components/federation/LibraryFollowTable.vue:22
+#: front/src/components/manage/library/RequestsTable.vue:52
+#: front/src/components/manage/users/InvitationsTable.vue:40
+msgid "Creation date"
+msgstr "تاريخ الإنشاء"
+
+#: front/src/components/auth/Settings.vue:54
+#, fuzzy
+msgid "Current avatar"
+msgstr "المَقطَع الحالي"
+
+#: front/src/components/playlists/PlaylistModal.vue:8
+msgid "Current track"
+msgstr "المَقطَع الحالي"
+
+#: front/src/components/manage/library/FilesTable.vue:189
+#: front/src/components/manage/library/RequestsTable.vue:195
+#: front/src/components/manage/users/InvitationsTable.vue:166
+#: front/src/views/playlists/Detail.vue:33
+msgid "Delete"
+msgstr "حذف"
+
+#: front/src/views/playlists/Detail.vue:38
+msgid "Delete playlist"
+msgstr "حذف قائمة الأغاني"
+
+#: front/src/views/radios/Detail.vue:28
+msgid "Delete radio"
+msgstr "حذف الإذاعة"
+
+#: front/src/components/federation/LibraryFollowTable.vue:52
+#: front/src/components/federation/LibraryFollowTable.vue:63
+msgid "Deny"
+msgstr "رفض"
+
+#: front/src/components/federation/LibraryFollowTable.vue:54
+msgid "Deny access?"
+msgstr "هل تؤكد رفض الوصول ؟"
+
+#: front/src/components/favorites/List.vue:34
+#: front/src/components/federation/LibraryTrackTable.vue:29
+#: front/src/components/library/Artists.vue:26
+#: src/components/library/Radios.vue:47
+#: front/src/components/manage/library/FilesTable.vue:20
+#: front/src/components/manage/library/RequestsTable.vue:20
+#: front/src/components/manage/users/UsersTable.vue:20
+#: front/src/views/federation/LibraryList.vue:29
+#: src/views/playlists/List.vue:28
+msgid "Descending"
+msgstr "تنازليًا"
+
+#: front/src/components/federation/LibraryCard.vue:50
+msgid "Detail"
+msgstr "التفاصيل"
+
+#: front/src/views/admin/users/UsersDetail.vue:146
+msgid "Determine if the user account is active or not. Inactive users cannot login or use the service."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:104
+#: front/src/components/auth/SubsonicTokenForm.vue:52
+msgid "Disable access"
+msgstr "تعطيل النفاذ"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:49
+msgid "Disable Subsonic access"
+msgstr "تعطيل النفاذ عبر صاب سونيك Subsonic"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:50
+msgid "Disable Subsonic API access?"
+msgstr "تعطيل النفاذ عبر واجهة برمجة التطبيقات صاب سونيك ؟"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:14
+msgid "Discover how to use Funkwhale from other apps"
+msgstr "إكتشف كيفية استخدام فانك وايل Funkwhale عبر التطبيقات الأخرى"
+
+#: front/src/components/library/radios/Builder.vue:26
+msgid "Display publicly"
+msgstr "إعرضها للعامة"
+
+#: front/src/components/playlists/Editor.vue:42
+msgid "Do you want to clear the playlist \"%{ playlist }\"?"
+msgstr "هل تودّ إفراغ قائمة المَقاطِع الموسيقية \"%{ playlist }\" ؟"
+
+#: front/src/components/common/DangerousButton.vue:7
+msgid "Do you want to confirm this action?"
+msgstr "هل تؤكّد هذا الإجراء ؟"
+
+#: front/src/views/playlists/Detail.vue:35
+msgid "Do you want to delete the playlist \"%{ playlist }\"?"
+msgstr "متأكّد مِن أنك تريد حذف قائمة المَقاطِع الموسيقية \"%{ playlist }\" ؟"
+
+#: front/src/views/radios/Detail.vue:26
+#, fuzzy
+msgid "Do you want to delete the radio \"%{ radio }\"?"
+msgstr "أتريد حقا حذف إذاعة \"{{ radio }}\" ؟"
+
+#: front/src/components/common/ActionTable.vue:29
+msgid "Do you want to launch %{ action } on %{ count } element?"
+msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: front/src/components/Sidebar.vue:113
+msgid "Do you want to restore your previous queue?"
+msgstr "هل تريد استرجاع قائمة الإنتظار السابقة للأغاني ؟"
+
+#: front/src/App.vue:38
+msgid "Documentation"
+msgstr "الدليل"
+
+#: front/src/components/audio/track/Table.vue:24
+#: src/components/library/Track.vue:48
+msgid "Download"
+msgstr "تنزيل"
+
+#: front/src/components/audio/track/Table.vue:27
+msgid "Download tracks"
+msgstr "تنزيل"
+
+#: front/src/components/playlists/Editor.vue:49
+msgid "Drag and drop rows to reorder tracks in the playlist"
+msgstr ""
+
+#: front/src/components/library/Track.vue:58
+#: front/src/components/manage/library/FilesTable.vue:43
+msgid "Duration"
+msgstr "المدّة"
+
+#: front/src/components/Home.vue:96
+msgid "Easy to use"
+msgstr "سهل للإستخدام"
+
+#: front/src/components/About.vue:21
+msgid "Edit instance info"
+msgstr "تعديل معلومات مثيل الخادوم"
+
+#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30
+msgid "Edit..."
+msgstr "تعديل …"
+
+#: front/src/components/auth/Signup.vue:29
+#: front/src/components/manage/users/UsersTable.vue:38
+msgid "Email"
+msgstr "البريد الإلكتروني"
+
+#: front/src/views/admin/users/UsersDetail.vue:29
+msgid "Email address"
+msgstr "عنوان البريد الإلكتروني"
+
+#: front/src/views/auth/EmailConfirm.vue:23
+msgid "Email confirmed"
+msgstr "عنوان البريد الإلكتروني مؤكَّد"
+
+#: front/src/views/playlists/Detail.vue:29
+msgid "End edition"
+msgstr "إنهاء التعديل"
+
+#: front/src/components/library/import/FileUpload.vue:4
+msgid "Ensure your music files are properly tagged before uploading them."
+msgstr "تأكّد مِن احتواء ملفات الموسيقى على بيانات وصفية صحيحة قبل إرسالها."
+
+#: front/src/components/library/Radios.vue:140
+msgid "Enter a radio name..."
+msgstr "أدخِل إسم إذاعة …"
+
+#: front/src/components/library/Artists.vue:118
+msgid "Enter an artist name..."
+msgstr "أدخِل إسم فنان …"
+
+#: front/src/views/federation/LibraryList.vue:122
+msgid "Enter an library domain name..."
+msgstr "أدخِل إسم نطاق لمكتبة ما …"
+
+#: front/src/views/playlists/List.vue:104
+msgid "Enter an playlist name..."
+msgstr "أدخِل إسم قائمة مَقاطِعٍ موسيقية …"
+
+#: front/src/components/auth/Signup.vue:98
+msgid "Enter your email"
+msgstr "أدخِل عنوان بريدك الإلكتروني"
+
+#: front/src/components/auth/Signup.vue:96
+msgid "Enter your invitation code (case insensitive)"
+msgstr "أدخِل رمز الدعوة"
+
+#: front/src/components/metadata/Search.vue:114
+msgid "Enter your search query..."
+msgstr "أدخِل طلب بحثِك …"
+
+#: front/src/components/auth/Signup.vue:97
+msgid "Enter your username"
+msgstr "أدخِل إسم المستخدِم"
+
+#: front/src/components/auth/Login.vue:77
+msgid "Enter your username or email"
+msgstr "أدخل إسم المستخدِم أو البريد الإلكتروني"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:20
+msgid "Error"
+msgstr "خطأ"
+
+#: front/src/views/admin/Settings.vue:87
+msgid "Error reporting"
+msgstr "سِجِل الأخطاء"
+
+#: front/src/components/common/ActionTable.vue:75
+msgid "Error while applying action"
+msgstr "حدث خطأ أثناء تطبيق الإجراء"
+
+#: front/src/views/auth/PasswordReset.vue:7
+msgid "Error while asking for a password reset"
+msgstr "حدث خطأ أثناء إرسال طلب إعادة تعيين الكلمة السرية"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:7
+msgid "Error while changing your password"
+msgstr "حدث خطأ أثناء عملية تعديل الكلمة السرية"
+
+#: front/src/views/auth/EmailConfirm.vue:7
+msgid "Error while confirming your email"
+msgstr "حدث خطأ أثناء تأكيد عنوان بريدك الإلكتروني"
+
+#: front/src/components/manage/users/InvitationForm.vue:4
+msgid "Error while creating invitation"
+msgstr "حدث خطأ أثناء إنشاء الدعوة"
+
+#: front/src/components/admin/SettingsGroup.vue:5
+msgid "Error while saving settings"
+msgstr "حدث خطأ أثناء حفظ الإعدادات"
+
+#: front/src/components/federation/LibraryForm.vue:10
+msgid "Error while scanning library"
+msgstr "حدث خطأ أثناء عملية مسح المكتبة"
+
+#: front/src/components/library/import/BatchDetail.vue:41
+#: front/src/components/library/import/BatchDetail.vue:70
+#: front/src/components/library/import/BatchList.vue:15
+msgid "Errored"
+msgstr "فيه خطأ"
+
+#: front/src/components/playlists/Form.vue:89
+msgid "Everyone"
+msgstr "الجميع"
+
+#: front/src/components/playlists/Form.vue:85
+msgid "Everyone on this instance"
+msgstr "كل مَن هم على مثيل الخادوم هذا"
+
+#: front/src/components/library/radios/Builder.vue:57
+msgid "Exclude"
+msgstr "إستثني"
+
+#: front/src/components/discussion/Comment.vue:14
+msgid "Expand"
+msgstr "توسيع"
+
+#: front/src/components/manage/users/InvitationsTable.vue:41
+msgid "Expiration date"
+msgstr "تاريخ نهاية الصلاحية"
+
+#: front/src/components/manage/users/InvitationsTable.vue:50
+msgid "Expired"
+msgstr "منتهية الصلاحيّة"
+
+#: front/src/components/manage/users/InvitationsTable.vue:21
+msgid "Expired/used"
+msgstr "إنتهت صلاحيتها/ أو مستعمَلة"
+
+#: front/src/components/library/import/Main.vue:65
+msgid "External source. Supported backends"
+msgstr "مصدر خارجي. الخدمات المدعومة"
+
+#: front/src/components/Sidebar.vue:51
+msgid "Favorites"
+msgstr "المفضلة"
+
+#: front/src/components/federation/LibraryForm.vue:3
+msgid "Federate with a new instance"
+msgstr "إتّحد مع مثيل خادوم جديد"
+
+#: front/src/views/federation/LibraryTrackList.vue:21
+msgid "Federated tracks"
+msgstr "المَقاطع الموسيقية المتحدة"
+
+#: front/src/components/Sidebar.vue:87
+#: src/components/library/import/BatchList.vue:25
+#: front/src/components/manage/users/UsersTable.vue:180
+#: front/src/views/admin/Settings.vue:84
+#: src/views/admin/users/UsersDetail.vue:161
+#: front/src/views/federation/Base.vue:35
+#: src/views/federation/LibraryDetail.vue:40
+msgid "Federation"
+msgstr "الفديرالية"
+
+#: front/src/views/federation/LibraryDetail.vue:3
+msgid "File mirroring"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:43
+msgid "File name"
+msgstr "إسم الملفّ"
+
+#: front/src/components/library/import/Main.vue:76
+msgid "File upload"
+msgstr "إرسال ملفّ"
+
+#: front/src/views/admin/library/Base.vue:5
+#: src/views/admin/library/FilesList.vue:21
+msgid "Files"
+msgstr "الملفّات"
+
+#: front/src/components/library/import/ArtistImport.vue:7
+msgid "Filter album types"
+msgstr "تصفية نوع الألبومات"
+
+#: front/src/components/library/radios/Builder.vue:56
+msgid "Filter name"
+msgstr "إسم عامل التصفية"
+
+#: front/src/components/library/import/Main.vue:52
+msgid "Finish import"
+msgstr "إنهاء الإستيراد"
+
+#: front/src/components/library/import/BatchDetail.vue:54
+msgid "Finished"
+msgstr "إكتمل"
+
+#: front/src/components/library/import/Main.vue:59
+msgid "First, choose where you want to import the music from"
+msgstr "أولًا قم باختيار أسلوب استيراد و جلب الموسيقى"
+
+#: front/src/components/federation/LibraryCard.vue:44
+msgid "Follow"
+msgstr "إتبع"
+
+#: front/src/components/federation/LibraryCard.vue:36
+msgid "Follow request pending approval"
+msgstr "طلبات متابعة مُعلّقة"
+
+#: front/src/views/federation/LibraryDetail.vue:21
+msgid "Follow status"
+msgstr "حالة الإشتراك"
+
+#: front/src/views/federation/Base.vue:13
+#: front/src/views/federation/LibraryFollowersList.vue:24
+msgid "Followers"
+msgstr "المتابِعون"
+
+#: front/src/components/federation/LibraryCard.vue:18
+msgid "Followers only"
+msgstr "المتابِعون فقط"
+
+#: front/src/components/federation/LibraryCard.vue:15
+#: front/src/views/federation/LibraryDetail.vue:29
+msgid "Following"
+msgstr "يُتابِع"
+
+#: front/src/components/activity/Like.vue:12
+#: src/components/activity/Listen.vue:12
+msgid "from %{ album } by %{ artist }"
+msgstr "مِن %{ album } لِـ %{ artist }"
+
+#: front/src/components/library/Track.vue:13
+msgid "From album %{ album } by %{ artist }"
+msgstr "مِن ألبوم %{ album } لِـ %{ artist }"
+
+#: front/src/App.vue:56
+msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!"
+msgstr "فانك وايل Funkwhale مشروع حُر و مفتوح المصدر يديره متطوعون. يمكنك مساعدتنا على تحسين المنصة عن طريق الإبلاغ عن أخطاء، و اقتراح ميزات بما في ذلك مشاركة المشروع مع أصدقائك !"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgid "Funkwhale is compatible with other music players that support the Subsonic API."
+msgstr "فانك وايل Funkwhale متوافق مع برمجيات تشغيل الموسيقى التي تدعم واجهة برمجية تطبيقات صاب سونيك."
+
+#: front/src/components/Home.vue:98
+msgid "Funkwhale is dead simple to use."
+msgstr "فانك وايل Funkwhale سهلٌ جدًا للإستخدام."
+
+#: front/src/components/Home.vue:39
+msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists."
+msgstr "طُوِّر فانك وايل Funkwhale لتسهيل الإستماع إلى الموسيقى التي تحبونها و لاكتشاف فنّانين جُدد."
+
+#: front/src/components/Home.vue:119
+msgid "Funkwhale is free and gives you control on your music."
+msgstr "فانك وايل Funkwhale مجاني و يُعيد التحكّم في موسيقاكم بين أيديكم."
+
+#: front/src/components/Home.vue:66
+msgid "Funkwhale takes care of handling your music"
+msgstr "فانك وايل Funkwhale يُحافظ على موسيقاكم"
+
+#: front/src/components/manage/users/InvitationForm.vue:16
+msgid "Get a new invitation"
+msgstr "تحصّل على دعوة جديدة"
+
+#: front/src/components/Home.vue:13
+msgid "Get me to the library"
+msgstr "أنقلني إلى المكتبة"
+
+#: front/src/components/Home.vue:77
+msgid ""
+"Get quality metadata about your music thanks to\n"
+"              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
+msgstr ""
+"أحصلوا على بيانات وصفية ذات جودة بفضل\n"
+"              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
+
+#: front/src/components/common/ActionTable.vue:21
+#: front/src/components/common/ActionTable.vue:27
+msgid "Go"
+msgstr "هيا"
+
+#: front/src/components/PageNotFound.vue:14
+msgid "Go to home page"
+msgstr "إنتقل إلى الصفحة الرئيسية"
+
+#: front/src/components/library/import/Main.vue:13
+msgid "Grab corresponding metadata"
+msgstr "جلب البيانات الوصفية ذات الصّلة"
+
+#: front/src/App.vue:74
+msgid "Help us translate Funkwhale"
+msgstr ""
+
+#: front/src/components/library/Home.vue:65
+msgid "Home"
+msgstr "الرئيسية"
+
+#: front/src/components/instance/Stats.vue:36
+msgid "Hours of music"
+msgstr "ساعات مِن الموسيقى"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:11
+msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:34
+msgid "ID"
+msgstr "المعرّف"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:24
+msgid "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."
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:196
+#: front/src/components/library/Library.vue:17
+msgid "Import"
+msgstr "استيراد"
+
+#: front/src/components/federation/LibraryTrackTable.vue:57
+msgid "Import #%{ id } launched"
+msgstr "إنطلَقت عملية الإستيراد #%{ id }"
+
+#: front/src/components/library/import/Main.vue:38
+msgid "Import %{ count } track"
+msgid_plural "Import %{ count } tracks"
+msgstr[0] "إستيراد %{ count } مَقطَع"
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] "إستيراد %{ count } مَقاطِع"
+msgstr[4] "إستيراد %{ count } مَقاطِع"
+msgstr[5] "إستيراد %{ count } مَقاطِع"
+
+#: front/src/components/library/import/BatchDetail.vue:10
+msgid "Import batch"
+msgstr "إستيراد بالجملة"
+
+#: front/src/components/library/import/BatchDetail.vue:185
+msgid "Import Batch #%{ id }"
+msgstr ""
+
+#: front/src/components/library/Library.vue:20
+msgid "Import batches"
+msgstr "حُزم الإستيراد بالجملة"
+
+#: front/src/components/library/import/BatchList.vue:117
+msgid "Import Batches"
+msgstr ""
+
+#: front/src/components/manage/library/FilesTable.vue:40
+#: front/src/components/manage/library/RequestsTable.vue:53
+msgid "Import date"
+msgstr "تاريخ الإستيراد"
+
+#: front/src/components/library/import/FileUpload.vue:38
+msgid "Import detail page"
+msgstr "إستيراد تفاصيل الصفحة"
+
+#: front/src/components/Sidebar.vue:81
+msgid "Import music"
+msgstr "استيراد الموسيقى"
+
+#: front/src/components/library/import/Main.vue:267
+msgid "Import Music"
+msgstr "استيراد الموسيقى"
+
+#: front/src/components/Home.vue:71
+msgid "Import music from various platforms, such as YouTube or SoundCloud"
+msgstr "استيراد الموسيقى من منصات مختلفة، مثل يوتيوب أو ساوند كلاود"
+
+#: front/src/components/federation/LibraryTrackTable.vue:14
+#: front/src/components/federation/LibraryTrackTable.vue:66
+msgid "Import pending"
+msgstr "الواردات المعلّقة"
+
+#: front/src/views/admin/library/Base.vue:9
+#: front/src/views/admin/library/RequestsList.vue:3
+#: front/src/views/admin/library/RequestsList.vue:21
+msgid "Import requests"
+msgstr "طلبات الإستيراد"
+
+#: front/src/components/library/import/BatchList.vue:20
+#: front/src/components/library/import/Main.vue:6
+msgid "Import source"
+msgstr "مصدر الإستيراد"
+
+#: front/src/components/federation/LibraryTrackTable.vue:9
+msgid "Import status"
+msgstr "حالة الإستيراد"
+
+#: front/src/components/library/import/ReleaseImport.vue:14
+msgid "Import this release"
+msgstr "أجلب هذا الألبوم"
+
+#: front/src/components/library/import/TrackImport.vue:11
+msgid "Import this track"
+msgstr "استورد هذا المَقطع"
+
+#: front/src/components/federation/LibraryTrackTable.vue:12
+#: front/src/components/manage/library/RequestsTable.vue:29
+#: front/src/components/manage/library/RequestsTable.vue:61
+msgid "Imported"
+msgstr "تم استيراده"
+
+#: front/src/components/library/import/TrackImport.vue:44
+msgid "Imported URL"
+msgstr "تم استيراد عنوان الرابط"
+
+#: front/src/views/admin/Settings.vue:82
+msgid "Imports"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:3
+msgid "In favorites"
+msgstr "في المفضلة"
+
+#: front/src/components/federation/LibraryTrackTable.vue:65
+msgid "In library"
+msgstr "على المكتبة"
+
+#: front/src/components/manage/users/UsersTable.vue:54
+msgid "Inactive"
+msgstr "غير ناشط"
+
+#: front/src/components/library/import/Main.vue:96
+msgid "Input a MusicBrainz ID manually:"
+msgstr "أدخِل يدويًا مُعرّف MusicBrainz ID :"
+
+#: front/src/views/auth/PasswordReset.vue:53
+msgid "Input the email address binded to your account"
+msgstr "أدخِل عنوان البريد الإلكتروني المتّصل بحسابك"
+
+#: front/src/components/playlists/Editor.vue:31
+msgid "Insert from queue (%{ count } track)"
+msgid_plural "Insert from queue (%{ count } tracks)"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: front/src/views/admin/Settings.vue:80
+msgid "Instance information"
+msgstr "معلومات عن مثيل الخادوم"
+
+#: front/src/components/library/Radios.vue:9
+#, fuzzy
+msgid "Instance radios"
+msgstr "معلومات عن مثيل الخادوم"
+
+#: front/src/views/admin/Settings.vue:75
+msgid "Instance settings"
+msgstr "إعدادات مثيل الخادوم"
+
+#: front/src/views/instance/Timeline.vue:57
+msgid "Instance Timeline"
+msgstr "الخيط الزمني لمثيل الخادوم"
+
+#: front/src/components/auth/Signup.vue:42
+#: front/src/components/manage/users/InvitationForm.vue:11
+msgid "Invitation code"
+msgstr "رمز الدعوة"
+
+#: front/src/components/auth/Signup.vue:43
+msgid "Invitation code (optional)"
+msgstr "رمز الدعوة (اختياري)"
+
+#: front/src/views/admin/users/Base.vue:8
+#: src/views/admin/users/InvitationsList.vue:3
+#: front/src/views/admin/users/InvitationsList.vue:24
+msgid "Invitations"
+msgstr "الدعوات"
+
+#: front/src/App.vue:43
+msgid "Issue tracker"
+msgstr "متعقّب المشاكل"
+
+#: front/src/components/library/import/BatchDetail.vue:80
+msgid "Job ID"
+msgstr "مُعرّف الإجراء"
+
+#: front/src/components/library/import/BatchList.vue:36
+msgid "Jobs"
+msgstr "الإجراءات"
+
+#: front/src/components/Home.vue:50
+msgid "Keep a track of your favorite songs"
+msgstr "حافظوا على أثر موسيقاكم و أغانيكم المفضّلة"
+
+#: front/src/components/audio/track/Table.vue:33
+msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:41
+#: front/src/views/admin/users/UsersDetail.vue:45
+msgid "Last activity"
+msgstr "آخر نشاط"
+
+#: front/src/views/federation/LibraryDetail.vue:101
+msgid "Last fetched"
+msgstr "آخِر عملية جلب"
+
+#: front/src/components/playlists/PlaylistModal.vue:32
+msgid "Last modification"
+msgstr "آخر تعديل"
+
+#: front/src/components/common/ActionTable.vue:39
+msgid "Launch"
+msgstr "إبدأ"
+
+#: front/src/components/library/import/BatchDetail.vue:18
+#: front/src/components/library/import/BatchList.vue:35
+msgid "Launch date"
+msgstr "تاريخ الإطلاق"
+
+#: front/src/components/federation/LibraryForm.vue:31
+msgid "Launch scan"
+msgstr "إبدأ المسح"
+
+#: front/src/components/Home.vue:10
+msgid "Learn more about this instance"
+msgstr "إعرف المزيد عن مثيل الخادوم هذا"
+
+#: front/src/components/manage/users/InvitationForm.vue:58
+msgid "Leave empty for a random code"
+msgstr "أتركه فارغًا للحصول على رمز عشوائي"
+
+#: front/src/components/requests/Form.vue:10
+msgid "Leave this field empty if you're requesting the whole discography."
+msgstr "دع هذا الحقل فارغا إن كنت ترغب في كافة الألبومات."
+
+#: front/src/views/federation/Base.vue:5
+#: src/views/federation/LibraryList.vue:123
+msgid "Libraries"
+msgstr "المكتبات"
+
+#: front/src/components/Sidebar.vue:70
+#: front/src/components/federation/LibraryTrackTable.vue:51
+#: front/src/components/instance/Stats.vue:30
+#: front/src/components/manage/users/UsersTable.vue:176
+#: front/src/views/admin/users/UsersDetail.vue:157
+#: front/src/views/federation/LibraryDetail.vue:194
+msgid "Library"
+msgstr "المكتبة"
+
+#: front/src/views/admin/library/FilesList.vue:3
+msgid "Library files"
+msgstr "ملفّات المكتبة"
+
+#: front/src/components/federation/LibraryForm.vue:20
+msgid "Library name"
+msgstr "إسم المكتبة"
+
+#: front/src/views/federation/LibraryDetail.vue:84
+msgid "Library size"
+msgstr "حجم المكتبة"
+
+#: front/src/components/federation/LibraryForm.vue:96
+msgid "library@demo.funkwhale.audio"
+msgstr "library@demo.funkwhale.audio"
+
+#: front/src/App.vue:29
+msgid "Links"
+msgstr "الروابط"
+
+#: front/src/views/instance/Timeline.vue:4
+msgid "Loading timeline..."
+msgstr "عملية تحميل الخيط الزمني جارية …"
+
+#: front/src/components/favorites/List.vue:5
+msgid "Loading your favorites..."
+msgstr "جارٍ تحميل مفضلاتك …"
+
+#: front/src/components/auth/Login.vue:78
+msgid "Log In"
+msgstr "الدخول"
+
+#: front/src/components/auth/Login.vue:4
+msgid "Log in to your Funkwhale account"
+msgstr "الدخول إلى حسابك على فانك وايل Funkwhale"
+
+#: front/src/components/auth/Logout.vue:20
+msgid "Log Out"
+msgstr "الخروج"
+
+#: front/src/components/Sidebar.vue:38
+msgid "Logged in as %{ username }"
+msgstr "مُتّصل كـ %{ username }"
+
+#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41
+msgid "Login"
+msgstr "الدخول"
+
+#: front/src/components/Sidebar.vue:43
+msgid "Logout"
+msgstr "خروج"
+
+#: front/src/components/audio/Player.vue:266
+msgid "Looping disabled. Click to switch to single-track looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:267
+msgid "Looping on a single track. Click to switch to whole queue looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:268
+msgid "Looping on whole queue. Click to disable looping."
+msgstr ""
+
+#: front/src/components/library/Track.vue:94
+msgid "Lyrics"
+msgstr "الكلمات"
+
+#: front/src/views/admin/library/Base.vue:25
+msgid "Manage library"
+msgstr "إدارة المكتبة"
+
+#: front/src/components/playlists/PlaylistModal.vue:3
+msgid "Manage playlists"
+msgstr "إدارة قوائم المَقاطِع الموسيقية"
+
+#: front/src/views/admin/users/Base.vue:20
+msgid "Manage users"
+msgstr "إدارة المستخدِمين"
+
+#: front/src/views/playlists/List.vue:8
+msgid "Manage your playlists"
+msgstr "إدارة القوائم الخاصة الموسيقى"
+
+#: front/src/components/manage/library/RequestsTable.vue:197
+msgid "Mark as closed"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:196
+msgid "Mark as imported"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:12
+msgid "Metadata"
+msgstr "البيانات الوصفية"
+
+#: front/src/components/library/import/Main.vue:115
+msgid ""
+"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n"
+"            <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"              MusicBrainz\n"
+"            </a>\n"
+"            project, which you can think about as the Wikipedia of music."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:48
+#: src/components/library/import/Main.vue:18
+msgid "Music"
+msgstr "الموسيقى"
+
+#: front/src/components/library/import/Main.vue:147
+msgid "Music request"
+msgstr "طلب موسيقى"
+
+#: front/src/components/audio/Player.vue:265
+msgid "Mute"
+msgstr "كتم"
+
+#: front/src/components/Sidebar.vue:34
+msgid "My account"
+msgstr "حسابي"
+
+#: front/src/components/playlists/Form.vue:74
+msgid "My awesome playlist"
+msgstr "قائمتي الرائعة للمَقاطِع الموسيقية"
+
+#: front/src/components/library/radios/Builder.vue:227
+msgid "My awesome radio"
+msgstr "إذاعتي الرائعة"
+
+#: front/src/components/library/Track.vue:64
+#: src/components/library/Track.vue:75
+#: front/src/components/library/Track.vue:86
+#: front/src/components/manage/library/FilesTable.vue:63
+#: front/src/components/manage/library/FilesTable.vue:69
+#: front/src/components/manage/library/FilesTable.vue:75
+#: front/src/components/manage/library/FilesTable.vue:81
+#: front/src/components/manage/library/RequestsTable.vue:71
+#: front/src/components/manage/library/RequestsTable.vue:75
+#: front/src/components/manage/library/RequestsTable.vue:82
+#: front/src/components/manage/users/UsersTable.vue:61
+#: front/src/views/admin/users/UsersDetail.vue:49
+msgid "N/A"
+msgstr "غير متوفر"
+
+#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/views/admin/users/UsersDetail.vue:21
+msgid "Name"
+msgstr "الإسم"
+
+#: front/src/components/auth/Settings.vue:88
+#: front/src/views/auth/PasswordResetConfirm.vue:14
+msgid "New password"
+msgstr "الكلمة السرية الجديدة"
+
+#: front/src/components/Sidebar.vue:158
+msgid "New tracks will be appended here automatically."
+msgstr "سوف يتم إضافة المَقاطِع الجديدة هنا آليًا."
+
+#: front/src/components/library/import/Main.vue:29
+msgid "Next step"
+msgstr "الخطوة التالية"
+
+#: front/src/components/audio/Player.vue:263
+msgid "Next track"
+msgstr "المَقطَع التالي"
+
+#: front/src/components/Sidebar.vue:125
+msgid "No"
+msgstr "لا"
+
+#: front/src/components/Home.vue:103
+msgid "No add-ons, no plugins : you only need a web library"
+msgstr "لا تحتاج إلى تنصيب إضافاتٍ أو مُلحَقاتٍ : كل ما تحتاج إليه هي مكتبة موسيقية على الويب"
+
+#: front/src/components/library/Track.vue:102
+msgid "No lyrics available for this track."
+msgstr "لا تتوفّر هناك كلمات لهذا المَقطَع."
+
+#: front/src/components/playlists/Form.vue:81
+msgid "Nobody except me"
+msgstr "لا أحد غيري"
+
+#: front/src/views/federation/LibraryDetail.vue:32
+msgid "Not following"
+msgstr "غير مشترِك"
+
+#: front/src/components/federation/LibraryTrackTable.vue:13
+#: front/src/components/federation/LibraryTrackTable.vue:67
+msgid "Not imported"
+msgstr "غير مُستورَد"
+
+#: front/src/components/manage/users/InvitationsTable.vue:51
+msgid "Not used"
+msgstr "غير مستعمَل"
+
+#: front/src/App.vue:37
+msgid "Official website"
+msgstr "موقع الويب الرسمي"
+
+#: front/src/components/auth/Settings.vue:83
+msgid "Old password"
+msgstr "الكلمة السرية الجديدة"
+
+#: front/src/components/library/import/FileUpload.vue:36
+msgid "Once all your files are uploaded, simply click the following button to check the import status."
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:21
+#: front/src/components/manage/users/InvitationsTable.vue:20
+msgid "Open"
+msgstr "مفتوح"
+
+#: front/src/App.vue:63
+msgid "Options"
+msgstr "الخيارات"
+
+#: front/src/components/library/import/Main.vue:93
+msgid "Or"
+msgstr "أو"
+
+#: front/src/components/favorites/List.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:18
+#: front/src/components/library/Artists.vue:15
+#: src/components/library/Radios.vue:33
+#: front/src/components/manage/library/FilesTable.vue:9
+#: front/src/components/manage/library/RequestsTable.vue:9
+#: front/src/components/manage/users/InvitationsTable.vue:9
+#: front/src/components/manage/users/UsersTable.vue:9
+#: front/src/views/federation/LibraryList.vue:18
+#: src/views/playlists/List.vue:17
+msgid "Ordering"
+msgstr "الترتيب"
+
+#: front/src/components/favorites/List.vue:31
+#: front/src/components/federation/LibraryTrackTable.vue:26
+#: front/src/components/library/Artists.vue:23
+#: src/components/library/Radios.vue:41
+#: front/src/components/manage/library/FilesTable.vue:17
+#: front/src/components/manage/library/RequestsTable.vue:17
+#: front/src/components/manage/users/UsersTable.vue:17
+#: front/src/views/federation/LibraryList.vue:26
+#: src/views/playlists/List.vue:25
+msgid "Ordering direction"
+msgstr "اتجاه الترتيب"
+
+#: front/src/components/manage/users/InvitationsTable.vue:38
+msgid "Owner"
+msgstr "المالك"
+
+#: front/src/components/PageNotFound.vue:33
+msgid "Page Not Found"
+msgstr "الصفحة غير موجودة"
+
+#: front/src/components/PageNotFound.vue:7
+msgid "Page not found!"
+msgstr "الصفحة غير موجودة !"
+
+#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38
+msgid "Password"
+msgstr "كلمة السر"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:95
+msgid "Password updated"
+msgstr "تم تحديث كلمة السر"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:28
+msgid "Password updated successfully"
+msgstr "تم تحديث كلمة السر بنجاح"
+
+#: front/src/components/audio/Player.vue:262
+msgid "Pause track"
+msgstr "ألبِث المَقطَع"
+
+#: front/src/components/federation/LibraryFollowTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:33
+#: front/src/components/library/import/BatchDetail.vue:69
+#: front/src/components/library/import/BatchList.vue:14
+#: front/src/components/library/import/FileUpload.vue:59
+#: front/src/components/manage/library/RequestsTable.vue:27
+#: front/src/components/manage/library/RequestsTable.vue:63
+msgid "Pending"
+msgstr "معلّق"
+
+#: front/src/components/federation/LibraryFollowTable.vue:11
+#: front/src/views/federation/LibraryDetail.vue:26
+msgid "Pending approval"
+msgstr "في انتظار التسريح"
+
+#: front/src/components/Sidebar.vue:217
+msgid "Pending follow requests"
+msgstr "طلبات المتابَعة المعلَّقة"
+
+#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26
+msgid "Pending import requests"
+msgstr "طلبات الإستيراد المعلّقة"
+
+#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36
+msgid "Pending requests"
+msgstr "الطلبات المعلَّقة"
+
+#: front/src/components/manage/users/UsersTable.vue:42
+#: front/src/views/admin/users/UsersDetail.vue:68
+msgid "Permissions"
+msgstr "الصّلاحيّات"
+
+#: front/src/components/audio/PlayButton.vue:9
+#: src/components/library/Track.vue:30
+msgid "Play"
+msgstr "غنّي"
+
+#: front/src/components/audio/album/Card.vue:50
+#: front/src/components/audio/artist/Card.vue:44
+#: src/components/library/Album.vue:28 front/src/views/playlists/Detail.vue:23
+msgid "Play all"
+msgstr "تشغيل الكل"
+
+#: front/src/components/library/Artist.vue:26
+msgid "Play all albums"
+msgstr "إعزف كافة الألبومات"
+
+#: front/src/components/audio/PlayButton.vue:58
+msgid "Play immediatly"
+msgstr "إعزف في الحين"
+
+#: front/src/components/audio/PlayButton.vue:15
+msgid "Play next"
+msgstr "إعزف التالي"
+
+#: front/src/components/audio/PlayButton.vue:16
+msgid "Play now"
+msgstr "إعزف الآن"
+
+#: front/src/components/audio/Player.vue:261
+msgid "Play track"
+msgstr "إعزف المَقطَع"
+
+#: front/src/views/playlists/Detail.vue:90
+msgid "Playlist"
+msgstr "قائمة المَقاطِع"
+
+#: front/src/views/playlists/Detail.vue:12
+msgid "Playlist containing %{ count } track, by %{ username }"
+msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: front/src/components/playlists/Form.vue:9
+msgid "Playlist created"
+msgstr "تم إنشاء قائمة تشغيل الموسيقى"
+
+#: front/src/components/playlists/Editor.vue:4
+msgid "Playlist editor"
+msgstr "محرّر قوائم تشغيل الموسيقى"
+
+#: front/src/components/playlists/Form.vue:21
+msgid "Playlist name"
+msgstr "إسم قائمة المَقاطِع"
+
+#: front/src/components/playlists/Form.vue:6
+msgid "Playlist updated"
+msgstr "تم تحديث قائمة تشغيل الموسيقى"
+
+#: front/src/components/playlists/Form.vue:25
+msgid "Playlist visibility"
+msgstr "مدى رؤية القائمة"
+
+#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16
+#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83
+#: front/src/views/playlists/List.vue:103
+msgid "Playlists"
+msgstr "قوائم المَقاطِع"
+
+#: front/src/components/Home.vue:56
+msgid "Playlists? We got them"
+msgstr "قوائم تشغيل الموسيقى ؟ متوفّرة لدينا"
+
+#: front/src/components/auth/Settings.vue:79
+msgid "Please double-check your password is correct"
+msgstr "يرجى التأكّد مِن صحة الكلمة السرية"
+
+#: front/src/components/auth/Login.vue:9
+msgid "Please double-check your username/password couple is correct"
+msgstr "الرجاء التأكّد مِن صحة اسم المستخدِم و الكلمة السرية"
+
+#: front/src/components/auth/Settings.vue:46
+msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:26
+msgid "Previous step"
+msgstr "الخطوة السابقة"
+
+#: front/src/components/audio/Player.vue:260
+msgid "Previous track"
+msgstr "المَقطَع السابق"
+
+#: front/src/views/auth/EmailConfirm.vue:26
+#: front/src/views/auth/PasswordResetConfirm.vue:31
+msgid "Proceed to login"
+msgstr "المواصلة إلى صفحة تسجيل الدخول"
+
+#: front/src/components/federation/LibraryTrackTable.vue:50
+msgid "Published date"
+msgstr "تاريخ النشر"
+
+#: front/src/components/library/import/ArtistImport.vue:17
+msgid "Query template"
+msgstr "نموذج البحث"
+
+#: front/src/components/Sidebar.vue:20
+msgid "Queue"
+msgstr "قائمة الإنتظار"
+
+#: front/src/components/audio/Player.vue:203
+msgid "Queue shuffled!"
+msgstr "تم خلط قائمة الإنتظار !"
+
+#: front/src/views/radios/Detail.vue:80
+msgid "Radio"
+msgstr "الإذاعة"
+
+#: front/src/components/library/radios/Builder.vue:226
+msgid "Radio Builder"
+msgstr "مُنشِئ الإذاعات و الراديو"
+
+#: front/src/components/library/radios/Builder.vue:15
+#, fuzzy
+msgid "Radio created"
+msgstr "إسم الإذاعة"
+
+#: front/src/components/library/radios/Builder.vue:21
+msgid "Radio name"
+msgstr "إسم الإذاعة"
+
+#: front/src/components/library/radios/Builder.vue:12
+#, fuzzy
+msgid "Radio updated"
+msgstr "إسم الإذاعة"
+
+#: front/src/components/library/Library.vue:10
+#: src/components/library/Radios.vue:141
+msgid "Radios"
+msgstr "الإذاعات"
+
+#: front/src/views/instance/Timeline.vue:7
+msgid "Recent activity on this instance"
+msgstr "أحدث الأنشطة على مثيل الخادوم هذا"
+
+#: front/src/components/library/Home.vue:24
+msgid "Recently added"
+msgstr ""
+
+#: front/src/components/library/Home.vue:11
+#, fuzzy
+msgid "Recently favorited"
+msgstr "في المفضلة"
+
+#: front/src/components/library/Home.vue:6
+msgid "Recently listened"
+msgstr "مَقاطِع أستُمِع إليها مؤخرا"
+
+#: front/src/components/library/import/BatchDetail.vue:81
+msgid "Recording MusicBrainz ID"
+msgstr "مُعرّف التسجيل الصوتي على ميوزيك براينز MusicBrainz"
+
+#: front/src/views/admin/users/UsersDetail.vue:84
+#: front/src/views/federation/LibraryDetail.vue:122
+msgid "Refresh"
+msgstr "إنعاش"
+
+#: front/src/components/federation/LibraryFollowTable.vue:42
+msgid "Refused"
+msgstr "رفض"
+
+#: front/src/components/auth/Profile.vue:12
+msgid "Registered since %{ date }"
+msgstr "مُسجّل منذ %{ date }"
+
+#: front/src/components/auth/Signup.vue:9
+msgid "Registration are closed on this instance, you will need an invitation code to signup."
+msgstr "إنّ التسجيلات مُغلَقة حاليًا على هذا الخادوم، يلزمك رمز دعوة للتسجيل فيه."
+
+#: front/src/components/manage/users/UsersTable.vue:71
+msgid "regular user"
+msgstr "مستخدِم عادي"
+
+#: front/src/components/library/radios/Filter.vue:59
+msgid "Remove"
+msgstr "حذف"
+
+#: front/src/components/auth/Settings.vue:58
+#, fuzzy
+msgid "Remove avatar"
+msgstr "حذف"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:19
+msgid "Remove from favorites"
+msgstr "حذف مِن المفضلة"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:34
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+msgid "Request a new password"
+msgstr "طلب كلمة سرية جديدة"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:35
+msgid "Request a new Subsonic API password?"
+msgstr "متأكد مِن أنك تريد إعادة طلب كلمة سرية جديدة لواجهة برمجة تطبيقات صاب سونيك API ؟"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:43
+msgid "Request a password"
+msgstr "طلب كلمة سرية"
+
+#: front/src/App.vue:35
+msgid "Request music"
+msgstr "طلب موسيقى"
+
+#: front/src/views/library/MusicRequest.vue:4
+#: src/views/library/MusicRequest.vue:21
+msgid "Request some music"
+msgstr "طلب بعض مِن الموسيقى"
+
+#: front/src/components/requests/Form.vue:20
+msgid "Request submitted!"
+msgstr "تم إرسال الطلب !"
+
+#: front/src/components/library/import/BatchDetail.vue:49
+msgid "Rerun errored jobs"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:187
+msgid "Rerun job"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4
+#: front/src/views/auth/PasswordReset.vue:52
+msgid "Reset your password"
+msgstr "إعادة تعيين كلمتك السرية"
+
+#: front/src/components/library/import/TrackImport.vue:31
+msgid "Result %{ current }/%{ total }"
+msgstr "النتيجة %{ current }/%{ total }"
+
+#: front/src/components/favorites/List.vue:38
+#: src/components/library/Artists.vue:30
+#: front/src/components/library/Radios.vue:52
+#: src/views/federation/LibraryList.vue:33
+#: front/src/views/playlists/List.vue:32
+msgid "Results per page"
+msgstr "عدد نتائج البحث في كل صفحة"
+
+#: front/src/components/admin/SettingsGroup.vue:63
+#: front/src/components/library/radios/Builder.vue:29
+msgid "Save"
+msgstr "احفظ"
+
+#: front/src/views/federation/LibraryDetail.vue:112
+msgid "Scan triggered!"
+msgstr "إنطَلَقَ المسح !"
+
+#: front/src/components/federation/LibraryTrackTable.vue:5
+#: front/src/components/library/Artists.vue:10
+#: src/components/library/Radios.vue:29
+#: front/src/components/library/import/BatchDetail.vue:62
+#: front/src/components/library/import/BatchList.vue:7
+#: front/src/components/manage/library/FilesTable.vue:5
+#: front/src/components/manage/library/RequestsTable.vue:5
+#: front/src/components/manage/users/InvitationsTable.vue:5
+#: front/src/components/manage/users/UsersTable.vue:5
+#: front/src/views/federation/LibraryList.vue:14
+#: src/views/playlists/List.vue:13
+msgid "Search"
+msgstr "البحث"
+
+#: front/src/components/library/import/Main.vue:85
+msgid "Search an entity you want to import:"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:180
+msgid "Search by artist, username, comment..."
+msgstr "البحث باستخدام إسم فنان أو مستخدِم أو تعليق …"
+
+#: front/src/components/library/import/BatchDetail.vue:188
+msgid "Search by source..."
+msgstr "البحث حسب المصدر …"
+
+#: front/src/components/library/import/BatchList.vue:116
+msgid "Search by submitter, source..."
+msgstr "البحث حسب المستخدِم أو المصدر …"
+
+#: front/src/components/federation/LibraryTrackTable.vue:182
+#: front/src/components/manage/library/FilesTable.vue:175
+msgid "Search by title, artist, domain..."
+msgstr "البحث حسب العنوان أو إسم فنان أو نطاق …"
+
+#: front/src/components/federation/LibraryFollowTable.vue:140
+msgid "Search by username, domain..."
+msgstr "البحث حسب إسم المستخدِم أو النطاق …"
+
+#: front/src/components/manage/users/InvitationsTable.vue:152
+msgid "Search by username, email, code..."
+msgstr "البحث باسم مستخدِم أو عنوان بريد إلكتروني أو رمز …"
+
+#: front/src/components/manage/users/UsersTable.vue:162
+msgid "Search by username, email, name..."
+msgstr "البحث باسم مستخدِم أو عنوان بريد إلكتروني أو إسم …"
+
+#: front/src/components/audio/SearchBar.vue:20
+msgid "Search for artists, albums, tracks..."
+msgstr "البحث عن فنانين أو ألبومات أو مَقاطِع موسيقية …"
+
+#: front/src/components/audio/Search.vue:2
+msgid "Search for some music"
+msgstr "البحث عن بعض مِن الموسيقى"
+
+#: front/src/components/library/Track.vue:105
+msgid "Search on lyrics.wikia.com"
+msgstr "البحث في lyrics.wikia.com"
+
+#: front/src/components/library/Album.vue:33
+#: src/components/library/Artist.vue:31
+#: front/src/components/library/Track.vue:40
+msgid "Search on Wikipedia"
+msgstr "البحث في ويكيبيديا"
+
+#: front/src/components/library/import/TrackImport.vue:42
+msgid "Search query"
+msgstr "البحث"
+
+#: front/src/views/admin/Settings.vue:15
+msgid "Sections"
+msgstr "الأقسام"
+
+#: front/src/components/library/radios/Builder.vue:41
+msgid "Select a filter"
+msgstr "إختيار عامل تصفية"
+
+#: front/src/components/common/ActionTable.vue:61
+msgid "Select all %{ total } elements"
+msgid_plural "Select all %{ total } elements"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: front/src/components/library/import/FileUpload.vue:22
+msgid "Select files to upload..."
+msgstr "إختيار الملفات الجاهزة للإرسال …"
+
+#: front/src/components/common/ActionTable.vue:69
+msgid "Select only current page"
+msgstr "تحديد الصفحة الحالية فقط"
+
+#: front/src/components/library/import/Main.vue:19
+msgid "Select relevant sources or files for import"
+msgstr "إختيار المصادر أو الملفات الجاهزة للإستيراد"
+
+#: front/src/components/federation/LibraryCard.vue:43
+msgid "Send a follow request"
+msgstr "إرسال طلب متابَعة"
+
+#: front/src/components/Sidebar.vue:97
+#: src/components/manage/users/UsersTable.vue:184
+#: front/src/views/admin/users/UsersDetail.vue:165
+msgid "Settings"
+msgstr "الإعدادات"
+
+#: front/src/components/auth/Settings.vue:10
+msgid "Settings updated"
+msgstr "تم تحديث الإعدادات"
+
+#: front/src/components/admin/SettingsGroup.vue:11
+msgid "Settings updated successfully."
+msgstr "تم تحديث الإعدادات بنجاح."
+
+#: front/src/components/auth/Profile.vue:24
+msgid "Settings..."
+msgstr "الإعدادات …"
+
+#: front/src/components/manage/users/InvitationForm.vue:27
+msgid "Share link"
+msgstr "رابط المشاركة"
+
+#: front/src/components/audio/artist/Card.vue:30
+msgid "Show 1 more album"
+msgid_plural "Show %{ count } more albums"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: front/src/components/audio/album/Card.vue:40
+msgid "Show 1 more track"
+msgid_plural "Show %{ count } more tracks"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: front/src/components/forms/PasswordInput.vue:25
+msgid "Show/hide password"
+msgstr "إظهار/إخفاء الكلمة السرية"
+
+#: front/src/components/federation/LibraryFollowTable.vue:97
+#: front/src/components/federation/LibraryTrackTable.vue:98
+#: front/src/components/library/import/BatchDetail.vue:128
+#: front/src/components/library/import/BatchList.vue:73
+#: front/src/components/manage/library/FilesTable.vue:97
+#: front/src/components/manage/library/RequestsTable.vue:104
+#: front/src/components/manage/users/InvitationsTable.vue:76
+#: front/src/components/manage/users/UsersTable.vue:87
+msgid "Showing results %{ start }-%{ end } on %{ total }"
+msgstr "عرض النتائج %{ start }-%{ end } مِن %{ total }"
+
+#: front/src/components/audio/Player.vue:269
+msgid "Shuffle your queue"
+msgstr "خلط قائمة الإنتظار"
+
+#: front/src/components/auth/Signup.vue:95
+msgid "Sign Up"
+msgstr "التسجيل"
+
+#: front/src/components/manage/users/UsersTable.vue:40
+#: front/src/views/admin/users/UsersDetail.vue:37
+msgid "Sign-up"
+msgstr "التسجيل"
+
+#: front/src/components/audio/track/Table.vue:31
+msgid "Simply copy paste the snippet below into a terminal to launch the download."
+msgstr ""
+
+#: front/src/components/library/Track.vue:69
+#: front/src/components/library/import/FileUpload.vue:44
+#: front/src/components/manage/library/FilesTable.vue:44
+msgid "Size"
+msgstr "الحجم"
+
+#: front/src/components/library/import/BatchDetail.vue:37
+#: front/src/components/library/import/BatchDetail.vue:72
+msgid "Skipped"
+msgstr "تمّ تجاهله"
+
+#: front/src/components/requests/Form.vue:3
+msgid "Something's missing in the library? Let us know what you would like to listen!"
+msgstr "هناك شيء ما ناقص في هذه المكتبة ؟ أبلغنا عما تريد الإستماع إليه !"
+
+#: front/src/components/audio/Search.vue:25
+msgid "Sorry, we did not found any album matching your query"
+msgstr "المعذرة، لم نتمكّن مِن العثور على أي ألبوم يناسب طلب بحثك"
+
+#: front/src/components/audio/Search.vue:16
+msgid "Sorry, we did not found any artist matching your query"
+msgstr "المعذرة، لم نتمكّن مِن العثور على أي فنان يناسب طلب بحثك"
+
+#: front/src/components/library/import/BatchDetail.vue:82
+#: front/src/components/library/import/BatchList.vue:38
+#: front/src/components/library/import/TrackImport.vue:17
+msgid "Source"
+msgstr "المصدر"
+
+#: front/src/App.vue:41
+msgid "Source code"
+msgstr "شفرة المصدر"
+
+#: front/src/App.vue:40
+msgid "Source code (%{version})"
+msgstr "الشفرة المصدرية (%{version})"
+
+#: front/src/components/auth/Profile.vue:20
+#: front/src/components/manage/users/UsersTable.vue:70
+msgid "Staff member"
+msgstr "عضو في الفريق"
+
+#: front/src/components/radios/Button.vue:4
+msgid "Start"
+msgstr "إبدأ"
+
+#: front/src/components/library/import/FileUpload.vue:28
+msgid "Start Upload"
+msgstr "إبدأ الإرسال"
+
+#: front/src/views/admin/Settings.vue:86
+msgid "Statistics"
+msgstr "الإحصائيات"
+
+#: front/src/components/federation/LibraryFollowTable.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:66
+#: front/src/components/library/import/BatchDetail.vue:83
+#: front/src/components/library/import/BatchList.vue:11
+#: front/src/components/library/import/BatchList.vue:37
+#: front/src/components/library/import/FileUpload.vue:45
+#: front/src/components/manage/library/RequestsTable.vue:24
+#: front/src/components/manage/library/RequestsTable.vue:48
+#: front/src/components/manage/users/InvitationsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:39
+#: front/src/components/manage/users/UsersTable.vue:43
+msgid "Status"
+msgstr "الحالة"
+
+#: front/src/components/radios/Button.vue:3
+msgid "Stop"
+msgstr "إيقاف"
+
+#: front/src/components/Sidebar.vue:159
+msgid "Stop radio"
+msgstr "إيقاف الإذاعة"
+
+#: front/src/components/library/import/FileUpload.vue:32
+msgid "Stop Upload"
+msgstr "إيقاف الإرسال"
+
+#: front/src/App.vue:9 src/components/requests/Form.vue:17
+msgid "Submit"
+msgstr "إرسال"
+
+#: front/src/components/requests/Form.vue:22
+msgid "Submit another request"
+msgstr "إرسال طلب جديد آخَر"
+
+#: front/src/components/library/import/BatchDetail.vue:26
+#: front/src/components/library/import/BatchList.vue:39
+msgid "Submitted by"
+msgstr "إقترَحه"
+
+#: front/src/views/admin/Settings.vue:85
+msgid "Subsonic"
+msgstr "صاب سونيك"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:2
+msgid "Subsonic API password"
+msgstr "الكلمة السرية لواجهة برمجة التطبيقات صاب سونيك Subsonic"
+
+#: front/src/components/library/import/BatchDetail.vue:71
+#: front/src/components/library/import/BatchList.vue:16
+#: front/src/components/library/import/FileUpload.vue:56
+msgid "Success"
+msgstr "نجح"
+
+#: front/src/App.vue:11
+msgid "Suggested choices"
+msgstr "الخيارات المتاحة"
+
+#: front/src/components/playlists/Editor.vue:9
+msgid "Syncing changes to server..."
+msgstr "مزامنة التغييرات مع الخادم …"
+
+#: front/src/components/Home.vue:26
+msgid "That's simple: we loved Grooveshark and we want to build something even better."
+msgstr "حسنًا الأمر سهل : أحببنا غروف شارْك و أردنا تصميم مشروع أحسَن منه بكثير."
+
+#: front/src/components/requests/Form.vue:73
+msgid "The Beatles, Mickael Jackson…"
+msgstr "The Beatles, Mickael Jackson…"
+
+#: front/src/App.vue:59
+msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
+msgstr "تم تصميم شعار فانك وايل funkwhale بفضل و كَرَم Francis Gading."
+
+#: front/src/components/Home.vue:124
+msgid "The plaform is free and open-source, you can install it and modify it without worries"
+msgstr "المنصّة مجانية و مفتوحة المصدر، بإمكانكم تنصيبها و تعديلها كما يحلو لكم دون قيود"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:4
+msgid "The Subsonic API is not available on this Funkwhale instance."
+msgstr ""
+
+#: front/src/components/requests/Form.vue:74
+msgid "The White Album, Thriller…"
+msgstr "The White Album, Thriller…"
+
+#: front/src/components/audio/track/Table.vue:30
+msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:149
+msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled."
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:195
+msgid "This indicate if the remote library granted you access"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:16
+msgid "This is you!"
+msgstr "هذا أنت !"
+
+#: front/src/components/common/ActionTable.vue:37
+msgid "This may affect a lot of elements, please double check this is really what you want."
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:61
+msgid "This track is not imported and cannot be played"
+msgstr "لم يتم استيراد هذا المَقطَع لذا لا يمكن الإستماع إليه"
+
+#: front/src/views/playlists/Detail.vue:37
+msgid "This will completely delete this playlist and cannot be undone."
+msgstr "سوف يؤدي ذلك إلى الحذف الكُلّي لقائمة التشغيل هذه و لا يُمكن إلغاء العملية و العودة."
+
+#: front/src/views/radios/Detail.vue:27
+msgid "This will completely delete this radio and cannot be undone."
+msgstr "سوف يؤدي ذلك إلى الحذف الكُلّي لهذه الإذاعة و لا يُمكن إلغاء العملية و العودة."
+
+#: front/src/components/auth/SubsonicTokenForm.vue:51
+msgid "This will completely disable access to the Subsonic API using from account."
+msgstr ""
+
+#: front/src/App.vue:137
+msgid "This will erase your local data and disconnect you, do you want to continue?"
+msgstr "ذلك سوف يؤدي إلى حذف بياناتك المحلية نهائيا و إخراجك. أمتأكد أنك ترغب في المواصلة ؟"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:36
+msgid "This will log you out from existing devices that use the current password."
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:44
+msgid "This will remove all tracks from this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:6
+#: front/src/components/federation/LibraryTrackTable.vue:47
+#: front/src/components/manage/library/FilesTable.vue:37
+msgid "Title"
+msgstr "العنوان"
+
+#: front/src/components/audio/SearchBar.vue:27
+#: src/components/library/Track.vue:174
+#: front/src/components/library/import/BatchDetail.vue:84
+#: front/src/components/metadata/Search.vue:138
+msgid "Track"
+msgstr "المَقطَع"
+
+#: front/src/components/library/Track.vue:53
+msgid "Track information"
+msgstr "معلومات عن المَقطَع"
+
+#: front/src/components/library/radios/Filter.vue:44
+msgid "Track matching filter"
+msgstr "مقطع يناسب عامل التصفية"
+
+#: front/src/components/instance/Stats.vue:54
+msgid "tracks"
+msgstr "مَقاطِع"
+
+#: front/src/components/library/Album.vue:43
+#: front/src/components/playlists/PlaylistModal.vue:33
+#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50
+#: front/src/views/radios/Detail.vue:34
+msgid "Tracks"
+msgstr "المَقاطِع"
+
+#: front/src/views/federation/LibraryDetail.vue:125
+msgid "Tracks available in this library"
+msgstr "المَقاطِع المتوفّرة في هذه المكتبة"
+
+#: front/src/components/library/Artist.vue:54
+#, fuzzy
+msgid "Tracks by this artist"
+msgstr "مِن ألبومات هذا الفنان"
+
+#: front/src/components/instance/Stats.vue:25
+msgid "Tracks favorited"
+msgstr "مَقاطِع تم الإعجاب بها"
+
+#: front/src/components/instance/Stats.vue:19
+msgid "tracks listened"
+msgstr "مَقاطِع أستُمِع إليها"
+
+#: front/src/views/federation/LibraryDetail.vue:109
+msgid "Trigger scan"
+msgstr ""
+
+#: front/src/components/manage/library/FilesTable.vue:41
+msgid "Type"
+msgstr ""
+
+#: front/src/components/About.vue:15
+msgid "Unfortunately, owners of this instance did not yet take the time to complete this page."
+msgstr "لسوء الحظ، لم يأخذ أصحاب مثيل الخادوم هذا الوقت الكافي لاستكمال هذه الصفحة."
+
+#: front/src/views/federation/LibraryDetail.vue:95
+msgid "Unknown"
+msgstr "مجهول"
+
+#: front/src/components/Home.vue:37
+msgid "Unlimited music"
+msgstr "موسيقى بلا حدود"
+
+#: front/src/components/audio/Player.vue:264
+msgid "Unmute"
+msgstr "إلغاء الكتم"
+
+#: front/src/components/auth/Settings.vue:50
+#, fuzzy
+msgid "Update avatar"
+msgstr "تحديث قائمة المَقاطِع الموسيقية"
+
+#: front/src/components/playlists/Form.vue:33
+msgid "Update playlist"
+msgstr "تحديث قائمة المَقاطِع الموسيقية"
+
+#: front/src/components/auth/Settings.vue:27
+msgid "Update settings"
+msgstr "تحديث الإعدادات"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:21
+msgid "Update your password"
+msgstr "قم بتحديث كلمتك السرية"
+
+#: front/src/components/manage/users/UsersTable.vue:172
+#: front/src/views/admin/users/UsersDetail.vue:153
+msgid "Upload"
+msgstr "أرسل"
+
+#: front/src/components/auth/Settings.vue:45
+msgid "Upload a new avatar"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:7
+msgid "Uploaded files or external source"
+msgstr "ملفات مُرسَلة أو مصدر خارجي"
+
+#: front/src/components/library/import/FileUpload.vue:57
+msgid "Uploading..."
+msgstr "عملية الإرسال جارية …"
+
+#: front/src/App.vue:45
+msgid "Use another instance"
+msgstr "إستخدم مثيل خادوم آخَر"
+
+#: front/src/components/requests/Form.vue:75
+msgid "Use this comment box to add details to your request if needed"
+msgstr "استخدم علبة التعليق هذه، إن دعت الحاجة، لإضافة تفاصيل طلبك"
+
+#: front/src/views/federation/LibraryDetail.vue:196
+msgid "Use this flag to enable/disable federation with this library"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:12
+msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
+msgstr "استخدم هذه الإستمارة لطلب إعادة ضبط كلمة المرور. سنرسل بريدا الكترونيا إلى العنوان المعين مرفوقا بتعليمات لإعادة ضبط كلمتك السرية."
+
+#: front/src/components/federation/LibraryForm.vue:6
+msgid "Use this form to scan an instance and setup federation."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:49
+msgid "Used"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:47
+msgid "User"
+msgstr "المستخدِم"
+
+#: front/src/components/instance/Stats.vue:5
+msgid "User activity"
+msgstr "نشاط المستخدِم"
+
+#: front/src/components/library/Radios.vue:20
+#, fuzzy
+msgid "User radios"
+msgstr "المستخدِمون"
+
+#: front/src/components/auth/Signup.vue:19
+#: front/src/components/manage/users/UsersTable.vue:37
+msgid "Username"
+msgstr "إسم المستخدِم"
+
+#: front/src/components/auth/Login.vue:15
+msgid "Username or email"
+msgstr "إسم المستخدِم أو عنوان البريد الإلكتروني"
+
+#: front/src/components/instance/Stats.vue:13
+msgid "users"
+msgstr "مستخدِم"
+
+#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81
+#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3
+#: front/src/views/admin/users/UsersList.vue:21
+msgid "Users"
+msgstr "المستخدِمون"
+
+#: front/src/components/library/Album.vue:37
+#: src/components/library/Artist.vue:35
+#: front/src/components/library/Track.vue:44
+#: front/src/components/library/import/ArtistImport.vue:131
+#: front/src/components/metadata/ArtistCard.vue:49
+#: front/src/components/metadata/ReleaseCard.vue:53
+msgid "View on MusicBrainz"
+msgstr "إطّلع عليه على ميوزيك براينز"
+
+#: front/src/components/playlists/PlaylistModal.vue:20
+msgid "We cannot add the track to a playlist"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:14
+msgid "We cannot create the playlist"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:13
+msgid "We cannot create your account"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:7
+msgid "We cannot log you in"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:38
+#, fuzzy
+msgid "We cannot save your avatar"
+msgstr "تعذّر علينا حفظ إعداداتك"
+
+#: front/src/components/auth/Settings.vue:14
+msgid "We cannot save your settings"
+msgstr "تعذّر علينا حفظ إعداداتك"
+
+#: front/src/components/Home.vue:130
+msgid "We do not track you or bother you with ads"
+msgstr "لا نتعقّبك و لا نزعجك بالإعلانات"
+
+#: front/src/components/library/import/FileUpload.vue:5
+msgid "We recommend using Picard for that purpose."
+msgstr "ننصحكم باستخدام برنامج Picard لهذا الغرض."
+
+#: front/src/components/Home.vue:7
+msgid "We think listening to music should be simple."
+msgstr "نعتقد أنّ الاستماع إلى الموسيقى ينبغي أن يكون سهلًا."
+
+#: front/src/components/PageNotFound.vue:10
+msgid "We're sorry, the page you asked for does not exist:"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:21
+msgid "We've received your request, you'll get some groove soon ;)"
+msgstr ""
+
+#: front/src/components/Home.vue:152
+msgid "Welcome"
+msgstr "مرحبًا"
+
+#: front/src/components/Home.vue:5
+msgid "Welcome on Funkwhale"
+msgstr "أهلا وسهلا بك على فانك وايل Funkwhale"
+
+#: front/src/components/library/import/Main.vue:114
+msgid "What is metadata?"
+msgstr "ما المقصود بالبيانات الوصفية ؟"
+
+#: front/src/views/federation/LibraryDetail.vue:197
+msgid "When enabled, auto importing will automatically import new tracks published in this library"
+msgstr ""
+
+#: front/src/components/Home.vue:24
+msgid "Why funkwhale?"
+msgstr "لماذا فانك وايل Funkwhale ؟"
+
+#: front/src/components/Sidebar.vue:124
+msgid "Yes"
+msgstr "نعم"
+
+#: front/src/components/auth/Logout.vue:8
+msgid "Yes, log me out!"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:7
+msgid "You are currently logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:111
+msgid "You can also skip this step and enter metadata manually."
+msgstr ""
+
+#: front/src/components/Home.vue:136
+msgid "You can invite friends and family to your instance so they can enjoy your music"
+msgstr "يمكِنك دعوة أصدقائك و عائلتك للإنظمام إلى مثيل خادومك للإستمتاع بموسيقاك"
+
+#: front/src/components/library/radios/Builder.vue:7
+msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:8
+msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:156
+msgid "You have a radio playing"
+msgstr ""
+
+#: front/src/App.vue:6
+msgid "You need to select an instance in order to continue"
+msgstr "يلزمك اختيار مثيل خادوم قصد المواصلة"
+
+#: front/src/components/auth/Settings.vue:100
+msgid "You will be logged out from this session and have to log in with the new one"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:71
+msgid "You will have to update your password on your clients that use this password."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:103
+msgid "You will import:"
+msgstr "أنت بصدد استيراد :"
+
+#: front/src/views/auth/EmailConfirm.vue:24
+msgid "Your email address was confirmed, you can now use the service without limitations."
+msgstr "تمّ تأكيد عنوان بريدك الإلكتروني، بإمكانك الآن استعمال الخدمة مِن دون قيود."
+
+#: front/src/components/favorites/List.vue:109
+msgid "Your Favorites"
+msgstr "مفضّلاتك"
+
+#: front/src/components/Home.vue:117
+msgid "Your music, your way"
+msgstr "موسيقاك، كما يحلو لك"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:29
+msgid "Your password has been updated successfully."
+msgstr "تم تحديث كلمتك السرية بنجاح."
+
+#: front/src/components/auth/Settings.vue:101
+msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:156
+msgid "%{ count } track was added to your queue"
+msgid_plural "%{ count } tracks were added to your queue"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
diff --git a/front/locales/eo/LC_MESSAGES/app.po b/front/locales/eo/LC_MESSAGES/app.po
new file mode 100644
index 0000000000000000000000000000000000000000..d4fc38a86447907ee594f7c9627e130d8bd48777
--- /dev/null
+++ b/front/locales/eo/LC_MESSAGES/app.po
@@ -0,0 +1,2451 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the front package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: front 1.0.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-07-22 14:12+0200\n"
+"PO-Revision-Date: 2018-07-22 15:50+0000\n"
+"Last-Translator: Baptiste Gelez <baptiste@gelez.xyz>\n"
+"Language-Team: none\n"
+"Language: eo\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.20\n"
+
+#: front/src/components/playlists/PlaylistModal.vue:9
+msgid "\"%{ title }\", by %{ artist }"
+msgstr "\"%{title}\" je %{artist}"
+
+#: front/src/components/Sidebar.vue:24
+msgid "(%{ index } of %{ length })"
+msgstr "(%{index} da %{length})"
+
+#: front/src/components/Sidebar.vue:22
+msgid "(empty)"
+msgstr "(malplena)"
+
+#: front/src/components/common/ActionTable.vue:43
+#: front/src/components/common/ActionTable.vue:51
+msgid "%{ count } on %{ total } selected"
+msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/Sidebar.vue:116
+#: src/views/federation/LibraryDetail.vue:87
+msgid "%{ count } track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{count} kanto"
+msgstr[1] "%{count} kantoj"
+
+#: front/src/components/library/Artist.vue:13
+msgid "%{ count } track in %{ albumsCount } albums"
+msgid_plural "%{ count } tracks in %{ albumsCount } albums"
+msgstr[0] "%{count} kanto en %{albumsCount} albumo"
+msgstr[1] "%{count} kantoj en %{albumsCount} albumoj"
+
+#: front/src/components/library/radios/Builder.vue:76
+msgid "%{ count } track matching combined filters"
+msgid_plural "%{ count } tracks matching combined filters"
+msgstr[0] "%{count} kanto kongruas kun la tutaj filtriloj"
+msgstr[1] "%{count} kantoj kongruas kun la tutaj filtriloj"
+
+#: front/src/components/playlists/Card.vue:18
+msgid "%{ count} track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{count} kanto"
+msgstr[1] "%{count} kantoj"
+
+#: front/src/components/common/Duration.vue:2
+msgid "%{ hours } h %{ minutes } min"
+msgstr "%{hours} h %{minutes} min"
+
+#: front/src/components/common/Duration.vue:5
+msgid "%{ minutes } min"
+msgstr "%{minutes} min"
+
+#: front/src/components/activity/Like.vue:7
+msgid "%{ user } favorited a track"
+msgstr "%{user} stelumis kanton"
+
+#: front/src/components/activity/Listen.vue:7
+msgid "%{ user } listened to a track"
+msgstr "%{user} aÅ­skultis kanton"
+
+#: front/src/components/auth/Profile.vue:49
+msgid "%{ username }'s profile"
+msgstr "Profilo de %{username}"
+
+#: front/src/components/audio/artist/Card.vue:41
+msgid "1 album"
+msgid_plural "%{ count } albums"
+msgstr[0] "Unu albumo"
+msgstr[1] "%{count} albumoj"
+
+#: front/src/components/favorites/List.vue:10
+msgid "1 favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "Unu stelumo"
+msgstr[1] "%{count} stelumoj"
+
+#: front/src/components/audio/album/Card.vue:54
+#: front/src/components/federation/LibraryCard.vue:25
+msgid "1 track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "Unu kanto"
+msgstr[1] "%{count} kantoj"
+
+#: front/src/components/About.vue:5
+msgid "About %{ instance }"
+msgstr "Pri %{instance}"
+
+#: front/src/App.vue:54
+msgid "About Funkwhale"
+msgstr "Pri Funkwhale"
+
+#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55
+msgid "About this instance"
+msgstr "Pri tiu instanco"
+
+#: front/src/components/manage/library/RequestsTable.vue:28
+#: front/src/components/manage/library/RequestsTable.vue:62
+msgid "Accepted"
+msgstr "akceptanta"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:111
+msgid "Access disabled"
+msgstr "Atingo malaktivigas"
+
+#: front/src/components/Home.vue:109
+msgid "Access your music from a clean interface that focus on what really matters"
+msgstr "Atingas vian muzikon kun pura interfaco ke koncentras ĝin sur gravaĵo"
+
+#: front/src/views/admin/users/UsersDetail.vue:54
+msgid "Account active"
+msgstr "Aktiva konto"
+
+#: front/src/components/auth/Settings.vue:5
+msgid "Account settings"
+msgstr "Preferoj de via konto"
+
+#: front/src/components/auth/Settings.vue:257
+msgid "Account Settings"
+msgstr "Preferoj de via konto"
+
+#: front/src/components/manage/users/UsersTable.vue:39
+msgid "Account status"
+msgstr "Pozicio de via konto"
+
+#: front/src/views/auth/PasswordReset.vue:14
+msgid "Account's email"
+msgstr "Retadreso de via konto"
+
+#: front/src/components/common/ActionTable.vue:82
+msgid "Action %{ action } was launched successfully on %{ count } element"
+msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
+msgstr[0] "Ago %{action} sukcese komenciĝis por %{count} ero"
+msgstr[1] "Ago %{action} sukcese komenciĝis por %{count} eroj"
+
+#: front/src/components/common/ActionTable.vue:8
+#: front/src/components/federation/LibraryFollowTable.vue:24
+#: front/src/components/library/radios/Builder.vue:60
+#: front/src/components/manage/library/RequestsTable.vue:54
+msgid "Actions"
+msgstr "Agoj"
+
+#: front/src/components/manage/users/UsersTable.vue:53
+msgid "Active"
+msgstr "Aktiva"
+
+#: front/src/components/Sidebar.vue:60
+msgid "Activity"
+msgstr "Aktivo"
+
+#: front/src/components/federation/LibraryFollowTable.vue:21
+msgid "Actor"
+msgstr "Aktoro"
+
+#: front/src/views/federation/LibraryList.vue:8
+msgid "Add a new library"
+msgstr "Aldoni nova muzikejo"
+
+#: front/src/components/library/radios/Builder.vue:46
+msgid "Add filter"
+msgstr "Aldoni filtrilo"
+
+#: front/src/components/library/radios/Builder.vue:36
+msgid "Add filters to customize your radio"
+msgstr "Aldonu filtriloj por agordi vian radion"
+
+#: front/src/components/audio/PlayButton.vue:53
+msgid "Add to current queue"
+msgstr "Aldoni al aktuala atendovico"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:4
+#: front/src/components/favorites/TrackFavoriteIcon.vue:21
+msgid "Add to favorites"
+msgstr "Aldoni al stelumoj"
+
+#: front/src/components/playlists/TrackPlaylistIcon.vue:6
+#: front/src/components/playlists/TrackPlaylistIcon.vue:32
+msgid "Add to playlist..."
+msgstr "Aldoni al ludlisto…"
+
+#: front/src/components/audio/PlayButton.vue:14
+msgid "Add to queue"
+msgstr "Aldoni al atendovico"
+
+#: front/src/components/playlists/PlaylistModal.vue:116
+msgid "Add to this playlist"
+msgstr "Aldoni al tiu ludlisto"
+
+#: front/src/components/playlists/PlaylistModal.vue:54
+msgid "Add track"
+msgstr "Aldoni kanton"
+
+#: front/src/components/manage/users/UsersTable.vue:69
+msgid "Admin"
+msgstr "Administranto"
+
+#: front/src/components/Sidebar.vue:64
+msgid "Administration"
+msgstr "Administrejo"
+
+#: front/src/components/audio/SearchBar.vue:26
+#: src/components/audio/track/Table.vue:8
+#: front/src/components/federation/LibraryTrackTable.vue:49
+#: front/src/components/library/Album.vue:91
+#: front/src/components/manage/library/FilesTable.vue:39
+#: front/src/components/metadata/Search.vue:134
+msgid "Album"
+msgstr "Albumo"
+
+#: front/src/components/library/import/ReleaseImport.vue:3
+msgid "Album %{ title } (%{ count } track) by %{ artist }"
+msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }"
+msgstr[0] "Albumo %{title} (%{count} kanto) je %{artist}"
+msgstr[1] "Albumo %{title} (%{count} kantoj) je %{artist}"
+
+#: front/src/components/library/Album.vue:12
+msgid "Album containing %{ count } track, by %{ artist }"
+msgid_plural "Album containing %{ count } tracks, by %{ artist }"
+msgstr[0] "Albumo kun %{count} kanto, je %{artist}"
+msgstr[1] "Albumo kun %{count} kantoj, je %{artist}"
+
+#: front/src/components/library/Track.vue:20
+msgid "Album page"
+msgstr "Albumpagô"
+
+#: front/src/components/audio/Search.vue:19
+#: src/components/instance/Stats.vue:48
+#: front/src/components/manage/library/RequestsTable.vue:50
+#: front/src/components/requests/Form.vue:9
+msgid "Albums"
+msgstr "Albumoj"
+
+#: front/src/components/library/Artist.vue:44
+msgid "Albums by this artist"
+msgstr "Albumoj je ĉi-tiu artisto"
+
+#: front/src/components/manage/library/RequestsTable.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:19
+msgid "All"
+msgstr "Ĉia"
+
+#: front/src/components/playlists/Editor.vue:13
+msgid "An error occured while saving your changes"
+msgstr "Eraro okazis kiam konservi viajn ŝanĝojn"
+
+#: front/src/components/auth/Login.vue:10
+msgid "An unknown error happend, this can mean the server is down or cannot be reached"
+msgstr "Nekonata eraro okazis, povus signifi ke la servilo paneas aÅ­ ne estas atingebla"
+
+#: front/src/components/federation/LibraryTrackTable.vue:11
+#: front/src/components/library/import/BatchDetail.vue:68
+#: front/src/components/library/import/BatchList.vue:13
+#: front/src/components/library/import/BatchList.vue:22
+msgid "Any"
+msgstr "Ajn"
+
+#: front/src/components/library/import/BatchList.vue:24
+msgid "API"
+msgstr "API"
+
+#: front/src/components/federation/LibraryFollowTable.vue:68
+#: front/src/components/federation/LibraryFollowTable.vue:78
+msgid "Approve"
+msgstr "Aprobi"
+
+#: front/src/components/federation/LibraryFollowTable.vue:70
+msgid "Approve access?"
+msgstr "Aprobi atingo?"
+
+#: front/src/components/federation/LibraryFollowTable.vue:38
+msgid "Approved"
+msgstr "Aprobanta"
+
+#: front/src/components/auth/Logout.vue:5
+msgid "Are you sure you want to log out?"
+msgstr "Ĉu vi vere volas elsaluti?"
+
+#: front/src/components/audio/SearchBar.vue:25
+#: src/components/audio/track/Table.vue:7
+#: front/src/components/federation/LibraryTrackTable.vue:48
+#: front/src/components/library/Artist.vue:119
+#: front/src/components/manage/library/FilesTable.vue:38
+#: front/src/components/manage/library/RequestsTable.vue:49
+#: front/src/components/metadata/Search.vue:130
+msgid "Artist"
+msgstr "Artisto"
+
+#: front/src/components/requests/Form.vue:5
+msgid "Artist name"
+msgstr "Nomo de artisto"
+
+#: front/src/components/library/Album.vue:22
+#: src/components/library/Track.vue:23
+msgid "Artist page"
+msgstr "Artistpaĝo"
+
+#: front/src/components/audio/Search.vue:65
+msgid "Artist, album, track..."
+msgstr "Artisto, albumo, kanto…"
+
+#: front/src/components/audio/Search.vue:10
+#: src/components/instance/Stats.vue:42
+#: front/src/components/library/Artists.vue:119
+#: src/components/library/Library.vue:7
+msgid "Artists"
+msgstr "Artistoj"
+
+#: front/src/components/favorites/List.vue:33
+#: front/src/components/federation/LibraryTrackTable.vue:28
+#: front/src/components/library/Artists.vue:25
+#: src/components/library/Radios.vue:44
+#: front/src/components/manage/library/FilesTable.vue:19
+#: front/src/components/manage/library/RequestsTable.vue:19
+#: front/src/components/manage/users/UsersTable.vue:19
+#: front/src/views/federation/LibraryList.vue:28
+#: src/views/playlists/List.vue:27
+msgid "Ascending"
+msgstr "Foste"
+
+#: front/src/views/auth/PasswordReset.vue:27
+#, fuzzy
+msgid "Ask for a password reset"
+msgstr "Demandi pasvorto renuligado"
+
+#: front/src/views/federation/LibraryDetail.vue:56
+msgid "Auto importing"
+msgstr "AÅ­tomata importado"
+
+#: front/src/components/playlists/PlaylistModal.vue:26
+msgid "Available playlists"
+msgstr "Disponeblaj ludlistoj"
+
+#: front/src/components/auth/Settings.vue:34
+msgid "Avatar"
+msgstr "Avataro"
+
+#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24
+#: front/src/views/auth/PasswordResetConfirm.vue:18
+msgid "Back to login"
+msgstr "Reiri al ensalutpaĝo"
+
+#: front/src/views/federation/LibraryFollowersList.vue:5
+msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library."
+msgstr "Zorgu kiam vi akceptas petoj da sekvado, ĉar ĝi signifas ke la sekvanto atingos vian tutan muzikejo."
+
+#: front/src/components/library/Track.vue:80
+#: front/src/components/manage/library/FilesTable.vue:42
+msgid "Bitrate"
+msgstr "Bitrapido"
+
+#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
+msgid "Browse"
+msgstr "Folii"
+
+#: front/src/components/Sidebar.vue:50
+msgid "Browse library"
+msgstr "Folii muzikejon"
+
+#: front/src/components/library/Artists.vue:4
+msgid "Browsing artists"
+msgstr "Folii artistojn"
+
+#: front/src/views/federation/LibraryTrackList.vue:3
+msgid "Browsing federated tracks"
+msgstr "Folii federantajn kantojn"
+
+#: front/src/views/federation/LibraryFollowersList.vue:3
+msgid "Browsing followers"
+msgstr "Folii sekvadojn"
+
+#: front/src/views/federation/LibraryList.vue:3
+msgid "Browsing libraries"
+msgstr "Folii muzikejojn"
+
+#: front/src/views/playlists/List.vue:3
+msgid "Browsing playlists"
+msgstr "Folii ludlistojn"
+
+#: front/src/components/library/Radios.vue:4
+msgid "Browsing radios"
+msgstr "Folii radiojn"
+
+#: front/src/components/library/radios/Builder.vue:5
+msgid "Builder"
+msgstr "Konstruilo"
+
+#: front/src/components/audio/album/Card.vue:13
+msgid "By %{ artist }"
+msgstr "Je %{artist}"
+
+#: front/src/components/federation/LibraryFollowTable.vue:57
+msgid "By confirming, %{ username } will be denied access to your library."
+msgstr "Konfirmante, %{username} ne plu rajtos atingi vian muzikejo."
+
+#: front/src/components/federation/LibraryFollowTable.vue:73
+msgid "By confirming, %{ username } will be granted access to your library."
+msgstr "Konfirmante, %{username} rajtos atingi vian muzikejo."
+
+#: front/src/components/audio/track/Table.vue:43
+#: front/src/components/common/DangerousButton.vue:17
+#: front/src/components/library/radios/Filter.vue:53
+#: front/src/components/playlists/PlaylistModal.vue:63
+msgid "Cancel"
+msgstr "Nuligi"
+
+#: front/src/components/library/radios/Builder.vue:59
+msgid "Candidates"
+msgstr "Kandidatoj"
+
+#: front/src/components/auth/Settings.vue:76
+msgid "Cannot change your password"
+msgstr "Ne eblas ŝanĝi vian pasvorton"
+
+#: front/src/App.vue:66
+msgid "Change language"
+msgstr "Ŝanĝi lingvon"
+
+#: front/src/components/auth/Settings.vue:67
+msgid "Change my password"
+msgstr "Ŝanĝi mian pasvorton"
+
+#: front/src/components/auth/Settings.vue:95
+msgid "Change password"
+msgstr "Ŝanĝi pasvorton"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:4
+#: front/src/views/auth/PasswordResetConfirm.vue:62
+msgid "Change your password"
+msgstr "Ŝanĝi vian pasvorton"
+
+#: front/src/components/auth/Settings.vue:96
+msgid "Change your password?"
+msgstr "Ĉu vi volas ŝanĝi vian pasvorton?"
+
+#: front/src/components/playlists/Editor.vue:21
+msgid "Changes synced with server"
+msgstr "Konservis ŝanĝoj"
+
+#: front/src/components/auth/Settings.vue:70
+msgid "Changing your password will also change your Subsonic API password if you have requested one."
+msgstr "Ŝanĝi vian pasvorton ankaŭ ŝanĝos vian Subsonic API pasvorto se vi petis tiun."
+
+#: front/src/components/auth/Settings.vue:98
+msgid "Changing your password will have the following consequences"
+msgstr "Ŝanĝi vian pasvorton tiel rezultigos"
+
+#: front/src/App.vue:4
+msgid "Choose your instance"
+msgstr "Elekti vian instanco"
+
+#: front/src/components/Home.vue:64
+msgid "Clean library"
+msgstr "Purigi muzikejon"
+
+#: front/src/components/manage/users/InvitationForm.vue:37
+msgid "Clear"
+msgstr "Purigi"
+
+#: front/src/components/playlists/Editor.vue:40
+#: front/src/components/playlists/Editor.vue:45
+msgid "Clear playlist"
+msgstr "Purigi ludliston"
+
+#: front/src/components/audio/Player.vue:270
+msgid "Clear your queue"
+msgstr "Purigi vian atendovico"
+
+#: front/src/components/library/import/BatchList.vue:23
+msgid "CLI"
+msgstr "Komandlinia interfaco"
+
+#: front/src/components/Home.vue:44
+msgid "Click once, listen for hours using built-in radios"
+msgstr "Alklaki unu foje, aÅ­skulti enkonstruitajn radiojn dum horoj"
+
+#: front/src/components/manage/library/RequestsTable.vue:30
+#: front/src/components/manage/library/RequestsTable.vue:64
+msgid "Closed"
+msgstr "Fermanta"
+
+#: front/src/components/manage/users/InvitationForm.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:42
+msgid "Code"
+msgstr "Kodo"
+
+#: front/src/components/audio/album/Card.vue:43
+#: front/src/components/audio/artist/Card.vue:33
+#: front/src/components/discussion/Comment.vue:20
+msgid "Collapse"
+msgstr "Malgrandigi"
+
+#: front/src/components/manage/library/RequestsTable.vue:51
+#: front/src/components/requests/Form.vue:14
+msgid "Comment"
+msgstr "Komenti"
+
+#: front/src/components/library/radios/Builder.vue:58
+msgid "Config"
+msgstr "Preferoj"
+
+#: front/src/components/common/DangerousButton.vue:21
+msgid "Confirm"
+msgstr "Konfirmi"
+
+#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20
+#: front/src/views/auth/EmailConfirm.vue:51
+msgid "Confirm your email"
+msgstr "Konfirmi vian retadreson"
+
+#: front/src/views/auth/EmailConfirm.vue:13
+msgid "Confirmation code"
+msgstr "Konfirmada kodo"
+
+#: front/src/components/playlists/Editor.vue:163
+msgid "Copy tracks from current queue to playlist"
+msgstr "Kopii kantojn el la aktuala atendovico en tiu ludlisto"
+
+#: front/src/components/Home.vue:88
+msgid "Covers, lyrics, our goal is to have them all ;)"
+msgstr "Reludversioj, kantparoloj, nian celon estas havi ĉiujn ;)"
+
+#: front/src/components/auth/Signup.vue:4
+msgid "Create a funkwhale account"
+msgstr "Krei Funkwhale konton"
+
+#: front/src/components/playlists/Form.vue:2
+msgid "Create a new playlist"
+msgstr "Krei novan ludliston"
+
+#: front/src/components/auth/Login.vue:17
+msgid "Create an account"
+msgstr "Krei konton"
+
+#: front/src/components/manage/library/RequestsTable.vue:88
+#: front/src/components/requests/Card.vue:25
+msgid "Create import"
+msgstr "Krei importadon"
+
+#: front/src/components/auth/Signup.vue:51
+msgid "Create my account"
+msgstr "Kreu mian konton"
+
+#: front/src/components/playlists/Form.vue:34
+msgid "Create playlist"
+msgstr "Krei ludliston"
+
+#: front/src/components/library/Radios.vue:23
+msgid "Create your own radio"
+msgstr "Krei vian propran radion"
+
+#: front/src/components/federation/LibraryFollowTable.vue:22
+#: front/src/components/manage/library/RequestsTable.vue:52
+#: front/src/components/manage/users/InvitationsTable.vue:40
+msgid "Creation date"
+msgstr "Kreodato"
+
+#: front/src/components/auth/Settings.vue:54
+msgid "Current avatar"
+msgstr "Aktuala avataro"
+
+#: front/src/components/playlists/PlaylistModal.vue:8
+msgid "Current track"
+msgstr "Aktuala kanto"
+
+#: front/src/components/manage/library/FilesTable.vue:189
+#: front/src/components/manage/library/RequestsTable.vue:195
+#: front/src/components/manage/users/InvitationsTable.vue:166
+#: front/src/views/playlists/Detail.vue:33
+msgid "Delete"
+msgstr "Forigi"
+
+#: front/src/views/playlists/Detail.vue:38
+msgid "Delete playlist"
+msgstr "Forigi ludliston"
+
+#: front/src/views/radios/Detail.vue:28
+msgid "Delete radio"
+msgstr "Forigi radion"
+
+#: front/src/components/federation/LibraryFollowTable.vue:52
+#: front/src/components/federation/LibraryFollowTable.vue:63
+msgid "Deny"
+msgstr "Malrajtu"
+
+#: front/src/components/federation/LibraryFollowTable.vue:54
+msgid "Deny access?"
+msgstr "Malrajti atingado?"
+
+#: front/src/components/favorites/List.vue:34
+#: front/src/components/federation/LibraryTrackTable.vue:29
+#: front/src/components/library/Artists.vue:26
+#: src/components/library/Radios.vue:47
+#: front/src/components/manage/library/FilesTable.vue:20
+#: front/src/components/manage/library/RequestsTable.vue:20
+#: front/src/components/manage/users/UsersTable.vue:20
+#: front/src/views/federation/LibraryList.vue:29
+#: src/views/playlists/List.vue:28
+msgid "Descending"
+msgstr "Malfoste"
+
+#: front/src/components/federation/LibraryCard.vue:50
+msgid "Detail"
+msgstr "Detalo"
+
+#: front/src/views/admin/users/UsersDetail.vue:146
+msgid "Determine if the user account is active or not. Inactive users cannot login or use the service."
+msgstr "Elekti ĉu la konton aktivas aŭ ne. Malaktivaj konton ne eblas ensaluti aŭ uzi la servico."
+
+#: front/src/components/auth/Settings.vue:104
+#: front/src/components/auth/SubsonicTokenForm.vue:52
+msgid "Disable access"
+msgstr "Malatingeblu"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:49
+msgid "Disable Subsonic access"
+msgstr "Malatingeblu Subsonic"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:50
+msgid "Disable Subsonic API access?"
+msgstr "Ĉu vi volas malatingeblu la Subsonic API?"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:14
+msgid "Discover how to use Funkwhale from other apps"
+msgstr "Malkovri kiel vi povas uzi Funkwhale el aliaj aplikaĵoj"
+
+#: front/src/components/library/radios/Builder.vue:26
+msgid "Display publicly"
+msgstr "Publike montri"
+
+#: front/src/components/playlists/Editor.vue:42
+msgid "Do you want to clear the playlist \"%{ playlist }\"?"
+msgstr "Ĉu vi volas purigi la \"%{playlist}\" ludliston?"
+
+#: front/src/components/common/DangerousButton.vue:7
+msgid "Do you want to confirm this action?"
+msgstr "Ĉu vi volas konfirmi tiun akton?"
+
+#: front/src/views/playlists/Detail.vue:35
+msgid "Do you want to delete the playlist \"%{ playlist }\"?"
+msgstr "Ĉu vi volas forigi la \"%{playlist}\" ludliston?"
+
+#: front/src/views/radios/Detail.vue:26
+#, fuzzy
+msgid "Do you want to delete the radio \"%{ radio }\"?"
+msgstr "Ĉu vi volas forigi la \"%{playlist}\" ludliston?"
+
+#: front/src/components/common/ActionTable.vue:29
+msgid "Do you want to launch %{ action } on %{ count } element?"
+msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
+msgstr[0] "Ĉu vi volas komenci %{action} por %{count} ero?"
+msgstr[1] "Ĉu vi volas komenci %{action} por %{count} eroj?"
+
+#: front/src/components/Sidebar.vue:113
+msgid "Do you want to restore your previous queue?"
+msgstr "Ĉu vi volas reŝargi vian antaŭan atendovicon?"
+
+#: front/src/App.vue:38
+msgid "Documentation"
+msgstr "Dokumentaro"
+
+#: front/src/components/audio/track/Table.vue:24
+#: src/components/library/Track.vue:48
+msgid "Download"
+msgstr "Elŝuti"
+
+#: front/src/components/audio/track/Table.vue:27
+msgid "Download tracks"
+msgstr "Elŝuti kantojn"
+
+#: front/src/components/playlists/Editor.vue:49
+msgid "Drag and drop rows to reorder tracks in the playlist"
+msgstr "Treni kaj guti horizontaloj por reordigi kantojn en la ludlisto"
+
+#: front/src/components/library/Track.vue:58
+#: front/src/components/manage/library/FilesTable.vue:43
+msgid "Duration"
+msgstr "DaÅ­ro"
+
+#: front/src/components/Home.vue:96
+msgid "Easy to use"
+msgstr "Facila uzo"
+
+#: front/src/components/About.vue:21
+msgid "Edit instance info"
+msgstr "Redakti informoj de instanco"
+
+#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30
+msgid "Edit..."
+msgstr "Redakti…"
+
+#: front/src/components/auth/Signup.vue:29
+#: front/src/components/manage/users/UsersTable.vue:38
+msgid "Email"
+msgstr "Retmesaĝo"
+
+#: front/src/views/admin/users/UsersDetail.vue:29
+msgid "Email address"
+msgstr "Retadreso"
+
+#: front/src/views/auth/EmailConfirm.vue:23
+msgid "Email confirmed"
+msgstr "Konfirmis retadreso"
+
+#: front/src/views/playlists/Detail.vue:29
+msgid "End edition"
+msgstr "Fini redakto"
+
+#: front/src/components/library/import/FileUpload.vue:4
+msgid "Ensure your music files are properly tagged before uploading them."
+msgstr ""
+"Zorgu ke viajn muzikdosierojn estas korekte etikedanta antaŭ alŝutis ilin."
+
+#: front/src/components/library/Radios.vue:140
+msgid "Enter a radio name..."
+msgstr "Tajpu nomon de radio…"
+
+#: front/src/components/library/Artists.vue:118
+msgid "Enter an artist name..."
+msgstr "Tajpu nomon de artisto…"
+
+#: front/src/views/federation/LibraryList.vue:122
+msgid "Enter an library domain name..."
+msgstr ""
+
+#: front/src/views/playlists/List.vue:104
+msgid "Enter an playlist name..."
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:98
+msgid "Enter your email"
+msgstr "Tajpu vian retadreson"
+
+#: front/src/components/auth/Signup.vue:96
+msgid "Enter your invitation code (case insensitive)"
+msgstr "Tajpu vian invitkodon (usklecoblindan)"
+
+#: front/src/components/metadata/Search.vue:114
+msgid "Enter your search query..."
+msgstr "Tajpu vian serĉon…"
+
+#: front/src/components/auth/Signup.vue:97
+msgid "Enter your username"
+msgstr "Tajpu vian uzantnomon"
+
+#: front/src/components/auth/Login.vue:77
+msgid "Enter your username or email"
+msgstr "Tajpu vian uzantnomon aÅ­ retadreson"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:20
+msgid "Error"
+msgstr "Eraro"
+
+#: front/src/views/admin/Settings.vue:87
+msgid "Error reporting"
+msgstr "Eraroraportado"
+
+#: front/src/components/common/ActionTable.vue:75
+msgid "Error while applying action"
+msgstr "Eraro kiam ruli akton"
+
+#: front/src/views/auth/PasswordReset.vue:7
+msgid "Error while asking for a password reset"
+msgstr "Eraro kiam demandi renuligadon de pasvorto"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:7
+msgid "Error while changing your password"
+msgstr "Eraro kiam ŝanĝi vian pasvorton"
+
+#: front/src/views/auth/EmailConfirm.vue:7
+msgid "Error while confirming your email"
+msgstr "Eraro kiam konfirmi vian retadreson"
+
+#: front/src/components/manage/users/InvitationForm.vue:4
+msgid "Error while creating invitation"
+msgstr "Eraro kiam krei inviton"
+
+#: front/src/components/admin/SettingsGroup.vue:5
+msgid "Error while saving settings"
+msgstr "Eraro kiam konservi preferojn"
+
+#: front/src/components/federation/LibraryForm.vue:10
+msgid "Error while scanning library"
+msgstr "Eraro kiam skani muzikejon"
+
+#: front/src/components/library/import/BatchDetail.vue:41
+#: front/src/components/library/import/BatchDetail.vue:70
+#: front/src/components/library/import/BatchList.vue:15
+msgid "Errored"
+msgstr "Eraris"
+
+#: front/src/components/playlists/Form.vue:89
+msgid "Everyone"
+msgstr "Ĉiu"
+
+#: front/src/components/playlists/Form.vue:85
+msgid "Everyone on this instance"
+msgstr "Ĉiu en ĉi-tiu instanco"
+
+#: front/src/components/library/radios/Builder.vue:57
+msgid "Exclude"
+msgstr "Ekskluzivi"
+
+#: front/src/components/discussion/Comment.vue:14
+msgid "Expand"
+msgstr "Grandigi"
+
+#: front/src/components/manage/users/InvitationsTable.vue:41
+msgid "Expiration date"
+msgstr "Fortempiĝa dato"
+
+#: front/src/components/manage/users/InvitationsTable.vue:50
+msgid "Expired"
+msgstr "Fortempiĝis"
+
+#: front/src/components/manage/users/InvitationsTable.vue:21
+msgid "Expired/used"
+msgstr "Fortempiĝis aŭ uzantiĝis"
+
+#: front/src/components/library/import/Main.vue:65
+msgid "External source. Supported backends"
+msgstr "Ekstera fonto. Kompateblaj servicoj"
+
+#: front/src/components/Sidebar.vue:51
+msgid "Favorites"
+msgstr "Stelumoj"
+
+#: front/src/components/federation/LibraryForm.vue:3
+msgid "Federate with a new instance"
+msgstr "Federi kun nova instanco"
+
+#: front/src/views/federation/LibraryTrackList.vue:21
+msgid "Federated tracks"
+msgstr "Federataj kantoj"
+
+#: front/src/components/Sidebar.vue:87
+#: src/components/library/import/BatchList.vue:25
+#: front/src/components/manage/users/UsersTable.vue:180
+#: front/src/views/admin/Settings.vue:84
+#: src/views/admin/users/UsersDetail.vue:161
+#: front/src/views/federation/Base.vue:35
+#: src/views/federation/LibraryDetail.vue:40
+msgid "Federation"
+msgstr "Federo"
+
+#: front/src/views/federation/LibraryDetail.vue:3
+msgid "File mirroring"
+msgstr "Dosierospegulado"
+
+#: front/src/components/library/import/FileUpload.vue:43
+msgid "File name"
+msgstr "Nomo de la dosiero"
+
+#: front/src/components/library/import/Main.vue:76
+msgid "File upload"
+msgstr "Dosiero alŝutado"
+
+#: front/src/views/admin/library/Base.vue:5
+#: src/views/admin/library/FilesList.vue:21
+msgid "Files"
+msgstr "Dosieroj"
+
+#: front/src/components/library/import/ArtistImport.vue:7
+msgid "Filter album types"
+msgstr "Filtri albumtipoj"
+
+#: front/src/components/library/radios/Builder.vue:56
+msgid "Filter name"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:52
+msgid "Finish import"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:54
+msgid "Finished"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:59
+msgid "First, choose where you want to import the music from"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:44
+msgid "Follow"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:36
+msgid "Follow request pending approval"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:21
+msgid "Follow status"
+msgstr ""
+
+#: front/src/views/federation/Base.vue:13
+#: front/src/views/federation/LibraryFollowersList.vue:24
+msgid "Followers"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:18
+msgid "Followers only"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:15
+#: front/src/views/federation/LibraryDetail.vue:29
+msgid "Following"
+msgstr ""
+
+#: front/src/components/activity/Like.vue:12
+#: src/components/activity/Listen.vue:12
+msgid "from %{ album } by %{ artist }"
+msgstr ""
+
+#: front/src/components/library/Track.vue:13
+msgid "From album %{ album } by %{ artist }"
+msgstr ""
+
+#: front/src/App.vue:56
+msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgid "Funkwhale is compatible with other music players that support the Subsonic API."
+msgstr ""
+
+#: front/src/components/Home.vue:98
+msgid "Funkwhale is dead simple to use."
+msgstr ""
+
+#: front/src/components/Home.vue:39
+msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists."
+msgstr ""
+
+#: front/src/components/Home.vue:119
+msgid "Funkwhale is free and gives you control on your music."
+msgstr ""
+
+#: front/src/components/Home.vue:66
+msgid "Funkwhale takes care of handling your music"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:16
+msgid "Get a new invitation"
+msgstr ""
+
+#: front/src/components/Home.vue:13
+msgid "Get me to the library"
+msgstr ""
+
+#: front/src/components/Home.vue:77
+msgid ""
+"Get quality metadata about your music thanks to\n"
+"              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:21
+#: front/src/components/common/ActionTable.vue:27
+msgid "Go"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:14
+msgid "Go to home page"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:13
+msgid "Grab corresponding metadata"
+msgstr ""
+
+#: front/src/App.vue:74
+msgid "Help us translate Funkwhale"
+msgstr ""
+
+#: front/src/components/library/Home.vue:65
+msgid "Home"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:36
+msgid "Hours of music"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:11
+msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:34
+msgid "ID"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:24
+msgid "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."
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:196
+#: front/src/components/library/Library.vue:17
+msgid "Import"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:57
+msgid "Import #%{ id } launched"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:38
+msgid "Import %{ count } track"
+msgid_plural "Import %{ count } tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/import/BatchDetail.vue:10
+msgid "Import batch"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:185
+msgid "Import Batch #%{ id }"
+msgstr ""
+
+#: front/src/components/library/Library.vue:20
+msgid "Import batches"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:117
+msgid "Import Batches"
+msgstr ""
+
+#: front/src/components/manage/library/FilesTable.vue:40
+#: front/src/components/manage/library/RequestsTable.vue:53
+msgid "Import date"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:38
+msgid "Import detail page"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:81
+msgid "Import music"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:267
+msgid "Import Music"
+msgstr ""
+
+#: front/src/components/Home.vue:71
+msgid "Import music from various platforms, such as YouTube or SoundCloud"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:14
+#: front/src/components/federation/LibraryTrackTable.vue:66
+msgid "Import pending"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:9
+#: front/src/views/admin/library/RequestsList.vue:3
+#: front/src/views/admin/library/RequestsList.vue:21
+msgid "Import requests"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:20
+#: front/src/components/library/import/Main.vue:6
+msgid "Import source"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:9
+msgid "Import status"
+msgstr ""
+
+#: front/src/components/library/import/ReleaseImport.vue:14
+msgid "Import this release"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:11
+msgid "Import this track"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:12
+#: front/src/components/manage/library/RequestsTable.vue:29
+#: front/src/components/manage/library/RequestsTable.vue:61
+msgid "Imported"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:44
+msgid "Imported URL"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:82
+msgid "Imports"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:3
+msgid "In favorites"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:65
+msgid "In library"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:54
+msgid "Inactive"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:96
+msgid "Input a MusicBrainz ID manually:"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:53
+msgid "Input the email address binded to your account"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:31
+msgid "Insert from queue (%{ count } track)"
+msgid_plural "Insert from queue (%{ count } tracks)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/views/admin/Settings.vue:80
+msgid "Instance information"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:9
+msgid "Instance radios"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:75
+msgid "Instance settings"
+msgstr ""
+
+#: front/src/views/instance/Timeline.vue:57
+msgid "Instance Timeline"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:42
+#: front/src/components/manage/users/InvitationForm.vue:11
+msgid "Invitation code"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:43
+msgid "Invitation code (optional)"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:8
+#: src/views/admin/users/InvitationsList.vue:3
+#: front/src/views/admin/users/InvitationsList.vue:24
+msgid "Invitations"
+msgstr ""
+
+#: front/src/App.vue:43
+msgid "Issue tracker"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:80
+msgid "Job ID"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:36
+msgid "Jobs"
+msgstr ""
+
+#: front/src/components/Home.vue:50
+msgid "Keep a track of your favorite songs"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:33
+msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:41
+#: front/src/views/admin/users/UsersDetail.vue:45
+msgid "Last activity"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:101
+msgid "Last fetched"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:32
+msgid "Last modification"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:39
+msgid "Launch"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:18
+#: front/src/components/library/import/BatchList.vue:35
+msgid "Launch date"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:31
+msgid "Launch scan"
+msgstr ""
+
+#: front/src/components/Home.vue:10
+msgid "Learn more about this instance"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:58
+msgid "Leave empty for a random code"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:10
+msgid "Leave this field empty if you're requesting the whole discography."
+msgstr ""
+
+#: front/src/views/federation/Base.vue:5
+#: src/views/federation/LibraryList.vue:123
+msgid "Libraries"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:70
+#: front/src/components/federation/LibraryTrackTable.vue:51
+#: front/src/components/instance/Stats.vue:30
+#: front/src/components/manage/users/UsersTable.vue:176
+#: front/src/views/admin/users/UsersDetail.vue:157
+#: front/src/views/federation/LibraryDetail.vue:194
+msgid "Library"
+msgstr ""
+
+#: front/src/views/admin/library/FilesList.vue:3
+msgid "Library files"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:20
+msgid "Library name"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:84
+msgid "Library size"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:96
+msgid "library@demo.funkwhale.audio"
+msgstr ""
+
+#: front/src/App.vue:29
+msgid "Links"
+msgstr ""
+
+#: front/src/views/instance/Timeline.vue:4
+msgid "Loading timeline..."
+msgstr ""
+
+#: front/src/components/favorites/List.vue:5
+msgid "Loading your favorites..."
+msgstr ""
+
+#: front/src/components/auth/Login.vue:78
+msgid "Log In"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:4
+msgid "Log in to your Funkwhale account"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:20
+msgid "Log Out"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:38
+msgid "Logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41
+msgid "Login"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:43
+msgid "Logout"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:266
+msgid "Looping disabled. Click to switch to single-track looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:267
+msgid "Looping on a single track. Click to switch to whole queue looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:268
+msgid "Looping on whole queue. Click to disable looping."
+msgstr ""
+
+#: front/src/components/library/Track.vue:94
+msgid "Lyrics"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:25
+msgid "Manage library"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:3
+msgid "Manage playlists"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:20
+msgid "Manage users"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:8
+msgid "Manage your playlists"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:197
+msgid "Mark as closed"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:196
+msgid "Mark as imported"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:12
+msgid "Metadata"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:115
+msgid ""
+"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n"
+"            <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"              MusicBrainz\n"
+"            </a>\n"
+"            project, which you can think about as the Wikipedia of music."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:48
+#: src/components/library/import/Main.vue:18
+msgid "Music"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:147
+msgid "Music request"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:265
+msgid "Mute"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:34
+msgid "My account"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:74
+msgid "My awesome playlist"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:227
+msgid "My awesome radio"
+msgstr ""
+
+#: front/src/components/library/Track.vue:64
+#: src/components/library/Track.vue:75
+#: front/src/components/library/Track.vue:86
+#: front/src/components/manage/library/FilesTable.vue:63
+#: front/src/components/manage/library/FilesTable.vue:69
+#: front/src/components/manage/library/FilesTable.vue:75
+#: front/src/components/manage/library/FilesTable.vue:81
+#: front/src/components/manage/library/RequestsTable.vue:71
+#: front/src/components/manage/library/RequestsTable.vue:75
+#: front/src/components/manage/library/RequestsTable.vue:82
+#: front/src/components/manage/users/UsersTable.vue:61
+#: front/src/views/admin/users/UsersDetail.vue:49
+msgid "N/A"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/views/admin/users/UsersDetail.vue:21
+msgid "Name"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:88
+#: front/src/views/auth/PasswordResetConfirm.vue:14
+msgid "New password"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:158
+msgid "New tracks will be appended here automatically."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:29
+msgid "Next step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:263
+msgid "Next track"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:125
+msgid "No"
+msgstr ""
+
+#: front/src/components/Home.vue:103
+msgid "No add-ons, no plugins : you only need a web library"
+msgstr ""
+
+#: front/src/components/library/Track.vue:102
+msgid "No lyrics available for this track."
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:81
+msgid "Nobody except me"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:32
+msgid "Not following"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:13
+#: front/src/components/federation/LibraryTrackTable.vue:67
+msgid "Not imported"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:51
+msgid "Not used"
+msgstr ""
+
+#: front/src/App.vue:37
+msgid "Official website"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:83
+msgid "Old password"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:36
+msgid "Once all your files are uploaded, simply click the following button to check the import status."
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:21
+#: front/src/components/manage/users/InvitationsTable.vue:20
+msgid "Open"
+msgstr ""
+
+#: front/src/App.vue:63
+msgid "Options"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:93
+msgid "Or"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:18
+#: front/src/components/library/Artists.vue:15
+#: src/components/library/Radios.vue:33
+#: front/src/components/manage/library/FilesTable.vue:9
+#: front/src/components/manage/library/RequestsTable.vue:9
+#: front/src/components/manage/users/InvitationsTable.vue:9
+#: front/src/components/manage/users/UsersTable.vue:9
+#: front/src/views/federation/LibraryList.vue:18
+#: src/views/playlists/List.vue:17
+msgid "Ordering"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:31
+#: front/src/components/federation/LibraryTrackTable.vue:26
+#: front/src/components/library/Artists.vue:23
+#: src/components/library/Radios.vue:41
+#: front/src/components/manage/library/FilesTable.vue:17
+#: front/src/components/manage/library/RequestsTable.vue:17
+#: front/src/components/manage/users/UsersTable.vue:17
+#: front/src/views/federation/LibraryList.vue:26
+#: src/views/playlists/List.vue:25
+msgid "Ordering direction"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:38
+msgid "Owner"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:33
+msgid "Page Not Found"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:7
+msgid "Page not found!"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38
+msgid "Password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:95
+msgid "Password updated"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:28
+msgid "Password updated successfully"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:262
+msgid "Pause track"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:33
+#: front/src/components/library/import/BatchDetail.vue:69
+#: front/src/components/library/import/BatchList.vue:14
+#: front/src/components/library/import/FileUpload.vue:59
+#: front/src/components/manage/library/RequestsTable.vue:27
+#: front/src/components/manage/library/RequestsTable.vue:63
+msgid "Pending"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:11
+#: front/src/views/federation/LibraryDetail.vue:26
+msgid "Pending approval"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:217
+msgid "Pending follow requests"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26
+msgid "Pending import requests"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36
+msgid "Pending requests"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:42
+#: front/src/views/admin/users/UsersDetail.vue:68
+msgid "Permissions"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:9
+#: src/components/library/Track.vue:30
+msgid "Play"
+msgstr ""
+
+#: front/src/components/audio/album/Card.vue:50
+#: front/src/components/audio/artist/Card.vue:44
+#: src/components/library/Album.vue:28 front/src/views/playlists/Detail.vue:23
+msgid "Play all"
+msgstr ""
+
+#: front/src/components/library/Artist.vue:26
+msgid "Play all albums"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:58
+msgid "Play immediatly"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:15
+msgid "Play next"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:16
+msgid "Play now"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:261
+msgid "Play track"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:90
+msgid "Playlist"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:12
+msgid "Playlist containing %{ count } track, by %{ username }"
+msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/playlists/Form.vue:9
+msgid "Playlist created"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:4
+msgid "Playlist editor"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:21
+msgid "Playlist name"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:6
+msgid "Playlist updated"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:25
+msgid "Playlist visibility"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16
+#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83
+#: front/src/views/playlists/List.vue:103
+msgid "Playlists"
+msgstr ""
+
+#: front/src/components/Home.vue:56
+msgid "Playlists? We got them"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
+msgid "Please double-check your password is correct"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:9
+msgid "Please double-check your username/password couple is correct"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:46
+msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:26
+msgid "Previous step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:260
+msgid "Previous track"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:26
+#: front/src/views/auth/PasswordResetConfirm.vue:31
+msgid "Proceed to login"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:50
+msgid "Published date"
+msgstr ""
+
+#: front/src/components/library/import/ArtistImport.vue:17
+msgid "Query template"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:20
+msgid "Queue"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:203
+msgid "Queue shuffled!"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:80
+msgid "Radio"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:226
+msgid "Radio Builder"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:15
+msgid "Radio created"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:21
+msgid "Radio name"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:12
+#, fuzzy
+msgid "Radio updated"
+msgstr "Kreodato"
+
+#: front/src/components/library/Library.vue:10
+#: src/components/library/Radios.vue:141
+msgid "Radios"
+msgstr ""
+
+#: front/src/views/instance/Timeline.vue:7
+msgid "Recent activity on this instance"
+msgstr ""
+
+#: front/src/components/library/Home.vue:24
+msgid "Recently added"
+msgstr ""
+
+#: front/src/components/library/Home.vue:11
+msgid "Recently favorited"
+msgstr ""
+
+#: front/src/components/library/Home.vue:6
+msgid "Recently listened"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:81
+msgid "Recording MusicBrainz ID"
+msgstr ""
+
+#: front/src/views/admin/users/UsersDetail.vue:84
+#: front/src/views/federation/LibraryDetail.vue:122
+msgid "Refresh"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:42
+msgid "Refused"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:12
+msgid "Registered since %{ date }"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:9
+msgid "Registration are closed on this instance, you will need an invitation code to signup."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:71
+msgid "regular user"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:59
+msgid "Remove"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:58
+msgid "Remove avatar"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:19
+msgid "Remove from favorites"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:34
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+msgid "Request a new password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:35
+msgid "Request a new Subsonic API password?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:43
+msgid "Request a password"
+msgstr ""
+
+#: front/src/App.vue:35
+msgid "Request music"
+msgstr ""
+
+#: front/src/views/library/MusicRequest.vue:4
+#: src/views/library/MusicRequest.vue:21
+msgid "Request some music"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:20
+msgid "Request submitted!"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:49
+msgid "Rerun errored jobs"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:187
+msgid "Rerun job"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4
+#: front/src/views/auth/PasswordReset.vue:52
+msgid "Reset your password"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:31
+msgid "Result %{ current }/%{ total }"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:38
+#: src/components/library/Artists.vue:30
+#: front/src/components/library/Radios.vue:52
+#: src/views/federation/LibraryList.vue:33
+#: front/src/views/playlists/List.vue:32
+msgid "Results per page"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:63
+#: front/src/components/library/radios/Builder.vue:29
+msgid "Save"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:112
+msgid "Scan triggered!"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:5
+#: front/src/components/library/Artists.vue:10
+#: src/components/library/Radios.vue:29
+#: front/src/components/library/import/BatchDetail.vue:62
+#: front/src/components/library/import/BatchList.vue:7
+#: front/src/components/manage/library/FilesTable.vue:5
+#: front/src/components/manage/library/RequestsTable.vue:5
+#: front/src/components/manage/users/InvitationsTable.vue:5
+#: front/src/components/manage/users/UsersTable.vue:5
+#: front/src/views/federation/LibraryList.vue:14
+#: src/views/playlists/List.vue:13
+msgid "Search"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:85
+msgid "Search an entity you want to import:"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:180
+msgid "Search by artist, username, comment..."
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:188
+msgid "Search by source..."
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:116
+msgid "Search by submitter, source..."
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:182
+#: front/src/components/manage/library/FilesTable.vue:175
+msgid "Search by title, artist, domain..."
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:140
+msgid "Search by username, domain..."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:152
+msgid "Search by username, email, code..."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:162
+msgid "Search by username, email, name..."
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:20
+msgid "Search for artists, albums, tracks..."
+msgstr ""
+
+#: front/src/components/audio/Search.vue:2
+msgid "Search for some music"
+msgstr ""
+
+#: front/src/components/library/Track.vue:105
+msgid "Search on lyrics.wikia.com"
+msgstr ""
+
+#: front/src/components/library/Album.vue:33
+#: src/components/library/Artist.vue:31
+#: front/src/components/library/Track.vue:40
+msgid "Search on Wikipedia"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:42
+msgid "Search query"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:15
+msgid "Sections"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:41
+msgid "Select a filter"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:61
+msgid "Select all %{ total } elements"
+msgid_plural "Select all %{ total } elements"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/import/FileUpload.vue:22
+msgid "Select files to upload..."
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:69
+msgid "Select only current page"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:19
+msgid "Select relevant sources or files for import"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:43
+msgid "Send a follow request"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:97
+#: src/components/manage/users/UsersTable.vue:184
+#: front/src/views/admin/users/UsersDetail.vue:165
+msgid "Settings"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:10
+msgid "Settings updated"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:11
+msgid "Settings updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:24
+msgid "Settings..."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:27
+msgid "Share link"
+msgstr ""
+
+#: front/src/components/audio/artist/Card.vue:30
+msgid "Show 1 more album"
+msgid_plural "Show %{ count } more albums"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/audio/album/Card.vue:40
+msgid "Show 1 more track"
+msgid_plural "Show %{ count } more tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/forms/PasswordInput.vue:25
+msgid "Show/hide password"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:97
+#: front/src/components/federation/LibraryTrackTable.vue:98
+#: front/src/components/library/import/BatchDetail.vue:128
+#: front/src/components/library/import/BatchList.vue:73
+#: front/src/components/manage/library/FilesTable.vue:97
+#: front/src/components/manage/library/RequestsTable.vue:104
+#: front/src/components/manage/users/InvitationsTable.vue:76
+#: front/src/components/manage/users/UsersTable.vue:87
+msgid "Showing results %{ start }-%{ end } on %{ total }"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:269
+msgid "Shuffle your queue"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:95
+msgid "Sign Up"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:40
+#: front/src/views/admin/users/UsersDetail.vue:37
+msgid "Sign-up"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:31
+msgid "Simply copy paste the snippet below into a terminal to launch the download."
+msgstr ""
+
+#: front/src/components/library/Track.vue:69
+#: front/src/components/library/import/FileUpload.vue:44
+#: front/src/components/manage/library/FilesTable.vue:44
+msgid "Size"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:37
+#: front/src/components/library/import/BatchDetail.vue:72
+msgid "Skipped"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:3
+msgid "Something's missing in the library? Let us know what you would like to listen!"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:25
+msgid "Sorry, we did not found any album matching your query"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:16
+msgid "Sorry, we did not found any artist matching your query"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:82
+#: front/src/components/library/import/BatchList.vue:38
+#: front/src/components/library/import/TrackImport.vue:17
+msgid "Source"
+msgstr ""
+
+#: front/src/App.vue:41
+msgid "Source code"
+msgstr ""
+
+#: front/src/App.vue:40
+msgid "Source code (%{version})"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:20
+#: front/src/components/manage/users/UsersTable.vue:70
+msgid "Staff member"
+msgstr ""
+
+#: front/src/components/radios/Button.vue:4
+msgid "Start"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:28
+msgid "Start Upload"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:86
+msgid "Statistics"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:66
+#: front/src/components/library/import/BatchDetail.vue:83
+#: front/src/components/library/import/BatchList.vue:11
+#: front/src/components/library/import/BatchList.vue:37
+#: front/src/components/library/import/FileUpload.vue:45
+#: front/src/components/manage/library/RequestsTable.vue:24
+#: front/src/components/manage/library/RequestsTable.vue:48
+#: front/src/components/manage/users/InvitationsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:39
+#: front/src/components/manage/users/UsersTable.vue:43
+msgid "Status"
+msgstr ""
+
+#: front/src/components/radios/Button.vue:3
+msgid "Stop"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:159
+msgid "Stop radio"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:32
+msgid "Stop Upload"
+msgstr ""
+
+#: front/src/App.vue:9 src/components/requests/Form.vue:17
+msgid "Submit"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:22
+msgid "Submit another request"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:26
+#: front/src/components/library/import/BatchList.vue:39
+msgid "Submitted by"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:85
+msgid "Subsonic"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:2
+msgid "Subsonic API password"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:71
+#: front/src/components/library/import/BatchList.vue:16
+#: front/src/components/library/import/FileUpload.vue:56
+msgid "Success"
+msgstr ""
+
+#: front/src/App.vue:11
+msgid "Suggested choices"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:9
+msgid "Syncing changes to server..."
+msgstr ""
+
+#: front/src/components/Home.vue:26
+msgid "That's simple: we loved Grooveshark and we want to build something even better."
+msgstr ""
+
+#: front/src/components/requests/Form.vue:73
+msgid "The Beatles, Mickael Jackson…"
+msgstr ""
+
+#: front/src/App.vue:59
+msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
+msgstr ""
+
+#: front/src/components/Home.vue:124
+msgid "The plaform is free and open-source, you can install it and modify it without worries"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:4
+msgid "The Subsonic API is not available on this Funkwhale instance."
+msgstr ""
+
+#: front/src/components/requests/Form.vue:74
+msgid "The White Album, Thriller…"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:30
+msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:149
+msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled."
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:195
+msgid "This indicate if the remote library granted you access"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:16
+msgid "This is you!"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:37
+msgid "This may affect a lot of elements, please double check this is really what you want."
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:61
+msgid "This track is not imported and cannot be played"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:37
+msgid "This will completely delete this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:27
+msgid "This will completely delete this radio and cannot be undone."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:51
+msgid "This will completely disable access to the Subsonic API using from account."
+msgstr ""
+
+#: front/src/App.vue:137
+msgid "This will erase your local data and disconnect you, do you want to continue?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:36
+msgid "This will log you out from existing devices that use the current password."
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:44
+msgid "This will remove all tracks from this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:6
+#: front/src/components/federation/LibraryTrackTable.vue:47
+#: front/src/components/manage/library/FilesTable.vue:37
+msgid "Title"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:27
+#: src/components/library/Track.vue:174
+#: front/src/components/library/import/BatchDetail.vue:84
+#: front/src/components/metadata/Search.vue:138
+msgid "Track"
+msgstr ""
+
+#: front/src/components/library/Track.vue:53
+msgid "Track information"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:44
+msgid "Track matching filter"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:54
+msgid "tracks"
+msgstr ""
+
+#: front/src/components/library/Album.vue:43
+#: front/src/components/playlists/PlaylistModal.vue:33
+#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50
+#: front/src/views/radios/Detail.vue:34
+msgid "Tracks"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:125
+msgid "Tracks available in this library"
+msgstr ""
+
+#: front/src/components/library/Artist.vue:54
+msgid "Tracks by this artist"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:25
+msgid "Tracks favorited"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:19
+msgid "tracks listened"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:109
+msgid "Trigger scan"
+msgstr ""
+
+#: front/src/components/manage/library/FilesTable.vue:41
+msgid "Type"
+msgstr ""
+
+#: front/src/components/About.vue:15
+msgid "Unfortunately, owners of this instance did not yet take the time to complete this page."
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:95
+msgid "Unknown"
+msgstr ""
+
+#: front/src/components/Home.vue:37
+msgid "Unlimited music"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:264
+msgid "Unmute"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:50
+msgid "Update avatar"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:33
+msgid "Update playlist"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:27
+msgid "Update settings"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:21
+msgid "Update your password"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:172
+#: front/src/views/admin/users/UsersDetail.vue:153
+msgid "Upload"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:45
+msgid "Upload a new avatar"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:7
+msgid "Uploaded files or external source"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:57
+msgid "Uploading..."
+msgstr ""
+
+#: front/src/App.vue:45
+msgid "Use another instance"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:75
+msgid "Use this comment box to add details to your request if needed"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:196
+msgid "Use this flag to enable/disable federation with this library"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:12
+msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:6
+msgid "Use this form to scan an instance and setup federation."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:49
+msgid "Used"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:47
+msgid "User"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:5
+msgid "User activity"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:20
+msgid "User radios"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:19
+#: front/src/components/manage/users/UsersTable.vue:37
+msgid "Username"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:15
+msgid "Username or email"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:13
+msgid "users"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81
+#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3
+#: front/src/views/admin/users/UsersList.vue:21
+msgid "Users"
+msgstr ""
+
+#: front/src/components/library/Album.vue:37
+#: src/components/library/Artist.vue:35
+#: front/src/components/library/Track.vue:44
+#: front/src/components/library/import/ArtistImport.vue:131
+#: front/src/components/metadata/ArtistCard.vue:49
+#: front/src/components/metadata/ReleaseCard.vue:53
+msgid "View on MusicBrainz"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:20
+msgid "We cannot add the track to a playlist"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:14
+msgid "We cannot create the playlist"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:13
+msgid "We cannot create your account"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:7
+msgid "We cannot log you in"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:38
+msgid "We cannot save your avatar"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:14
+msgid "We cannot save your settings"
+msgstr ""
+
+#: front/src/components/Home.vue:130
+msgid "We do not track you or bother you with ads"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:5
+msgid "We recommend using Picard for that purpose."
+msgstr ""
+
+#: front/src/components/Home.vue:7
+msgid "We think listening to music should be simple."
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:10
+msgid "We're sorry, the page you asked for does not exist:"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:21
+msgid "We've received your request, you'll get some groove soon ;)"
+msgstr ""
+
+#: front/src/components/Home.vue:152
+msgid "Welcome"
+msgstr ""
+
+#: front/src/components/Home.vue:5
+msgid "Welcome on Funkwhale"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:114
+msgid "What is metadata?"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:197
+msgid "When enabled, auto importing will automatically import new tracks published in this library"
+msgstr ""
+
+#: front/src/components/Home.vue:24
+msgid "Why funkwhale?"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:124
+msgid "Yes"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:8
+msgid "Yes, log me out!"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:7
+msgid "You are currently logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:111
+msgid "You can also skip this step and enter metadata manually."
+msgstr ""
+
+#: front/src/components/Home.vue:136
+msgid "You can invite friends and family to your instance so they can enjoy your music"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:7
+msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:8
+msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:156
+msgid "You have a radio playing"
+msgstr ""
+
+#: front/src/App.vue:6
+msgid "You need to select an instance in order to continue"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:100
+msgid "You will be logged out from this session and have to log in with the new one"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:71
+msgid "You will have to update your password on your clients that use this password."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:103
+msgid "You will import:"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:24
+msgid "Your email address was confirmed, you can now use the service without limitations."
+msgstr ""
+
+#: front/src/components/favorites/List.vue:109
+msgid "Your Favorites"
+msgstr ""
+
+#: front/src/components/Home.vue:117
+msgid "Your music, your way"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:29
+msgid "Your password has been updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:101
+msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:156
+msgid "%{ count } track was added to your queue"
+msgid_plural "%{ count } tracks were added to your queue"
+msgstr[0] ""
+msgstr[1] ""
diff --git a/front/locales/fr_FR/LC_MESSAGES/app.po b/front/locales/fr_FR/LC_MESSAGES/app.po
new file mode 100644
index 0000000000000000000000000000000000000000..8c737757052582763d282f1dde46cbca121299a0
--- /dev/null
+++ b/front/locales/fr_FR/LC_MESSAGES/app.po
@@ -0,0 +1,2453 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: French (Funkwhale)\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-07-22 14:12+0200\n"
+"PO-Revision-Date: 2018-07-21 21:30+0000\n"
+"Last-Translator: Baptiste Gelez <baptiste@gelez.xyz>\n"
+"Language-Team: French <https://translate.funkwhale.audio/projects/funkwhale/front/fr/>\n"
+"Language: fr_FR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.20\n"
+
+#: front/src/components/playlists/PlaylistModal.vue:9
+msgid "\"%{ title }\", by %{ artist }"
+msgstr "\"%{ title }\", de %{ artist }"
+
+#: front/src/components/Sidebar.vue:24
+msgid "(%{ index } of %{ length })"
+msgstr "(%{ index } sur %{ length })"
+
+#: front/src/components/Sidebar.vue:22
+msgid "(empty)"
+msgstr "(vide)"
+
+#: front/src/components/common/ActionTable.vue:43
+#: front/src/components/common/ActionTable.vue:51
+msgid "%{ count } on %{ total } selected"
+msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] "%{ count } sur %{ total } élément sélectionné"
+msgstr[1] "%{ count } sur %{ total } éléments sélectionnés"
+
+#: front/src/components/Sidebar.vue:116
+#: src/views/federation/LibraryDetail.vue:87
+msgid "%{ count } track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{ count } piste"
+msgstr[1] "%{ count } pistes"
+
+#: front/src/components/library/Artist.vue:13
+msgid "%{ count } track in %{ albumsCount } albums"
+msgid_plural "%{ count } tracks in %{ albumsCount } albums"
+msgstr[0] "%{ count } piste dans %{ albumsCount } albums"
+msgstr[1] "%{ count } pistes dans %{ albumsCount } albums"
+
+#: front/src/components/library/radios/Builder.vue:76
+msgid "%{ count } track matching combined filters"
+msgid_plural "%{ count } tracks matching combined filters"
+msgstr[0] "%{ count } piste correspondant aux filtres sélectionnés"
+msgstr[1] "%{ count } pistes correspondant aux filtres sélectionnés"
+
+#: front/src/components/playlists/Card.vue:18
+msgid "%{ count} track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{ count} piste"
+msgstr[1] "%{ count } pistes"
+
+#: front/src/components/common/Duration.vue:2
+msgid "%{ hours } h %{ minutes } min"
+msgstr "%{hours} h %{minutes} min"
+
+#: front/src/components/common/Duration.vue:5
+msgid "%{ minutes } min"
+msgstr "%{minutes} min"
+
+#: front/src/components/activity/Like.vue:7
+msgid "%{ user } favorited a track"
+msgstr "%{ user } a ajouté une piste a ses favoris"
+
+#: front/src/components/activity/Listen.vue:7
+msgid "%{ user } listened to a track"
+msgstr "%{ user } a écouté une piste"
+
+#: front/src/components/auth/Profile.vue:49
+msgid "%{ username }'s profile"
+msgstr "Profil de %{ username }"
+
+#: front/src/components/audio/artist/Card.vue:41
+msgid "1 album"
+msgid_plural "%{ count } albums"
+msgstr[0] "1 album"
+msgstr[1] "%{ count } albums"
+
+#: front/src/components/favorites/List.vue:10
+msgid "1 favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "1 favoris"
+msgstr[1] "%{ count } favoris"
+
+#: front/src/components/audio/album/Card.vue:54
+#: front/src/components/federation/LibraryCard.vue:25
+msgid "1 track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "1 piste"
+msgstr[1] "%{ count } pistes"
+
+#: front/src/components/About.vue:5
+msgid "About %{ instance }"
+msgstr "À propos de cette instance"
+
+#: front/src/App.vue:54
+msgid "About Funkwhale"
+msgstr "À propos de Funkwhale"
+
+#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55
+msgid "About this instance"
+msgstr "A propos de cette instance"
+
+#: front/src/components/manage/library/RequestsTable.vue:28
+#: front/src/components/manage/library/RequestsTable.vue:62
+msgid "Accepted"
+msgstr "Accepté"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:111
+msgid "Access disabled"
+msgstr "Accès désactivé"
+
+#: front/src/components/Home.vue:109
+msgid "Access your music from a clean interface that focus on what really matters"
+msgstr "Accédez à votre musique depuis une interface épurée, adaptée à ce qui compte vraiment"
+
+#: front/src/views/admin/users/UsersDetail.vue:54
+msgid "Account active"
+msgstr "Compte actif"
+
+#: front/src/components/auth/Settings.vue:5
+msgid "Account settings"
+msgstr "Paramètres du compte"
+
+#: front/src/components/auth/Settings.vue:257
+msgid "Account Settings"
+msgstr "Paramètres du compte"
+
+#: front/src/components/manage/users/UsersTable.vue:39
+msgid "Account status"
+msgstr "Statut du compte"
+
+#: front/src/views/auth/PasswordReset.vue:14
+msgid "Account's email"
+msgstr "Email du compte"
+
+#: front/src/components/common/ActionTable.vue:82
+msgid "Action %{ action } was launched successfully on %{ count } element"
+msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
+msgstr[0] "L'action %{ action } a été lancée avec succès sur %{ count } élément"
+msgstr[1] "L'action %{ action } a été lancée avec succès sur %{ count } éléments"
+
+#: front/src/components/common/ActionTable.vue:8
+#: front/src/components/federation/LibraryFollowTable.vue:24
+#: front/src/components/library/radios/Builder.vue:60
+#: front/src/components/manage/library/RequestsTable.vue:54
+msgid "Actions"
+msgstr "Actions"
+
+#: front/src/components/manage/users/UsersTable.vue:53
+#, fuzzy
+msgid "Active"
+msgstr "Activité"
+
+#: front/src/components/Sidebar.vue:60
+msgid "Activity"
+msgstr "Activité"
+
+#: front/src/components/federation/LibraryFollowTable.vue:21
+msgid "Actor"
+msgstr "Acteur"
+
+#: front/src/views/federation/LibraryList.vue:8
+msgid "Add a new library"
+msgstr "Ajouter une nouvelle bibliothèque"
+
+#: front/src/components/library/radios/Builder.vue:46
+msgid "Add filter"
+msgstr "Ajouter des filtres"
+
+#: front/src/components/library/radios/Builder.vue:36
+msgid "Add filters to customize your radio"
+msgstr "Ajouter des filtres pour personnaliser votre radio"
+
+#: front/src/components/audio/PlayButton.vue:53
+msgid "Add to current queue"
+msgstr "Ajouter à la queue"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:4
+#: front/src/components/favorites/TrackFavoriteIcon.vue:21
+msgid "Add to favorites"
+msgstr "Ajouter aux favoris"
+
+#: front/src/components/playlists/TrackPlaylistIcon.vue:6
+#: front/src/components/playlists/TrackPlaylistIcon.vue:32
+msgid "Add to playlist..."
+msgstr "Ajouter à une playlist..."
+
+#: front/src/components/audio/PlayButton.vue:14
+msgid "Add to queue"
+msgstr "Ajouter à la queue"
+
+#: front/src/components/playlists/PlaylistModal.vue:116
+msgid "Add to this playlist"
+msgstr "Ajouter à cette playlist"
+
+#: front/src/components/playlists/PlaylistModal.vue:54
+msgid "Add track"
+msgstr "Ajouter une piste"
+
+#: front/src/components/manage/users/UsersTable.vue:69
+msgid "Admin"
+msgstr "Admin"
+
+#: front/src/components/Sidebar.vue:64
+msgid "Administration"
+msgstr "Administration"
+
+#: front/src/components/audio/SearchBar.vue:26
+#: src/components/audio/track/Table.vue:8
+#: front/src/components/federation/LibraryTrackTable.vue:49
+#: front/src/components/library/Album.vue:91
+#: front/src/components/manage/library/FilesTable.vue:39
+#: front/src/components/metadata/Search.vue:134
+msgid "Album"
+msgstr "Album"
+
+#: front/src/components/library/import/ReleaseImport.vue:3
+msgid "Album %{ title } (%{ count } track) by %{ artist }"
+msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }"
+msgstr[0] "Album %{ title } (%{ count } piste) par %{ artist }"
+msgstr[1] "Album %{ title } (%{ count } pistes) by %{ artist }"
+
+#: front/src/components/library/Album.vue:12
+msgid "Album containing %{ count } track, by %{ artist }"
+msgid_plural "Album containing %{ count } tracks, by %{ artist }"
+msgstr[0] "Album incluant %{ count } piste, de %{ artist }"
+msgstr[1] "Album incluant %{ count } pistes, de %{ artist }"
+
+#: front/src/components/library/Track.vue:20
+msgid "Album page"
+msgstr "Page de l'album"
+
+#: front/src/components/audio/Search.vue:19
+#: src/components/instance/Stats.vue:48
+#: front/src/components/manage/library/RequestsTable.vue:50
+#: front/src/components/requests/Form.vue:9
+msgid "Albums"
+msgstr "Albums"
+
+#: front/src/components/library/Artist.vue:44
+msgid "Albums by this artist"
+msgstr "Albums de cet·te artiste"
+
+#: front/src/components/manage/library/RequestsTable.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:19
+msgid "All"
+msgstr "Tout"
+
+#: front/src/components/playlists/Editor.vue:13
+msgid "An error occured while saving your changes"
+msgstr "Une erreur s'est produite pendant l'enregistrement de vos modifications"
+
+#: front/src/components/auth/Login.vue:10
+msgid "An unknown error happend, this can mean the server is down or cannot be reached"
+msgstr "Une erreur inconnue a été rencontrée, ce qui peut signifier que le serveur est en panne ou n’a pas pu être atteint"
+
+#: front/src/components/federation/LibraryTrackTable.vue:11
+#: front/src/components/library/import/BatchDetail.vue:68
+#: front/src/components/library/import/BatchList.vue:13
+#: front/src/components/library/import/BatchList.vue:22
+msgid "Any"
+msgstr "Tous"
+
+#: front/src/components/library/import/BatchList.vue:24
+msgid "API"
+msgstr "API"
+
+#: front/src/components/federation/LibraryFollowTable.vue:68
+#: front/src/components/federation/LibraryFollowTable.vue:78
+msgid "Approve"
+msgstr "Approuver"
+
+#: front/src/components/federation/LibraryFollowTable.vue:70
+msgid "Approve access?"
+msgstr "Approuver l'accès ?"
+
+#: front/src/components/federation/LibraryFollowTable.vue:38
+msgid "Approved"
+msgstr "Approuvé"
+
+#: front/src/components/auth/Logout.vue:5
+msgid "Are you sure you want to log out?"
+msgstr "Êtes-vous sur de vouloir vous déconnecter ?"
+
+#: front/src/components/audio/SearchBar.vue:25
+#: src/components/audio/track/Table.vue:7
+#: front/src/components/federation/LibraryTrackTable.vue:48
+#: front/src/components/library/Artist.vue:119
+#: front/src/components/manage/library/FilesTable.vue:38
+#: front/src/components/manage/library/RequestsTable.vue:49
+#: front/src/components/metadata/Search.vue:130
+msgid "Artist"
+msgstr "Artiste"
+
+#: front/src/components/requests/Form.vue:5
+msgid "Artist name"
+msgstr "Nom de l'artiste"
+
+#: front/src/components/library/Album.vue:22
+#: src/components/library/Track.vue:23
+msgid "Artist page"
+msgstr "Page de l'artiste"
+
+#: front/src/components/audio/Search.vue:65
+msgid "Artist, album, track..."
+msgstr "Artiste, album, piste..."
+
+#: front/src/components/audio/Search.vue:10
+#: src/components/instance/Stats.vue:42
+#: front/src/components/library/Artists.vue:119
+#: src/components/library/Library.vue:7
+msgid "Artists"
+msgstr "Artistes"
+
+#: front/src/components/favorites/List.vue:33
+#: front/src/components/federation/LibraryTrackTable.vue:28
+#: front/src/components/library/Artists.vue:25
+#: src/components/library/Radios.vue:44
+#: front/src/components/manage/library/FilesTable.vue:19
+#: front/src/components/manage/library/RequestsTable.vue:19
+#: front/src/components/manage/users/UsersTable.vue:19
+#: front/src/views/federation/LibraryList.vue:28
+#: src/views/playlists/List.vue:27
+msgid "Ascending"
+msgstr "Ascendant"
+
+#: front/src/views/auth/PasswordReset.vue:27
+msgid "Ask for a password reset"
+msgstr "Demander à réinitialiser votre mot de passe"
+
+#: front/src/views/federation/LibraryDetail.vue:56
+msgid "Auto importing"
+msgstr "Import automatique"
+
+#: front/src/components/playlists/PlaylistModal.vue:26
+msgid "Available playlists"
+msgstr "Playlists disponibles"
+
+#: front/src/components/auth/Settings.vue:34
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24
+#: front/src/views/auth/PasswordResetConfirm.vue:18
+msgid "Back to login"
+msgstr "Retour à la page de connexion"
+
+#: front/src/views/federation/LibraryFollowersList.vue:5
+msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library."
+msgstr "Soyez prudent·es en acceptant les demandes d'abonnements, car vos abonné·es pourront accéder à l'intégralité de votre bibliothèque."
+
+#: front/src/components/library/Track.vue:80
+#: front/src/components/manage/library/FilesTable.vue:42
+msgid "Bitrate"
+msgstr "Bitrate"
+
+#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
+msgid "Browse"
+msgstr "Parcourir"
+
+#: front/src/components/Sidebar.vue:50
+msgid "Browse library"
+msgstr "Parcourir la bibliothèque"
+
+#: front/src/components/library/Artists.vue:4
+msgid "Browsing artists"
+msgstr "Parcourir les artistes"
+
+#: front/src/views/federation/LibraryTrackList.vue:3
+msgid "Browsing federated tracks"
+msgstr "Parcourir les pistes fédérées"
+
+#: front/src/views/federation/LibraryFollowersList.vue:3
+msgid "Browsing followers"
+msgstr "Parcourir les abonnés"
+
+#: front/src/views/federation/LibraryList.vue:3
+msgid "Browsing libraries"
+msgstr "Parcourir les bibliothèques"
+
+#: front/src/views/playlists/List.vue:3
+msgid "Browsing playlists"
+msgstr "Parcourir les playlists"
+
+#: front/src/components/library/Radios.vue:4
+msgid "Browsing radios"
+msgstr "Parcourir les radios"
+
+#: front/src/components/library/radios/Builder.vue:5
+msgid "Builder"
+msgstr "Éditeur"
+
+#: front/src/components/audio/album/Card.vue:13
+msgid "By %{ artist }"
+msgstr "De %{ artist }"
+
+#: front/src/components/federation/LibraryFollowTable.vue:57
+msgid "By confirming, %{ username } will be denied access to your library."
+msgstr "Si vous confirmez, %{ username } se verra refuser l'accès à votre bibliothèque."
+
+#: front/src/components/federation/LibraryFollowTable.vue:73
+msgid "By confirming, %{ username } will be granted access to your library."
+msgstr "Si vous confirmez, %{ username } se verra accorder l'accès à votre bitliothèque."
+
+#: front/src/components/audio/track/Table.vue:43
+#: front/src/components/common/DangerousButton.vue:17
+#: front/src/components/library/radios/Filter.vue:53
+#: front/src/components/playlists/PlaylistModal.vue:63
+msgid "Cancel"
+msgstr "Annuler"
+
+#: front/src/components/library/radios/Builder.vue:59
+msgid "Candidates"
+msgstr "Pistes candidates"
+
+#: front/src/components/auth/Settings.vue:76
+msgid "Cannot change your password"
+msgstr "Mot de passe ne peut pas être changé"
+
+#: front/src/App.vue:66
+msgid "Change language"
+msgstr "Changer de langue"
+
+#: front/src/components/auth/Settings.vue:67
+msgid "Change my password"
+msgstr "Changer mon mot de passe"
+
+#: front/src/components/auth/Settings.vue:95
+msgid "Change password"
+msgstr "Changer le mot de passe"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:4
+#: front/src/views/auth/PasswordResetConfirm.vue:62
+msgid "Change your password"
+msgstr "Changer votre mot de passe"
+
+#: front/src/components/auth/Settings.vue:96
+msgid "Change your password?"
+msgstr "Changer le mot de passe ?"
+
+#: front/src/components/playlists/Editor.vue:21
+msgid "Changes synced with server"
+msgstr "Changements synchronisés avec le serveur"
+
+#: front/src/components/auth/Settings.vue:70
+msgid "Changing your password will also change your Subsonic API password if you have requested one."
+msgstr "La mise à jour de votre mot de passe impactera également le mot de passe de l'API Subsonic si vous en avez demandé un."
+
+#: front/src/components/auth/Settings.vue:98
+msgid "Changing your password will have the following consequences"
+msgstr "Modifier votre mot de passe aura les conséquences suivantes"
+
+#: front/src/App.vue:4
+msgid "Choose your instance"
+msgstr "Choisissez votre instance"
+
+#: front/src/components/Home.vue:64
+msgid "Clean library"
+msgstr "Une bibliothèque musicale de qualité"
+
+#: front/src/components/manage/users/InvitationForm.vue:37
+msgid "Clear"
+msgstr "Effacer"
+
+#: front/src/components/playlists/Editor.vue:40
+#: front/src/components/playlists/Editor.vue:45
+msgid "Clear playlist"
+msgstr "Vider la playlist"
+
+#: front/src/components/audio/Player.vue:270
+msgid "Clear your queue"
+msgstr "Vider la queue"
+
+#: front/src/components/library/import/BatchList.vue:23
+msgid "CLI"
+msgstr "CLI"
+
+#: front/src/components/Home.vue:44
+msgid "Click once, listen for hours using built-in radios"
+msgstr "Écoutez de la musique pendant des heures, en un clic, grâce aux radios intégrées."
+
+#: front/src/components/manage/library/RequestsTable.vue:30
+#: front/src/components/manage/library/RequestsTable.vue:64
+msgid "Closed"
+msgstr "Fermée"
+
+#: front/src/components/manage/users/InvitationForm.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:42
+msgid "Code"
+msgstr "Code"
+
+#: front/src/components/audio/album/Card.vue:43
+#: front/src/components/audio/artist/Card.vue:33
+#: front/src/components/discussion/Comment.vue:20
+msgid "Collapse"
+msgstr "Réduire"
+
+#: front/src/components/manage/library/RequestsTable.vue:51
+#: front/src/components/requests/Form.vue:14
+msgid "Comment"
+msgstr "Commentaire"
+
+#: front/src/components/library/radios/Builder.vue:58
+msgid "Config"
+msgstr "Configuration"
+
+#: front/src/components/common/DangerousButton.vue:21
+msgid "Confirm"
+msgstr "Confirmer"
+
+#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20
+#: front/src/views/auth/EmailConfirm.vue:51
+msgid "Confirm your email"
+msgstr "Confirmer votre email"
+
+#: front/src/views/auth/EmailConfirm.vue:13
+msgid "Confirmation code"
+msgstr "Code de confirmation"
+
+#: front/src/components/playlists/Editor.vue:163
+msgid "Copy tracks from current queue to playlist"
+msgstr "Copier les pistes de la queue dans la playlist"
+
+#: front/src/components/Home.vue:88
+msgid "Covers, lyrics, our goal is to have them all ;)"
+msgstr "Pochettes d'albums, paroles, notre but est de tout implémenter ;)"
+
+#: front/src/components/auth/Signup.vue:4
+msgid "Create a funkwhale account"
+msgstr "Créer un compte funkwhale"
+
+#: front/src/components/playlists/Form.vue:2
+msgid "Create a new playlist"
+msgstr "Créer une nouvelle playlist"
+
+#: front/src/components/auth/Login.vue:17
+msgid "Create an account"
+msgstr "Créer un compte"
+
+#: front/src/components/manage/library/RequestsTable.vue:88
+#: front/src/components/requests/Card.vue:25
+msgid "Create import"
+msgstr "Créer un import"
+
+#: front/src/components/auth/Signup.vue:51
+msgid "Create my account"
+msgstr "Créer mon compte"
+
+#: front/src/components/playlists/Form.vue:34
+msgid "Create playlist"
+msgstr "Créer une playlist"
+
+#: front/src/components/library/Radios.vue:23
+msgid "Create your own radio"
+msgstr "Créer votre propre radio"
+
+#: front/src/components/federation/LibraryFollowTable.vue:22
+#: front/src/components/manage/library/RequestsTable.vue:52
+#: front/src/components/manage/users/InvitationsTable.vue:40
+msgid "Creation date"
+msgstr "Date de création"
+
+#: front/src/components/auth/Settings.vue:54
+msgid "Current avatar"
+msgstr "Avatar actuel"
+
+#: front/src/components/playlists/PlaylistModal.vue:8
+msgid "Current track"
+msgstr "Piste actuelle"
+
+#: front/src/components/manage/library/FilesTable.vue:189
+#: front/src/components/manage/library/RequestsTable.vue:195
+#: front/src/components/manage/users/InvitationsTable.vue:166
+#: front/src/views/playlists/Detail.vue:33
+msgid "Delete"
+msgstr "Supprimer"
+
+#: front/src/views/playlists/Detail.vue:38
+msgid "Delete playlist"
+msgstr "Supprimer la playlist"
+
+#: front/src/views/radios/Detail.vue:28
+msgid "Delete radio"
+msgstr "Supprimer la radio"
+
+#: front/src/components/federation/LibraryFollowTable.vue:52
+#: front/src/components/federation/LibraryFollowTable.vue:63
+msgid "Deny"
+msgstr "Refuser"
+
+#: front/src/components/federation/LibraryFollowTable.vue:54
+msgid "Deny access?"
+msgstr "Refuser l'accès ?"
+
+#: front/src/components/favorites/List.vue:34
+#: front/src/components/federation/LibraryTrackTable.vue:29
+#: front/src/components/library/Artists.vue:26
+#: src/components/library/Radios.vue:47
+#: front/src/components/manage/library/FilesTable.vue:20
+#: front/src/components/manage/library/RequestsTable.vue:20
+#: front/src/components/manage/users/UsersTable.vue:20
+#: front/src/views/federation/LibraryList.vue:29
+#: src/views/playlists/List.vue:28
+msgid "Descending"
+msgstr "Descendant"
+
+#: front/src/components/federation/LibraryCard.vue:50
+msgid "Detail"
+msgstr "Détail"
+
+#: front/src/views/admin/users/UsersDetail.vue:146
+msgid "Determine if the user account is active or not. Inactive users cannot login or use the service."
+msgstr "Détermine si le compte utilisateur est actif ou non. Les comptes inactifs ne peuvent pas se connecter ou utiliser le service."
+
+#: front/src/components/auth/Settings.vue:104
+#: front/src/components/auth/SubsonicTokenForm.vue:52
+msgid "Disable access"
+msgstr "Désactiver l'accès"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:49
+msgid "Disable Subsonic access"
+msgstr "Désactiver l'accès via Subsonic"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:50
+msgid "Disable Subsonic API access?"
+msgstr "Désactiver l'accès à l'API Subsonic ?"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:14
+msgid "Discover how to use Funkwhale from other apps"
+msgstr "Découvrez comment utiliser Funkwhale sur d'autres applications"
+
+#: front/src/components/library/radios/Builder.vue:26
+msgid "Display publicly"
+msgstr "Afficher publiquement"
+
+#: front/src/components/playlists/Editor.vue:42
+msgid "Do you want to clear the playlist \"%{ playlist }\"?"
+msgstr "Voulez-vous vider la playlist \"%{ playlist }\" ?"
+
+#: front/src/components/common/DangerousButton.vue:7
+msgid "Do you want to confirm this action?"
+msgstr "Souhaitez-vous confirmer cette action ?"
+
+#: front/src/views/playlists/Detail.vue:35
+msgid "Do you want to delete the playlist \"%{ playlist }\"?"
+msgstr "Voulez-vous supprimer la playlist \"%{ playlist }\" ?"
+
+#: front/src/views/radios/Detail.vue:26
+#, fuzzy
+msgid "Do you want to delete the radio \"%{ radio }\"?"
+msgstr "Voulez-vous supprimer la radio \"%{ radio }\" ?"
+
+#: front/src/components/common/ActionTable.vue:29
+msgid "Do you want to launch %{ action } on %{ count } element?"
+msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
+msgstr[0] "Voulez-vous effectuer l'action \"%{ action } sur %{ count } élément ?"
+msgstr[1] "Voulez-vous effectuer l'action \"%{ action } sur %{ count } éléments ?"
+
+#: front/src/components/Sidebar.vue:113
+msgid "Do you want to restore your previous queue?"
+msgstr "Souhaitez-vous restaurer votre queue précédente ?"
+
+#: front/src/App.vue:38
+msgid "Documentation"
+msgstr "Documentation"
+
+#: front/src/components/audio/track/Table.vue:24
+#: src/components/library/Track.vue:48
+msgid "Download"
+msgstr "Télécharger"
+
+#: front/src/components/audio/track/Table.vue:27
+msgid "Download tracks"
+msgstr "Télécharger"
+
+#: front/src/components/playlists/Editor.vue:49
+msgid "Drag and drop rows to reorder tracks in the playlist"
+msgstr "Glissez et déposer les lignes pour réordonner les pistes dans la playlist"
+
+#: front/src/components/library/Track.vue:58
+#: front/src/components/manage/library/FilesTable.vue:43
+msgid "Duration"
+msgstr "Durée"
+
+#: front/src/components/Home.vue:96
+msgid "Easy to use"
+msgstr "Simple à utiliser"
+
+#: front/src/components/About.vue:21
+msgid "Edit instance info"
+msgstr "Éditer les informations de cette instance"
+
+#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30
+msgid "Edit..."
+msgstr "Éditer..."
+
+#: front/src/components/auth/Signup.vue:29
+#: front/src/components/manage/users/UsersTable.vue:38
+msgid "Email"
+msgstr "Email"
+
+#: front/src/views/admin/users/UsersDetail.vue:29
+msgid "Email address"
+msgstr "Adresse email"
+
+#: front/src/views/auth/EmailConfirm.vue:23
+msgid "Email confirmed"
+msgstr "Email confirmé"
+
+#: front/src/views/playlists/Detail.vue:29
+msgid "End edition"
+msgstr "Terminer l'édition"
+
+#: front/src/components/library/import/FileUpload.vue:4
+msgid "Ensure your music files are properly tagged before uploading them."
+msgstr "Vérifier que vos fichiers musicaux sont correctement taggués avant de les envoyer."
+
+#: front/src/components/library/Radios.vue:140
+msgid "Enter a radio name..."
+msgstr "Saisissez un nom de radio..."
+
+#: front/src/components/library/Artists.vue:118
+msgid "Enter an artist name..."
+msgstr "Saisissez un nom d'artiste..."
+
+#: front/src/views/federation/LibraryList.vue:122
+msgid "Enter an library domain name..."
+msgstr "Saisissez un nom de domaine..."
+
+#: front/src/views/playlists/List.vue:104
+msgid "Enter an playlist name..."
+msgstr "Saisissez un nom de playlist..."
+
+#: front/src/components/auth/Signup.vue:98
+msgid "Enter your email"
+msgstr "Saisissez votre email"
+
+#: front/src/components/auth/Signup.vue:96
+msgid "Enter your invitation code (case insensitive)"
+msgstr "Saisissez votre code d'invitation (insensible à la casse)"
+
+#: front/src/components/metadata/Search.vue:114
+msgid "Enter your search query..."
+msgstr "Saisissez votre recherche..."
+
+#: front/src/components/auth/Signup.vue:97
+msgid "Enter your username"
+msgstr "Saisissez votre nom d'utilisateur·rice"
+
+#: front/src/components/auth/Login.vue:77
+msgid "Enter your username or email"
+msgstr "Saisissez votre nom d'utilisateur·rice ou email"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:20
+msgid "Error"
+msgstr "Erreur"
+
+#: front/src/views/admin/Settings.vue:87
+msgid "Error reporting"
+msgstr "Rapports d'erreur"
+
+#: front/src/components/common/ActionTable.vue:75
+msgid "Error while applying action"
+msgstr "Erreur lors du traitement de l'action"
+
+#: front/src/views/auth/PasswordReset.vue:7
+msgid "Error while asking for a password reset"
+msgstr "Erreur pendant la demande de réinitialisation de mot de passe"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:7
+msgid "Error while changing your password"
+msgstr "Erreur pendant le changement de mot de passe"
+
+#: front/src/views/auth/EmailConfirm.vue:7
+msgid "Error while confirming your email"
+msgstr "Erreur lors de la confirmation de votre email"
+
+#: front/src/components/manage/users/InvitationForm.vue:4
+msgid "Error while creating invitation"
+msgstr "Erreur lors de la création de l'invitation"
+
+#: front/src/components/admin/SettingsGroup.vue:5
+msgid "Error while saving settings"
+msgstr "Erreur pendant l'enregistrement des paramètres"
+
+#: front/src/components/federation/LibraryForm.vue:10
+msgid "Error while scanning library"
+msgstr "Erreur lors du scan de la bibliothèque"
+
+#: front/src/components/library/import/BatchDetail.vue:41
+#: front/src/components/library/import/BatchDetail.vue:70
+#: front/src/components/library/import/BatchList.vue:15
+msgid "Errored"
+msgstr "En erreur"
+
+#: front/src/components/playlists/Form.vue:89
+msgid "Everyone"
+msgstr "Tout le monde"
+
+#: front/src/components/playlists/Form.vue:85
+msgid "Everyone on this instance"
+msgstr "Tout le monde sur cette instance"
+
+#: front/src/components/library/radios/Builder.vue:57
+msgid "Exclude"
+msgstr "Exclure"
+
+#: front/src/components/discussion/Comment.vue:14
+msgid "Expand"
+msgstr "Ouvrir"
+
+#: front/src/components/manage/users/InvitationsTable.vue:41
+msgid "Expiration date"
+msgstr "Date d'expiration"
+
+#: front/src/components/manage/users/InvitationsTable.vue:50
+msgid "Expired"
+msgstr "Expirée"
+
+#: front/src/components/manage/users/InvitationsTable.vue:21
+msgid "Expired/used"
+msgstr "Expirée/utilisée"
+
+#: front/src/components/library/import/Main.vue:65
+msgid "External source. Supported backends"
+msgstr "Source externe. Services supportés"
+
+#: front/src/components/Sidebar.vue:51
+msgid "Favorites"
+msgstr "Favoris"
+
+#: front/src/components/federation/LibraryForm.vue:3
+msgid "Federate with a new instance"
+msgstr "Fédérer avec une nouvelle instance"
+
+#: front/src/views/federation/LibraryTrackList.vue:21
+msgid "Federated tracks"
+msgstr "Pistes fédérées"
+
+#: front/src/components/Sidebar.vue:87
+#: src/components/library/import/BatchList.vue:25
+#: front/src/components/manage/users/UsersTable.vue:180
+#: front/src/views/admin/Settings.vue:84
+#: src/views/admin/users/UsersDetail.vue:161
+#: front/src/views/federation/Base.vue:35
+#: src/views/federation/LibraryDetail.vue:40
+msgid "Federation"
+msgstr "Fédération"
+
+#: front/src/views/federation/LibraryDetail.vue:3
+msgid "File mirroring"
+msgstr "Réplication des fichiers"
+
+#: front/src/components/library/import/FileUpload.vue:43
+msgid "File name"
+msgstr "Nom du fichier"
+
+#: front/src/components/library/import/Main.vue:76
+msgid "File upload"
+msgstr "Envoi de fichier"
+
+#: front/src/views/admin/library/Base.vue:5
+#: src/views/admin/library/FilesList.vue:21
+msgid "Files"
+msgstr "Fichiers"
+
+#: front/src/components/library/import/ArtistImport.vue:7
+msgid "Filter album types"
+msgstr "Filtrer le type d'album"
+
+#: front/src/components/library/radios/Builder.vue:56
+msgid "Filter name"
+msgstr "Nom du filtre"
+
+#: front/src/components/library/import/Main.vue:52
+msgid "Finish import"
+msgstr "Terminer l'import"
+
+#: front/src/components/library/import/BatchDetail.vue:54
+msgid "Finished"
+msgstr "Terminé"
+
+#: front/src/components/library/import/Main.vue:59
+msgid "First, choose where you want to import the music from"
+msgstr "Tout d'abord, choisissez le mode d'import de la musique"
+
+#: front/src/components/federation/LibraryCard.vue:44
+msgid "Follow"
+msgstr "Suivre"
+
+#: front/src/components/federation/LibraryCard.vue:36
+msgid "Follow request pending approval"
+msgstr "Abonnement en attente de validation"
+
+#: front/src/views/federation/LibraryDetail.vue:21
+msgid "Follow status"
+msgstr "Statut de l'abonnement"
+
+#: front/src/views/federation/Base.vue:13
+#: front/src/views/federation/LibraryFollowersList.vue:24
+msgid "Followers"
+msgstr "Abonnés"
+
+#: front/src/components/federation/LibraryCard.vue:18
+msgid "Followers only"
+msgstr "Abonné·es seulement"
+
+#: front/src/components/federation/LibraryCard.vue:15
+#: front/src/views/federation/LibraryDetail.vue:29
+msgid "Following"
+msgstr "Abonné"
+
+#: front/src/components/activity/Like.vue:12
+#: src/components/activity/Listen.vue:12
+msgid "from %{ album } by %{ artist }"
+msgstr "de l'album %{ album } par %{ artist }"
+
+#: front/src/components/library/Track.vue:13
+msgid "From album %{ album } by %{ artist }"
+msgstr "De l'album %{ album } par %{ artist }"
+
+#: front/src/App.vue:56
+msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!"
+msgstr "Funkwale est un projet open-source et gratuit, animé par des bénévoles. Vous pouvez nous aider à améliorer le service en remontant les problèmes que vous rencontrez, en suggérant des améliorations et en parlant du projet autour de vous !"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgid "Funkwhale is compatible with other music players that support the Subsonic API."
+msgstr "Funkwhale est compatible avec d'autres lecteurs de musique qui supportent l'API Subsonic."
+
+#: front/src/components/Home.vue:98
+msgid "Funkwhale is dead simple to use."
+msgstr "Funkwhale est très simple à utiliser."
+
+#: front/src/components/Home.vue:39
+msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists."
+msgstr "Funkwhale est conçu pour faciliter l'écoute des musiques que vous aimez et découvrir de nouveaux artistes."
+
+#: front/src/components/Home.vue:119
+msgid "Funkwhale is free and gives you control on your music."
+msgstr "Funkwhale est gratuit et vous donne le contrôle sur votre musique."
+
+#: front/src/components/Home.vue:66
+msgid "Funkwhale takes care of handling your music"
+msgstr "Funkwhale prend soin de votre musique"
+
+#: front/src/components/manage/users/InvitationForm.vue:16
+msgid "Get a new invitation"
+msgstr "Obtenir une nouvelle invitation"
+
+#: front/src/components/Home.vue:13
+msgid "Get me to the library"
+msgstr "Amenez moi à la bibliothèque"
+
+#: front/src/components/Home.vue:77
+msgid ""
+"Get quality metadata about your music thanks to\n"
+"              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
+msgstr ""
+"Obtenez des métadonnées de qualité grâce à              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
+
+#: front/src/components/common/ActionTable.vue:21
+#: front/src/components/common/ActionTable.vue:27
+msgid "Go"
+msgstr "Aller"
+
+#: front/src/components/PageNotFound.vue:14
+msgid "Go to home page"
+msgstr "Retourner à la page d'accueil"
+
+#: front/src/components/library/import/Main.vue:13
+msgid "Grab corresponding metadata"
+msgstr "Récupérer les métadonnées correspondantes"
+
+#: front/src/App.vue:74
+msgid "Help us translate Funkwhale"
+msgstr ""
+
+#: front/src/components/library/Home.vue:65
+msgid "Home"
+msgstr "Accueil"
+
+#: front/src/components/instance/Stats.vue:36
+msgid "Hours of music"
+msgstr "Heures de musique"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:11
+msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
+msgstr "Cependant, accéder à Funkwhale depuis ces clients requiert un mot de passe distinct que vous pouvez configurer ci-dessous."
+
+#: front/src/components/library/import/BatchList.vue:34
+msgid "ID"
+msgstr "ID"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:24
+msgid "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."
+msgstr "Si l'adresse email que vous avez fournie est valide et associée à un compte utilisateur, vous allez recevoir un email contenant les instructions de réinitialisation au cours des prochaines minutes."
+
+#: front/src/components/federation/LibraryTrackTable.vue:196
+#: front/src/components/library/Library.vue:17
+msgid "Import"
+msgstr "Import"
+
+#: front/src/components/federation/LibraryTrackTable.vue:57
+msgid "Import #%{ id } launched"
+msgstr "Import #%{ id } démarré"
+
+#: front/src/components/library/import/Main.vue:38
+msgid "Import %{ count } track"
+msgid_plural "Import %{ count } tracks"
+msgstr[0] "Import %{ count } track"
+msgstr[1] "Importer %{ count } pistes"
+
+#: front/src/components/library/import/BatchDetail.vue:10
+msgid "Import batch"
+msgstr "Lot d'import"
+
+#: front/src/components/library/import/BatchDetail.vue:185
+msgid "Import Batch #%{ id }"
+msgstr "Lot d'imports #%{ id }"
+
+#: front/src/components/library/Library.vue:20
+msgid "Import batches"
+msgstr "Lots d'imports"
+
+#: front/src/components/library/import/BatchList.vue:117
+msgid "Import Batches"
+msgstr "Lots d'imports"
+
+#: front/src/components/manage/library/FilesTable.vue:40
+#: front/src/components/manage/library/RequestsTable.vue:53
+msgid "Import date"
+msgstr "Date d'import"
+
+#: front/src/components/library/import/FileUpload.vue:38
+msgid "Import detail page"
+msgstr "Page de détail de l'import"
+
+#: front/src/components/Sidebar.vue:81
+msgid "Import music"
+msgstr "Importer de la musique"
+
+#: front/src/components/library/import/Main.vue:267
+msgid "Import Music"
+msgstr "Importer de la musique"
+
+#: front/src/components/Home.vue:71
+msgid "Import music from various platforms, such as YouTube or SoundCloud"
+msgstr "Importez de la musique de différentes plate-formes, comme YouTube ou Soundcloud"
+
+#: front/src/components/federation/LibraryTrackTable.vue:14
+#: front/src/components/federation/LibraryTrackTable.vue:66
+msgid "Import pending"
+msgstr "Import en attente"
+
+#: front/src/views/admin/library/Base.vue:9
+#: front/src/views/admin/library/RequestsList.vue:3
+#: front/src/views/admin/library/RequestsList.vue:21
+msgid "Import requests"
+msgstr "Requêtes d'import"
+
+#: front/src/components/library/import/BatchList.vue:20
+#: front/src/components/library/import/Main.vue:6
+msgid "Import source"
+msgstr "Source de l'import"
+
+#: front/src/components/federation/LibraryTrackTable.vue:9
+msgid "Import status"
+msgstr "Status de l'import"
+
+#: front/src/components/library/import/ReleaseImport.vue:14
+msgid "Import this release"
+msgstr "Importer cet album"
+
+#: front/src/components/library/import/TrackImport.vue:11
+msgid "Import this track"
+msgstr "Importer cette piste"
+
+#: front/src/components/federation/LibraryTrackTable.vue:12
+#: front/src/components/manage/library/RequestsTable.vue:29
+#: front/src/components/manage/library/RequestsTable.vue:61
+msgid "Imported"
+msgstr "Importé"
+
+#: front/src/components/library/import/TrackImport.vue:44
+msgid "Imported URL"
+msgstr "URL importée"
+
+#: front/src/views/admin/Settings.vue:82
+msgid "Imports"
+msgstr "Imports"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:3
+msgid "In favorites"
+msgstr "Dans les favoris"
+
+#: front/src/components/federation/LibraryTrackTable.vue:65
+msgid "In library"
+msgstr "Dans la bibliothèque"
+
+#: front/src/components/manage/users/UsersTable.vue:54
+msgid "Inactive"
+msgstr "Actif"
+
+#: front/src/components/library/import/Main.vue:96
+msgid "Input a MusicBrainz ID manually:"
+msgstr "Saisir manuellement un ID MusicBrainz :"
+
+#: front/src/views/auth/PasswordReset.vue:53
+msgid "Input the email address binded to your account"
+msgstr "Saisissez l'adresse email associée à votre compte"
+
+#: front/src/components/playlists/Editor.vue:31
+msgid "Insert from queue (%{ count } track)"
+msgid_plural "Insert from queue (%{ count } tracks)"
+msgstr[0] "Insérer depuis la queue (%{ count } piste)"
+msgstr[1] "Insérer depuis la queue (%{ count } pistes)"
+
+#: front/src/views/admin/Settings.vue:80
+msgid "Instance information"
+msgstr "Informations relatives à cette instance"
+
+#: front/src/components/library/Radios.vue:9
+msgid "Instance radios"
+msgstr "Radios de l'instance"
+
+#: front/src/views/admin/Settings.vue:75
+msgid "Instance settings"
+msgstr "Paramètres de l'instance"
+
+#: front/src/views/instance/Timeline.vue:57
+msgid "Instance Timeline"
+msgstr "Fil de l'instance"
+
+#: front/src/components/auth/Signup.vue:42
+#: front/src/components/manage/users/InvitationForm.vue:11
+msgid "Invitation code"
+msgstr "Code d'invitation"
+
+#: front/src/components/auth/Signup.vue:43
+msgid "Invitation code (optional)"
+msgstr "Code d'invitation (optionnel)"
+
+#: front/src/views/admin/users/Base.vue:8
+#: src/views/admin/users/InvitationsList.vue:3
+#: front/src/views/admin/users/InvitationsList.vue:24
+msgid "Invitations"
+msgstr "Invitations"
+
+#: front/src/App.vue:43
+msgid "Issue tracker"
+msgstr "Issue tracker"
+
+#: front/src/components/library/import/BatchDetail.vue:80
+msgid "Job ID"
+msgstr "ID de la tâche"
+
+#: front/src/components/library/import/BatchList.vue:36
+msgid "Jobs"
+msgstr "Tâches"
+
+#: front/src/components/Home.vue:50
+msgid "Keep a track of your favorite songs"
+msgstr "Gardez une trace de vos chansons favorites"
+
+#: front/src/components/audio/track/Table.vue:33
+msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account."
+msgstr "Gardez votre PRIVATE_TOKEN secret étant donné qu'il permet l'accès à votre compte."
+
+#: front/src/components/manage/users/UsersTable.vue:41
+#: front/src/views/admin/users/UsersDetail.vue:45
+msgid "Last activity"
+msgstr "Dernière activité"
+
+#: front/src/views/federation/LibraryDetail.vue:101
+msgid "Last fetched"
+msgstr "Dernière récupération"
+
+#: front/src/components/playlists/PlaylistModal.vue:32
+msgid "Last modification"
+msgstr "Dernière modification"
+
+#: front/src/components/common/ActionTable.vue:39
+msgid "Launch"
+msgstr "Démarrer"
+
+#: front/src/components/library/import/BatchDetail.vue:18
+#: front/src/components/library/import/BatchList.vue:35
+msgid "Launch date"
+msgstr "Date de lancement"
+
+#: front/src/components/federation/LibraryForm.vue:31
+msgid "Launch scan"
+msgstr "Démarrer le scan"
+
+#: front/src/components/Home.vue:10
+msgid "Learn more about this instance"
+msgstr "En apprendre plus à propos de cette instance"
+
+#: front/src/components/manage/users/InvitationForm.vue:58
+msgid "Leave empty for a random code"
+msgstr "Laisser vide pour obtenir un code aléatoire"
+
+#: front/src/components/requests/Form.vue:10
+msgid "Leave this field empty if you're requesting the whole discography."
+msgstr "Laisser ce champ vide si vous voulez suggérer toute la discographie."
+
+#: front/src/views/federation/Base.vue:5
+#: src/views/federation/LibraryList.vue:123
+msgid "Libraries"
+msgstr "Bibliothèques"
+
+#: front/src/components/Sidebar.vue:70
+#: front/src/components/federation/LibraryTrackTable.vue:51
+#: front/src/components/instance/Stats.vue:30
+#: front/src/components/manage/users/UsersTable.vue:176
+#: front/src/views/admin/users/UsersDetail.vue:157
+#: front/src/views/federation/LibraryDetail.vue:194
+msgid "Library"
+msgstr "Bibliothèque"
+
+#: front/src/views/admin/library/FilesList.vue:3
+msgid "Library files"
+msgstr "Fichiers de la bibliothèque"
+
+#: front/src/components/federation/LibraryForm.vue:20
+msgid "Library name"
+msgstr "Nom de la bibliothèque"
+
+#: front/src/views/federation/LibraryDetail.vue:84
+msgid "Library size"
+msgstr "Taille de la bibliothèque"
+
+#: front/src/components/federation/LibraryForm.vue:96
+msgid "library@demo.funkwhale.audio"
+msgstr "library@demo.funkwhale.audio"
+
+#: front/src/App.vue:29
+msgid "Links"
+msgstr "Liens"
+
+#: front/src/views/instance/Timeline.vue:4
+msgid "Loading timeline..."
+msgstr "Chargement de la timeline ..."
+
+#: front/src/components/favorites/List.vue:5
+msgid "Loading your favorites..."
+msgstr "Chargement de vos favoris ..."
+
+#: front/src/components/auth/Login.vue:78
+msgid "Log In"
+msgstr "Connexion"
+
+#: front/src/components/auth/Login.vue:4
+msgid "Log in to your Funkwhale account"
+msgstr "Connectez vous à votre compte Funkwhale"
+
+#: front/src/components/auth/Logout.vue:20
+msgid "Log Out"
+msgstr "Déconnexion"
+
+#: front/src/components/Sidebar.vue:38
+msgid "Logged in as %{ username }"
+msgstr "Connecté·e en tant que %{ username }"
+
+#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41
+msgid "Login"
+msgstr "Connexion"
+
+#: front/src/components/Sidebar.vue:43
+msgid "Logout"
+msgstr "Déconnexion"
+
+#: front/src/components/audio/Player.vue:266
+msgid "Looping disabled. Click to switch to single-track looping."
+msgstr "Répétition désactivée. Cliquez pour activer la répétition sur la piste actuelle."
+
+#: front/src/components/audio/Player.vue:267
+msgid "Looping on a single track. Click to switch to whole queue looping."
+msgstr "Répétition sur la piste en cours. Cliquer pour répêter sur l'intégralité de la queue."
+
+#: front/src/components/audio/Player.vue:268
+msgid "Looping on whole queue. Click to disable looping."
+msgstr "Répétition sur l'intégralité, cliquez pour désactiver la répétition."
+
+#: front/src/components/library/Track.vue:94
+msgid "Lyrics"
+msgstr "Paroles"
+
+#: front/src/views/admin/library/Base.vue:25
+msgid "Manage library"
+msgstr "Gérer la bibliothèque"
+
+#: front/src/components/playlists/PlaylistModal.vue:3
+msgid "Manage playlists"
+msgstr "Gérer les playlists"
+
+#: front/src/views/admin/users/Base.vue:20
+msgid "Manage users"
+msgstr "Gérer les utilisateur·rices"
+
+#: front/src/views/playlists/List.vue:8
+msgid "Manage your playlists"
+msgstr "Gérer vos playlists"
+
+#: front/src/components/manage/library/RequestsTable.vue:197
+msgid "Mark as closed"
+msgstr "Marquer comme fermé"
+
+#: front/src/components/manage/library/RequestsTable.vue:196
+msgid "Mark as imported"
+msgstr "Marquer comme importé"
+
+#: front/src/components/library/import/Main.vue:12
+msgid "Metadata"
+msgstr "Metadonnées"
+
+#: front/src/components/library/import/Main.vue:115
+msgid ""
+"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n"
+"            <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"              MusicBrainz\n"
+"            </a>\n"
+"            project, which you can think about as the Wikipedia of music."
+msgstr ""
+"Les métadonnées sont les informations relatives à la musique que vous souhaitez importer. Cela inclut notamment toutes les informations concernant les artistes, albums et pistes. Afin d'avoir des métadonnées de qualité, il est recommandé d'utiliser les métadonnées du projet            <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"              MusicBrainz\n"
+"            </a>\n"
+"            qui est une base de données musicale fonctionnant sur le même modèle que Wikipédia."
+
+#: front/src/components/Sidebar.vue:48
+#: src/components/library/import/Main.vue:18
+msgid "Music"
+msgstr "Musique"
+
+#: front/src/components/library/import/Main.vue:147
+msgid "Music request"
+msgstr "Requête musicale"
+
+#: front/src/components/audio/Player.vue:265
+msgid "Mute"
+msgstr "Couper le son"
+
+#: front/src/components/Sidebar.vue:34
+msgid "My account"
+msgstr "Mon compte"
+
+#: front/src/components/playlists/Form.vue:74
+msgid "My awesome playlist"
+msgstr "Ma playlist d'enfer"
+
+#: front/src/components/library/radios/Builder.vue:227
+msgid "My awesome radio"
+msgstr "Ma radio d'enfer"
+
+#: front/src/components/library/Track.vue:64
+#: src/components/library/Track.vue:75
+#: front/src/components/library/Track.vue:86
+#: front/src/components/manage/library/FilesTable.vue:63
+#: front/src/components/manage/library/FilesTable.vue:69
+#: front/src/components/manage/library/FilesTable.vue:75
+#: front/src/components/manage/library/FilesTable.vue:81
+#: front/src/components/manage/library/RequestsTable.vue:71
+#: front/src/components/manage/library/RequestsTable.vue:75
+#: front/src/components/manage/library/RequestsTable.vue:82
+#: front/src/components/manage/users/UsersTable.vue:61
+#: front/src/views/admin/users/UsersDetail.vue:49
+msgid "N/A"
+msgstr "ND"
+
+#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/views/admin/users/UsersDetail.vue:21
+msgid "Name"
+msgstr "Nom"
+
+#: front/src/components/auth/Settings.vue:88
+#: front/src/views/auth/PasswordResetConfirm.vue:14
+msgid "New password"
+msgstr "Nouveau mot de passe"
+
+#: front/src/components/Sidebar.vue:158
+msgid "New tracks will be appended here automatically."
+msgstr "Les nouvelles pistes seront ajoutées ici automatiquement."
+
+#: front/src/components/library/import/Main.vue:29
+msgid "Next step"
+msgstr "Prochaine étape"
+
+#: front/src/components/audio/Player.vue:263
+msgid "Next track"
+msgstr "Piste suivante"
+
+#: front/src/components/Sidebar.vue:125
+msgid "No"
+msgstr "Non"
+
+#: front/src/components/Home.vue:103
+msgid "No add-ons, no plugins : you only need a web library"
+msgstr "Pas d'addons ou d'extension à installer, il vous suffit d'une bibliothèque sur le web"
+
+#: front/src/components/library/Track.vue:102
+msgid "No lyrics available for this track."
+msgstr "Pas de paroles disponibles pour cette piste."
+
+#: front/src/components/playlists/Form.vue:81
+msgid "Nobody except me"
+msgstr "Personne à part moi"
+
+#: front/src/views/federation/LibraryDetail.vue:32
+msgid "Not following"
+msgstr "Non abonné·e"
+
+#: front/src/components/federation/LibraryTrackTable.vue:13
+#: front/src/components/federation/LibraryTrackTable.vue:67
+msgid "Not imported"
+msgstr "Non importé"
+
+#: front/src/components/manage/users/InvitationsTable.vue:51
+msgid "Not used"
+msgstr "Pas utilisé"
+
+#: front/src/App.vue:37
+msgid "Official website"
+msgstr "Site officiel"
+
+#: front/src/components/auth/Settings.vue:83
+msgid "Old password"
+msgstr "Ancien mot de passe"
+
+#: front/src/components/library/import/FileUpload.vue:36
+msgid "Once all your files are uploaded, simply click the following button to check the import status."
+msgstr "Une fois que tous vos fichiers sont chargés, cliquez sur le bouton suivant pour vérifier le statut d'import."
+
+#: front/src/components/federation/LibraryCard.vue:21
+#: front/src/components/manage/users/InvitationsTable.vue:20
+msgid "Open"
+msgstr "Accès libre"
+
+#: front/src/App.vue:63
+msgid "Options"
+msgstr "Options"
+
+#: front/src/components/library/import/Main.vue:93
+msgid "Or"
+msgstr "Ou"
+
+#: front/src/components/favorites/List.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:18
+#: front/src/components/library/Artists.vue:15
+#: src/components/library/Radios.vue:33
+#: front/src/components/manage/library/FilesTable.vue:9
+#: front/src/components/manage/library/RequestsTable.vue:9
+#: front/src/components/manage/users/InvitationsTable.vue:9
+#: front/src/components/manage/users/UsersTable.vue:9
+#: front/src/views/federation/LibraryList.vue:18
+#: src/views/playlists/List.vue:17
+msgid "Ordering"
+msgstr "Ordre"
+
+#: front/src/components/favorites/List.vue:31
+#: front/src/components/federation/LibraryTrackTable.vue:26
+#: front/src/components/library/Artists.vue:23
+#: src/components/library/Radios.vue:41
+#: front/src/components/manage/library/FilesTable.vue:17
+#: front/src/components/manage/library/RequestsTable.vue:17
+#: front/src/components/manage/users/UsersTable.vue:17
+#: front/src/views/federation/LibraryList.vue:26
+#: src/views/playlists/List.vue:25
+msgid "Ordering direction"
+msgstr "Direction"
+
+#: front/src/components/manage/users/InvitationsTable.vue:38
+msgid "Owner"
+msgstr "Propriétaire"
+
+#: front/src/components/PageNotFound.vue:33
+msgid "Page Not Found"
+msgstr "Page non trouvée"
+
+#: front/src/components/PageNotFound.vue:7
+msgid "Page not found!"
+msgstr "Page non trouvée !"
+
+#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38
+msgid "Password"
+msgstr "Mot de passe"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:95
+msgid "Password updated"
+msgstr "Mot de passe mis à jour"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:28
+msgid "Password updated successfully"
+msgstr "Mot de passe modifié avec succès"
+
+#: front/src/components/audio/Player.vue:262
+msgid "Pause track"
+msgstr "Mettre en pause"
+
+#: front/src/components/federation/LibraryFollowTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:33
+#: front/src/components/library/import/BatchDetail.vue:69
+#: front/src/components/library/import/BatchList.vue:14
+#: front/src/components/library/import/FileUpload.vue:59
+#: front/src/components/manage/library/RequestsTable.vue:27
+#: front/src/components/manage/library/RequestsTable.vue:63
+msgid "Pending"
+msgstr "En attente"
+
+#: front/src/components/federation/LibraryFollowTable.vue:11
+#: front/src/views/federation/LibraryDetail.vue:26
+msgid "Pending approval"
+msgstr "En attente de validation"
+
+#: front/src/components/Sidebar.vue:217
+msgid "Pending follow requests"
+msgstr "Demandes d'abonnement en attente"
+
+#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26
+msgid "Pending import requests"
+msgstr "Requêtes en attente"
+
+#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36
+msgid "Pending requests"
+msgstr "Requêtes en attente"
+
+#: front/src/components/manage/users/UsersTable.vue:42
+#: front/src/views/admin/users/UsersDetail.vue:68
+msgid "Permissions"
+msgstr "Permissions"
+
+#: front/src/components/audio/PlayButton.vue:9
+#: src/components/library/Track.vue:30
+msgid "Play"
+msgstr "Jouer"
+
+#: front/src/components/audio/album/Card.vue:50
+#: front/src/components/audio/artist/Card.vue:44
+#: src/components/library/Album.vue:28 front/src/views/playlists/Detail.vue:23
+msgid "Play all"
+msgstr "Tout lire"
+
+#: front/src/components/library/Artist.vue:26
+msgid "Play all albums"
+msgstr "Lire tous les albums"
+
+#: front/src/components/audio/PlayButton.vue:58
+msgid "Play immediatly"
+msgstr "Jouer immédiatement"
+
+#: front/src/components/audio/PlayButton.vue:15
+msgid "Play next"
+msgstr "Lire ensuite"
+
+#: front/src/components/audio/PlayButton.vue:16
+msgid "Play now"
+msgstr "Lire maintenant"
+
+#: front/src/components/audio/Player.vue:261
+msgid "Play track"
+msgstr "Jouer"
+
+#: front/src/views/playlists/Detail.vue:90
+msgid "Playlist"
+msgstr "Playlist"
+
+#: front/src/views/playlists/Detail.vue:12
+msgid "Playlist containing %{ count } track, by %{ username }"
+msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
+msgstr[0] "Playlist contenant %{ count } piste, par %{ username }"
+msgstr[1] "Playlist contenant %{ count } pistes, par %{ username }"
+
+#: front/src/components/playlists/Form.vue:9
+msgid "Playlist created"
+msgstr "Playlist créée"
+
+#: front/src/components/playlists/Editor.vue:4
+msgid "Playlist editor"
+msgstr "Éditeur de playlist"
+
+#: front/src/components/playlists/Form.vue:21
+msgid "Playlist name"
+msgstr "Nom de la playlist"
+
+#: front/src/components/playlists/Form.vue:6
+msgid "Playlist updated"
+msgstr "Playlist mise à jour"
+
+#: front/src/components/playlists/Form.vue:25
+msgid "Playlist visibility"
+msgstr "Visibilité de la playlist"
+
+#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16
+#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83
+#: front/src/views/playlists/List.vue:103
+msgid "Playlists"
+msgstr "Playlists"
+
+#: front/src/components/Home.vue:56
+msgid "Playlists? We got them"
+msgstr "Les playlists ? Elles sont là !"
+
+#: front/src/components/auth/Settings.vue:79
+msgid "Please double-check your password is correct"
+msgstr "Merci de vérifier que votre mot de passe est correct"
+
+#: front/src/components/auth/Login.vue:9
+msgid "Please double-check your username/password couple is correct"
+msgstr "Merci de vérifier que votre nom d'utilisateur et mot de passe sont corrects"
+
+#: front/src/components/auth/Settings.vue:46
+msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
+msgstr "PNG, GIF ou JPG. 2Mb au plus. L'image sera réduite à 400×400 pixels."
+
+#: front/src/components/library/import/Main.vue:26
+msgid "Previous step"
+msgstr "Étape précédente"
+
+#: front/src/components/audio/Player.vue:260
+msgid "Previous track"
+msgstr "Piste précédente"
+
+#: front/src/views/auth/EmailConfirm.vue:26
+#: front/src/views/auth/PasswordResetConfirm.vue:31
+msgid "Proceed to login"
+msgstr "Poursuivre vers la page de connexion"
+
+#: front/src/components/federation/LibraryTrackTable.vue:50
+msgid "Published date"
+msgstr "Date de sortie"
+
+#: front/src/components/library/import/ArtistImport.vue:17
+msgid "Query template"
+msgstr "Template de recherche"
+
+#: front/src/components/Sidebar.vue:20
+msgid "Queue"
+msgstr "Queue"
+
+#: front/src/components/audio/Player.vue:203
+msgid "Queue shuffled!"
+msgstr "La queue a été mélangée !"
+
+#: front/src/views/radios/Detail.vue:80
+msgid "Radio"
+msgstr "Radio"
+
+#: front/src/components/library/radios/Builder.vue:226
+msgid "Radio Builder"
+msgstr "Éditeur de radio"
+
+#: front/src/components/library/radios/Builder.vue:15
+#, fuzzy
+msgid "Radio created"
+msgstr "Nom de la radio"
+
+#: front/src/components/library/radios/Builder.vue:21
+msgid "Radio name"
+msgstr "Nom de la radio"
+
+#: front/src/components/library/radios/Builder.vue:12
+#, fuzzy
+msgid "Radio updated"
+msgstr "Nom de la radio"
+
+#: front/src/components/library/Library.vue:10
+#: src/components/library/Radios.vue:141
+msgid "Radios"
+msgstr "Radios"
+
+#: front/src/views/instance/Timeline.vue:7
+msgid "Recent activity on this instance"
+msgstr "Activité récente sur cette instance"
+
+#: front/src/components/library/Home.vue:24
+msgid "Recently added"
+msgstr "Ajoutés récemment"
+
+#: front/src/components/library/Home.vue:11
+msgid "Recently favorited"
+msgstr "Ajoutées à vos favoris récemment"
+
+#: front/src/components/library/Home.vue:6
+msgid "Recently listened"
+msgstr "Écoutées récemment"
+
+#: front/src/components/library/import/BatchDetail.vue:81
+msgid "Recording MusicBrainz ID"
+msgstr "ID MusicBrainz de l'enregistrement"
+
+#: front/src/views/admin/users/UsersDetail.vue:84
+#: front/src/views/federation/LibraryDetail.vue:122
+msgid "Refresh"
+msgstr "Rafraîchir"
+
+#: front/src/components/federation/LibraryFollowTable.vue:42
+msgid "Refused"
+msgstr "Refusé"
+
+#: front/src/components/auth/Profile.vue:12
+msgid "Registered since %{ date }"
+msgstr "Inscrit·e depuis le %{ date }"
+
+#: front/src/components/auth/Signup.vue:9
+msgid "Registration are closed on this instance, you will need an invitation code to signup."
+msgstr "Les inscriptions sont fermées sur cette instance, vous aurez besoin d'un code d'invitation pour vous inscrire."
+
+#: front/src/components/manage/users/UsersTable.vue:71
+msgid "regular user"
+msgstr "utilisateur·rice standard·e"
+
+#: front/src/components/library/radios/Filter.vue:59
+msgid "Remove"
+msgstr "Retirer"
+
+#: front/src/components/auth/Settings.vue:58
+msgid "Remove avatar"
+msgstr "Supprimer mon avatar"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:19
+msgid "Remove from favorites"
+msgstr "Retirer des favoris"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:34
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+msgid "Request a new password"
+msgstr "Demander un nouveau mot de passe"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:35
+msgid "Request a new Subsonic API password?"
+msgstr "Demander un nouveau mot de passe pour l'API Subsonic ?"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:43
+msgid "Request a password"
+msgstr "Demander un mot de passe"
+
+#: front/src/App.vue:35
+msgid "Request music"
+msgstr "Demandes de musique"
+
+#: front/src/views/library/MusicRequest.vue:4
+#: src/views/library/MusicRequest.vue:21
+msgid "Request some music"
+msgstr "Demandez de la musique"
+
+#: front/src/components/requests/Form.vue:20
+msgid "Request submitted!"
+msgstr "Requête envoyée"
+
+#: front/src/components/library/import/BatchDetail.vue:49
+msgid "Rerun errored jobs"
+msgstr "Relancer les tâches échouées"
+
+#: front/src/components/library/import/BatchDetail.vue:187
+msgid "Rerun job"
+msgstr "Relancer la tâche"
+
+#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4
+#: front/src/views/auth/PasswordReset.vue:52
+msgid "Reset your password"
+msgstr "Réinitialiser votre mot de passe"
+
+#: front/src/components/library/import/TrackImport.vue:31
+msgid "Result %{ current }/%{ total }"
+msgstr "Résultat %{ current }/%{ total }"
+
+#: front/src/components/favorites/List.vue:38
+#: src/components/library/Artists.vue:30
+#: front/src/components/library/Radios.vue:52
+#: src/views/federation/LibraryList.vue:33
+#: front/src/views/playlists/List.vue:32
+msgid "Results per page"
+msgstr "Résultats par page"
+
+#: front/src/components/admin/SettingsGroup.vue:63
+#: front/src/components/library/radios/Builder.vue:29
+msgid "Save"
+msgstr "Enregistrer"
+
+#: front/src/views/federation/LibraryDetail.vue:112
+msgid "Scan triggered!"
+msgstr "Scan démarré !"
+
+#: front/src/components/federation/LibraryTrackTable.vue:5
+#: front/src/components/library/Artists.vue:10
+#: src/components/library/Radios.vue:29
+#: front/src/components/library/import/BatchDetail.vue:62
+#: front/src/components/library/import/BatchList.vue:7
+#: front/src/components/manage/library/FilesTable.vue:5
+#: front/src/components/manage/library/RequestsTable.vue:5
+#: front/src/components/manage/users/InvitationsTable.vue:5
+#: front/src/components/manage/users/UsersTable.vue:5
+#: front/src/views/federation/LibraryList.vue:14
+#: src/views/playlists/List.vue:13
+msgid "Search"
+msgstr "Rechercher"
+
+#: front/src/components/library/import/Main.vue:85
+msgid "Search an entity you want to import:"
+msgstr "Rechercher une ressource que vous voulez importer :"
+
+#: front/src/components/manage/library/RequestsTable.vue:180
+msgid "Search by artist, username, comment..."
+msgstr "Rechercher par artiste, nom d'utilisateur·rice, commentaire..."
+
+#: front/src/components/library/import/BatchDetail.vue:188
+msgid "Search by source..."
+msgstr "Rechercher par source..."
+
+#: front/src/components/library/import/BatchList.vue:116
+msgid "Search by submitter, source..."
+msgstr "Rechercher par utilisateur·rice, source..."
+
+#: front/src/components/federation/LibraryTrackTable.vue:182
+#: front/src/components/manage/library/FilesTable.vue:175
+msgid "Search by title, artist, domain..."
+msgstr "Rechercher par titre, artiste, domaine..."
+
+#: front/src/components/federation/LibraryFollowTable.vue:140
+msgid "Search by username, domain..."
+msgstr "Rechercher par nom d'utilisateur·rice, domaine..."
+
+#: front/src/components/manage/users/InvitationsTable.vue:152
+msgid "Search by username, email, code..."
+msgstr "Rechercher par nom d'utilisateur·rice, email, code..."
+
+#: front/src/components/manage/users/UsersTable.vue:162
+msgid "Search by username, email, name..."
+msgstr "Rechercher par nom d'utilisateur·rice, email, nom..."
+
+#: front/src/components/audio/SearchBar.vue:20
+msgid "Search for artists, albums, tracks..."
+msgstr "Rechercher des artistes, des albums, des pistes"
+
+#: front/src/components/audio/Search.vue:2
+msgid "Search for some music"
+msgstr "Rechercher de la musique"
+
+#: front/src/components/library/Track.vue:105
+msgid "Search on lyrics.wikia.com"
+msgstr "Rechercher sur lyrics.wikia.com"
+
+#: front/src/components/library/Album.vue:33
+#: src/components/library/Artist.vue:31
+#: front/src/components/library/Track.vue:40
+msgid "Search on Wikipedia"
+msgstr "Rechercher sur Wikipédia"
+
+#: front/src/components/library/import/TrackImport.vue:42
+msgid "Search query"
+msgstr "Recherche"
+
+#: front/src/views/admin/Settings.vue:15
+msgid "Sections"
+msgstr "Sections"
+
+#: front/src/components/library/radios/Builder.vue:41
+msgid "Select a filter"
+msgstr "Sélectionner un filtre"
+
+#: front/src/components/common/ActionTable.vue:61
+msgid "Select all %{ total } elements"
+msgid_plural "Select all %{ total } elements"
+msgstr[0] "Selectionner l'ensemble des %{ total } élément"
+msgstr[1] "Selectionner l'ensemble des %{ total } éléments"
+
+#: front/src/components/library/import/FileUpload.vue:22
+msgid "Select files to upload..."
+msgstr "Sélectionner les fichiers à envoyer..."
+
+#: front/src/components/common/ActionTable.vue:69
+msgid "Select only current page"
+msgstr "Sélectionner seulement la page actuelle"
+
+#: front/src/components/library/import/Main.vue:19
+msgid "Select relevant sources or files for import"
+msgstr "Sélectionner les sources ou fichiers à importer"
+
+#: front/src/components/federation/LibraryCard.vue:43
+msgid "Send a follow request"
+msgstr "Envoyer une demande d'abonnement"
+
+#: front/src/components/Sidebar.vue:97
+#: src/components/manage/users/UsersTable.vue:184
+#: front/src/views/admin/users/UsersDetail.vue:165
+msgid "Settings"
+msgstr "Paramètres"
+
+#: front/src/components/auth/Settings.vue:10
+msgid "Settings updated"
+msgstr "Paramètres mis à jour"
+
+#: front/src/components/admin/SettingsGroup.vue:11
+msgid "Settings updated successfully."
+msgstr "Paramètres modifiés avec succès."
+
+#: front/src/components/auth/Profile.vue:24
+msgid "Settings..."
+msgstr "Paramètres..."
+
+#: front/src/components/manage/users/InvitationForm.vue:27
+msgid "Share link"
+msgstr "Lien de partage"
+
+#: front/src/components/audio/artist/Card.vue:30
+msgid "Show 1 more album"
+msgid_plural "Show %{ count } more albums"
+msgstr[0] "Montrer 1 album supplémentaire"
+msgstr[1] "Montrer %{ count } albums supplémentaires"
+
+#: front/src/components/audio/album/Card.vue:40
+msgid "Show 1 more track"
+msgid_plural "Show %{ count } more tracks"
+msgstr[0] "Afficher 1 piste de plus"
+msgstr[1] "Afficher %{ count } pistes de plus"
+
+#: front/src/components/forms/PasswordInput.vue:25
+msgid "Show/hide password"
+msgstr "Afficher/masquer le mot de passe"
+
+#: front/src/components/federation/LibraryFollowTable.vue:97
+#: front/src/components/federation/LibraryTrackTable.vue:98
+#: front/src/components/library/import/BatchDetail.vue:128
+#: front/src/components/library/import/BatchList.vue:73
+#: front/src/components/manage/library/FilesTable.vue:97
+#: front/src/components/manage/library/RequestsTable.vue:104
+#: front/src/components/manage/users/InvitationsTable.vue:76
+#: front/src/components/manage/users/UsersTable.vue:87
+msgid "Showing results %{ start }-%{ end } on %{ total }"
+msgstr "Affichage des résultats %{ start }-%{ end } sur %{ total }"
+
+#: front/src/components/audio/Player.vue:269
+msgid "Shuffle your queue"
+msgstr "Mélanger votre queue"
+
+#: front/src/components/auth/Signup.vue:95
+msgid "Sign Up"
+msgstr "Inscription"
+
+#: front/src/components/manage/users/UsersTable.vue:40
+#: front/src/views/admin/users/UsersDetail.vue:37
+msgid "Sign-up"
+msgstr "Inscription"
+
+#: front/src/components/audio/track/Table.vue:31
+msgid "Simply copy paste the snippet below into a terminal to launch the download."
+msgstr "Copiez le texte ci-dessous dans un terminal pour lancer le téléchargement."
+
+#: front/src/components/library/Track.vue:69
+#: front/src/components/library/import/FileUpload.vue:44
+#: front/src/components/manage/library/FilesTable.vue:44
+msgid "Size"
+msgstr "Taille"
+
+#: front/src/components/library/import/BatchDetail.vue:37
+#: front/src/components/library/import/BatchDetail.vue:72
+msgid "Skipped"
+msgstr "Ignoré"
+
+#: front/src/components/requests/Form.vue:3
+msgid "Something's missing in the library? Let us know what you would like to listen!"
+msgstr "Quelque chose manque dans la bibliothèque ? Dîtes nous ce que vous voulez écouter !"
+
+#: front/src/components/audio/Search.vue:25
+msgid "Sorry, we did not found any album matching your query"
+msgstr "Désolé, nous n'avons trouvé aucun album correspondant à votre recherche"
+
+#: front/src/components/audio/Search.vue:16
+msgid "Sorry, we did not found any artist matching your query"
+msgstr "Désolé, nous n'avons trouver aucun·a artiste correspondant à votre recherche"
+
+#: front/src/components/library/import/BatchDetail.vue:82
+#: front/src/components/library/import/BatchList.vue:38
+#: front/src/components/library/import/TrackImport.vue:17
+msgid "Source"
+msgstr "Source"
+
+#: front/src/App.vue:41
+msgid "Source code"
+msgstr "Code source"
+
+#: front/src/App.vue:40
+msgid "Source code (%{version})"
+msgstr "Code source (%{version})"
+
+#: front/src/components/auth/Profile.vue:20
+#: front/src/components/manage/users/UsersTable.vue:70
+msgid "Staff member"
+msgstr "Membre de l'équipe"
+
+#: front/src/components/radios/Button.vue:4
+msgid "Start"
+msgstr "Démarrer"
+
+#: front/src/components/library/import/FileUpload.vue:28
+msgid "Start Upload"
+msgstr "Démarrer l'envoi"
+
+#: front/src/views/admin/Settings.vue:86
+msgid "Statistics"
+msgstr "Statistiques"
+
+#: front/src/components/federation/LibraryFollowTable.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:66
+#: front/src/components/library/import/BatchDetail.vue:83
+#: front/src/components/library/import/BatchList.vue:11
+#: front/src/components/library/import/BatchList.vue:37
+#: front/src/components/library/import/FileUpload.vue:45
+#: front/src/components/manage/library/RequestsTable.vue:24
+#: front/src/components/manage/library/RequestsTable.vue:48
+#: front/src/components/manage/users/InvitationsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:39
+#: front/src/components/manage/users/UsersTable.vue:43
+msgid "Status"
+msgstr "Statut"
+
+#: front/src/components/radios/Button.vue:3
+msgid "Stop"
+msgstr "Arrêter"
+
+#: front/src/components/Sidebar.vue:159
+msgid "Stop radio"
+msgstr "Arrêter la radio"
+
+#: front/src/components/library/import/FileUpload.vue:32
+msgid "Stop Upload"
+msgstr "Arrêter l'envoi"
+
+#: front/src/App.vue:9 src/components/requests/Form.vue:17
+msgid "Submit"
+msgstr "Valider"
+
+#: front/src/components/requests/Form.vue:22
+msgid "Submit another request"
+msgstr "Envoyer une nouvelle requête"
+
+#: front/src/components/library/import/BatchDetail.vue:26
+#: front/src/components/library/import/BatchList.vue:39
+msgid "Submitted by"
+msgstr "Proposé par"
+
+#: front/src/views/admin/Settings.vue:85
+msgid "Subsonic"
+msgstr "Subsonic"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:2
+msgid "Subsonic API password"
+msgstr "Mot de passe de l'API Subsonic"
+
+#: front/src/components/library/import/BatchDetail.vue:71
+#: front/src/components/library/import/BatchList.vue:16
+#: front/src/components/library/import/FileUpload.vue:56
+msgid "Success"
+msgstr "Succès"
+
+#: front/src/App.vue:11
+msgid "Suggested choices"
+msgstr "Suggestions"
+
+#: front/src/components/playlists/Editor.vue:9
+msgid "Syncing changes to server..."
+msgstr "Synchronisation des changements avec le serveur..."
+
+#: front/src/components/Home.vue:26
+msgid "That's simple: we loved Grooveshark and we want to build something even better."
+msgstr "C'est simple : nous adorions Grooveshark et nous voulions construire quelque chose d'encore mieux."
+
+#: front/src/components/requests/Form.vue:73
+msgid "The Beatles, Mickael Jackson…"
+msgstr "Les Beatles, Mickael Jackson..."
+
+#: front/src/App.vue:59
+msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
+msgstr "Le logo de Funkwhale a été généreusement dessiné et fourni par Francis Gading."
+
+#: front/src/components/Home.vue:124
+msgid "The plaform is free and open-source, you can install it and modify it without worries"
+msgstr "La plateforme est gratuite et open-source, vous pouvez l'installer et la modifier sans restrictions"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:4
+msgid "The Subsonic API is not available on this Funkwhale instance."
+msgstr "L'API Subsonic n'est pas disponible sur cette instance Funkwhale."
+
+#: front/src/components/requests/Form.vue:74
+msgid "The White Album, Thriller…"
+msgstr "L'Album Blanc, Thriller..."
+
+#: front/src/components/audio/track/Table.vue:30
+msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks."
+msgstr "Il n'est pas possible pour le moment de télécharger un ensemble de pistes sous forme d'archive. Cependant, vous pouvez utiliser un outil en ligne de commande tel que cURL pour télécharger facilement une liste de pistes."
+
+#: front/src/components/library/import/Main.vue:149
+msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled."
+msgstr "Cet import sera associé à la requête ci dessous. Une fois l'import terminé, la requête sera marquée comme complétée."
+
+#: front/src/views/federation/LibraryDetail.vue:195
+msgid "This indicate if the remote library granted you access"
+msgstr "Ceci indique si la bibliothèque distance vous à accordé l'accès"
+
+#: front/src/components/auth/Profile.vue:16
+msgid "This is you!"
+msgstr "C'est vous !"
+
+#: front/src/components/common/ActionTable.vue:37
+msgid "This may affect a lot of elements, please double check this is really what you want."
+msgstr "Cette opération peut affecter de nombreux éléments, merci de vérifier que c'est bien ce que vous souhaitez."
+
+#: front/src/components/audio/PlayButton.vue:61
+msgid "This track is not imported and cannot be played"
+msgstr "Cette piste n'est pas importée et ne peut pas être jouée"
+
+#: front/src/views/playlists/Detail.vue:37
+msgid "This will completely delete this playlist and cannot be undone."
+msgstr "Cela supprimera définitivement cette playlist et ne pourra pas être annulé."
+
+#: front/src/views/radios/Detail.vue:27
+msgid "This will completely delete this radio and cannot be undone."
+msgstr "Cela supprimera définitivement cette radio et ne pourra pas être annulé."
+
+#: front/src/components/auth/SubsonicTokenForm.vue:51
+msgid "This will completely disable access to the Subsonic API using from account."
+msgstr "Cela désactivera complétement l'accès à l'API Subsonic depuis votre compte."
+
+#: front/src/App.vue:137
+msgid "This will erase your local data and disconnect you, do you want to continue?"
+msgstr "Cela va effacer vos données locales et vous déconnecter, voulez-vous continuer ?"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:36
+msgid "This will log you out from existing devices that use the current password."
+msgstr "Cela vous déconnectera sur l'ensemble de vos appareils utilisant ce mot de passe."
+
+#: front/src/components/playlists/Editor.vue:44
+msgid "This will remove all tracks from this playlist and cannot be undone."
+msgstr "Cela supprimera toutes les pistes de la playlist et ne pourra pas être annulé."
+
+#: front/src/components/audio/track/Table.vue:6
+#: front/src/components/federation/LibraryTrackTable.vue:47
+#: front/src/components/manage/library/FilesTable.vue:37
+msgid "Title"
+msgstr "Titre"
+
+#: front/src/components/audio/SearchBar.vue:27
+#: src/components/library/Track.vue:174
+#: front/src/components/library/import/BatchDetail.vue:84
+#: front/src/components/metadata/Search.vue:138
+msgid "Track"
+msgstr "Piste"
+
+#: front/src/components/library/Track.vue:53
+msgid "Track information"
+msgstr "Information de la piste"
+
+#: front/src/components/library/radios/Filter.vue:44
+msgid "Track matching filter"
+msgstr "Piste correspondant au filtre"
+
+#: front/src/components/instance/Stats.vue:54
+msgid "tracks"
+msgstr "pistes"
+
+#: front/src/components/library/Album.vue:43
+#: front/src/components/playlists/PlaylistModal.vue:33
+#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50
+#: front/src/views/radios/Detail.vue:34
+msgid "Tracks"
+msgstr "Pistes"
+
+#: front/src/views/federation/LibraryDetail.vue:125
+msgid "Tracks available in this library"
+msgstr "Pistes disponibles dans cette bibliothèque"
+
+#: front/src/components/library/Artist.vue:54
+msgid "Tracks by this artist"
+msgstr "Pistes par cetâ‹…te artiste"
+
+#: front/src/components/instance/Stats.vue:25
+msgid "Tracks favorited"
+msgstr "Pistes en favoris"
+
+#: front/src/components/instance/Stats.vue:19
+msgid "tracks listened"
+msgstr "pistes écoutées"
+
+#: front/src/views/federation/LibraryDetail.vue:109
+msgid "Trigger scan"
+msgstr "Déclencher un scan"
+
+#: front/src/components/manage/library/FilesTable.vue:41
+msgid "Type"
+msgstr "Type"
+
+#: front/src/components/About.vue:15
+msgid "Unfortunately, owners of this instance did not yet take the time to complete this page."
+msgstr "Malheureusement, les gestionnaires de cette instance n'ont pas encore pris le temps de compléter cette page."
+
+#: front/src/views/federation/LibraryDetail.vue:95
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: front/src/components/Home.vue:37
+msgid "Unlimited music"
+msgstr "Musique illimitée"
+
+#: front/src/components/audio/Player.vue:264
+msgid "Unmute"
+msgstr "Réactiver le son"
+
+#: front/src/components/auth/Settings.vue:50
+msgid "Update avatar"
+msgstr "Mettre à jour l'avatar"
+
+#: front/src/components/playlists/Form.vue:33
+msgid "Update playlist"
+msgstr "Mettre à jour la playlist"
+
+#: front/src/components/auth/Settings.vue:27
+msgid "Update settings"
+msgstr "Mettre à jour les paramètres"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:21
+msgid "Update your password"
+msgstr "Mettre à jour votre mot de passe"
+
+#: front/src/components/manage/users/UsersTable.vue:172
+#: front/src/views/admin/users/UsersDetail.vue:153
+msgid "Upload"
+msgstr "Envoi"
+
+#: front/src/components/auth/Settings.vue:45
+msgid "Upload a new avatar"
+msgstr "Envoyer un nouvel avatar"
+
+#: front/src/components/library/import/Main.vue:7
+msgid "Uploaded files or external source"
+msgstr "Fichiers envoyés ou source externe"
+
+#: front/src/components/library/import/FileUpload.vue:57
+msgid "Uploading..."
+msgstr "Envoi en cours..."
+
+#: front/src/App.vue:45
+msgid "Use another instance"
+msgstr "Utiliser une autre instance"
+
+#: front/src/components/requests/Form.vue:75
+msgid "Use this comment box to add details to your request if needed"
+msgstr "Utilisez ce champ pour ajouter des détails à votre demande, si nécessaire"
+
+#: front/src/views/federation/LibraryDetail.vue:196
+msgid "Use this flag to enable/disable federation with this library"
+msgstr "Utilisez ce réglage pour activer/désactiver la fédération avec cette bibliothèque"
+
+#: front/src/views/auth/PasswordReset.vue:12
+msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
+msgstr "Utilisez ce formulaire pour demander à réinitialiser votre mot de passe. Vous recevrez un email à l'adresse indiquée contenant les instructions de réinitialisation."
+
+#: front/src/components/federation/LibraryForm.vue:6
+msgid "Use this form to scan an instance and setup federation."
+msgstr "Utilisez ce formulaire pour scanner le catalogue d'une instance et mettre en place la fédération."
+
+#: front/src/components/manage/users/InvitationsTable.vue:49
+msgid "Used"
+msgstr "Utilisé"
+
+#: front/src/components/manage/library/RequestsTable.vue:47
+msgid "User"
+msgstr "Utilisateur·rice"
+
+#: front/src/components/instance/Stats.vue:5
+msgid "User activity"
+msgstr "Activité des utilisateur·ice·s"
+
+#: front/src/components/library/Radios.vue:20
+msgid "User radios"
+msgstr "Radios des utilisateur·ice·s"
+
+#: front/src/components/auth/Signup.vue:19
+#: front/src/components/manage/users/UsersTable.vue:37
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
+#: front/src/components/auth/Login.vue:15
+msgid "Username or email"
+msgstr "Nom d'utilisateur ou email"
+
+#: front/src/components/instance/Stats.vue:13
+msgid "users"
+msgstr "tilisateur·ice·s"
+
+#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81
+#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3
+#: front/src/views/admin/users/UsersList.vue:21
+msgid "Users"
+msgstr "Utilisateur·ice·s"
+
+#: front/src/components/library/Album.vue:37
+#: src/components/library/Artist.vue:35
+#: front/src/components/library/Track.vue:44
+#: front/src/components/library/import/ArtistImport.vue:131
+#: front/src/components/metadata/ArtistCard.vue:49
+#: front/src/components/metadata/ReleaseCard.vue:53
+msgid "View on MusicBrainz"
+msgstr "Voir sur MusicBrainz"
+
+#: front/src/components/playlists/PlaylistModal.vue:20
+msgid "We cannot add the track to a playlist"
+msgstr "Nous ne pouvons pas ajouter cette piste à une playlist"
+
+#: front/src/components/playlists/Form.vue:14
+msgid "We cannot create the playlist"
+msgstr "Nous ne pouvons pas créer cette playlist"
+
+#: front/src/components/auth/Signup.vue:13
+msgid "We cannot create your account"
+msgstr "Nous ne pouvons pas créer votre compte"
+
+#: front/src/components/auth/Login.vue:7
+msgid "We cannot log you in"
+msgstr "Erreur lors de la connexion"
+
+#: front/src/components/auth/Settings.vue:38
+msgid "We cannot save your avatar"
+msgstr "Nous ne pouvons pas enregistrer votre avatar"
+
+#: front/src/components/auth/Settings.vue:14
+msgid "We cannot save your settings"
+msgstr "Nous ne pouvons pas enregistrer vos paramètres"
+
+#: front/src/components/Home.vue:130
+msgid "We do not track you or bother you with ads"
+msgstr "Nous ne vous pistons pas et ne vous exposons pas à des publicités"
+
+#: front/src/components/library/import/FileUpload.vue:5
+msgid "We recommend using Picard for that purpose."
+msgstr "Nous recommandons d'utiliser le logiciel Picard pour cela."
+
+#: front/src/components/Home.vue:7
+msgid "We think listening to music should be simple."
+msgstr "Nous pensons que l'accès à la musique devrait être simple."
+
+#: front/src/components/PageNotFound.vue:10
+msgid "We're sorry, the page you asked for does not exist:"
+msgstr "Désolé, la page demandée n’existe pas :"
+
+#: front/src/components/requests/Form.vue:21
+msgid "We've received your request, you'll get some groove soon ;)"
+msgstr "Nous avons bien reçu votre requête, vous aurez bientôt de nos nouvelles ;)"
+
+#: front/src/components/Home.vue:152
+msgid "Welcome"
+msgstr "Bienvenue"
+
+#: front/src/components/Home.vue:5
+msgid "Welcome on Funkwhale"
+msgstr "Bienvenue sur Funkwhale"
+
+#: front/src/components/library/import/Main.vue:114
+msgid "What is metadata?"
+msgstr "Qu'est-ce que les métadonnées ?"
+
+#: front/src/views/federation/LibraryDetail.vue:197
+msgid "When enabled, auto importing will automatically import new tracks published in this library"
+msgstr "Si ce réglage est activé, les nouvelles pistes ajoutées dans cette bibliothèque seront automatiquement importées"
+
+#: front/src/components/Home.vue:24
+msgid "Why funkwhale?"
+msgstr "Pourquoi Funkwhale ?"
+
+#: front/src/components/Sidebar.vue:124
+msgid "Yes"
+msgstr "Oui"
+
+#: front/src/components/auth/Logout.vue:8
+msgid "Yes, log me out!"
+msgstr "Oui, déconnectez-moi !"
+
+#: front/src/components/auth/Logout.vue:7
+msgid "You are currently logged in as %{ username }"
+msgstr "Vous êtes actuellement connecté·e en tant que %{ username }"
+
+#: front/src/components/library/import/Main.vue:111
+msgid "You can also skip this step and enter metadata manually."
+msgstr "Vous pouvez également sauter cette étape et entrer les métadonnées manuellement."
+
+#: front/src/components/Home.vue:136
+msgid "You can invite friends and family to your instance so they can enjoy your music"
+msgstr "Vous pouvez inviter vos ami·es et votre famille sur votre instance pour qu'ils·elles puissent profiter de votre musique"
+
+#: front/src/components/library/radios/Builder.vue:7
+msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria."
+msgstr "Vous pouvez utiliser cette interface pour réaliser votre propre radio personnalisée, qui jouera les pistes correspondant aux critères indiqués."
+
+#: front/src/components/auth/SubsonicTokenForm.vue:8
+msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
+msgstr "Vous pouvez les utiliser pour profiter de vos playlists et de votre musique en mode hors-ligne sur votre smatphone ou tablette, par exemple."
+
+#: front/src/components/Sidebar.vue:156
+msgid "You have a radio playing"
+msgstr "Vous écoutez une radio"
+
+#: front/src/App.vue:6
+msgid "You need to select an instance in order to continue"
+msgstr "Vous devez choisir une instance pour continuer"
+
+#: front/src/components/auth/Settings.vue:100
+msgid "You will be logged out from this session and have to log in with the new one"
+msgstr "Vous allez être déconnecté⋅e de cette session et vous allez devoir vous connecter avec votre nouveau mot de passe"
+
+#: front/src/components/auth/Settings.vue:71
+msgid "You will have to update your password on your clients that use this password."
+msgstr "Vous devrez mettre à jour votre mot de passe sur l'ensemble des clients utilisant ce mot de passe."
+
+#: front/src/components/library/import/Main.vue:103
+msgid "You will import:"
+msgstr "Vous allez importer :"
+
+#: front/src/views/auth/EmailConfirm.vue:24
+msgid "Your email address was confirmed, you can now use the service without limitations."
+msgstr "Votre adresse email a été confirmée, vous pouvez maintenant utiliser le service sans limitations."
+
+#: front/src/components/favorites/List.vue:109
+msgid "Your Favorites"
+msgstr "Vos favoris"
+
+#: front/src/components/Home.vue:117
+msgid "Your music, your way"
+msgstr "Votre musique, à votre façon"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:29
+msgid "Your password has been updated successfully."
+msgstr "Votre mot de passe a été mis à jour avec succès."
+
+#: front/src/components/auth/Settings.vue:101
+msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
+msgstr "Votre mot de passe Subsonic sera remplacé par un nouveau mot de passe aléatoire, ce qui vous déconnectera de tous les appareils utilisant l'ancien mot de passe"
+
+#: front/src/components/audio/PlayButton.vue:156
+msgid "%{ count } track was added to your queue"
+msgid_plural "%{ count } tracks were added to your queue"
+msgstr[0] "%{ count } piste a été ajouté à votre queue"
+msgstr[1] "%{ count } pistes ont été ajoutées à votre queue"
diff --git a/front/locales/it/LC_MESSAGES/app.po b/front/locales/it/LC_MESSAGES/app.po
new file mode 100644
index 0000000000000000000000000000000000000000..4e37fb1cda8c144687e09ee50b4a96e83cdfd5c8
--- /dev/null
+++ b/front/locales/it/LC_MESSAGES/app.po
@@ -0,0 +1,2461 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the front package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: front 1.0.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-07-22 14:12+0200\n"
+"PO-Revision-Date: 2018-07-19 10:49+0000\n"
+"Last-Translator: Sylke Vicious <silkevicious@tuta.io>\n"
+"Language-Team: none\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.20\n"
+
+#: front/src/components/playlists/PlaylistModal.vue:9
+msgid "\"%{ title }\", by %{ artist }"
+msgstr "\"%{ title }\", di %{ artist }"
+
+#: front/src/components/Sidebar.vue:24
+msgid "(%{ index } of %{ length })"
+msgstr "(%{ index } su %{ length })"
+
+#: front/src/components/Sidebar.vue:22
+msgid "(empty)"
+msgstr "(vuoto)"
+
+#: front/src/components/common/ActionTable.vue:43
+#: front/src/components/common/ActionTable.vue:51
+msgid "%{ count } on %{ total } selected"
+msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] "%{ count } su %{ total } selezionato"
+msgstr[1] "%{ count } su %{ total } selezionati"
+
+#: front/src/components/Sidebar.vue:116
+#: src/views/federation/LibraryDetail.vue:87
+msgid "%{ count } track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{ count } traccia"
+msgstr[1] "%{ count } tracce"
+
+#: front/src/components/library/Artist.vue:13
+msgid "%{ count } track in %{ albumsCount } albums"
+msgid_plural "%{ count } tracks in %{ albumsCount } albums"
+msgstr[0] "%{ count } traccia in %{ albumsCount } album"
+msgstr[1] "%{ count } tracce in %{ albumsCount } album"
+
+#: front/src/components/library/radios/Builder.vue:76
+msgid "%{ count } track matching combined filters"
+msgid_plural "%{ count } tracks matching combined filters"
+msgstr[0] "%{ count } traccia corrisponde ai filtri combinati"
+msgstr[1] "%{ count } tracce corrispondono ai filtri combinati"
+
+#: front/src/components/playlists/Card.vue:18
+msgid "%{ count} track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{ count} traccia"
+msgstr[1] "%{ count} tracce"
+
+#: front/src/components/common/Duration.vue:2
+msgid "%{ hours } h %{ minutes } min"
+msgstr ""
+
+#: front/src/components/common/Duration.vue:5
+msgid "%{ minutes } min"
+msgstr ""
+
+#: front/src/components/activity/Like.vue:7
+msgid "%{ user } favorited a track"
+msgstr "a %{ user } piace una traccia"
+
+#: front/src/components/activity/Listen.vue:7
+msgid "%{ user } listened to a track"
+msgstr "%{ user } ha ascoltato una traccia"
+
+#: front/src/components/auth/Profile.vue:49
+msgid "%{ username }'s profile"
+msgstr "Profilo di %{ username }"
+
+#: front/src/components/audio/artist/Card.vue:41
+msgid "1 album"
+msgid_plural "%{ count } albums"
+msgstr[0] "1 album"
+msgstr[1] "%{ count } album"
+
+#: front/src/components/favorites/List.vue:10
+msgid "1 favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "1 mi piace"
+msgstr[1] "%{ count } mi piace"
+
+#: front/src/components/audio/album/Card.vue:54
+#: front/src/components/federation/LibraryCard.vue:25
+msgid "1 track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "1 traccia"
+msgstr[1] "%{ count } tracce"
+
+#: front/src/components/About.vue:5
+#, fuzzy
+msgid "About %{ instance }"
+msgstr "A proposito di questa istanza"
+
+#: front/src/App.vue:54
+msgid "About Funkwhale"
+msgstr "A proposito di Funkwhale"
+
+#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55
+msgid "About this instance"
+msgstr "A proposito di questa istanza"
+
+#: front/src/components/manage/library/RequestsTable.vue:28
+#: front/src/components/manage/library/RequestsTable.vue:62
+msgid "Accepted"
+msgstr "Accettato"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:111
+msgid "Access disabled"
+msgstr "Accesso disabilitato"
+
+#: front/src/components/Home.vue:109
+msgid "Access your music from a clean interface that focus on what really matters"
+msgstr "Accedi alla tua musica da un'interfaccia pulita che si focalizza su quello che conta davvero"
+
+#: front/src/views/admin/users/UsersDetail.vue:54
+msgid "Account active"
+msgstr "Account attivo"
+
+#: front/src/components/auth/Settings.vue:5
+msgid "Account settings"
+msgstr "Impostazioni dell'account"
+
+#: front/src/components/auth/Settings.vue:257
+msgid "Account Settings"
+msgstr "Impostazioni dell'account"
+
+#: front/src/components/manage/users/UsersTable.vue:39
+msgid "Account status"
+msgstr "Stato dell'account"
+
+#: front/src/views/auth/PasswordReset.vue:14
+msgid "Account's email"
+msgstr "Email dell'account"
+
+#: front/src/components/common/ActionTable.vue:82
+msgid "Action %{ action } was launched successfully on %{ count } element"
+msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
+msgstr[0] "L'azione %{ action } è stata lanciata con successo su %{ count } elemento"
+msgstr[1] "L'azione %{ action } è stata lanciata con successo su %{ count } elementi"
+
+#: front/src/components/common/ActionTable.vue:8
+#: front/src/components/federation/LibraryFollowTable.vue:24
+#: front/src/components/library/radios/Builder.vue:60
+#: front/src/components/manage/library/RequestsTable.vue:54
+msgid "Actions"
+msgstr "Azioni"
+
+#: front/src/components/manage/users/UsersTable.vue:53
+#, fuzzy
+msgid "Active"
+msgstr "Attività"
+
+#: front/src/components/Sidebar.vue:60
+msgid "Activity"
+msgstr "Attività"
+
+#: front/src/components/federation/LibraryFollowTable.vue:21
+msgid "Actor"
+msgstr ""
+
+#: front/src/views/federation/LibraryList.vue:8
+msgid "Add a new library"
+msgstr "Aggiungi una nuova libreria"
+
+#: front/src/components/library/radios/Builder.vue:46
+msgid "Add filter"
+msgstr "Aggiungi filtro"
+
+#: front/src/components/library/radios/Builder.vue:36
+msgid "Add filters to customize your radio"
+msgstr "Aggiungi filtri per personalizzare la tua radio"
+
+#: front/src/components/audio/PlayButton.vue:53
+msgid "Add to current queue"
+msgstr "Aggiungi alla coda corrente"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:4
+#: front/src/components/favorites/TrackFavoriteIcon.vue:21
+msgid "Add to favorites"
+msgstr "Aggiungi ai preferiti"
+
+#: front/src/components/playlists/TrackPlaylistIcon.vue:6
+#: front/src/components/playlists/TrackPlaylistIcon.vue:32
+msgid "Add to playlist..."
+msgstr "Aggiungi alla playlist..."
+
+#: front/src/components/audio/PlayButton.vue:14
+msgid "Add to queue"
+msgstr "Aggiungi alla coda"
+
+#: front/src/components/playlists/PlaylistModal.vue:116
+msgid "Add to this playlist"
+msgstr "Aggiungi a questa playlist"
+
+#: front/src/components/playlists/PlaylistModal.vue:54
+msgid "Add track"
+msgstr "Aggiungi traccia"
+
+#: front/src/components/manage/users/UsersTable.vue:69
+msgid "Admin"
+msgstr "Amministratore"
+
+#: front/src/components/Sidebar.vue:64
+msgid "Administration"
+msgstr "Amministrazione"
+
+#: front/src/components/audio/SearchBar.vue:26
+#: src/components/audio/track/Table.vue:8
+#: front/src/components/federation/LibraryTrackTable.vue:49
+#: front/src/components/library/Album.vue:91
+#: front/src/components/manage/library/FilesTable.vue:39
+#: front/src/components/metadata/Search.vue:134
+msgid "Album"
+msgstr "Album"
+
+#: front/src/components/library/import/ReleaseImport.vue:3
+msgid "Album %{ title } (%{ count } track) by %{ artist }"
+msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }"
+msgstr[0] "Album %{ title } (%{ count } traccia) di %{ artist }"
+msgstr[1] "Album %{ title } (%{ count } tracce) di %{ artist }"
+
+#: front/src/components/library/Album.vue:12
+msgid "Album containing %{ count } track, by %{ artist }"
+msgid_plural "Album containing %{ count } tracks, by %{ artist }"
+msgstr[0] "Album contenente %{ count } traccia, di %{ artist }"
+msgstr[1] "Album contenente %{ count } tracce, di %{ artist }"
+
+#: front/src/components/library/Track.vue:20
+msgid "Album page"
+msgstr "Pagina dell'album"
+
+#: front/src/components/audio/Search.vue:19
+#: src/components/instance/Stats.vue:48
+#: front/src/components/manage/library/RequestsTable.vue:50
+#: front/src/components/requests/Form.vue:9
+msgid "Albums"
+msgstr "Albums"
+
+#: front/src/components/library/Artist.vue:44
+msgid "Albums by this artist"
+msgstr "Albums di questo artista"
+
+#: front/src/components/manage/library/RequestsTable.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:19
+msgid "All"
+msgstr "Tutto"
+
+#: front/src/components/playlists/Editor.vue:13
+msgid "An error occured while saving your changes"
+msgstr "C'è stato un errore durante il salvataggio delle tue modifiche"
+
+#: front/src/components/auth/Login.vue:10
+msgid "An unknown error happend, this can mean the server is down or cannot be reached"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:11
+#: front/src/components/library/import/BatchDetail.vue:68
+#: front/src/components/library/import/BatchList.vue:13
+#: front/src/components/library/import/BatchList.vue:22
+msgid "Any"
+msgstr "Qualsiasi"
+
+#: front/src/components/library/import/BatchList.vue:24
+msgid "API"
+msgstr "API"
+
+#: front/src/components/federation/LibraryFollowTable.vue:68
+#: front/src/components/federation/LibraryFollowTable.vue:78
+msgid "Approve"
+msgstr "Approva"
+
+#: front/src/components/federation/LibraryFollowTable.vue:70
+msgid "Approve access?"
+msgstr "Approvi l'accesso?"
+
+#: front/src/components/federation/LibraryFollowTable.vue:38
+msgid "Approved"
+msgstr "Approvato"
+
+#: front/src/components/auth/Logout.vue:5
+msgid "Are you sure you want to log out?"
+msgstr "Sei sicuro di volerti disconnettere?"
+
+#: front/src/components/audio/SearchBar.vue:25
+#: src/components/audio/track/Table.vue:7
+#: front/src/components/federation/LibraryTrackTable.vue:48
+#: front/src/components/library/Artist.vue:119
+#: front/src/components/manage/library/FilesTable.vue:38
+#: front/src/components/manage/library/RequestsTable.vue:49
+#: front/src/components/metadata/Search.vue:130
+msgid "Artist"
+msgstr "Artista"
+
+#: front/src/components/requests/Form.vue:5
+msgid "Artist name"
+msgstr "Nome dell'artista"
+
+#: front/src/components/library/Album.vue:22
+#: src/components/library/Track.vue:23
+msgid "Artist page"
+msgstr "Pagina dell'artista"
+
+#: front/src/components/audio/Search.vue:65
+msgid "Artist, album, track..."
+msgstr "Artista, album, traccia..."
+
+#: front/src/components/audio/Search.vue:10
+#: src/components/instance/Stats.vue:42
+#: front/src/components/library/Artists.vue:119
+#: src/components/library/Library.vue:7
+msgid "Artists"
+msgstr "Artisti"
+
+#: front/src/components/favorites/List.vue:33
+#: front/src/components/federation/LibraryTrackTable.vue:28
+#: front/src/components/library/Artists.vue:25
+#: src/components/library/Radios.vue:44
+#: front/src/components/manage/library/FilesTable.vue:19
+#: front/src/components/manage/library/RequestsTable.vue:19
+#: front/src/components/manage/users/UsersTable.vue:19
+#: front/src/views/federation/LibraryList.vue:28
+#: src/views/playlists/List.vue:27
+msgid "Ascending"
+msgstr "Crescente"
+
+#: front/src/views/auth/PasswordReset.vue:27
+msgid "Ask for a password reset"
+msgstr "Chiedi un reset della password"
+
+#: front/src/views/federation/LibraryDetail.vue:56
+msgid "Auto importing"
+msgstr "Auto importazione"
+
+#: front/src/components/playlists/PlaylistModal.vue:26
+msgid "Available playlists"
+msgstr "Playlist disponibili"
+
+#: front/src/components/auth/Settings.vue:34
+msgid "Avatar"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24
+#: front/src/views/auth/PasswordResetConfirm.vue:18
+msgid "Back to login"
+msgstr "Torna alla pagina di accesso"
+
+#: front/src/views/federation/LibraryFollowersList.vue:5
+msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library."
+msgstr "Fai attenzione quando accetti le richieste di seguirti, perchè significa che quell'utente avrà accesso a tutta la tua libreria."
+
+#: front/src/components/library/Track.vue:80
+#: front/src/components/manage/library/FilesTable.vue:42
+msgid "Bitrate"
+msgstr "Bitrate"
+
+#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
+msgid "Browse"
+msgstr "Sfoglia"
+
+#: front/src/components/Sidebar.vue:50
+msgid "Browse library"
+msgstr "Sfoglia libreria"
+
+#: front/src/components/library/Artists.vue:4
+msgid "Browsing artists"
+msgstr "Sfogliando artisti"
+
+#: front/src/views/federation/LibraryTrackList.vue:3
+msgid "Browsing federated tracks"
+msgstr "Sfogliando tracce federate"
+
+#: front/src/views/federation/LibraryFollowersList.vue:3
+msgid "Browsing followers"
+msgstr "Sfogliando followers"
+
+#: front/src/views/federation/LibraryList.vue:3
+msgid "Browsing libraries"
+msgstr "Sfogliando librerie"
+
+#: front/src/views/playlists/List.vue:3
+msgid "Browsing playlists"
+msgstr "Sfogliando playlists"
+
+#: front/src/components/library/Radios.vue:4
+msgid "Browsing radios"
+msgstr "Sfogliando radio"
+
+#: front/src/components/library/radios/Builder.vue:5
+msgid "Builder"
+msgstr "Crea"
+
+#: front/src/components/audio/album/Card.vue:13
+msgid "By %{ artist }"
+msgstr "Di %{ artist }"
+
+#: front/src/components/federation/LibraryFollowTable.vue:57
+msgid "By confirming, %{ username } will be denied access to your library."
+msgstr "Confermando, a %{ username } sarà negato l'accesso alla tua libreria."
+
+#: front/src/components/federation/LibraryFollowTable.vue:73
+msgid "By confirming, %{ username } will be granted access to your library."
+msgstr "Confermando, a %{ username } sarà consentito l'accesso alla tua libreria."
+
+#: front/src/components/audio/track/Table.vue:43
+#: front/src/components/common/DangerousButton.vue:17
+#: front/src/components/library/radios/Filter.vue:53
+#: front/src/components/playlists/PlaylistModal.vue:63
+msgid "Cancel"
+msgstr "Annulla"
+
+#: front/src/components/library/radios/Builder.vue:59
+msgid "Candidates"
+msgstr "Candidati"
+
+#: front/src/components/auth/Settings.vue:76
+msgid "Cannot change your password"
+msgstr "Non puoi cambiare la tua password"
+
+#: front/src/App.vue:66
+msgid "Change language"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:67
+msgid "Change my password"
+msgstr "Cambia la mia password"
+
+#: front/src/components/auth/Settings.vue:95
+msgid "Change password"
+msgstr "Cambia password"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:4
+#: front/src/views/auth/PasswordResetConfirm.vue:62
+msgid "Change your password"
+msgstr "Cambia la tua password"
+
+#: front/src/components/auth/Settings.vue:96
+msgid "Change your password?"
+msgstr "Cambiare la tua password?"
+
+#: front/src/components/playlists/Editor.vue:21
+msgid "Changes synced with server"
+msgstr "Modifiche sincronizzate con il server"
+
+#: front/src/components/auth/Settings.vue:70
+msgid "Changing your password will also change your Subsonic API password if you have requested one."
+msgstr "Cambiando la tua password cambierà anche la password della API Subsonic se ne hai richiesta una."
+
+#: front/src/components/auth/Settings.vue:98
+msgid "Changing your password will have the following consequences"
+msgstr "Cambiare la tua password avrà queste conseguenze"
+
+#: front/src/App.vue:4
+msgid "Choose your instance"
+msgstr "Scegli la tua istanza"
+
+#: front/src/components/Home.vue:64
+msgid "Clean library"
+msgstr "Pulisci libreria"
+
+#: front/src/components/manage/users/InvitationForm.vue:37
+msgid "Clear"
+msgstr "Pulisci"
+
+#: front/src/components/playlists/Editor.vue:40
+#: front/src/components/playlists/Editor.vue:45
+msgid "Clear playlist"
+msgstr "Pulisci playlist"
+
+#: front/src/components/audio/Player.vue:270
+msgid "Clear your queue"
+msgstr "Pulisci la tua coda"
+
+#: front/src/components/library/import/BatchList.vue:23
+msgid "CLI"
+msgstr "CLI"
+
+#: front/src/components/Home.vue:44
+msgid "Click once, listen for hours using built-in radios"
+msgstr "Clicca una volta, ascolta per ore utilizzando le radio integrate"
+
+#: front/src/components/manage/library/RequestsTable.vue:30
+#: front/src/components/manage/library/RequestsTable.vue:64
+msgid "Closed"
+msgstr "Chiuso"
+
+#: front/src/components/manage/users/InvitationForm.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:42
+msgid "Code"
+msgstr "Codice"
+
+#: front/src/components/audio/album/Card.vue:43
+#: front/src/components/audio/artist/Card.vue:33
+#: front/src/components/discussion/Comment.vue:20
+msgid "Collapse"
+msgstr "Riduci"
+
+#: front/src/components/manage/library/RequestsTable.vue:51
+#: front/src/components/requests/Form.vue:14
+msgid "Comment"
+msgstr "Commenta"
+
+#: front/src/components/library/radios/Builder.vue:58
+msgid "Config"
+msgstr "Configurazione"
+
+#: front/src/components/common/DangerousButton.vue:21
+msgid "Confirm"
+msgstr "Conferma"
+
+#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20
+#: front/src/views/auth/EmailConfirm.vue:51
+msgid "Confirm your email"
+msgstr "Conferma la tua email"
+
+#: front/src/views/auth/EmailConfirm.vue:13
+msgid "Confirmation code"
+msgstr "Codice di conferma"
+
+#: front/src/components/playlists/Editor.vue:163
+msgid "Copy tracks from current queue to playlist"
+msgstr "Copia tracce dalla tua coda corrente alla playlist"
+
+#: front/src/components/Home.vue:88
+msgid "Covers, lyrics, our goal is to have them all ;)"
+msgstr "Copertine, testi, il nostro obbiettivo è averli tutti ;)"
+
+#: front/src/components/auth/Signup.vue:4
+msgid "Create a funkwhale account"
+msgstr "Crea un account funkwhale"
+
+#: front/src/components/playlists/Form.vue:2
+msgid "Create a new playlist"
+msgstr "Crea una nuova playlist"
+
+#: front/src/components/auth/Login.vue:17
+msgid "Create an account"
+msgstr "Crea un account"
+
+#: front/src/components/manage/library/RequestsTable.vue:88
+#: front/src/components/requests/Card.vue:25
+msgid "Create import"
+msgstr "Crea importazione"
+
+#: front/src/components/auth/Signup.vue:51
+msgid "Create my account"
+msgstr "Crea il mio account"
+
+#: front/src/components/playlists/Form.vue:34
+msgid "Create playlist"
+msgstr "Crea playlist"
+
+#: front/src/components/library/Radios.vue:23
+msgid "Create your own radio"
+msgstr "Crea la tua radio"
+
+#: front/src/components/federation/LibraryFollowTable.vue:22
+#: front/src/components/manage/library/RequestsTable.vue:52
+#: front/src/components/manage/users/InvitationsTable.vue:40
+msgid "Creation date"
+msgstr "Data di creazione"
+
+#: front/src/components/auth/Settings.vue:54
+#, fuzzy
+msgid "Current avatar"
+msgstr "Traccia corrente"
+
+#: front/src/components/playlists/PlaylistModal.vue:8
+msgid "Current track"
+msgstr "Traccia corrente"
+
+#: front/src/components/manage/library/FilesTable.vue:189
+#: front/src/components/manage/library/RequestsTable.vue:195
+#: front/src/components/manage/users/InvitationsTable.vue:166
+#: front/src/views/playlists/Detail.vue:33
+msgid "Delete"
+msgstr "Elimina"
+
+#: front/src/views/playlists/Detail.vue:38
+msgid "Delete playlist"
+msgstr "Elimina playlist"
+
+#: front/src/views/radios/Detail.vue:28
+msgid "Delete radio"
+msgstr "Elimina radio"
+
+#: front/src/components/federation/LibraryFollowTable.vue:52
+#: front/src/components/federation/LibraryFollowTable.vue:63
+msgid "Deny"
+msgstr "Nega"
+
+#: front/src/components/federation/LibraryFollowTable.vue:54
+msgid "Deny access?"
+msgstr "Negare accesso?"
+
+#: front/src/components/favorites/List.vue:34
+#: front/src/components/federation/LibraryTrackTable.vue:29
+#: front/src/components/library/Artists.vue:26
+#: src/components/library/Radios.vue:47
+#: front/src/components/manage/library/FilesTable.vue:20
+#: front/src/components/manage/library/RequestsTable.vue:20
+#: front/src/components/manage/users/UsersTable.vue:20
+#: front/src/views/federation/LibraryList.vue:29
+#: src/views/playlists/List.vue:28
+msgid "Descending"
+msgstr "Decrescente"
+
+#: front/src/components/federation/LibraryCard.vue:50
+msgid "Detail"
+msgstr "Dettaglio"
+
+#: front/src/views/admin/users/UsersDetail.vue:146
+#, fuzzy
+msgid "Determine if the user account is active or not. Inactive users cannot login or use the service."
+msgstr "Determina se un account utente è attivo o meno. Gli utenti inattivi non possono accedere o utilizzare il servizio."
+
+#: front/src/components/auth/Settings.vue:104
+#: front/src/components/auth/SubsonicTokenForm.vue:52
+msgid "Disable access"
+msgstr "Disabilita accesso"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:49
+msgid "Disable Subsonic access"
+msgstr "Disabilita accesso Subsonic"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:50
+msgid "Disable Subsonic API access?"
+msgstr "Disabilitare l'accesso alle API Subsonic?"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:14
+msgid "Discover how to use Funkwhale from other apps"
+msgstr "Scopri come utilizzare Funkwhale attraverso altre app"
+
+#: front/src/components/library/radios/Builder.vue:26
+msgid "Display publicly"
+msgstr "Mostra pubblicamente"
+
+#: front/src/components/playlists/Editor.vue:42
+msgid "Do you want to clear the playlist \"%{ playlist }\"?"
+msgstr "Vuoi pulire la playlist \"%{ playlist }\"?"
+
+#: front/src/components/common/DangerousButton.vue:7
+msgid "Do you want to confirm this action?"
+msgstr "Vuoi confermare questa azione?"
+
+#: front/src/views/playlists/Detail.vue:35
+msgid "Do you want to delete the playlist \"%{ playlist }\"?"
+msgstr "Vuoi eliminare la playlist \"%{ playlist }\"?"
+
+#: front/src/views/radios/Detail.vue:26
+#, fuzzy
+msgid "Do you want to delete the radio \"%{ radio }\"?"
+msgstr "Vuoi eliminare la radio \"{{ radio }}\"?"
+
+#: front/src/components/common/ActionTable.vue:29
+msgid "Do you want to launch %{ action } on %{ count } element?"
+msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/Sidebar.vue:113
+msgid "Do you want to restore your previous queue?"
+msgstr "Vuoi ripristinare la tua coda precedente?"
+
+#: front/src/App.vue:38
+msgid "Documentation"
+msgstr "Documentazione"
+
+#: front/src/components/audio/track/Table.vue:24
+#: src/components/library/Track.vue:48
+msgid "Download"
+msgstr "Scarica"
+
+#: front/src/components/audio/track/Table.vue:27
+#, fuzzy
+msgid "Download tracks"
+msgstr "Scarica"
+
+#: front/src/components/playlists/Editor.vue:49
+msgid "Drag and drop rows to reorder tracks in the playlist"
+msgstr "Trascina e rilascia righe per riordinare le tracce nella playlist"
+
+#: front/src/components/library/Track.vue:58
+#: front/src/components/manage/library/FilesTable.vue:43
+msgid "Duration"
+msgstr "Durata"
+
+#: front/src/components/Home.vue:96
+msgid "Easy to use"
+msgstr "Facile da utilizzare"
+
+#: front/src/components/About.vue:21
+msgid "Edit instance info"
+msgstr "Modifica le info dell'istanza"
+
+#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30
+msgid "Edit..."
+msgstr "Modifica..."
+
+#: front/src/components/auth/Signup.vue:29
+#: front/src/components/manage/users/UsersTable.vue:38
+msgid "Email"
+msgstr "Email"
+
+#: front/src/views/admin/users/UsersDetail.vue:29
+msgid "Email address"
+msgstr "Indirizzo email"
+
+#: front/src/views/auth/EmailConfirm.vue:23
+msgid "Email confirmed"
+msgstr "Email confermata"
+
+#: front/src/views/playlists/Detail.vue:29
+msgid "End edition"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:4
+msgid "Ensure your music files are properly tagged before uploading them."
+msgstr "Assicurati che i tuoi files musicali siano taggati in modo corretto prima di caricarli."
+
+#: front/src/components/library/Radios.vue:140
+msgid "Enter a radio name..."
+msgstr "Inserisci un nome di una radio..."
+
+#: front/src/components/library/Artists.vue:118
+msgid "Enter an artist name..."
+msgstr "Inserisci il nome di un artista..."
+
+#: front/src/views/federation/LibraryList.vue:122
+msgid "Enter an library domain name..."
+msgstr "Inserisci il nome del dominio di una libreria..."
+
+#: front/src/views/playlists/List.vue:104
+msgid "Enter an playlist name..."
+msgstr "Inserisci il nome di una playlist..."
+
+#: front/src/components/auth/Signup.vue:98
+msgid "Enter your email"
+msgstr "Inserisci la tua email"
+
+#: front/src/components/auth/Signup.vue:96
+msgid "Enter your invitation code (case insensitive)"
+msgstr "Inserisci il tuo codice di invito (non tiene conto di maiuscole o minuscole)"
+
+#: front/src/components/metadata/Search.vue:114
+msgid "Enter your search query..."
+msgstr "Inserisci i tuoi criteri di ricerca..."
+
+#: front/src/components/auth/Signup.vue:97
+msgid "Enter your username"
+msgstr "Inserisci il tuo nome utente"
+
+#: front/src/components/auth/Login.vue:77
+msgid "Enter your username or email"
+msgstr "Inserisci il tuo nome utente o l'email"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:20
+msgid "Error"
+msgstr "Errore"
+
+#: front/src/views/admin/Settings.vue:87
+msgid "Error reporting"
+msgstr "Segnalazione errore"
+
+#: front/src/components/common/ActionTable.vue:75
+msgid "Error while applying action"
+msgstr "Errore durante l'esecuzione dell'azione"
+
+#: front/src/views/auth/PasswordReset.vue:7
+msgid "Error while asking for a password reset"
+msgstr "Errore durante la richiesta di un reset della password"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:7
+msgid "Error while changing your password"
+msgstr "Errore durante la modifica della password"
+
+#: front/src/views/auth/EmailConfirm.vue:7
+msgid "Error while confirming your email"
+msgstr "Errore durante la conferma della tua email"
+
+#: front/src/components/manage/users/InvitationForm.vue:4
+msgid "Error while creating invitation"
+msgstr "Errore durante la creazione dell'invito"
+
+#: front/src/components/admin/SettingsGroup.vue:5
+msgid "Error while saving settings"
+msgstr "Errore durante il salvataggio delle impostazioni"
+
+#: front/src/components/federation/LibraryForm.vue:10
+msgid "Error while scanning library"
+msgstr "Errore durante la scansione della libreria"
+
+#: front/src/components/library/import/BatchDetail.vue:41
+#: front/src/components/library/import/BatchDetail.vue:70
+#: front/src/components/library/import/BatchList.vue:15
+msgid "Errored"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:89
+msgid "Everyone"
+msgstr "Tutti"
+
+#: front/src/components/playlists/Form.vue:85
+msgid "Everyone on this instance"
+msgstr "Tutti su questa istanza"
+
+#: front/src/components/library/radios/Builder.vue:57
+msgid "Exclude"
+msgstr "Escludi"
+
+#: front/src/components/discussion/Comment.vue:14
+msgid "Expand"
+msgstr "Espandi"
+
+#: front/src/components/manage/users/InvitationsTable.vue:41
+msgid "Expiration date"
+msgstr "Data di scadenza"
+
+#: front/src/components/manage/users/InvitationsTable.vue:50
+msgid "Expired"
+msgstr "Scaduto"
+
+#: front/src/components/manage/users/InvitationsTable.vue:21
+msgid "Expired/used"
+msgstr "Scaduto/utilizzato"
+
+#: front/src/components/library/import/Main.vue:65
+msgid "External source. Supported backends"
+msgstr "Sorgente esterna. Supporta backends"
+
+#: front/src/components/Sidebar.vue:51
+msgid "Favorites"
+msgstr "Preferiti"
+
+#: front/src/components/federation/LibraryForm.vue:3
+msgid "Federate with a new instance"
+msgstr "Unisciti ad una nuova istanza"
+
+#: front/src/views/federation/LibraryTrackList.vue:21
+msgid "Federated tracks"
+msgstr "Tracce federate"
+
+#: front/src/components/Sidebar.vue:87
+#: src/components/library/import/BatchList.vue:25
+#: front/src/components/manage/users/UsersTable.vue:180
+#: front/src/views/admin/Settings.vue:84
+#: src/views/admin/users/UsersDetail.vue:161
+#: front/src/views/federation/Base.vue:35
+#: src/views/federation/LibraryDetail.vue:40
+msgid "Federation"
+msgstr "Federazione"
+
+#: front/src/views/federation/LibraryDetail.vue:3
+msgid "File mirroring"
+msgstr "Mirroring dei file"
+
+#: front/src/components/library/import/FileUpload.vue:43
+msgid "File name"
+msgstr "Nome file"
+
+#: front/src/components/library/import/Main.vue:76
+msgid "File upload"
+msgstr "Carica file"
+
+#: front/src/views/admin/library/Base.vue:5
+#: src/views/admin/library/FilesList.vue:21
+msgid "Files"
+msgstr "Files"
+
+#: front/src/components/library/import/ArtistImport.vue:7
+msgid "Filter album types"
+msgstr "Filtra tipi di album"
+
+#: front/src/components/library/radios/Builder.vue:56
+msgid "Filter name"
+msgstr "Filtra nome"
+
+#: front/src/components/library/import/Main.vue:52
+msgid "Finish import"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:54
+msgid "Finished"
+msgstr "Finito"
+
+#: front/src/components/library/import/Main.vue:59
+msgid "First, choose where you want to import the music from"
+msgstr "Prima, scegli da dove vuoi importare la musica"
+
+#: front/src/components/federation/LibraryCard.vue:44
+msgid "Follow"
+msgstr "Segui"
+
+#: front/src/components/federation/LibraryCard.vue:36
+msgid "Follow request pending approval"
+msgstr "Richiesta di seguire in attesa di approvazione"
+
+#: front/src/views/federation/LibraryDetail.vue:21
+msgid "Follow status"
+msgstr "Stato di segui"
+
+#: front/src/views/federation/Base.vue:13
+#: front/src/views/federation/LibraryFollowersList.vue:24
+msgid "Followers"
+msgstr "Seguito da"
+
+#: front/src/components/federation/LibraryCard.vue:18
+msgid "Followers only"
+msgstr "Solo chi segue"
+
+#: front/src/components/federation/LibraryCard.vue:15
+#: front/src/views/federation/LibraryDetail.vue:29
+msgid "Following"
+msgstr ""
+
+#: front/src/components/activity/Like.vue:12
+#: src/components/activity/Listen.vue:12
+msgid "from %{ album } by %{ artist }"
+msgstr "da %{ album } di %{ artist }"
+
+#: front/src/components/library/Track.vue:13
+msgid "From album %{ album } by %{ artist }"
+msgstr "Dall'album %{ album } di %{ artist }"
+
+#: front/src/App.vue:56
+msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgid "Funkwhale is compatible with other music players that support the Subsonic API."
+msgstr ""
+
+#: front/src/components/Home.vue:98
+msgid "Funkwhale is dead simple to use."
+msgstr "Funkwhale è semplicissimo da usare."
+
+#: front/src/components/Home.vue:39
+msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists."
+msgstr ""
+
+#: front/src/components/Home.vue:119
+msgid "Funkwhale is free and gives you control on your music."
+msgstr ""
+
+#: front/src/components/Home.vue:66
+msgid "Funkwhale takes care of handling your music"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:16
+msgid "Get a new invitation"
+msgstr "Ottieni un nuovo invito"
+
+#: front/src/components/Home.vue:13
+msgid "Get me to the library"
+msgstr "Portami alla libreria"
+
+#: front/src/components/Home.vue:77
+msgid ""
+"Get quality metadata about your music thanks to\n"
+"              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:21
+#: front/src/components/common/ActionTable.vue:27
+msgid "Go"
+msgstr "Vai"
+
+#: front/src/components/PageNotFound.vue:14
+msgid "Go to home page"
+msgstr "Vai alla pagina iniziale"
+
+#: front/src/components/library/import/Main.vue:13
+msgid "Grab corresponding metadata"
+msgstr ""
+
+#: front/src/App.vue:74
+msgid "Help us translate Funkwhale"
+msgstr ""
+
+#: front/src/components/library/Home.vue:65
+msgid "Home"
+msgstr "Pagina Iniziale"
+
+#: front/src/components/instance/Stats.vue:36
+msgid "Hours of music"
+msgstr "Ore di musica"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:11
+msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:34
+msgid "ID"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:24
+msgid "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."
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:196
+#: front/src/components/library/Library.vue:17
+msgid "Import"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:57
+msgid "Import #%{ id } launched"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:38
+msgid "Import %{ count } track"
+msgid_plural "Import %{ count } tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/import/BatchDetail.vue:10
+msgid "Import batch"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:185
+msgid "Import Batch #%{ id }"
+msgstr ""
+
+#: front/src/components/library/Library.vue:20
+msgid "Import batches"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:117
+msgid "Import Batches"
+msgstr ""
+
+#: front/src/components/manage/library/FilesTable.vue:40
+#: front/src/components/manage/library/RequestsTable.vue:53
+msgid "Import date"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:38
+msgid "Import detail page"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:81
+msgid "Import music"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:267
+msgid "Import Music"
+msgstr ""
+
+#: front/src/components/Home.vue:71
+msgid "Import music from various platforms, such as YouTube or SoundCloud"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:14
+#: front/src/components/federation/LibraryTrackTable.vue:66
+msgid "Import pending"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:9
+#: front/src/views/admin/library/RequestsList.vue:3
+#: front/src/views/admin/library/RequestsList.vue:21
+msgid "Import requests"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:20
+#: front/src/components/library/import/Main.vue:6
+msgid "Import source"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:9
+msgid "Import status"
+msgstr ""
+
+#: front/src/components/library/import/ReleaseImport.vue:14
+msgid "Import this release"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:11
+msgid "Import this track"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:12
+#: front/src/components/manage/library/RequestsTable.vue:29
+#: front/src/components/manage/library/RequestsTable.vue:61
+msgid "Imported"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:44
+msgid "Imported URL"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:82
+msgid "Imports"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:3
+msgid "In favorites"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:65
+msgid "In library"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:54
+msgid "Inactive"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:96
+msgid "Input a MusicBrainz ID manually:"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:53
+msgid "Input the email address binded to your account"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:31
+msgid "Insert from queue (%{ count } track)"
+msgid_plural "Insert from queue (%{ count } tracks)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/views/admin/Settings.vue:80
+msgid "Instance information"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:9
+#, fuzzy
+msgid "Instance radios"
+msgstr "Modifica le info dell'istanza"
+
+#: front/src/views/admin/Settings.vue:75
+msgid "Instance settings"
+msgstr ""
+
+#: front/src/views/instance/Timeline.vue:57
+msgid "Instance Timeline"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:42
+#: front/src/components/manage/users/InvitationForm.vue:11
+msgid "Invitation code"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:43
+msgid "Invitation code (optional)"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:8
+#: src/views/admin/users/InvitationsList.vue:3
+#: front/src/views/admin/users/InvitationsList.vue:24
+msgid "Invitations"
+msgstr ""
+
+#: front/src/App.vue:43
+msgid "Issue tracker"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:80
+msgid "Job ID"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:36
+msgid "Jobs"
+msgstr ""
+
+#: front/src/components/Home.vue:50
+msgid "Keep a track of your favorite songs"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:33
+msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:41
+#: front/src/views/admin/users/UsersDetail.vue:45
+msgid "Last activity"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:101
+msgid "Last fetched"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:32
+msgid "Last modification"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:39
+msgid "Launch"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:18
+#: front/src/components/library/import/BatchList.vue:35
+msgid "Launch date"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:31
+msgid "Launch scan"
+msgstr ""
+
+#: front/src/components/Home.vue:10
+msgid "Learn more about this instance"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:58
+msgid "Leave empty for a random code"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:10
+msgid "Leave this field empty if you're requesting the whole discography."
+msgstr ""
+
+#: front/src/views/federation/Base.vue:5
+#: src/views/federation/LibraryList.vue:123
+msgid "Libraries"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:70
+#: front/src/components/federation/LibraryTrackTable.vue:51
+#: front/src/components/instance/Stats.vue:30
+#: front/src/components/manage/users/UsersTable.vue:176
+#: front/src/views/admin/users/UsersDetail.vue:157
+#: front/src/views/federation/LibraryDetail.vue:194
+msgid "Library"
+msgstr ""
+
+#: front/src/views/admin/library/FilesList.vue:3
+msgid "Library files"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:20
+msgid "Library name"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:84
+msgid "Library size"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:96
+msgid "library@demo.funkwhale.audio"
+msgstr ""
+
+#: front/src/App.vue:29
+msgid "Links"
+msgstr ""
+
+#: front/src/views/instance/Timeline.vue:4
+msgid "Loading timeline..."
+msgstr ""
+
+#: front/src/components/favorites/List.vue:5
+msgid "Loading your favorites..."
+msgstr ""
+
+#: front/src/components/auth/Login.vue:78
+msgid "Log In"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:4
+msgid "Log in to your Funkwhale account"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:20
+msgid "Log Out"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:38
+msgid "Logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41
+msgid "Login"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:43
+msgid "Logout"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:266
+msgid "Looping disabled. Click to switch to single-track looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:267
+msgid "Looping on a single track. Click to switch to whole queue looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:268
+msgid "Looping on whole queue. Click to disable looping."
+msgstr ""
+
+#: front/src/components/library/Track.vue:94
+msgid "Lyrics"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:25
+msgid "Manage library"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:3
+msgid "Manage playlists"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:20
+msgid "Manage users"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:8
+msgid "Manage your playlists"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:197
+msgid "Mark as closed"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:196
+msgid "Mark as imported"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:12
+msgid "Metadata"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:115
+msgid ""
+"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n"
+"            <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"              MusicBrainz\n"
+"            </a>\n"
+"            project, which you can think about as the Wikipedia of music."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:48
+#: src/components/library/import/Main.vue:18
+msgid "Music"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:147
+msgid "Music request"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:265
+msgid "Mute"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:34
+msgid "My account"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:74
+msgid "My awesome playlist"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:227
+msgid "My awesome radio"
+msgstr ""
+
+#: front/src/components/library/Track.vue:64
+#: src/components/library/Track.vue:75
+#: front/src/components/library/Track.vue:86
+#: front/src/components/manage/library/FilesTable.vue:63
+#: front/src/components/manage/library/FilesTable.vue:69
+#: front/src/components/manage/library/FilesTable.vue:75
+#: front/src/components/manage/library/FilesTable.vue:81
+#: front/src/components/manage/library/RequestsTable.vue:71
+#: front/src/components/manage/library/RequestsTable.vue:75
+#: front/src/components/manage/library/RequestsTable.vue:82
+#: front/src/components/manage/users/UsersTable.vue:61
+#: front/src/views/admin/users/UsersDetail.vue:49
+msgid "N/A"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/views/admin/users/UsersDetail.vue:21
+msgid "Name"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:88
+#: front/src/views/auth/PasswordResetConfirm.vue:14
+msgid "New password"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:158
+msgid "New tracks will be appended here automatically."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:29
+msgid "Next step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:263
+msgid "Next track"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:125
+msgid "No"
+msgstr ""
+
+#: front/src/components/Home.vue:103
+msgid "No add-ons, no plugins : you only need a web library"
+msgstr ""
+
+#: front/src/components/library/Track.vue:102
+msgid "No lyrics available for this track."
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:81
+msgid "Nobody except me"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:32
+msgid "Not following"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:13
+#: front/src/components/federation/LibraryTrackTable.vue:67
+msgid "Not imported"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:51
+msgid "Not used"
+msgstr ""
+
+#: front/src/App.vue:37
+msgid "Official website"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:83
+#, fuzzy
+msgid "Old password"
+msgstr "Cambia password"
+
+#: front/src/components/library/import/FileUpload.vue:36
+msgid "Once all your files are uploaded, simply click the following button to check the import status."
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:21
+#: front/src/components/manage/users/InvitationsTable.vue:20
+msgid "Open"
+msgstr ""
+
+#: front/src/App.vue:63
+msgid "Options"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:93
+msgid "Or"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:18
+#: front/src/components/library/Artists.vue:15
+#: src/components/library/Radios.vue:33
+#: front/src/components/manage/library/FilesTable.vue:9
+#: front/src/components/manage/library/RequestsTable.vue:9
+#: front/src/components/manage/users/InvitationsTable.vue:9
+#: front/src/components/manage/users/UsersTable.vue:9
+#: front/src/views/federation/LibraryList.vue:18
+#: src/views/playlists/List.vue:17
+msgid "Ordering"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:31
+#: front/src/components/federation/LibraryTrackTable.vue:26
+#: front/src/components/library/Artists.vue:23
+#: src/components/library/Radios.vue:41
+#: front/src/components/manage/library/FilesTable.vue:17
+#: front/src/components/manage/library/RequestsTable.vue:17
+#: front/src/components/manage/users/UsersTable.vue:17
+#: front/src/views/federation/LibraryList.vue:26
+#: src/views/playlists/List.vue:25
+msgid "Ordering direction"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:38
+msgid "Owner"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:33
+msgid "Page Not Found"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:7
+msgid "Page not found!"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38
+msgid "Password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:95
+msgid "Password updated"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:28
+msgid "Password updated successfully"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:262
+msgid "Pause track"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:33
+#: front/src/components/library/import/BatchDetail.vue:69
+#: front/src/components/library/import/BatchList.vue:14
+#: front/src/components/library/import/FileUpload.vue:59
+#: front/src/components/manage/library/RequestsTable.vue:27
+#: front/src/components/manage/library/RequestsTable.vue:63
+msgid "Pending"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:11
+#: front/src/views/federation/LibraryDetail.vue:26
+msgid "Pending approval"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:217
+msgid "Pending follow requests"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26
+msgid "Pending import requests"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36
+msgid "Pending requests"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:42
+#: front/src/views/admin/users/UsersDetail.vue:68
+msgid "Permissions"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:9
+#: src/components/library/Track.vue:30
+msgid "Play"
+msgstr ""
+
+#: front/src/components/audio/album/Card.vue:50
+#: front/src/components/audio/artist/Card.vue:44
+#: src/components/library/Album.vue:28 front/src/views/playlists/Detail.vue:23
+msgid "Play all"
+msgstr ""
+
+#: front/src/components/library/Artist.vue:26
+msgid "Play all albums"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:58
+msgid "Play immediatly"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:15
+msgid "Play next"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:16
+msgid "Play now"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:261
+msgid "Play track"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:90
+msgid "Playlist"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:12
+msgid "Playlist containing %{ count } track, by %{ username }"
+msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/playlists/Form.vue:9
+msgid "Playlist created"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:4
+msgid "Playlist editor"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:21
+msgid "Playlist name"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:6
+msgid "Playlist updated"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:25
+msgid "Playlist visibility"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16
+#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83
+#: front/src/views/playlists/List.vue:103
+msgid "Playlists"
+msgstr ""
+
+#: front/src/components/Home.vue:56
+msgid "Playlists? We got them"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
+msgid "Please double-check your password is correct"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:9
+msgid "Please double-check your username/password couple is correct"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:46
+msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:26
+msgid "Previous step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:260
+msgid "Previous track"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:26
+#: front/src/views/auth/PasswordResetConfirm.vue:31
+msgid "Proceed to login"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:50
+msgid "Published date"
+msgstr ""
+
+#: front/src/components/library/import/ArtistImport.vue:17
+msgid "Query template"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:20
+msgid "Queue"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:203
+msgid "Queue shuffled!"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:80
+msgid "Radio"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:226
+msgid "Radio Builder"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:15
+msgid "Radio created"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:21
+msgid "Radio name"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:12
+#, fuzzy
+msgid "Radio updated"
+msgstr "Data di creazione"
+
+#: front/src/components/library/Library.vue:10
+#: src/components/library/Radios.vue:141
+msgid "Radios"
+msgstr ""
+
+#: front/src/views/instance/Timeline.vue:7
+msgid "Recent activity on this instance"
+msgstr ""
+
+#: front/src/components/library/Home.vue:24
+msgid "Recently added"
+msgstr ""
+
+#: front/src/components/library/Home.vue:11
+#, fuzzy
+msgid "Recently favorited"
+msgstr "1 mi piace"
+
+#: front/src/components/library/Home.vue:6
+msgid "Recently listened"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:81
+msgid "Recording MusicBrainz ID"
+msgstr ""
+
+#: front/src/views/admin/users/UsersDetail.vue:84
+#: front/src/views/federation/LibraryDetail.vue:122
+msgid "Refresh"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:42
+msgid "Refused"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:12
+msgid "Registered since %{ date }"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:9
+msgid "Registration are closed on this instance, you will need an invitation code to signup."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:71
+msgid "regular user"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:59
+msgid "Remove"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:58
+msgid "Remove avatar"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:19
+msgid "Remove from favorites"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:34
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+msgid "Request a new password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:35
+msgid "Request a new Subsonic API password?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:43
+msgid "Request a password"
+msgstr ""
+
+#: front/src/App.vue:35
+msgid "Request music"
+msgstr ""
+
+#: front/src/views/library/MusicRequest.vue:4
+#: src/views/library/MusicRequest.vue:21
+#, fuzzy
+msgid "Request some music"
+msgstr "Ore di musica"
+
+#: front/src/components/requests/Form.vue:20
+msgid "Request submitted!"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:49
+msgid "Rerun errored jobs"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:187
+msgid "Rerun job"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4
+#: front/src/views/auth/PasswordReset.vue:52
+msgid "Reset your password"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:31
+msgid "Result %{ current }/%{ total }"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:38
+#: src/components/library/Artists.vue:30
+#: front/src/components/library/Radios.vue:52
+#: src/views/federation/LibraryList.vue:33
+#: front/src/views/playlists/List.vue:32
+msgid "Results per page"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:63
+#: front/src/components/library/radios/Builder.vue:29
+msgid "Save"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:112
+msgid "Scan triggered!"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:5
+#: front/src/components/library/Artists.vue:10
+#: src/components/library/Radios.vue:29
+#: front/src/components/library/import/BatchDetail.vue:62
+#: front/src/components/library/import/BatchList.vue:7
+#: front/src/components/manage/library/FilesTable.vue:5
+#: front/src/components/manage/library/RequestsTable.vue:5
+#: front/src/components/manage/users/InvitationsTable.vue:5
+#: front/src/components/manage/users/UsersTable.vue:5
+#: front/src/views/federation/LibraryList.vue:14
+#: src/views/playlists/List.vue:13
+msgid "Search"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:85
+msgid "Search an entity you want to import:"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:180
+msgid "Search by artist, username, comment..."
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:188
+msgid "Search by source..."
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:116
+msgid "Search by submitter, source..."
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:182
+#: front/src/components/manage/library/FilesTable.vue:175
+msgid "Search by title, artist, domain..."
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:140
+msgid "Search by username, domain..."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:152
+msgid "Search by username, email, code..."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:162
+msgid "Search by username, email, name..."
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:20
+msgid "Search for artists, albums, tracks..."
+msgstr ""
+
+#: front/src/components/audio/Search.vue:2
+msgid "Search for some music"
+msgstr ""
+
+#: front/src/components/library/Track.vue:105
+msgid "Search on lyrics.wikia.com"
+msgstr ""
+
+#: front/src/components/library/Album.vue:33
+#: src/components/library/Artist.vue:31
+#: front/src/components/library/Track.vue:40
+msgid "Search on Wikipedia"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:42
+msgid "Search query"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:15
+msgid "Sections"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:41
+msgid "Select a filter"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:61
+msgid "Select all %{ total } elements"
+msgid_plural "Select all %{ total } elements"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/import/FileUpload.vue:22
+msgid "Select files to upload..."
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:69
+msgid "Select only current page"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:19
+msgid "Select relevant sources or files for import"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:43
+msgid "Send a follow request"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:97
+#: src/components/manage/users/UsersTable.vue:184
+#: front/src/views/admin/users/UsersDetail.vue:165
+msgid "Settings"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:10
+msgid "Settings updated"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:11
+msgid "Settings updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:24
+msgid "Settings..."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:27
+msgid "Share link"
+msgstr ""
+
+#: front/src/components/audio/artist/Card.vue:30
+msgid "Show 1 more album"
+msgid_plural "Show %{ count } more albums"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/audio/album/Card.vue:40
+msgid "Show 1 more track"
+msgid_plural "Show %{ count } more tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/forms/PasswordInput.vue:25
+msgid "Show/hide password"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:97
+#: front/src/components/federation/LibraryTrackTable.vue:98
+#: front/src/components/library/import/BatchDetail.vue:128
+#: front/src/components/library/import/BatchList.vue:73
+#: front/src/components/manage/library/FilesTable.vue:97
+#: front/src/components/manage/library/RequestsTable.vue:104
+#: front/src/components/manage/users/InvitationsTable.vue:76
+#: front/src/components/manage/users/UsersTable.vue:87
+msgid "Showing results %{ start }-%{ end } on %{ total }"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:269
+msgid "Shuffle your queue"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:95
+msgid "Sign Up"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:40
+#: front/src/views/admin/users/UsersDetail.vue:37
+msgid "Sign-up"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:31
+msgid "Simply copy paste the snippet below into a terminal to launch the download."
+msgstr ""
+
+#: front/src/components/library/Track.vue:69
+#: front/src/components/library/import/FileUpload.vue:44
+#: front/src/components/manage/library/FilesTable.vue:44
+msgid "Size"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:37
+#: front/src/components/library/import/BatchDetail.vue:72
+msgid "Skipped"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:3
+msgid "Something's missing in the library? Let us know what you would like to listen!"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:25
+msgid "Sorry, we did not found any album matching your query"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:16
+msgid "Sorry, we did not found any artist matching your query"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:82
+#: front/src/components/library/import/BatchList.vue:38
+#: front/src/components/library/import/TrackImport.vue:17
+msgid "Source"
+msgstr ""
+
+#: front/src/App.vue:41
+msgid "Source code"
+msgstr ""
+
+#: front/src/App.vue:40
+msgid "Source code (%{version})"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:20
+#: front/src/components/manage/users/UsersTable.vue:70
+msgid "Staff member"
+msgstr ""
+
+#: front/src/components/radios/Button.vue:4
+msgid "Start"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:28
+msgid "Start Upload"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:86
+msgid "Statistics"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:66
+#: front/src/components/library/import/BatchDetail.vue:83
+#: front/src/components/library/import/BatchList.vue:11
+#: front/src/components/library/import/BatchList.vue:37
+#: front/src/components/library/import/FileUpload.vue:45
+#: front/src/components/manage/library/RequestsTable.vue:24
+#: front/src/components/manage/library/RequestsTable.vue:48
+#: front/src/components/manage/users/InvitationsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:39
+#: front/src/components/manage/users/UsersTable.vue:43
+msgid "Status"
+msgstr ""
+
+#: front/src/components/radios/Button.vue:3
+msgid "Stop"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:159
+msgid "Stop radio"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:32
+msgid "Stop Upload"
+msgstr ""
+
+#: front/src/App.vue:9 src/components/requests/Form.vue:17
+msgid "Submit"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:22
+msgid "Submit another request"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:26
+#: front/src/components/library/import/BatchList.vue:39
+msgid "Submitted by"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:85
+msgid "Subsonic"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:2
+msgid "Subsonic API password"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:71
+#: front/src/components/library/import/BatchList.vue:16
+#: front/src/components/library/import/FileUpload.vue:56
+msgid "Success"
+msgstr ""
+
+#: front/src/App.vue:11
+msgid "Suggested choices"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:9
+msgid "Syncing changes to server..."
+msgstr ""
+
+#: front/src/components/Home.vue:26
+msgid "That's simple: we loved Grooveshark and we want to build something even better."
+msgstr ""
+
+#: front/src/components/requests/Form.vue:73
+msgid "The Beatles, Mickael Jackson…"
+msgstr ""
+
+#: front/src/App.vue:59
+msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
+msgstr ""
+
+#: front/src/components/Home.vue:124
+msgid "The plaform is free and open-source, you can install it and modify it without worries"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:4
+msgid "The Subsonic API is not available on this Funkwhale instance."
+msgstr ""
+
+#: front/src/components/requests/Form.vue:74
+msgid "The White Album, Thriller…"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:30
+msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:149
+msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled."
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:195
+msgid "This indicate if the remote library granted you access"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:16
+msgid "This is you!"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:37
+msgid "This may affect a lot of elements, please double check this is really what you want."
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:61
+msgid "This track is not imported and cannot be played"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:37
+msgid "This will completely delete this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:27
+msgid "This will completely delete this radio and cannot be undone."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:51
+msgid "This will completely disable access to the Subsonic API using from account."
+msgstr ""
+
+#: front/src/App.vue:137
+msgid "This will erase your local data and disconnect you, do you want to continue?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:36
+msgid "This will log you out from existing devices that use the current password."
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:44
+msgid "This will remove all tracks from this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:6
+#: front/src/components/federation/LibraryTrackTable.vue:47
+#: front/src/components/manage/library/FilesTable.vue:37
+msgid "Title"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:27
+#: src/components/library/Track.vue:174
+#: front/src/components/library/import/BatchDetail.vue:84
+#: front/src/components/metadata/Search.vue:138
+msgid "Track"
+msgstr ""
+
+#: front/src/components/library/Track.vue:53
+msgid "Track information"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:44
+msgid "Track matching filter"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:54
+msgid "tracks"
+msgstr ""
+
+#: front/src/components/library/Album.vue:43
+#: front/src/components/playlists/PlaylistModal.vue:33
+#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50
+#: front/src/views/radios/Detail.vue:34
+msgid "Tracks"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:125
+msgid "Tracks available in this library"
+msgstr ""
+
+#: front/src/components/library/Artist.vue:54
+#, fuzzy
+msgid "Tracks by this artist"
+msgstr "Albums di questo artista"
+
+#: front/src/components/instance/Stats.vue:25
+msgid "Tracks favorited"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:19
+msgid "tracks listened"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:109
+msgid "Trigger scan"
+msgstr ""
+
+#: front/src/components/manage/library/FilesTable.vue:41
+msgid "Type"
+msgstr ""
+
+#: front/src/components/About.vue:15
+msgid "Unfortunately, owners of this instance did not yet take the time to complete this page."
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:95
+msgid "Unknown"
+msgstr ""
+
+#: front/src/components/Home.vue:37
+msgid "Unlimited music"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:264
+msgid "Unmute"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:50
+msgid "Update avatar"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:33
+msgid "Update playlist"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:27
+msgid "Update settings"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:21
+msgid "Update your password"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:172
+#: front/src/views/admin/users/UsersDetail.vue:153
+msgid "Upload"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:45
+msgid "Upload a new avatar"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:7
+msgid "Uploaded files or external source"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:57
+msgid "Uploading..."
+msgstr ""
+
+#: front/src/App.vue:45
+msgid "Use another instance"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:75
+msgid "Use this comment box to add details to your request if needed"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:196
+msgid "Use this flag to enable/disable federation with this library"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:12
+msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:6
+msgid "Use this form to scan an instance and setup federation."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:49
+msgid "Used"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:47
+msgid "User"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:5
+msgid "User activity"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:20
+#, fuzzy
+msgid "User radios"
+msgstr "Sfogliando radio"
+
+#: front/src/components/auth/Signup.vue:19
+#: front/src/components/manage/users/UsersTable.vue:37
+msgid "Username"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:15
+msgid "Username or email"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:13
+msgid "users"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81
+#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3
+#: front/src/views/admin/users/UsersList.vue:21
+msgid "Users"
+msgstr ""
+
+#: front/src/components/library/Album.vue:37
+#: src/components/library/Artist.vue:35
+#: front/src/components/library/Track.vue:44
+#: front/src/components/library/import/ArtistImport.vue:131
+#: front/src/components/metadata/ArtistCard.vue:49
+#: front/src/components/metadata/ReleaseCard.vue:53
+msgid "View on MusicBrainz"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:20
+msgid "We cannot add the track to a playlist"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:14
+msgid "We cannot create the playlist"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:13
+msgid "We cannot create your account"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:7
+msgid "We cannot log you in"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:38
+#, fuzzy
+msgid "We cannot save your avatar"
+msgstr "Non puoi cambiare la tua password"
+
+#: front/src/components/auth/Settings.vue:14
+msgid "We cannot save your settings"
+msgstr ""
+
+#: front/src/components/Home.vue:130
+msgid "We do not track you or bother you with ads"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:5
+msgid "We recommend using Picard for that purpose."
+msgstr ""
+
+#: front/src/components/Home.vue:7
+msgid "We think listening to music should be simple."
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:10
+msgid "We're sorry, the page you asked for does not exist:"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:21
+msgid "We've received your request, you'll get some groove soon ;)"
+msgstr ""
+
+#: front/src/components/Home.vue:152
+msgid "Welcome"
+msgstr ""
+
+#: front/src/components/Home.vue:5
+msgid "Welcome on Funkwhale"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:114
+msgid "What is metadata?"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:197
+msgid "When enabled, auto importing will automatically import new tracks published in this library"
+msgstr ""
+
+#: front/src/components/Home.vue:24
+msgid "Why funkwhale?"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:124
+msgid "Yes"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:8
+msgid "Yes, log me out!"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:7
+msgid "You are currently logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:111
+msgid "You can also skip this step and enter metadata manually."
+msgstr ""
+
+#: front/src/components/Home.vue:136
+msgid "You can invite friends and family to your instance so they can enjoy your music"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:7
+msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:8
+msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:156
+msgid "You have a radio playing"
+msgstr ""
+
+#: front/src/App.vue:6
+msgid "You need to select an instance in order to continue"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:100
+msgid "You will be logged out from this session and have to log in with the new one"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:71
+msgid "You will have to update your password on your clients that use this password."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:103
+msgid "You will import:"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:24
+msgid "Your email address was confirmed, you can now use the service without limitations."
+msgstr ""
+
+#: front/src/components/favorites/List.vue:109
+msgid "Your Favorites"
+msgstr ""
+
+#: front/src/components/Home.vue:117
+msgid "Your music, your way"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:29
+msgid "Your password has been updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:101
+msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:156
+msgid "%{ count } track was added to your queue"
+msgid_plural "%{ count } tracks were added to your queue"
+msgstr[0] ""
+msgstr[1] ""
diff --git a/front/locales/oc/LC_MESSAGES/app.po b/front/locales/oc/LC_MESSAGES/app.po
new file mode 100644
index 0000000000000000000000000000000000000000..095008a6c7009c73f97704fac0db690a4397b5a0
--- /dev/null
+++ b/front/locales/oc/LC_MESSAGES/app.po
@@ -0,0 +1,2536 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the front package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: front 1.0.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-07-22 14:12+0200\n"
+"PO-Revision-Date: 2018-07-22 20:29+0000\n"
+"Last-Translator: Quentí <quentin_antonin@hotmail.com>\n"
+"Language-Team: none\n"
+"Language: oc\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.20\n"
+
+#: front/src/components/playlists/PlaylistModal.vue:9
+msgid "\"%{ title }\", by %{ artist }"
+msgstr "\"%{ title }\", de %{ artist }"
+
+#: front/src/components/Sidebar.vue:24
+msgid "(%{ index } of %{ length })"
+msgstr "(%{ index } sus %{ length })"
+
+#: front/src/components/Sidebar.vue:22
+msgid "(empty)"
+msgstr "(void)"
+
+#: front/src/components/common/ActionTable.vue:43
+#: front/src/components/common/ActionTable.vue:51
+msgid "%{ count } on %{ total } selected"
+msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] "%{ count } sus %{ total } element seleccionat"
+msgstr[1] "%{ count } sus %{ total } elements seleccionats"
+
+#: front/src/components/Sidebar.vue:116
+#: src/views/federation/LibraryDetail.vue:87
+msgid "%{ count } track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{ count } pista"
+msgstr[1] "%{ count } pistas"
+
+#: front/src/components/library/Artist.vue:13
+msgid "%{ count } track in %{ albumsCount } albums"
+msgid_plural "%{ count } tracks in %{ albumsCount } albums"
+msgstr[0] "%{ count } pista dins %{ albumsCount } albums"
+msgstr[1] "%{ count } pistas dins %{ albumsCount } albums"
+
+#: front/src/components/library/radios/Builder.vue:76
+msgid "%{ count } track matching combined filters"
+msgid_plural "%{ count } tracks matching combined filters"
+msgstr[0] "%{ count } pista correspond als filtres seleccionats"
+msgstr[1] "%{ count } pistas correspondon als filtres seleccionats"
+
+#: front/src/components/playlists/Card.vue:18
+msgid "%{ count} track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{ count} pista"
+msgstr[1] "%{ count} pistas"
+
+#: front/src/components/common/Duration.vue:2
+msgid "%{ hours } h %{ minutes } min"
+msgstr "%{ hours } h %{ minutes } min"
+
+#: front/src/components/common/Duration.vue:5
+msgid "%{ minutes } min"
+msgstr "%{ minutes } min"
+
+#: front/src/components/activity/Like.vue:7
+msgid "%{ user } favorited a track"
+msgstr "%{ user } a aimat una pista"
+
+#: front/src/components/activity/Listen.vue:7
+msgid "%{ user } listened to a track"
+msgstr "%{ user } a escotat una pista"
+
+#: front/src/components/auth/Profile.vue:49
+msgid "%{ username }'s profile"
+msgstr "Perfil de %{ username }"
+
+#: front/src/components/audio/artist/Card.vue:41
+msgid "1 album"
+msgid_plural "%{ count } albums"
+msgstr[0] "1 album"
+msgstr[1] "%{ count } albums"
+
+#: front/src/components/favorites/List.vue:10
+msgid "1 favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "1 favorit"
+msgstr[1] "%{ count } favorits"
+
+#: front/src/components/audio/album/Card.vue:54
+#: front/src/components/federation/LibraryCard.vue:25
+msgid "1 track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "1 piste"
+msgstr[1] "%{ count } pistas"
+
+#: front/src/components/About.vue:5
+msgid "About %{ instance }"
+msgstr "A prepaus de %{ instance }"
+
+#: front/src/App.vue:54
+msgid "About Funkwhale"
+msgstr "A prepaus de Funkwhale"
+
+#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55
+msgid "About this instance"
+msgstr "A prepaus d’aquesta instància"
+
+#: front/src/components/manage/library/RequestsTable.vue:28
+#: front/src/components/manage/library/RequestsTable.vue:62
+msgid "Accepted"
+msgstr "Acceptat"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:111
+msgid "Access disabled"
+msgstr "Accès desactivat"
+
+#: front/src/components/Home.vue:109
+msgid "Access your music from a clean interface that focus on what really matters"
+msgstr ""
+"Accedissètz a vòstra musica d’una interfàcia afinada estant, adaptada a çò "
+"que compta vertadièrament"
+
+#: front/src/views/admin/users/UsersDetail.vue:54
+msgid "Account active"
+msgstr "Compte actiu"
+
+#: front/src/components/auth/Settings.vue:5
+msgid "Account settings"
+msgstr "Paramètres del compte"
+
+#: front/src/components/auth/Settings.vue:257
+msgid "Account Settings"
+msgstr "Paramètres del compte"
+
+#: front/src/components/manage/users/UsersTable.vue:39
+msgid "Account status"
+msgstr "Estat del compte"
+
+#: front/src/views/auth/PasswordReset.vue:14
+msgid "Account's email"
+msgstr "Adreça electronica del compte"
+
+#: front/src/components/common/ActionTable.vue:82
+msgid "Action %{ action } was launched successfully on %{ count } element"
+msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
+msgstr[0] "L’action %{ action } es estada lançada corrèctament sus %{ count } element"
+msgstr[1] "L’action %{ action } es estada lançada corrèctament sus %{ count } elements"
+
+#: front/src/components/common/ActionTable.vue:8
+#: front/src/components/federation/LibraryFollowTable.vue:24
+#: front/src/components/library/radios/Builder.vue:60
+#: front/src/components/manage/library/RequestsTable.vue:54
+msgid "Actions"
+msgstr "Accions"
+
+#: front/src/components/manage/users/UsersTable.vue:53
+msgid "Active"
+msgstr "Actiu"
+
+#: front/src/components/Sidebar.vue:60
+msgid "Activity"
+msgstr "Activitat"
+
+#: front/src/components/federation/LibraryFollowTable.vue:21
+msgid "Actor"
+msgstr "Actor"
+
+#: front/src/views/federation/LibraryList.vue:8
+msgid "Add a new library"
+msgstr "Ajustar una nòva bibliotèca"
+
+#: front/src/components/library/radios/Builder.vue:46
+msgid "Add filter"
+msgstr "Ajustar de filtres"
+
+#: front/src/components/library/radios/Builder.vue:36
+msgid "Add filters to customize your radio"
+msgstr "Ajustar de filtre per dire de personalizar vòstra ràdio"
+
+#: front/src/components/audio/PlayButton.vue:53
+msgid "Add to current queue"
+msgstr "Ajustar a la lista de lectura"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:4
+#: front/src/components/favorites/TrackFavoriteIcon.vue:21
+msgid "Add to favorites"
+msgstr "Ajustar als favorits"
+
+#: front/src/components/playlists/TrackPlaylistIcon.vue:6
+#: front/src/components/playlists/TrackPlaylistIcon.vue:32
+msgid "Add to playlist..."
+msgstr "Ajustar a la lista de lectura..."
+
+#: front/src/components/audio/PlayButton.vue:14
+msgid "Add to queue"
+msgstr "Ajustar a la lista"
+
+#: front/src/components/playlists/PlaylistModal.vue:116
+msgid "Add to this playlist"
+msgstr "Ajustar a aquesta lista de lectura"
+
+#: front/src/components/playlists/PlaylistModal.vue:54
+msgid "Add track"
+msgstr "Ajustar una pista"
+
+#: front/src/components/manage/users/UsersTable.vue:69
+msgid "Admin"
+msgstr "Admin"
+
+#: front/src/components/Sidebar.vue:64
+msgid "Administration"
+msgstr "Administracion"
+
+#: front/src/components/audio/SearchBar.vue:26
+#: src/components/audio/track/Table.vue:8
+#: front/src/components/federation/LibraryTrackTable.vue:49
+#: front/src/components/library/Album.vue:91
+#: front/src/components/manage/library/FilesTable.vue:39
+#: front/src/components/metadata/Search.vue:134
+msgid "Album"
+msgstr "Album"
+
+#: front/src/components/library/import/ReleaseImport.vue:3
+msgid "Album %{ title } (%{ count } track) by %{ artist }"
+msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }"
+msgstr[0] "Album %{ title } (%{ count } pista) per %{ artist }"
+msgstr[1] "Album %{ title } (%{ count } pistas) per %{ artist }"
+
+#: front/src/components/library/Album.vue:12
+msgid "Album containing %{ count } track, by %{ artist }"
+msgid_plural "Album containing %{ count } tracks, by %{ artist }"
+msgstr[0] "Album contenent %{ count } pista, de %{ artist }"
+msgstr[1] "Album contenent %{ count } pistas, de %{ artist }"
+
+#: front/src/components/library/Track.vue:20
+msgid "Album page"
+msgstr "Pagina de l’album"
+
+#: front/src/components/audio/Search.vue:19
+#: src/components/instance/Stats.vue:48
+#: front/src/components/manage/library/RequestsTable.vue:50
+#: front/src/components/requests/Form.vue:9
+msgid "Albums"
+msgstr "Albums"
+
+#: front/src/components/library/Artist.vue:44
+msgid "Albums by this artist"
+msgstr "Albums d’aqueste artista"
+
+#: front/src/components/manage/library/RequestsTable.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:19
+msgid "All"
+msgstr "Tot"
+
+#: front/src/components/playlists/Editor.vue:13
+msgid "An error occured while saving your changes"
+msgstr "Una error s’es producha en enregistrar vòstras modificacions"
+
+#: front/src/components/auth/Login.vue:10
+msgid "An unknown error happend, this can mean the server is down or cannot be reached"
+msgstr ""
+"Una error desconeguda encontrada, aquò pòt significar que lo servidor es "
+"fòra servici o pòt pas èsser atengut"
+
+#: front/src/components/federation/LibraryTrackTable.vue:11
+#: front/src/components/library/import/BatchDetail.vue:68
+#: front/src/components/library/import/BatchList.vue:13
+#: front/src/components/library/import/BatchList.vue:22
+msgid "Any"
+msgstr "Totes"
+
+#: front/src/components/library/import/BatchList.vue:24
+msgid "API"
+msgstr "API"
+
+#: front/src/components/federation/LibraryFollowTable.vue:68
+#: front/src/components/federation/LibraryFollowTable.vue:78
+msgid "Approve"
+msgstr "Aprovar"
+
+#: front/src/components/federation/LibraryFollowTable.vue:70
+msgid "Approve access?"
+msgstr "Aprovar l’accès ?"
+
+#: front/src/components/federation/LibraryFollowTable.vue:38
+msgid "Approved"
+msgstr "Aprovat"
+
+#: front/src/components/auth/Logout.vue:5
+msgid "Are you sure you want to log out?"
+msgstr "Volètz vertadièrament vos desconnectar ?"
+
+#: front/src/components/audio/SearchBar.vue:25
+#: src/components/audio/track/Table.vue:7
+#: front/src/components/federation/LibraryTrackTable.vue:48
+#: front/src/components/library/Artist.vue:119
+#: front/src/components/manage/library/FilesTable.vue:38
+#: front/src/components/manage/library/RequestsTable.vue:49
+#: front/src/components/metadata/Search.vue:130
+msgid "Artist"
+msgstr "Artista"
+
+#: front/src/components/requests/Form.vue:5
+msgid "Artist name"
+msgstr "Nom de l’artista"
+
+#: front/src/components/library/Album.vue:22
+#: src/components/library/Track.vue:23
+msgid "Artist page"
+msgstr "Pagina de l’artista"
+
+#: front/src/components/audio/Search.vue:65
+msgid "Artist, album, track..."
+msgstr "Artista, album, pista..."
+
+#: front/src/components/audio/Search.vue:10
+#: src/components/instance/Stats.vue:42
+#: front/src/components/library/Artists.vue:119
+#: src/components/library/Library.vue:7
+msgid "Artists"
+msgstr "Artistas"
+
+#: front/src/components/favorites/List.vue:33
+#: front/src/components/federation/LibraryTrackTable.vue:28
+#: front/src/components/library/Artists.vue:25
+#: src/components/library/Radios.vue:44
+#: front/src/components/manage/library/FilesTable.vue:19
+#: front/src/components/manage/library/RequestsTable.vue:19
+#: front/src/components/manage/users/UsersTable.vue:19
+#: front/src/views/federation/LibraryList.vue:28
+#: src/views/playlists/List.vue:27
+msgid "Ascending"
+msgstr "Ascendent"
+
+#: front/src/views/auth/PasswordReset.vue:27
+msgid "Ask for a password reset"
+msgstr "Demandar un nòu senhal"
+
+#: front/src/views/federation/LibraryDetail.vue:56
+msgid "Auto importing"
+msgstr "Importacion automatica"
+
+#: front/src/components/playlists/PlaylistModal.vue:26
+msgid "Available playlists"
+msgstr "Listas de lectura disponiblas"
+
+#: front/src/components/auth/Settings.vue:34
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24
+#: front/src/views/auth/PasswordResetConfirm.vue:18
+msgid "Back to login"
+msgstr "Tornar a la pagina de connexion"
+
+#: front/src/views/federation/LibraryFollowersList.vue:5
+msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library."
+msgstr ""
+"Atencion en acceptar de demandas d’abonament, vòl dire que los seguidors "
+"poiràn accedir a vòstra bibliotèca complèta."
+
+#: front/src/components/library/Track.vue:80
+#: front/src/components/manage/library/FilesTable.vue:42
+msgid "Bitrate"
+msgstr "Debit"
+
+#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
+msgid "Browse"
+msgstr "Percórrer"
+
+#: front/src/components/Sidebar.vue:50
+msgid "Browse library"
+msgstr "Percórrer la bibliotèca"
+
+#: front/src/components/library/Artists.vue:4
+msgid "Browsing artists"
+msgstr "Percórrer los artistas"
+
+#: front/src/views/federation/LibraryTrackList.vue:3
+msgid "Browsing federated tracks"
+msgstr "Percórrer las pistas federadas"
+
+#: front/src/views/federation/LibraryFollowersList.vue:3
+msgid "Browsing followers"
+msgstr "Percórrer los seguidors"
+
+#: front/src/views/federation/LibraryList.vue:3
+msgid "Browsing libraries"
+msgstr "Percórrer las bibliotècas"
+
+#: front/src/views/playlists/List.vue:3
+msgid "Browsing playlists"
+msgstr "Percórrer las listas de lectura"
+
+#: front/src/components/library/Radios.vue:4
+msgid "Browsing radios"
+msgstr "Percórrer las ràdios"
+
+#: front/src/components/library/radios/Builder.vue:5
+msgid "Builder"
+msgstr "Editor"
+
+#: front/src/components/audio/album/Card.vue:13
+msgid "By %{ artist }"
+msgstr "De %{ artist }"
+
+#: front/src/components/federation/LibraryFollowTable.vue:57
+msgid "By confirming, %{ username } will be denied access to your library."
+msgstr "Se confirmatz, %{ username } poirà pas accedir a vòstra bibliotèca."
+
+#: front/src/components/federation/LibraryFollowTable.vue:73
+msgid "By confirming, %{ username } will be granted access to your library."
+msgstr "Se confirmatz, %{ username } poirà accedir a vòstra bibliotèca."
+
+#: front/src/components/audio/track/Table.vue:43
+#: front/src/components/common/DangerousButton.vue:17
+#: front/src/components/library/radios/Filter.vue:53
+#: front/src/components/playlists/PlaylistModal.vue:63
+msgid "Cancel"
+msgstr "Anullar"
+
+#: front/src/components/library/radios/Builder.vue:59
+msgid "Candidates"
+msgstr "Pistas candidatas"
+
+#: front/src/components/auth/Settings.vue:76
+msgid "Cannot change your password"
+msgstr "Lo senhal pòt pas se cambiar"
+
+#: front/src/App.vue:66
+msgid "Change language"
+msgstr "Cambiar la lenga"
+
+#: front/src/components/auth/Settings.vue:67
+msgid "Change my password"
+msgstr "Cambiar lo senhal"
+
+#: front/src/components/auth/Settings.vue:95
+msgid "Change password"
+msgstr "Cambiar lo senhal"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:4
+#: front/src/views/auth/PasswordResetConfirm.vue:62
+msgid "Change your password"
+msgstr "Cambiar lo senhal"
+
+#: front/src/components/auth/Settings.vue:96
+msgid "Change your password?"
+msgstr "Cambiar lo senhal ?"
+
+#: front/src/components/playlists/Editor.vue:21
+msgid "Changes synced with server"
+msgstr "Cambiament sincronizat amb lo servidor"
+
+#: front/src/components/auth/Settings.vue:70
+msgid "Changing your password will also change your Subsonic API password if you have requested one."
+msgstr ""
+"L’actualizacion de vòstra senhal cambiarà tanben lo de l’API Subsonic se n’"
+"avètz un."
+
+#: front/src/components/auth/Settings.vue:98
+msgid "Changing your password will have the following consequences"
+msgstr "Lo cambiament de senhal a las consequéncias seguentas"
+
+#: front/src/App.vue:4
+msgid "Choose your instance"
+msgstr "Causissètz vòstra instància"
+
+#: front/src/components/Home.vue:64
+msgid "Clean library"
+msgstr "Bibliotèca de qualitat"
+
+#: front/src/components/manage/users/InvitationForm.vue:37
+msgid "Clear"
+msgstr "Escafar"
+
+#: front/src/components/playlists/Editor.vue:40
+#: front/src/components/playlists/Editor.vue:45
+msgid "Clear playlist"
+msgstr "Escafar la lista de lectura"
+
+#: front/src/components/audio/Player.vue:270
+msgid "Clear your queue"
+msgstr "Voidar la fila"
+
+#: front/src/components/library/import/BatchList.vue:23
+msgid "CLI"
+msgstr "CLI"
+
+#: front/src/components/Home.vue:44
+msgid "Click once, listen for hours using built-in radios"
+msgstr "Amb un clic, escotatz d’oras de musica a la ràdio"
+
+#: front/src/components/manage/library/RequestsTable.vue:30
+#: front/src/components/manage/library/RequestsTable.vue:64
+msgid "Closed"
+msgstr "Tampada"
+
+#: front/src/components/manage/users/InvitationForm.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:42
+msgid "Code"
+msgstr "Còdi"
+
+#: front/src/components/audio/album/Card.vue:43
+#: front/src/components/audio/artist/Card.vue:33
+#: front/src/components/discussion/Comment.vue:20
+msgid "Collapse"
+msgstr "Plegar"
+
+#: front/src/components/manage/library/RequestsTable.vue:51
+#: front/src/components/requests/Form.vue:14
+msgid "Comment"
+msgstr "Comentari"
+
+#: front/src/components/library/radios/Builder.vue:58
+msgid "Config"
+msgstr "Configuracion"
+
+#: front/src/components/common/DangerousButton.vue:21
+msgid "Confirm"
+msgstr "Confirmar"
+
+#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20
+#: front/src/views/auth/EmailConfirm.vue:51
+msgid "Confirm your email"
+msgstr "Confirmar vòstra adreça electronica"
+
+#: front/src/views/auth/EmailConfirm.vue:13
+msgid "Confirmation code"
+msgstr "Còdi de confirmacion"
+
+#: front/src/components/playlists/Editor.vue:163
+msgid "Copy tracks from current queue to playlist"
+msgstr "Copiar las pistas de la fila a la lista de lectura"
+
+#: front/src/components/Home.vue:88
+msgid "Covers, lyrics, our goal is to have them all ;)"
+msgstr "Jaqueta d’albums, paraulas, nòstra tòca es d’o aver tot ;)"
+
+#: front/src/components/auth/Signup.vue:4
+msgid "Create a funkwhale account"
+msgstr "Crear un compte funkwhale"
+
+#: front/src/components/playlists/Form.vue:2
+msgid "Create a new playlist"
+msgstr "Crear una nòva lista de lectura"
+
+#: front/src/components/auth/Login.vue:17
+msgid "Create an account"
+msgstr "Crear un compte"
+
+#: front/src/components/manage/library/RequestsTable.vue:88
+#: front/src/components/requests/Card.vue:25
+msgid "Create import"
+msgstr "Crear un import"
+
+#: front/src/components/auth/Signup.vue:51
+msgid "Create my account"
+msgstr "Crear mon compte"
+
+#: front/src/components/playlists/Form.vue:34
+msgid "Create playlist"
+msgstr "Crear una lista de lectura"
+
+#: front/src/components/library/Radios.vue:23
+msgid "Create your own radio"
+msgstr "Crear vòstra pròpria ràdio"
+
+#: front/src/components/federation/LibraryFollowTable.vue:22
+#: front/src/components/manage/library/RequestsTable.vue:52
+#: front/src/components/manage/users/InvitationsTable.vue:40
+msgid "Creation date"
+msgstr "Data de creacion"
+
+#: front/src/components/auth/Settings.vue:54
+msgid "Current avatar"
+msgstr "Avatar actual"
+
+#: front/src/components/playlists/PlaylistModal.vue:8
+msgid "Current track"
+msgstr "Pista actuala"
+
+#: front/src/components/manage/library/FilesTable.vue:189
+#: front/src/components/manage/library/RequestsTable.vue:195
+#: front/src/components/manage/users/InvitationsTable.vue:166
+#: front/src/views/playlists/Detail.vue:33
+msgid "Delete"
+msgstr "Suprimir"
+
+#: front/src/views/playlists/Detail.vue:38
+msgid "Delete playlist"
+msgstr "Suprimir la lista de lectura"
+
+#: front/src/views/radios/Detail.vue:28
+msgid "Delete radio"
+msgstr "Suprimir la ràdio"
+
+#: front/src/components/federation/LibraryFollowTable.vue:52
+#: front/src/components/federation/LibraryFollowTable.vue:63
+msgid "Deny"
+msgstr "Refusar"
+
+#: front/src/components/federation/LibraryFollowTable.vue:54
+msgid "Deny access?"
+msgstr "Refusar l’accès ?"
+
+#: front/src/components/favorites/List.vue:34
+#: front/src/components/federation/LibraryTrackTable.vue:29
+#: front/src/components/library/Artists.vue:26
+#: src/components/library/Radios.vue:47
+#: front/src/components/manage/library/FilesTable.vue:20
+#: front/src/components/manage/library/RequestsTable.vue:20
+#: front/src/components/manage/users/UsersTable.vue:20
+#: front/src/views/federation/LibraryList.vue:29
+#: src/views/playlists/List.vue:28
+msgid "Descending"
+msgstr "Descendent"
+
+#: front/src/components/federation/LibraryCard.vue:50
+msgid "Detail"
+msgstr "Detalhs"
+
+#: front/src/views/admin/users/UsersDetail.vue:146
+msgid "Determine if the user account is active or not. Inactive users cannot login or use the service."
+msgstr ""
+"Determina se l’utilizaire es actiu o non. Los compte inactius se pòdon pas "
+"connectar nimai utilizar lo servici."
+
+#: front/src/components/auth/Settings.vue:104
+#: front/src/components/auth/SubsonicTokenForm.vue:52
+msgid "Disable access"
+msgstr "Desactivar l’accès"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:49
+msgid "Disable Subsonic access"
+msgstr "Desactivar l’accès via Subsonic"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:50
+msgid "Disable Subsonic API access?"
+msgstr "Desactivar l’accès a l’API Subsonic ?"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:14
+msgid "Discover how to use Funkwhale from other apps"
+msgstr "Aprenètz a utilizar Funkwhale amb d’autras aplicacions"
+
+#: front/src/components/library/radios/Builder.vue:26
+msgid "Display publicly"
+msgstr "Mostrar publicament"
+
+#: front/src/components/playlists/Editor.vue:42
+msgid "Do you want to clear the playlist \"%{ playlist }\"?"
+msgstr "Volètz voidar la lista de lectura « %{ playlist } »  ?"
+
+#: front/src/components/common/DangerousButton.vue:7
+msgid "Do you want to confirm this action?"
+msgstr "Volètz confirmar aquesta accion ?"
+
+#: front/src/views/playlists/Detail.vue:35
+msgid "Do you want to delete the playlist \"%{ playlist }\"?"
+msgstr "Volètz suprimir la lista de lectura « %{ playlist } »  ?"
+
+#: front/src/views/radios/Detail.vue:26
+msgid "Do you want to delete the radio \"%{ radio }\"?"
+msgstr "Volètz suprimir la ràdio « %{ playlist } »  ?"
+
+#: front/src/components/common/ActionTable.vue:29
+msgid "Do you want to launch %{ action } on %{ count } element?"
+msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
+msgstr[0] "Volètz lançar l’accion « %{ action } » sus %{ count } element ?"
+msgstr[1] "Volètz lançar l’accion « %{ action } » sus %{ count } elements ?"
+
+#: front/src/components/Sidebar.vue:113
+msgid "Do you want to restore your previous queue?"
+msgstr "Volètz restablir vòstra fila precedenta ?"
+
+#: front/src/App.vue:38
+msgid "Documentation"
+msgstr "Documentacion"
+
+#: front/src/components/audio/track/Table.vue:24
+#: src/components/library/Track.vue:48
+msgid "Download"
+msgstr "Telecargar"
+
+#: front/src/components/audio/track/Table.vue:27
+msgid "Download tracks"
+msgstr "Telecargar las pistas"
+
+#: front/src/components/playlists/Editor.vue:49
+msgid "Drag and drop rows to reorder tracks in the playlist"
+msgstr "Lisatz las linhas per triar las pistas de la lista de lectura"
+
+#: front/src/components/library/Track.vue:58
+#: front/src/components/manage/library/FilesTable.vue:43
+msgid "Duration"
+msgstr "Durada"
+
+#: front/src/components/Home.vue:96
+msgid "Easy to use"
+msgstr "Simple d’utilizar"
+
+#: front/src/components/About.vue:21
+msgid "Edit instance info"
+msgstr "Editrar las informacions d’aquesta instància"
+
+#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30
+msgid "Edit..."
+msgstr "Editar..."
+
+#: front/src/components/auth/Signup.vue:29
+#: front/src/components/manage/users/UsersTable.vue:38
+msgid "Email"
+msgstr "Corrièl"
+
+#: front/src/views/admin/users/UsersDetail.vue:29
+msgid "Email address"
+msgstr "Adreça electronica"
+
+#: front/src/views/auth/EmailConfirm.vue:23
+msgid "Email confirmed"
+msgstr "Corrièl confirmat"
+
+#: front/src/views/playlists/Detail.vue:29
+msgid "End edition"
+msgstr "Acabar l’edicion"
+
+#: front/src/components/library/import/FileUpload.vue:4
+msgid "Ensure your music files are properly tagged before uploading them."
+msgstr ""
+"Verificatz que vòstres fichièrs musicals son corrèctament etiquetats abans "
+"de los enviar."
+
+#: front/src/components/library/Radios.vue:140
+msgid "Enter a radio name..."
+msgstr "Escrivètz un nom de ràdio..."
+
+#: front/src/components/library/Artists.vue:118
+msgid "Enter an artist name..."
+msgstr "Escrivètz un nom d’artista..."
+
+#: front/src/views/federation/LibraryList.vue:122
+msgid "Enter an library domain name..."
+msgstr "Escrivètz un nom de domeni..."
+
+#: front/src/views/playlists/List.vue:104
+msgid "Enter an playlist name..."
+msgstr "Escrivètz un nom de lista de lectura..."
+
+#: front/src/components/auth/Signup.vue:98
+msgid "Enter your email"
+msgstr "Escrivètz vòstre adreça electronica"
+
+#: front/src/components/auth/Signup.vue:96
+msgid "Enter your invitation code (case insensitive)"
+msgstr "Escrivètz vòstre còdi d’invitacion (pas sensible a la cassa)"
+
+#: front/src/components/metadata/Search.vue:114
+msgid "Enter your search query..."
+msgstr "Escrivètz vòstra recèrca..."
+
+#: front/src/components/auth/Signup.vue:97
+msgid "Enter your username"
+msgstr "Escrivètz vòstre nom d’utilizaire"
+
+#: front/src/components/auth/Login.vue:77
+msgid "Enter your username or email"
+msgstr "Escrivètz vòstre nom d’utilizaire o corrièl"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:20
+msgid "Error"
+msgstr "Error"
+
+#: front/src/views/admin/Settings.vue:87
+msgid "Error reporting"
+msgstr "Rapòrt d’error"
+
+#: front/src/components/common/ActionTable.vue:75
+msgid "Error while applying action"
+msgstr "Error en tractar l’accion"
+
+#: front/src/views/auth/PasswordReset.vue:7
+msgid "Error while asking for a password reset"
+msgstr "Error en demandar un novèl senhal"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:7
+msgid "Error while changing your password"
+msgstr "Error en cambiar lo senhal"
+
+#: front/src/views/auth/EmailConfirm.vue:7
+msgid "Error while confirming your email"
+msgstr "Error en confirmar l’adreça electronica"
+
+#: front/src/components/manage/users/InvitationForm.vue:4
+msgid "Error while creating invitation"
+msgstr "Error en crear l’invitacion"
+
+#: front/src/components/admin/SettingsGroup.vue:5
+msgid "Error while saving settings"
+msgstr "Error en enregistrar los paramètres"
+
+#: front/src/components/federation/LibraryForm.vue:10
+msgid "Error while scanning library"
+msgstr "Error en analizar la bibliotèca"
+
+#: front/src/components/library/import/BatchDetail.vue:41
+#: front/src/components/library/import/BatchDetail.vue:70
+#: front/src/components/library/import/BatchList.vue:15
+msgid "Errored"
+msgstr "Perturbat"
+
+#: front/src/components/playlists/Form.vue:89
+msgid "Everyone"
+msgstr "Tot lo monde"
+
+#: front/src/components/playlists/Form.vue:85
+msgid "Everyone on this instance"
+msgstr "Lo monde d’aquesta instància"
+
+#: front/src/components/library/radios/Builder.vue:57
+msgid "Exclude"
+msgstr "Exclure"
+
+#: front/src/components/discussion/Comment.vue:14
+msgid "Expand"
+msgstr "Dobrir"
+
+#: front/src/components/manage/users/InvitationsTable.vue:41
+msgid "Expiration date"
+msgstr "Data d’expiracion"
+
+#: front/src/components/manage/users/InvitationsTable.vue:50
+msgid "Expired"
+msgstr "Expirada"
+
+#: front/src/components/manage/users/InvitationsTable.vue:21
+msgid "Expired/used"
+msgstr "Expirada/utilizada"
+
+#: front/src/components/library/import/Main.vue:65
+msgid "External source. Supported backends"
+msgstr "Font extèrna. Servicis compatibles"
+
+#: front/src/components/Sidebar.vue:51
+msgid "Favorites"
+msgstr "Favorits"
+
+#: front/src/components/federation/LibraryForm.vue:3
+msgid "Federate with a new instance"
+msgstr "Federar amb una nòva instància"
+
+#: front/src/views/federation/LibraryTrackList.vue:21
+msgid "Federated tracks"
+msgstr "Pistas federadas"
+
+#: front/src/components/Sidebar.vue:87
+#: src/components/library/import/BatchList.vue:25
+#: front/src/components/manage/users/UsersTable.vue:180
+#: front/src/views/admin/Settings.vue:84
+#: src/views/admin/users/UsersDetail.vue:161
+#: front/src/views/federation/Base.vue:35
+#: src/views/federation/LibraryDetail.vue:40
+msgid "Federation"
+msgstr "Federacion"
+
+#: front/src/views/federation/LibraryDetail.vue:3
+msgid "File mirroring"
+msgstr "Còpia dels fichièrs"
+
+#: front/src/components/library/import/FileUpload.vue:43
+msgid "File name"
+msgstr "Nom del fichièr"
+
+#: front/src/components/library/import/Main.vue:76
+msgid "File upload"
+msgstr "Mandadís del fichièr"
+
+#: front/src/views/admin/library/Base.vue:5
+#: src/views/admin/library/FilesList.vue:21
+msgid "Files"
+msgstr "Fichièrs"
+
+#: front/src/components/library/import/ArtistImport.vue:7
+msgid "Filter album types"
+msgstr "Filtrar lo tipe d’album"
+
+#: front/src/components/library/radios/Builder.vue:56
+msgid "Filter name"
+msgstr "Nom del filtre"
+
+#: front/src/components/library/import/Main.vue:52
+msgid "Finish import"
+msgstr "Acabar l’import"
+
+#: front/src/components/library/import/BatchDetail.vue:54
+msgid "Finished"
+msgstr "Acabat"
+
+#: front/src/components/library/import/Main.vue:59
+msgid "First, choose where you want to import the music from"
+msgstr "D’en primièr, causissètz lo mòde d’import per la musica"
+
+#: front/src/components/federation/LibraryCard.vue:44
+msgid "Follow"
+msgstr "Seguir"
+
+#: front/src/components/federation/LibraryCard.vue:36
+msgid "Follow request pending approval"
+msgstr "Abonament en espèra de validacion"
+
+#: front/src/views/federation/LibraryDetail.vue:21
+msgid "Follow status"
+msgstr "Estatut  de l’abonament"
+
+#: front/src/views/federation/Base.vue:13
+#: front/src/views/federation/LibraryFollowersList.vue:24
+msgid "Followers"
+msgstr "Seguidors"
+
+#: front/src/components/federation/LibraryCard.vue:18
+msgid "Followers only"
+msgstr "Seguidors solament"
+
+#: front/src/components/federation/LibraryCard.vue:15
+#: front/src/views/federation/LibraryDetail.vue:29
+msgid "Following"
+msgstr "Abonat"
+
+#: front/src/components/activity/Like.vue:12
+#: src/components/activity/Listen.vue:12
+msgid "from %{ album } by %{ artist }"
+msgstr "de l’album %{ album } per %{ artist }"
+
+#: front/src/components/library/Track.vue:13
+msgid "From album %{ album } by %{ artist }"
+msgstr "De l’album %{ album } per %{ artist }"
+
+#: front/src/App.vue:56
+msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!"
+msgstr ""
+"Funkwhale es un projècte liure e gratuit, menat per de benevols. Podètz "
+"ajudar a melhorar lo servici en senhalar los problèmas que trobatz, en "
+"suggerir de melhoraments e ne’n parlant altorn de vos !"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgid "Funkwhale is compatible with other music players that support the Subsonic API."
+msgstr ""
+"Funkwhale es compatible amb d’autres lectors de musica compatibles amb l’API "
+"Subsonic."
+
+#: front/src/components/Home.vue:98
+msgid "Funkwhale is dead simple to use."
+msgstr "Funkwhale es simple d’utilizar."
+
+#: front/src/components/Home.vue:39
+msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists."
+msgstr ""
+"Funkwhale es concebut per facilitar l’escota de las musicas que vos agradan "
+"e descobrir de novèls artistas."
+
+#: front/src/components/Home.vue:119
+msgid "Funkwhale is free and gives you control on your music."
+msgstr "Funkwhale es a gratís e vos dòna lo contròla de vòstra musica."
+
+#: front/src/components/Home.vue:66
+msgid "Funkwhale takes care of handling your music"
+msgstr "Funkwhale prend cura de vòstra musica"
+
+#: front/src/components/manage/users/InvitationForm.vue:16
+msgid "Get a new invitation"
+msgstr "Obténer una novèla invitacion"
+
+#: front/src/components/Home.vue:13
+msgid "Get me to the library"
+msgstr "Menatz-me a la bibliotèca"
+
+#: front/src/components/Home.vue:77
+msgid ""
+"Get quality metadata about your music thanks to\n"
+"              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
+msgstr ""
+"Obtenètz de metadonadas de qualitat per vòstra musica gràcia a\n"
+"              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
+
+#: front/src/components/common/ActionTable.vue:21
+#: front/src/components/common/ActionTable.vue:27
+msgid "Go"
+msgstr "Zo"
+
+#: front/src/components/PageNotFound.vue:14
+msgid "Go to home page"
+msgstr "Tornar a l’acuèlh"
+
+#: front/src/components/library/import/Main.vue:13
+msgid "Grab corresponding metadata"
+msgstr "Recuperar las metadonadas ligadas"
+
+#: front/src/App.vue:74
+msgid "Help us translate Funkwhale"
+msgstr "Ajudar a traduire Funkwhale"
+
+#: front/src/components/library/Home.vue:65
+msgid "Home"
+msgstr "Acuèlh"
+
+#: front/src/components/instance/Stats.vue:36
+msgid "Hours of music"
+msgstr "Oras de musica"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:11
+msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
+msgstr ""
+"Pr’aquò, accedir a Funkwhale d’un client estant demanda un senhal diferent "
+"que podètz configurar çai-jos."
+
+#: front/src/components/library/import/BatchList.vue:34
+msgid "ID"
+msgstr "ID"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:24
+msgid "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."
+msgstr ""
+"Se l’adreça qu’avètz provesida es valida e associada a un compte utilizaire, "
+"sètz per recebre un messatge amb las consignas de reïnicializacion d’aquí "
+"una estona."
+
+#: front/src/components/federation/LibraryTrackTable.vue:196
+#: front/src/components/library/Library.vue:17
+msgid "Import"
+msgstr "Import"
+
+#: front/src/components/federation/LibraryTrackTable.vue:57
+msgid "Import #%{ id } launched"
+msgstr "Import #%{ id } aviat"
+
+#: front/src/components/library/import/Main.vue:38
+msgid "Import %{ count } track"
+msgid_plural "Import %{ count } tracks"
+msgstr[0] "Import %{ count } pista"
+msgstr[1] "Import %{ count } pistas"
+
+#: front/src/components/library/import/BatchDetail.vue:10
+msgid "Import batch"
+msgstr "Part d’import"
+
+#: front/src/components/library/import/BatchDetail.vue:185
+msgid "Import Batch #%{ id }"
+msgstr "Part d’imports #%{ id }"
+
+#: front/src/components/library/Library.vue:20
+msgid "Import batches"
+msgstr "Parts d’imports"
+
+#: front/src/components/library/import/BatchList.vue:117
+msgid "Import Batches"
+msgstr "Parts d’imports"
+
+#: front/src/components/manage/library/FilesTable.vue:40
+#: front/src/components/manage/library/RequestsTable.vue:53
+msgid "Import date"
+msgstr "Data d’import"
+
+#: front/src/components/library/import/FileUpload.vue:38
+msgid "Import detail page"
+msgstr "Pagina de detalhs de l’import"
+
+#: front/src/components/Sidebar.vue:81
+msgid "Import music"
+msgstr "Importar de musica"
+
+#: front/src/components/library/import/Main.vue:267
+msgid "Import Music"
+msgstr "Importar de musica"
+
+#: front/src/components/Home.vue:71
+msgid "Import music from various platforms, such as YouTube or SoundCloud"
+msgstr "Importatz la musica de diferentas plataforma, coma YouTube o Soundcloud"
+
+#: front/src/components/federation/LibraryTrackTable.vue:14
+#: front/src/components/federation/LibraryTrackTable.vue:66
+msgid "Import pending"
+msgstr "Import en espèra"
+
+#: front/src/views/admin/library/Base.vue:9
+#: front/src/views/admin/library/RequestsList.vue:3
+#: front/src/views/admin/library/RequestsList.vue:21
+msgid "Import requests"
+msgstr "Requèstas d’import"
+
+#: front/src/components/library/import/BatchList.vue:20
+#: front/src/components/library/import/Main.vue:6
+msgid "Import source"
+msgstr "Font de l’import"
+
+#: front/src/components/federation/LibraryTrackTable.vue:9
+msgid "Import status"
+msgstr "Estatut de l’import"
+
+#: front/src/components/library/import/ReleaseImport.vue:14
+msgid "Import this release"
+msgstr "Importar aquesta album"
+
+#: front/src/components/library/import/TrackImport.vue:11
+msgid "Import this track"
+msgstr "Importar aquesta pista"
+
+#: front/src/components/federation/LibraryTrackTable.vue:12
+#: front/src/components/manage/library/RequestsTable.vue:29
+#: front/src/components/manage/library/RequestsTable.vue:61
+msgid "Imported"
+msgstr "Importat"
+
+#: front/src/components/library/import/TrackImport.vue:44
+msgid "Imported URL"
+msgstr "URL importadas"
+
+#: front/src/views/admin/Settings.vue:82
+msgid "Imports"
+msgstr "Imports"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:3
+msgid "In favorites"
+msgstr "Als favorits"
+
+#: front/src/components/federation/LibraryTrackTable.vue:65
+msgid "In library"
+msgstr "A la bibliotèca"
+
+#: front/src/components/manage/users/UsersTable.vue:54
+msgid "Inactive"
+msgstr "Actiu"
+
+#: front/src/components/library/import/Main.vue:96
+msgid "Input a MusicBrainz ID manually:"
+msgstr "Picar manualament un ID MasicBrainz :"
+
+#: front/src/views/auth/PasswordReset.vue:53
+msgid "Input the email address binded to your account"
+msgstr "Escrivètz l’adreça ligada a vòstre compte"
+
+#: front/src/components/playlists/Editor.vue:31
+msgid "Insert from queue (%{ count } track)"
+msgid_plural "Insert from queue (%{ count } tracks)"
+msgstr[0] "Inserir de la fila (%{ count } pista)"
+msgstr[1] "Inserir de la fila (%{ count } pistas)"
+
+#: front/src/views/admin/Settings.vue:80
+msgid "Instance information"
+msgstr "Info. de l’instància"
+
+#: front/src/components/library/Radios.vue:9
+msgid "Instance radios"
+msgstr "Ràdios de l’instància"
+
+#: front/src/views/admin/Settings.vue:75
+msgid "Instance settings"
+msgstr "Paramètres de l’intància"
+
+#: front/src/views/instance/Timeline.vue:57
+msgid "Instance Timeline"
+msgstr "Flux de l’instància"
+
+#: front/src/components/auth/Signup.vue:42
+#: front/src/components/manage/users/InvitationForm.vue:11
+msgid "Invitation code"
+msgstr "Còdi d’invitacion"
+
+#: front/src/components/auth/Signup.vue:43
+msgid "Invitation code (optional)"
+msgstr "Còdi d’invitacion (opcional)"
+
+#: front/src/views/admin/users/Base.vue:8
+#: src/views/admin/users/InvitationsList.vue:3
+#: front/src/views/admin/users/InvitationsList.vue:24
+msgid "Invitations"
+msgstr "Invitacions"
+
+#: front/src/App.vue:43
+msgid "Issue tracker"
+msgstr "Traçador de problèmas"
+
+#: front/src/components/library/import/BatchDetail.vue:80
+msgid "Job ID"
+msgstr "ID de la tasca"
+
+#: front/src/components/library/import/BatchList.vue:36
+msgid "Jobs"
+msgstr "Tascas"
+
+#: front/src/components/Home.vue:50
+msgid "Keep a track of your favorite songs"
+msgstr "Gardatz una traça de vòstras cançons favoritas"
+
+#: front/src/components/audio/track/Table.vue:33
+msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account."
+msgstr ""
+"Gardatz vòstre PRIVATE_TOKEN secrèt estant que permet l’accès a vòstre "
+"compte."
+
+#: front/src/components/manage/users/UsersTable.vue:41
+#: front/src/views/admin/users/UsersDetail.vue:45
+msgid "Last activity"
+msgstr "Darrièra activitat"
+
+#: front/src/views/federation/LibraryDetail.vue:101
+msgid "Last fetched"
+msgstr "Darrièra recuperacion"
+
+#: front/src/components/playlists/PlaylistModal.vue:32
+msgid "Last modification"
+msgstr "Darrièra modificacion"
+
+#: front/src/components/common/ActionTable.vue:39
+msgid "Launch"
+msgstr "Aviar"
+
+#: front/src/components/library/import/BatchDetail.vue:18
+#: front/src/components/library/import/BatchList.vue:35
+msgid "Launch date"
+msgstr "Data de lançament"
+
+#: front/src/components/federation/LibraryForm.vue:31
+msgid "Launch scan"
+msgstr "Aviar l’analisi"
+
+#: front/src/components/Home.vue:10
+msgid "Learn more about this instance"
+msgstr "Ne saber mai tocant aquesta instància"
+
+#: front/src/components/manage/users/InvitationForm.vue:58
+msgid "Leave empty for a random code"
+msgstr "Daissar void per obténer un còdi aleatòri"
+
+#: front/src/components/requests/Form.vue:10
+msgid "Leave this field empty if you're requesting the whole discography."
+msgstr "Daissar aqueste camp void se volètz suggerir totas las discografia."
+
+#: front/src/views/federation/Base.vue:5
+#: src/views/federation/LibraryList.vue:123
+msgid "Libraries"
+msgstr "Bibliotècas"
+
+#: front/src/components/Sidebar.vue:70
+#: front/src/components/federation/LibraryTrackTable.vue:51
+#: front/src/components/instance/Stats.vue:30
+#: front/src/components/manage/users/UsersTable.vue:176
+#: front/src/views/admin/users/UsersDetail.vue:157
+#: front/src/views/federation/LibraryDetail.vue:194
+msgid "Library"
+msgstr "Bibliotèca"
+
+#: front/src/views/admin/library/FilesList.vue:3
+msgid "Library files"
+msgstr "Fichièrs de la bibliotèca"
+
+#: front/src/components/federation/LibraryForm.vue:20
+msgid "Library name"
+msgstr "Nom de la bibliotèca"
+
+#: front/src/views/federation/LibraryDetail.vue:84
+msgid "Library size"
+msgstr "Talha de la bibliotèca"
+
+#: front/src/components/federation/LibraryForm.vue:96
+msgid "library@demo.funkwhale.audio"
+msgstr "library@demo.funkwhale.audio"
+
+#: front/src/App.vue:29
+msgid "Links"
+msgstr "Ligams"
+
+#: front/src/views/instance/Timeline.vue:4
+msgid "Loading timeline..."
+msgstr "Cargament del flux d’actualitat..."
+
+#: front/src/components/favorites/List.vue:5
+msgid "Loading your favorites..."
+msgstr "Cargament de vòstres favorits..."
+
+#: front/src/components/auth/Login.vue:78
+msgid "Log In"
+msgstr "Connexion"
+
+#: front/src/components/auth/Login.vue:4
+msgid "Log in to your Funkwhale account"
+msgstr "Connectatz-vos a vòstre compte Funkwhale"
+
+#: front/src/components/auth/Logout.vue:20
+msgid "Log Out"
+msgstr "Desconnexion"
+
+#: front/src/components/Sidebar.vue:38
+msgid "Logged in as %{ username }"
+msgstr "Connectat coma %{ username }"
+
+#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41
+msgid "Login"
+msgstr "Connexion"
+
+#: front/src/components/Sidebar.vue:43
+msgid "Logout"
+msgstr "Desconnexion"
+
+#: front/src/components/audio/Player.vue:266
+msgid "Looping disabled. Click to switch to single-track looping."
+msgstr ""
+"Repeticion desactivada. Clicatz per activar la repeticion de la pista "
+"actuala."
+
+#: front/src/components/audio/Player.vue:267
+msgid "Looping on a single track. Click to switch to whole queue looping."
+msgstr ""
+"Repeticion de la pista actuala. Clicatz per activar la repeticion de tota la "
+"fila."
+
+#: front/src/components/audio/Player.vue:268
+msgid "Looping on whole queue. Click to disable looping."
+msgstr "Repeticion de tota la fila, clicatz per desactivar la repeticion."
+
+#: front/src/components/library/Track.vue:94
+msgid "Lyrics"
+msgstr "Paraulas"
+
+#: front/src/views/admin/library/Base.vue:25
+msgid "Manage library"
+msgstr "Gerir la bibliotèca"
+
+#: front/src/components/playlists/PlaylistModal.vue:3
+msgid "Manage playlists"
+msgstr "Gerir las listas de lectura"
+
+#: front/src/views/admin/users/Base.vue:20
+msgid "Manage users"
+msgstr "Gerir los utilizaires"
+
+#: front/src/views/playlists/List.vue:8
+msgid "Manage your playlists"
+msgstr "Gerir vòstras listas de lectura"
+
+#: front/src/components/manage/library/RequestsTable.vue:197
+msgid "Mark as closed"
+msgstr "Marcar coma tampat"
+
+#: front/src/components/manage/library/RequestsTable.vue:196
+msgid "Mark as imported"
+msgstr "Marcar coma importat"
+
+#: front/src/components/library/import/Main.vue:12
+msgid "Metadata"
+msgstr "Metadonadas"
+
+#: front/src/components/library/import/Main.vue:115
+msgid ""
+"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n"
+"            <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"              MusicBrainz\n"
+"            </a>\n"
+"            project, which you can think about as the Wikipedia of music."
+msgstr ""
+"Las metadonadas son d’informacions relativas a la musica que volètz "
+"importar. Aquò concerna totas las informacions tocant los artistas, album e "
+"pistas. Per dire d’aver de metadonadas de qualitat, es recomandat d’emplegar "
+"las metadonadas del projècte\n"
+"            <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"              MusicBrainz\n"
+"            </a>\n"
+"            , que podètz veire coma lo Wikipèdia de la musica."
+
+#: front/src/components/Sidebar.vue:48
+#: src/components/library/import/Main.vue:18
+msgid "Music"
+msgstr "Musica"
+
+#: front/src/components/library/import/Main.vue:147
+msgid "Music request"
+msgstr "Requèsta musicala"
+
+#: front/src/components/audio/Player.vue:265
+msgid "Mute"
+msgstr "Copar lo son"
+
+#: front/src/components/Sidebar.vue:34
+msgid "My account"
+msgstr "Mon compte"
+
+#: front/src/components/playlists/Form.vue:74
+msgid "My awesome playlist"
+msgstr "Ma lista de lectura tròp crana"
+
+#: front/src/components/library/radios/Builder.vue:227
+msgid "My awesome radio"
+msgstr "Ma ràdio tròp crana"
+
+#: front/src/components/library/Track.vue:64
+#: src/components/library/Track.vue:75
+#: front/src/components/library/Track.vue:86
+#: front/src/components/manage/library/FilesTable.vue:63
+#: front/src/components/manage/library/FilesTable.vue:69
+#: front/src/components/manage/library/FilesTable.vue:75
+#: front/src/components/manage/library/FilesTable.vue:81
+#: front/src/components/manage/library/RequestsTable.vue:71
+#: front/src/components/manage/library/RequestsTable.vue:75
+#: front/src/components/manage/library/RequestsTable.vue:82
+#: front/src/components/manage/users/UsersTable.vue:61
+#: front/src/views/admin/users/UsersDetail.vue:49
+msgid "N/A"
+msgstr "ND"
+
+#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/views/admin/users/UsersDetail.vue:21
+msgid "Name"
+msgstr "Nom"
+
+#: front/src/components/auth/Settings.vue:88
+#: front/src/views/auth/PasswordResetConfirm.vue:14
+msgid "New password"
+msgstr "Nòu senhal"
+
+#: front/src/components/Sidebar.vue:158
+msgid "New tracks will be appended here automatically."
+msgstr "Las novèlas pistas seràn automaticament ajustadas aquí."
+
+#: front/src/components/library/import/Main.vue:29
+msgid "Next step"
+msgstr "Etapa seguenta"
+
+#: front/src/components/audio/Player.vue:263
+msgid "Next track"
+msgstr "Pista seguenta"
+
+#: front/src/components/Sidebar.vue:125
+msgid "No"
+msgstr "Non"
+
+#: front/src/components/Home.vue:103
+msgid "No add-ons, no plugins : you only need a web library"
+msgstr "Cap d’extension d’installar, vos cal pas qu’una bibliotèca sul web"
+
+#: front/src/components/library/Track.vue:102
+msgid "No lyrics available for this track."
+msgstr "Cap de paraulas pas disponiblas per aquesta pista."
+
+#: front/src/components/playlists/Form.vue:81
+msgid "Nobody except me"
+msgstr "Degun fòra ieu"
+
+#: front/src/views/federation/LibraryDetail.vue:32
+msgid "Not following"
+msgstr "Pas abonat"
+
+#: front/src/components/federation/LibraryTrackTable.vue:13
+#: front/src/components/federation/LibraryTrackTable.vue:67
+msgid "Not imported"
+msgstr "Pas importat"
+
+#: front/src/components/manage/users/InvitationsTable.vue:51
+msgid "Not used"
+msgstr "Pas utilizat"
+
+#: front/src/App.vue:37
+msgid "Official website"
+msgstr "Site oficial"
+
+#: front/src/components/auth/Settings.vue:83
+msgid "Old password"
+msgstr "Senhal precedent"
+
+#: front/src/components/library/import/FileUpload.vue:36
+msgid "Once all your files are uploaded, simply click the following button to check the import status."
+msgstr ""
+"Un còp totes los fichièrs cargats, clicatz lo boton seguent per verificar l’"
+"estatut de l’import."
+
+#: front/src/components/federation/LibraryCard.vue:21
+#: front/src/components/manage/users/InvitationsTable.vue:20
+msgid "Open"
+msgstr "Accès liure"
+
+#: front/src/App.vue:63
+msgid "Options"
+msgstr "Opcions"
+
+#: front/src/components/library/import/Main.vue:93
+msgid "Or"
+msgstr "O"
+
+#: front/src/components/favorites/List.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:18
+#: front/src/components/library/Artists.vue:15
+#: src/components/library/Radios.vue:33
+#: front/src/components/manage/library/FilesTable.vue:9
+#: front/src/components/manage/library/RequestsTable.vue:9
+#: front/src/components/manage/users/InvitationsTable.vue:9
+#: front/src/components/manage/users/UsersTable.vue:9
+#: front/src/views/federation/LibraryList.vue:18
+#: src/views/playlists/List.vue:17
+msgid "Ordering"
+msgstr "Ã’rdre"
+
+#: front/src/components/favorites/List.vue:31
+#: front/src/components/federation/LibraryTrackTable.vue:26
+#: front/src/components/library/Artists.vue:23
+#: src/components/library/Radios.vue:41
+#: front/src/components/manage/library/FilesTable.vue:17
+#: front/src/components/manage/library/RequestsTable.vue:17
+#: front/src/components/manage/users/UsersTable.vue:17
+#: front/src/views/federation/LibraryList.vue:26
+#: src/views/playlists/List.vue:25
+msgid "Ordering direction"
+msgstr "Direccion"
+
+#: front/src/components/manage/users/InvitationsTable.vue:38
+msgid "Owner"
+msgstr "Proprietari"
+
+#: front/src/components/PageNotFound.vue:33
+msgid "Page Not Found"
+msgstr "Pagina pas trobada"
+
+#: front/src/components/PageNotFound.vue:7
+msgid "Page not found!"
+msgstr "Pagina pas trobada !"
+
+#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38
+msgid "Password"
+msgstr "Senhal"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:95
+msgid "Password updated"
+msgstr "Senhal actualizat"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:28
+msgid "Password updated successfully"
+msgstr "Senhal corrèctament modificat"
+
+#: front/src/components/audio/Player.vue:262
+msgid "Pause track"
+msgstr "Pausar"
+
+#: front/src/components/federation/LibraryFollowTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:33
+#: front/src/components/library/import/BatchDetail.vue:69
+#: front/src/components/library/import/BatchList.vue:14
+#: front/src/components/library/import/FileUpload.vue:59
+#: front/src/components/manage/library/RequestsTable.vue:27
+#: front/src/components/manage/library/RequestsTable.vue:63
+msgid "Pending"
+msgstr "En espèra"
+
+#: front/src/components/federation/LibraryFollowTable.vue:11
+#: front/src/views/federation/LibraryDetail.vue:26
+msgid "Pending approval"
+msgstr "En espèra de validacion"
+
+#: front/src/components/Sidebar.vue:217
+msgid "Pending follow requests"
+msgstr "Demandas d’abonament en espèra"
+
+#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26
+msgid "Pending import requests"
+msgstr "Requèstas en espèra"
+
+#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36
+msgid "Pending requests"
+msgstr "Requèsta en espèra"
+
+#: front/src/components/manage/users/UsersTable.vue:42
+#: front/src/views/admin/users/UsersDetail.vue:68
+msgid "Permissions"
+msgstr "Autorizacions"
+
+#: front/src/components/audio/PlayButton.vue:9
+#: src/components/library/Track.vue:30
+msgid "Play"
+msgstr "Legir"
+
+#: front/src/components/audio/album/Card.vue:50
+#: front/src/components/audio/artist/Card.vue:44
+#: src/components/library/Album.vue:28 front/src/views/playlists/Detail.vue:23
+msgid "Play all"
+msgstr "O legir tot"
+
+#: front/src/components/library/Artist.vue:26
+msgid "Play all albums"
+msgstr "Legir totes los albums"
+
+#: front/src/components/audio/PlayButton.vue:58
+msgid "Play immediatly"
+msgstr "Legir sulcòp"
+
+#: front/src/components/audio/PlayButton.vue:15
+msgid "Play next"
+msgstr "Legir en seguida"
+
+#: front/src/components/audio/PlayButton.vue:16
+msgid "Play now"
+msgstr "Legir ara"
+
+#: front/src/components/audio/Player.vue:261
+msgid "Play track"
+msgstr "Legir"
+
+#: front/src/views/playlists/Detail.vue:90
+msgid "Playlist"
+msgstr "Lista de lectura"
+
+#: front/src/views/playlists/Detail.vue:12
+msgid "Playlist containing %{ count } track, by %{ username }"
+msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
+msgstr[0] "Lista de lectura contenent %{ count } pista, per %{ username }"
+msgstr[1] "Lista de lectura contenent %{ count } pistas, per %{ username }"
+
+#: front/src/components/playlists/Form.vue:9
+msgid "Playlist created"
+msgstr "Lista de lectura creada"
+
+#: front/src/components/playlists/Editor.vue:4
+msgid "Playlist editor"
+msgstr "Editor de lista de lectura"
+
+#: front/src/components/playlists/Form.vue:21
+msgid "Playlist name"
+msgstr "Nom de la lista de lectura"
+
+#: front/src/components/playlists/Form.vue:6
+msgid "Playlist updated"
+msgstr "Lista de lectura actualizada"
+
+#: front/src/components/playlists/Form.vue:25
+msgid "Playlist visibility"
+msgstr "Visibilitat de la lista de lectura"
+
+#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16
+#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83
+#: front/src/views/playlists/List.vue:103
+msgid "Playlists"
+msgstr "Listas de lectura"
+
+#: front/src/components/Home.vue:56
+msgid "Playlists? We got them"
+msgstr "Las listas de lectura ? Son aicí !"
+
+#: front/src/components/auth/Settings.vue:79
+msgid "Please double-check your password is correct"
+msgstr "Mercés de verificar que lo senhal es corrèct"
+
+#: front/src/components/auth/Login.vue:9
+msgid "Please double-check your username/password couple is correct"
+msgstr "Mercés de verificar que lo nom d’utilizaire e lo senhal son corrècts"
+
+#: front/src/components/auth/Settings.vue:46
+msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
+msgstr ""
+"PNG, GIF o JPG. 2Mo al maximum. L’imatge serà retalhat en 400×400 pixèls."
+
+#: front/src/components/library/import/Main.vue:26
+msgid "Previous step"
+msgstr "Etapa precedenta"
+
+#: front/src/components/audio/Player.vue:260
+msgid "Previous track"
+msgstr "Pista precedenta"
+
+#: front/src/views/auth/EmailConfirm.vue:26
+#: front/src/views/auth/PasswordResetConfirm.vue:31
+msgid "Proceed to login"
+msgstr "Contunhar cap a la pagina de connexion"
+
+#: front/src/components/federation/LibraryTrackTable.vue:50
+msgid "Published date"
+msgstr "Data de sortida"
+
+#: front/src/components/library/import/ArtistImport.vue:17
+msgid "Query template"
+msgstr "Modèl de recèrca"
+
+#: front/src/components/Sidebar.vue:20
+msgid "Queue"
+msgstr "Fila"
+
+#: front/src/components/audio/Player.vue:203
+msgid "Queue shuffled!"
+msgstr "La fila es estada mesclada !"
+
+#: front/src/views/radios/Detail.vue:80
+msgid "Radio"
+msgstr "Ràdio"
+
+#: front/src/components/library/radios/Builder.vue:226
+msgid "Radio Builder"
+msgstr "Editor de ràdio"
+
+#: front/src/components/library/radios/Builder.vue:15
+msgid "Radio created"
+msgstr "Nom de la ràdio"
+
+#: front/src/components/library/radios/Builder.vue:21
+msgid "Radio name"
+msgstr "Nom de la ràdio"
+
+#: front/src/components/library/radios/Builder.vue:12
+msgid "Radio updated"
+msgstr "Ràdio actualizada"
+
+#: front/src/components/library/Library.vue:10
+#: src/components/library/Radios.vue:141
+msgid "Radios"
+msgstr "Ràdios"
+
+#: front/src/views/instance/Timeline.vue:7
+msgid "Recent activity on this instance"
+msgstr "Activitats recentas d’aquesta instància"
+
+#: front/src/components/library/Home.vue:24
+msgid "Recently added"
+msgstr "Ajustats i a res"
+
+#: front/src/components/library/Home.vue:11
+msgid "Recently favorited"
+msgstr "Ajustadas als favorits i a res"
+
+#: front/src/components/library/Home.vue:6
+msgid "Recently listened"
+msgstr "Escotadas i a res"
+
+#: front/src/components/library/import/BatchDetail.vue:81
+msgid "Recording MusicBrainz ID"
+msgstr "ID MuzicBrainz de l’enregistrament"
+
+#: front/src/views/admin/users/UsersDetail.vue:84
+#: front/src/views/federation/LibraryDetail.vue:122
+msgid "Refresh"
+msgstr "Actualizar"
+
+#: front/src/components/federation/LibraryFollowTable.vue:42
+msgid "Refused"
+msgstr "Refusat"
+
+#: front/src/components/auth/Profile.vue:12
+msgid "Registered since %{ date }"
+msgstr "Marcat dempuèi %{ date }"
+
+#: front/src/components/auth/Signup.vue:9
+msgid "Registration are closed on this instance, you will need an invitation code to signup."
+msgstr ""
+"Las inscripcions son tampadas sus aquestà instància, aurètz de téner un còdi "
+"d’invitacion per vos marcar."
+
+#: front/src/components/manage/users/UsersTable.vue:71
+msgid "regular user"
+msgstr "utilizaire estandard"
+
+#: front/src/components/library/radios/Filter.vue:59
+msgid "Remove"
+msgstr "Tirar"
+
+#: front/src/components/auth/Settings.vue:58
+msgid "Remove avatar"
+msgstr "Suprimir l’avatar"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:19
+msgid "Remove from favorites"
+msgstr "Tirar dels favorits"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:34
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+msgid "Request a new password"
+msgstr "Demandar un nòu senhal"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:35
+msgid "Request a new Subsonic API password?"
+msgstr "Demandar un nòu senhal per l’API Subsonic ?"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:43
+msgid "Request a password"
+msgstr "Demandar un senhal"
+
+#: front/src/App.vue:35
+msgid "Request music"
+msgstr "Demandas de musica"
+
+#: front/src/views/library/MusicRequest.vue:4
+#: src/views/library/MusicRequest.vue:21
+msgid "Request some music"
+msgstr "Demandatz de musica"
+
+#: front/src/components/requests/Form.vue:20
+msgid "Request submitted!"
+msgstr "Requèsta enviada"
+
+#: front/src/components/library/import/BatchDetail.vue:49
+msgid "Rerun errored jobs"
+msgstr "Tornar aviar las tascas fracassadas"
+
+#: front/src/components/library/import/BatchDetail.vue:187
+msgid "Rerun job"
+msgstr "Reaviar la tasca"
+
+#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4
+#: front/src/views/auth/PasswordReset.vue:52
+msgid "Reset your password"
+msgstr "Reïnicializar lo senhal"
+
+#: front/src/components/library/import/TrackImport.vue:31
+msgid "Result %{ current }/%{ total }"
+msgstr "Resultat %{ current }/%{ total }"
+
+#: front/src/components/favorites/List.vue:38
+#: src/components/library/Artists.vue:30
+#: front/src/components/library/Radios.vue:52
+#: src/views/federation/LibraryList.vue:33
+#: front/src/views/playlists/List.vue:32
+msgid "Results per page"
+msgstr "Resultats per pagina"
+
+#: front/src/components/admin/SettingsGroup.vue:63
+#: front/src/components/library/radios/Builder.vue:29
+msgid "Save"
+msgstr "Enregistrar"
+
+#: front/src/views/federation/LibraryDetail.vue:112
+msgid "Scan triggered!"
+msgstr "Analisi aviat !"
+
+#: front/src/components/federation/LibraryTrackTable.vue:5
+#: front/src/components/library/Artists.vue:10
+#: src/components/library/Radios.vue:29
+#: front/src/components/library/import/BatchDetail.vue:62
+#: front/src/components/library/import/BatchList.vue:7
+#: front/src/components/manage/library/FilesTable.vue:5
+#: front/src/components/manage/library/RequestsTable.vue:5
+#: front/src/components/manage/users/InvitationsTable.vue:5
+#: front/src/components/manage/users/UsersTable.vue:5
+#: front/src/views/federation/LibraryList.vue:14
+#: src/views/playlists/List.vue:13
+msgid "Search"
+msgstr "Recercar"
+
+#: front/src/components/library/import/Main.vue:85
+msgid "Search an entity you want to import:"
+msgstr "Recercar una ressorga que volètz importar :"
+
+#: front/src/components/manage/library/RequestsTable.vue:180
+msgid "Search by artist, username, comment..."
+msgstr "Recercar per artista, nom d’utilizaire, comentari..."
+
+#: front/src/components/library/import/BatchDetail.vue:188
+msgid "Search by source..."
+msgstr "Recercar per font..."
+
+#: front/src/components/library/import/BatchList.vue:116
+msgid "Search by submitter, source..."
+msgstr "Recercar per utilizaire, font..."
+
+#: front/src/components/federation/LibraryTrackTable.vue:182
+#: front/src/components/manage/library/FilesTable.vue:175
+msgid "Search by title, artist, domain..."
+msgstr "Recercar per títol, artista, domeni..."
+
+#: front/src/components/federation/LibraryFollowTable.vue:140
+msgid "Search by username, domain..."
+msgstr "Recercar per nom d’utilizaire, domeni..."
+
+#: front/src/components/manage/users/InvitationsTable.vue:152
+msgid "Search by username, email, code..."
+msgstr "Recercar per nom d’utilizaire, corrièl, còdi..."
+
+#: front/src/components/manage/users/UsersTable.vue:162
+msgid "Search by username, email, name..."
+msgstr "Recercar per nom d’utilizaire, corrièl, nom..."
+
+#: front/src/components/audio/SearchBar.vue:20
+msgid "Search for artists, albums, tracks..."
+msgstr "Recercar d’artistas, d’albums, de pistas..."
+
+#: front/src/components/audio/Search.vue:2
+msgid "Search for some music"
+msgstr "Recercar de musica"
+
+#: front/src/components/library/Track.vue:105
+msgid "Search on lyrics.wikia.com"
+msgstr "Recercar sus lyrics.wikia.com"
+
+#: front/src/components/library/Album.vue:33
+#: src/components/library/Artist.vue:31
+#: front/src/components/library/Track.vue:40
+msgid "Search on Wikipedia"
+msgstr "Recercar sus Wikipèdia"
+
+#: front/src/components/library/import/TrackImport.vue:42
+msgid "Search query"
+msgstr "Recèrca"
+
+#: front/src/views/admin/Settings.vue:15
+msgid "Sections"
+msgstr "Seccions"
+
+#: front/src/components/library/radios/Builder.vue:41
+msgid "Select a filter"
+msgstr "Seleccionar un filtre"
+
+#: front/src/components/common/ActionTable.vue:61
+msgid "Select all %{ total } elements"
+msgid_plural "Select all %{ total } elements"
+msgstr[0] "Seleccionar l’ensemble dels %{ total } element"
+msgstr[1] "Seleccionar l’ensemble dels %{ total } elements"
+
+#: front/src/components/library/import/FileUpload.vue:22
+msgid "Select files to upload..."
+msgstr "Seleccionar los fichièrs per enviar..."
+
+#: front/src/components/common/ActionTable.vue:69
+msgid "Select only current page"
+msgstr "Seleccionar solament la pagina actuala"
+
+#: front/src/components/library/import/Main.vue:19
+msgid "Select relevant sources or files for import"
+msgstr "Seleccionar las fonts o los fichièrs d’importar"
+
+#: front/src/components/federation/LibraryCard.vue:43
+msgid "Send a follow request"
+msgstr "Enviar una demanda d’abonament"
+
+#: front/src/components/Sidebar.vue:97
+#: src/components/manage/users/UsersTable.vue:184
+#: front/src/views/admin/users/UsersDetail.vue:165
+msgid "Settings"
+msgstr "Paramètres"
+
+#: front/src/components/auth/Settings.vue:10
+msgid "Settings updated"
+msgstr "Paramètres actualizats"
+
+#: front/src/components/admin/SettingsGroup.vue:11
+msgid "Settings updated successfully."
+msgstr "Paramètres corrèctament modificats."
+
+#: front/src/components/auth/Profile.vue:24
+msgid "Settings..."
+msgstr "Paramètres..."
+
+#: front/src/components/manage/users/InvitationForm.vue:27
+msgid "Share link"
+msgstr "Ligam de partatge"
+
+#: front/src/components/audio/artist/Card.vue:30
+msgid "Show 1 more album"
+msgid_plural "Show %{ count } more albums"
+msgstr[0] "Mostrar 1 album mai"
+msgstr[1] "Mostrar %{ count } albums mai"
+
+#: front/src/components/audio/album/Card.vue:40
+msgid "Show 1 more track"
+msgid_plural "Show %{ count } more tracks"
+msgstr[0] "Mostrar 1 pista mai"
+msgstr[1] "Mostrar %{ count } pistas mai"
+
+#: front/src/components/forms/PasswordInput.vue:25
+msgid "Show/hide password"
+msgstr "Mostrar/amagar lo senhal"
+
+#: front/src/components/federation/LibraryFollowTable.vue:97
+#: front/src/components/federation/LibraryTrackTable.vue:98
+#: front/src/components/library/import/BatchDetail.vue:128
+#: front/src/components/library/import/BatchList.vue:73
+#: front/src/components/manage/library/FilesTable.vue:97
+#: front/src/components/manage/library/RequestsTable.vue:104
+#: front/src/components/manage/users/InvitationsTable.vue:76
+#: front/src/components/manage/users/UsersTable.vue:87
+msgid "Showing results %{ start }-%{ end } on %{ total }"
+msgstr "Afichatge dels resultats %{ start }-%{ end } sus %{ total }"
+
+#: front/src/components/audio/Player.vue:269
+msgid "Shuffle your queue"
+msgstr "Mesclar la fila"
+
+#: front/src/components/auth/Signup.vue:95
+msgid "Sign Up"
+msgstr "Inscripcion"
+
+#: front/src/components/manage/users/UsersTable.vue:40
+#: front/src/views/admin/users/UsersDetail.vue:37
+msgid "Sign-up"
+msgstr "Inscripcion"
+
+#: front/src/components/audio/track/Table.vue:31
+msgid "Simply copy paste the snippet below into a terminal to launch the download."
+msgstr "Copiatz lo tèxte çai-jos dins un terminal per lançar lo telecargament."
+
+#: front/src/components/library/Track.vue:69
+#: front/src/components/library/import/FileUpload.vue:44
+#: front/src/components/manage/library/FilesTable.vue:44
+msgid "Size"
+msgstr "Talha"
+
+#: front/src/components/library/import/BatchDetail.vue:37
+#: front/src/components/library/import/BatchDetail.vue:72
+msgid "Skipped"
+msgstr "Ignorat"
+
+#: front/src/components/requests/Form.vue:3
+msgid "Something's missing in the library? Let us know what you would like to listen!"
+msgstr "Manca quicòm a la bibliotèca ? Digatz-nos çò que volètz escotar !"
+
+#: front/src/components/audio/Search.vue:25
+msgid "Sorry, we did not found any album matching your query"
+msgstr "O planhèm, avèm pas trobat cap d’album que correspond a vòstra recèrca"
+
+#: front/src/components/audio/Search.vue:16
+msgid "Sorry, we did not found any artist matching your query"
+msgstr ""
+"O planhèm, avèm pas trobat cap d’artista que correspond a vòstra recèrca"
+
+#: front/src/components/library/import/BatchDetail.vue:82
+#: front/src/components/library/import/BatchList.vue:38
+#: front/src/components/library/import/TrackImport.vue:17
+msgid "Source"
+msgstr "Font"
+
+#: front/src/App.vue:41
+msgid "Source code"
+msgstr "Còdi font"
+
+#: front/src/App.vue:40
+msgid "Source code (%{version})"
+msgstr "Còdi font (%{version})"
+
+#: front/src/components/auth/Profile.vue:20
+#: front/src/components/manage/users/UsersTable.vue:70
+msgid "Staff member"
+msgstr "Membre de la còla"
+
+#: front/src/components/radios/Button.vue:4
+msgid "Start"
+msgstr "Aviar"
+
+#: front/src/components/library/import/FileUpload.vue:28
+msgid "Start Upload"
+msgstr "Aviar lo mandadís"
+
+#: front/src/views/admin/Settings.vue:86
+msgid "Statistics"
+msgstr "Estatisticas"
+
+#: front/src/components/federation/LibraryFollowTable.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:66
+#: front/src/components/library/import/BatchDetail.vue:83
+#: front/src/components/library/import/BatchList.vue:11
+#: front/src/components/library/import/BatchList.vue:37
+#: front/src/components/library/import/FileUpload.vue:45
+#: front/src/components/manage/library/RequestsTable.vue:24
+#: front/src/components/manage/library/RequestsTable.vue:48
+#: front/src/components/manage/users/InvitationsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:39
+#: front/src/components/manage/users/UsersTable.vue:43
+msgid "Status"
+msgstr "Estatut"
+
+#: front/src/components/radios/Button.vue:3
+msgid "Stop"
+msgstr "Arrestar"
+
+#: front/src/components/Sidebar.vue:159
+msgid "Stop radio"
+msgstr "Arrestar la ràdio"
+
+#: front/src/components/library/import/FileUpload.vue:32
+msgid "Stop Upload"
+msgstr "Arrestar lo mandadís"
+
+#: front/src/App.vue:9 src/components/requests/Form.vue:17
+msgid "Submit"
+msgstr "Validar"
+
+#: front/src/components/requests/Form.vue:22
+msgid "Submit another request"
+msgstr "Enviar una novèla requèsta"
+
+#: front/src/components/library/import/BatchDetail.vue:26
+#: front/src/components/library/import/BatchList.vue:39
+msgid "Submitted by"
+msgstr "Prepausat per"
+
+#: front/src/views/admin/Settings.vue:85
+msgid "Subsonic"
+msgstr "Subsonic"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:2
+msgid "Subsonic API password"
+msgstr "Senhal de l’API Subsonic"
+
+#: front/src/components/library/import/BatchDetail.vue:71
+#: front/src/components/library/import/BatchList.vue:16
+#: front/src/components/library/import/FileUpload.vue:56
+msgid "Success"
+msgstr "Succès"
+
+#: front/src/App.vue:11
+msgid "Suggested choices"
+msgstr "Suggestions"
+
+#: front/src/components/playlists/Editor.vue:9
+msgid "Syncing changes to server..."
+msgstr "Sincronizacion dels cambiaments amb lo servidor..."
+
+#: front/src/components/Home.vue:26
+msgid "That's simple: we loved Grooveshark and we want to build something even better."
+msgstr ""
+"Es simple : nos agradava Grooveshark e voliam construire quicòm de melhor."
+
+#: front/src/components/requests/Form.vue:73
+msgid "The Beatles, Mickael Jackson…"
+msgstr "Los Beatles, Mickael Jackson…"
+
+#: front/src/App.vue:59
+msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
+msgstr "Lo logotipe de Funkwhale foguèt dessenhat e fornit per Francis Gading."
+
+#: front/src/components/Home.vue:124
+msgid "The plaform is free and open-source, you can install it and modify it without worries"
+msgstr ""
+"La plataforma es gratuita e liura, podètz l’installar e la modificar sens "
+"cap de limit"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:4
+msgid "The Subsonic API is not available on this Funkwhale instance."
+msgstr "L’API Subsonic es pas disponibla per aquesta instància Funkwhale."
+
+#: front/src/components/requests/Form.vue:74
+msgid "The White Album, Thriller…"
+msgstr "L'Album Blanc, Thriller…"
+
+#: front/src/components/audio/track/Table.vue:30
+msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks."
+msgstr ""
+"Es pas possible pel moment de telecargar un ensemble de pistas coma un "
+"archiu ZIP. Pr’aquò, podètz utilizar una aisina en linha de comanda coma "
+"cURL per telecargar facilament una lista de pistas."
+
+#: front/src/components/library/import/Main.vue:149
+msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled."
+msgstr ""
+"Aqueste import serà associat a la requèsta çai-jos. Un còp acabat, la "
+"requèsta sera marcada coma completada."
+
+#: front/src/views/federation/LibraryDetail.vue:195
+msgid "This indicate if the remote library granted you access"
+msgstr "Aquò indica se la bibliotèca alonhada vos a donat l’accès"
+
+#: front/src/components/auth/Profile.vue:16
+msgid "This is you!"
+msgstr "Sètz vos !"
+
+#: front/src/components/common/ActionTable.vue:37
+msgid "This may affect a lot of elements, please double check this is really what you want."
+msgstr ""
+"Aquesta operacion pòt afectar mantun elements, mercés de verificar s’es ben "
+"çò que desiratz."
+
+#: front/src/components/audio/PlayButton.vue:61
+msgid "This track is not imported and cannot be played"
+msgstr "Aquesta pista es pas importada e òm pòt pas la legir"
+
+#: front/src/views/playlists/Detail.vue:37
+msgid "This will completely delete this playlist and cannot be undone."
+msgstr ""
+"Aquò escafarà aquesta lista de lectura per totjorn e poirà pas èsser anullat."
+
+#: front/src/views/radios/Detail.vue:27
+msgid "This will completely delete this radio and cannot be undone."
+msgstr "Aquò escafarà aquesta ràdio per totjorn e poirà pas èsser anullat."
+
+#: front/src/components/auth/SubsonicTokenForm.vue:51
+msgid "This will completely disable access to the Subsonic API using from account."
+msgstr ""
+"Aquò desactivarà complètament l’accès a l’API Subsonic de vòstre compte "
+"estant."
+
+#: front/src/App.vue:137
+msgid "This will erase your local data and disconnect you, do you want to continue?"
+msgstr ""
+"Aquò escafarà vòstras donadas localas e vos desconnectarà, volètz contunhar ?"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:36
+msgid "This will log you out from existing devices that use the current password."
+msgstr ""
+"Aquò vos desconnectarà de totes los periferics qu’utilizan aqueste senhal."
+
+#: front/src/components/playlists/Editor.vue:44
+msgid "This will remove all tracks from this playlist and cannot be undone."
+msgstr ""
+"Aquò escafarà totas las pistas de la lista de lectura e poirà pas èsser "
+"anullat."
+
+#: front/src/components/audio/track/Table.vue:6
+#: front/src/components/federation/LibraryTrackTable.vue:47
+#: front/src/components/manage/library/FilesTable.vue:37
+msgid "Title"
+msgstr "Títol"
+
+#: front/src/components/audio/SearchBar.vue:27
+#: src/components/library/Track.vue:174
+#: front/src/components/library/import/BatchDetail.vue:84
+#: front/src/components/metadata/Search.vue:138
+msgid "Track"
+msgstr "Pista"
+
+#: front/src/components/library/Track.vue:53
+msgid "Track information"
+msgstr "Informacions de la pista"
+
+#: front/src/components/library/radios/Filter.vue:44
+msgid "Track matching filter"
+msgstr "Pista correspondent al filtre"
+
+#: front/src/components/instance/Stats.vue:54
+msgid "tracks"
+msgstr "pistas"
+
+#: front/src/components/library/Album.vue:43
+#: front/src/components/playlists/PlaylistModal.vue:33
+#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50
+#: front/src/views/radios/Detail.vue:34
+msgid "Tracks"
+msgstr "Pistas"
+
+#: front/src/views/federation/LibraryDetail.vue:125
+msgid "Tracks available in this library"
+msgstr "Pistas disponiblas dins aquesta bibliotèca"
+
+#: front/src/components/library/Artist.vue:54
+msgid "Tracks by this artist"
+msgstr "Pistas d’aqueste artista"
+
+#: front/src/components/instance/Stats.vue:25
+msgid "Tracks favorited"
+msgstr "Pistas en favorits"
+
+#: front/src/components/instance/Stats.vue:19
+msgid "tracks listened"
+msgstr "pistas escotadas"
+
+#: front/src/views/federation/LibraryDetail.vue:109
+msgid "Trigger scan"
+msgstr "Aviar un analisi"
+
+#: front/src/components/manage/library/FilesTable.vue:41
+msgid "Type"
+msgstr "Tipe"
+
+#: front/src/components/About.vue:15
+msgid "Unfortunately, owners of this instance did not yet take the time to complete this page."
+msgstr ""
+"Malurosament, los gestionaris d’aquesta instància completèron pas aquesta "
+"pagina."
+
+#: front/src/views/federation/LibraryDetail.vue:95
+msgid "Unknown"
+msgstr "Desconegut"
+
+#: front/src/components/Home.vue:37
+msgid "Unlimited music"
+msgstr "Musica sens cap de limit"
+
+#: front/src/components/audio/Player.vue:264
+msgid "Unmute"
+msgstr "Restablir lo son"
+
+#: front/src/components/auth/Settings.vue:50
+msgid "Update avatar"
+msgstr "Actualizar l’avatar"
+
+#: front/src/components/playlists/Form.vue:33
+msgid "Update playlist"
+msgstr "Actualizar la lista de lectura"
+
+#: front/src/components/auth/Settings.vue:27
+msgid "Update settings"
+msgstr "Actualizar los paramètres"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:21
+msgid "Update your password"
+msgstr "Actualizar vòstre senhal"
+
+#: front/src/components/manage/users/UsersTable.vue:172
+#: front/src/views/admin/users/UsersDetail.vue:153
+msgid "Upload"
+msgstr "Mandadís"
+
+#: front/src/components/auth/Settings.vue:45
+msgid "Upload a new avatar"
+msgstr "Enviar un nòu avatar"
+
+#: front/src/components/library/import/Main.vue:7
+msgid "Uploaded files or external source"
+msgstr "Fichièrs enviats o font extèrna"
+
+#: front/src/components/library/import/FileUpload.vue:57
+msgid "Uploading..."
+msgstr "Mandadís en cors..."
+
+#: front/src/App.vue:45
+msgid "Use another instance"
+msgstr "Utilizar una autra instància"
+
+#: front/src/components/requests/Form.vue:75
+msgid "Use this comment box to add details to your request if needed"
+msgstr "Utilizatz aqueste camp per ajustar de detalhs a vòstra demanda, se cal"
+
+#: front/src/views/federation/LibraryDetail.vue:196
+msgid "Use this flag to enable/disable federation with this library"
+msgstr ""
+"Utilizatz aqueste paramètre per activar/desactivar la deferacion amb aquesta "
+"bibliotèca"
+
+#: front/src/views/auth/PasswordReset.vue:12
+msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
+msgstr ""
+"Garnissètz aqueste formulari per demandar un nòu senhal. Auretz un corrièl a "
+"vòstra adreça indicada contenent las consignas de reïnicializacion."
+
+#: front/src/components/federation/LibraryForm.vue:6
+msgid "Use this form to scan an instance and setup federation."
+msgstr ""
+"Utilizatz aqueste formulari per analizar lo catalòg d’una instància e "
+"establir la federacion."
+
+#: front/src/components/manage/users/InvitationsTable.vue:49
+msgid "Used"
+msgstr "Utilizat"
+
+#: front/src/components/manage/library/RequestsTable.vue:47
+msgid "User"
+msgstr "Utilizaire"
+
+#: front/src/components/instance/Stats.vue:5
+msgid "User activity"
+msgstr "Activitat dels utilizaires"
+
+#: front/src/components/library/Radios.vue:20
+msgid "User radios"
+msgstr "Ràdios dels utilizaires"
+
+#: front/src/components/auth/Signup.vue:19
+#: front/src/components/manage/users/UsersTable.vue:37
+msgid "Username"
+msgstr "Nom d’utilizaire"
+
+#: front/src/components/auth/Login.vue:15
+msgid "Username or email"
+msgstr "Nom d’utilizaire o corrièl"
+
+#: front/src/components/instance/Stats.vue:13
+msgid "users"
+msgstr "utilizaire"
+
+#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81
+#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3
+#: front/src/views/admin/users/UsersList.vue:21
+msgid "Users"
+msgstr "Utilizaires"
+
+#: front/src/components/library/Album.vue:37
+#: src/components/library/Artist.vue:35
+#: front/src/components/library/Track.vue:44
+#: front/src/components/library/import/ArtistImport.vue:131
+#: front/src/components/metadata/ArtistCard.vue:49
+#: front/src/components/metadata/ReleaseCard.vue:53
+msgid "View on MusicBrainz"
+msgstr "Veire sus MusicBrainz"
+
+#: front/src/components/playlists/PlaylistModal.vue:20
+msgid "We cannot add the track to a playlist"
+msgstr "Podèm pas ajustar aquesta pista a una lista de lectura"
+
+#: front/src/components/playlists/Form.vue:14
+msgid "We cannot create the playlist"
+msgstr "Podèm pas crear aquesta lista de lectura"
+
+#: front/src/components/auth/Signup.vue:13
+msgid "We cannot create your account"
+msgstr "Podèm pas crear vòstre compte"
+
+#: front/src/components/auth/Login.vue:7
+msgid "We cannot log you in"
+msgstr "Error pendent la connexion"
+
+#: front/src/components/auth/Settings.vue:38
+msgid "We cannot save your avatar"
+msgstr "Podèm pas enregistrar vòstre avatar"
+
+#: front/src/components/auth/Settings.vue:14
+msgid "We cannot save your settings"
+msgstr "Podèm pas enregistrar vòstres paramètres"
+
+#: front/src/components/Home.vue:130
+msgid "We do not track you or bother you with ads"
+msgstr "Vos pistam pas e vos mostram pas cap de reclama"
+
+#: front/src/components/library/import/FileUpload.vue:5
+msgid "We recommend using Picard for that purpose."
+msgstr "Vos recomandam d’utilizar lo logicial Picard per aquò far."
+
+#: front/src/components/Home.vue:7
+msgid "We think listening to music should be simple."
+msgstr "Pensam que l’accès a la musica deuriá èsser simple."
+
+#: front/src/components/PageNotFound.vue:10
+msgid "We're sorry, the page you asked for does not exist:"
+msgstr "O planhèm, la pagina demandada existís pas :"
+
+#: front/src/components/requests/Form.vue:21
+msgid "We've received your request, you'll get some groove soon ;)"
+msgstr "Avèm ben recebut vòstra requèsta, aurètz lèu de novèlas ;)"
+
+#: front/src/components/Home.vue:152
+msgid "Welcome"
+msgstr "La benvenguda"
+
+#: front/src/components/Home.vue:5
+msgid "Welcome on Funkwhale"
+msgstr "La benvenguda a Funkwhale"
+
+#: front/src/components/library/import/Main.vue:114
+msgid "What is metadata?"
+msgstr "Qu’es aquò las metadonadas ?"
+
+#: front/src/views/federation/LibraryDetail.vue:197
+msgid "When enabled, auto importing will automatically import new tracks published in this library"
+msgstr ""
+"S’aqueste paramètre es activat, las novèlas pistas ajustadas a aquesta "
+"bibliotèca seràn automaticament importadas"
+
+#: front/src/components/Home.vue:24
+msgid "Why funkwhale?"
+msgstr "Perque Funkwhale ?"
+
+#: front/src/components/Sidebar.vue:124
+msgid "Yes"
+msgstr "Ã’c"
+
+#: front/src/components/auth/Logout.vue:8
+msgid "Yes, log me out!"
+msgstr "Òc-ben, desconnectatz-me !"
+
+#: front/src/components/auth/Logout.vue:7
+msgid "You are currently logged in as %{ username }"
+msgstr "Sètz connectat coma %{ username }"
+
+#: front/src/components/library/import/Main.vue:111
+msgid "You can also skip this step and enter metadata manually."
+msgstr "Podètz passar aquesta etapa e dintrar las metadonadas manualament."
+
+#: front/src/components/Home.vue:136
+msgid "You can invite friends and family to your instance so they can enjoy your music"
+msgstr ""
+"Podètz convidar vòstres amics e vòstra familha a aquesta instància per que "
+"pòscan profeitar de vòstra musica"
+
+#: front/src/components/library/radios/Builder.vue:7
+msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria."
+msgstr ""
+"Podètz utilizar aquesta interfàcia per realizar vòstra pròpria ràdio "
+"personalizada, que jogarà las listas segon los critèris indicats."
+
+#: front/src/components/auth/SubsonicTokenForm.vue:8
+msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
+msgstr ""
+"Podètz los utilizar per profeitar de vòstras listas de lectura e de vòstra "
+"musica en mòde fòra linha sus vòstre mobil, tableta, per exemple."
+
+#: front/src/components/Sidebar.vue:156
+msgid "You have a radio playing"
+msgstr "Escotatz una ràdio"
+
+#: front/src/App.vue:6
+msgid "You need to select an instance in order to continue"
+msgstr "Vos cal causir una instància per contunhar"
+
+#: front/src/components/auth/Settings.vue:100
+msgid "You will be logged out from this session and have to log in with the new one"
+msgstr ""
+"Sètz per èsser desconnectat d’aquesta session e vos caldrà vos connectar amb "
+"lo nòu senhal"
+
+#: front/src/components/auth/Settings.vue:71
+msgid "You will have to update your password on your clients that use this password."
+msgstr ""
+"Vos caldrà actualizar lo senhal sus totes los clients qu’utilizan aqueste "
+"senhal."
+
+#: front/src/components/library/import/Main.vue:103
+msgid "You will import:"
+msgstr "Sètz per importar :"
+
+#: front/src/views/auth/EmailConfirm.vue:24
+msgid "Your email address was confirmed, you can now use the service without limitations."
+msgstr ""
+"Vòstra adreça electronica es confirmada, podètz ara utilizar lo servici sens "
+"cap de limitacions."
+
+#: front/src/components/favorites/List.vue:109
+msgid "Your Favorites"
+msgstr "Vòstres favorits"
+
+#: front/src/components/Home.vue:117
+msgid "Your music, your way"
+msgstr "Vòstra musica, coma volètz"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:29
+msgid "Your password has been updated successfully."
+msgstr "Vòstre senhal es corrèctament cambiat."
+
+#: front/src/components/auth/Settings.vue:101
+msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
+msgstr ""
+"Vòstre senhal Subsonic serà remplaçat per un nòu aleatòri, aquò vos "
+"desconnectarà de totes los periferics qu’utilizan l’ancian senhal"
+
+#: front/src/components/audio/PlayButton.vue:156
+msgid "%{ count } track was added to your queue"
+msgid_plural "%{ count } tracks were added to your queue"
+msgstr[0] "%{ count } pista ajustada a la fila"
+msgstr[1] "%{ count } pistas ajustadas a la fila"
diff --git a/front/locales/pl/LC_MESSAGES/app.po b/front/locales/pl/LC_MESSAGES/app.po
new file mode 100644
index 0000000000000000000000000000000000000000..7cf384b590a4047fee8be977775c97e4d4953e6c
--- /dev/null
+++ b/front/locales/pl/LC_MESSAGES/app.po
@@ -0,0 +1,2478 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the front package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: front 1.0.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-07-22 14:12+0200\n"
+"PO-Revision-Date: 2018-07-20 19:03+0000\n"
+"Last-Translator: Marcin Mikołajczak <me@m4sk.in>\n"
+"Language-Team: \n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 2.20\n"
+
+#: front/src/components/playlists/PlaylistModal.vue:9
+msgid "\"%{ title }\", by %{ artist }"
+msgstr "„%{ title }”, od %{ artist }"
+
+#: front/src/components/Sidebar.vue:24
+msgid "(%{ index } of %{ length })"
+msgstr "(%{ index } z %{ length })"
+
+#: front/src/components/Sidebar.vue:22
+msgid "(empty)"
+msgstr "(pusta)"
+
+#: front/src/components/common/ActionTable.vue:43
+#: front/src/components/common/ActionTable.vue:51
+msgid "%{ count } on %{ total } selected"
+msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] "%{ count } z %{ total } zaznaczonego"
+msgstr[1] "%{ count } z %{ total } zaznaczonych"
+msgstr[2] "%{ count } z %{ total } zaznaczonych"
+
+#: front/src/components/Sidebar.vue:116
+#: src/views/federation/LibraryDetail.vue:87
+msgid "%{ count } track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{ count } utwór"
+msgstr[1] "%{ count } utwory"
+msgstr[2] "%{ count } utworów"
+
+#: front/src/components/library/Artist.vue:13
+msgid "%{ count } track in %{ albumsCount } albums"
+msgid_plural "%{ count } tracks in %{ albumsCount } albums"
+msgstr[0] "%{ count } utwór w %{ albumsCount } albumach"
+msgstr[1] "%{ count } utwory w %{ albumsCount } albumach"
+msgstr[2] "%{ count } utworow w %{ albumsCount } albumach"
+
+#: front/src/components/library/radios/Builder.vue:76
+msgid "%{ count } track matching combined filters"
+msgid_plural "%{ count } tracks matching combined filters"
+msgstr[0] "%{ count } utwór zgodny z wybranymi filtrami"
+msgstr[1] "%{ count } utwory zgodne z wybranymi filtrami"
+msgstr[2] "%{ count } utworów zgodnych z wybranymi filtrami"
+
+#: front/src/components/playlists/Card.vue:18
+msgid "%{ count} track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{ count} utwór"
+msgstr[1] "%{ count} utwory"
+msgstr[2] "%{ count} utworów"
+
+#: front/src/components/common/Duration.vue:2
+msgid "%{ hours } h %{ minutes } min"
+msgstr "%{ hours } godz. %{ minutes } min"
+
+#: front/src/components/common/Duration.vue:5
+msgid "%{ minutes } min"
+msgstr "%{ minutes } min"
+
+#: front/src/components/activity/Like.vue:7
+msgid "%{ user } favorited a track"
+msgstr "%{ user } dodał utwór do ulubionych"
+
+#: front/src/components/activity/Listen.vue:7
+msgid "%{ user } listened to a track"
+msgstr "%{ user } słuchał utworu"
+
+#: front/src/components/auth/Profile.vue:49
+msgid "%{ username }'s profile"
+msgstr "Profil %{ username }"
+
+#: front/src/components/audio/artist/Card.vue:41
+msgid "1 album"
+msgid_plural "%{ count } albums"
+msgstr[0] "1 album"
+msgstr[1] "%{ count } albumy"
+msgstr[2] "%{ count } albumów"
+
+#: front/src/components/favorites/List.vue:10
+msgid "1 favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "1 polubienie"
+msgstr[1] "%{ count} polubienia"
+msgstr[2] "%{ count} polubień"
+
+#: front/src/components/audio/album/Card.vue:54
+#: front/src/components/federation/LibraryCard.vue:25
+msgid "1 track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "1 utwór"
+msgstr[1] "%{ count } utwory"
+msgstr[2] "%{ count } utworów"
+
+#: front/src/components/About.vue:5
+msgid "About %{ instance }"
+msgstr "O %{ instance }"
+
+#: front/src/App.vue:54
+msgid "About Funkwhale"
+msgstr "O Funkwhale"
+
+#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55
+msgid "About this instance"
+msgstr "O tej instancji"
+
+#: front/src/components/manage/library/RequestsTable.vue:28
+#: front/src/components/manage/library/RequestsTable.vue:62
+msgid "Accepted"
+msgstr "Zaakceptowano"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:111
+msgid "Access disabled"
+msgstr "Brak dostępu"
+
+#: front/src/components/Home.vue:109
+msgid "Access your music from a clean interface that focus on what really matters"
+msgstr "Uzyskaj dostęp do swojej muzyki z przejrzystego interfejsu skupionego na tym, co naprawdę ważne"
+
+#: front/src/views/admin/users/UsersDetail.vue:54
+msgid "Account active"
+msgstr "Konto aktywne"
+
+#: front/src/components/auth/Settings.vue:5
+msgid "Account settings"
+msgstr "Ustawienia konta"
+
+#: front/src/components/auth/Settings.vue:257
+msgid "Account Settings"
+msgstr "Ustawienia konta"
+
+#: front/src/components/manage/users/UsersTable.vue:39
+msgid "Account status"
+msgstr "Stan konta"
+
+#: front/src/views/auth/PasswordReset.vue:14
+msgid "Account's email"
+msgstr "Adres e-mail konta"
+
+#: front/src/components/common/ActionTable.vue:82
+msgid "Action %{ action } was launched successfully on %{ count } element"
+msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
+msgstr[0] "Działanie %{ action } zostało rozpoczęte pomyślnie na %{ count } elemencie"
+msgstr[1] "Działanie %{ action } zostało rozpoczęte pomyślnie na %{ count } elementach"
+msgstr[2] "Działanie %{ action } zostało rozpoczęte pomyślnie na %{ count } elementach"
+
+#: front/src/components/common/ActionTable.vue:8
+#: front/src/components/federation/LibraryFollowTable.vue:24
+#: front/src/components/library/radios/Builder.vue:60
+#: front/src/components/manage/library/RequestsTable.vue:54
+msgid "Actions"
+msgstr "Działania"
+
+#: front/src/components/manage/users/UsersTable.vue:53
+msgid "Active"
+msgstr "Aktywny"
+
+#: front/src/components/Sidebar.vue:60
+msgid "Activity"
+msgstr "Aktywność"
+
+#: front/src/components/federation/LibraryFollowTable.vue:21
+msgid "Actor"
+msgstr "Aktor"
+
+#: front/src/views/federation/LibraryList.vue:8
+msgid "Add a new library"
+msgstr "Dodaj nowÄ… bibliotekÄ™"
+
+#: front/src/components/library/radios/Builder.vue:46
+msgid "Add filter"
+msgstr "Dodaj filtr"
+
+#: front/src/components/library/radios/Builder.vue:36
+msgid "Add filters to customize your radio"
+msgstr "Dodaj filtry aby dostosować swoje radio"
+
+#: front/src/components/audio/PlayButton.vue:53
+msgid "Add to current queue"
+msgstr "Dodaj do obecnej kolejki"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:4
+#: front/src/components/favorites/TrackFavoriteIcon.vue:21
+msgid "Add to favorites"
+msgstr "Dodaj do ulubionych"
+
+#: front/src/components/playlists/TrackPlaylistIcon.vue:6
+#: front/src/components/playlists/TrackPlaylistIcon.vue:32
+msgid "Add to playlist..."
+msgstr "Dodaj do playlisty…"
+
+#: front/src/components/audio/PlayButton.vue:14
+msgid "Add to queue"
+msgstr "Dodaj do kolejki"
+
+#: front/src/components/playlists/PlaylistModal.vue:116
+msgid "Add to this playlist"
+msgstr "Dodaj do tej playlisty"
+
+#: front/src/components/playlists/PlaylistModal.vue:54
+msgid "Add track"
+msgstr "Dodaj utwór"
+
+#: front/src/components/manage/users/UsersTable.vue:69
+msgid "Admin"
+msgstr "Administrator"
+
+#: front/src/components/Sidebar.vue:64
+msgid "Administration"
+msgstr "Administracja"
+
+#: front/src/components/audio/SearchBar.vue:26
+#: src/components/audio/track/Table.vue:8
+#: front/src/components/federation/LibraryTrackTable.vue:49
+#: front/src/components/library/Album.vue:91
+#: front/src/components/manage/library/FilesTable.vue:39
+#: front/src/components/metadata/Search.vue:134
+msgid "Album"
+msgstr "Album"
+
+#: front/src/components/library/import/ReleaseImport.vue:3
+msgid "Album %{ title } (%{ count } track) by %{ artist }"
+msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }"
+msgstr[0] "Album %{ title } (%{ count } utwór) od %{ artist }"
+msgstr[1] "Album %{ title } (%{ count } utwory) od %{ artist }"
+msgstr[2] "Album %{ title } (%{ count } utworów) od %{ artist }"
+
+#: front/src/components/library/Album.vue:12
+msgid "Album containing %{ count } track, by %{ artist }"
+msgid_plural "Album containing %{ count } tracks, by %{ artist }"
+msgstr[0] "Album zawiera %{ count } utwór od %{ artist }"
+msgstr[1] "Album zawiera %{ count } utwory od %{ artist }"
+msgstr[2] "Album zawiera %{ count } utworów od %{ artist }"
+
+#: front/src/components/library/Track.vue:20
+msgid "Album page"
+msgstr "Strona albumu"
+
+#: front/src/components/audio/Search.vue:19
+#: src/components/instance/Stats.vue:48
+#: front/src/components/manage/library/RequestsTable.vue:50
+#: front/src/components/requests/Form.vue:9
+msgid "Albums"
+msgstr "Albumy"
+
+#: front/src/components/library/Artist.vue:44
+msgid "Albums by this artist"
+msgstr "Albumy tego wykonawcy"
+
+#: front/src/components/manage/library/RequestsTable.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:19
+msgid "All"
+msgstr "Wszystkie"
+
+#: front/src/components/playlists/Editor.vue:13
+msgid "An error occured while saving your changes"
+msgstr "Wystąpił błąd podczas zapisywania zmian"
+
+#: front/src/components/auth/Login.vue:10
+msgid "An unknown error happend, this can mean the server is down or cannot be reached"
+msgstr "Wystąpił nieznany błąd, może oznaczać to że serwer jest wyłączony lub nieosiągalny"
+
+#: front/src/components/federation/LibraryTrackTable.vue:11
+#: front/src/components/library/import/BatchDetail.vue:68
+#: front/src/components/library/import/BatchList.vue:13
+#: front/src/components/library/import/BatchList.vue:22
+msgid "Any"
+msgstr "Dowolne"
+
+#: front/src/components/library/import/BatchList.vue:24
+msgid "API"
+msgstr "API"
+
+#: front/src/components/federation/LibraryFollowTable.vue:68
+#: front/src/components/federation/LibraryFollowTable.vue:78
+msgid "Approve"
+msgstr "Zaakceptuj"
+
+#: front/src/components/federation/LibraryFollowTable.vue:70
+msgid "Approve access?"
+msgstr "Pozwolić na dostęp?"
+
+#: front/src/components/federation/LibraryFollowTable.vue:38
+msgid "Approved"
+msgstr "Pozwolono"
+
+#: front/src/components/auth/Logout.vue:5
+msgid "Are you sure you want to log out?"
+msgstr "Czy na pewno chcesz się wylogować?"
+
+#: front/src/components/audio/SearchBar.vue:25
+#: src/components/audio/track/Table.vue:7
+#: front/src/components/federation/LibraryTrackTable.vue:48
+#: front/src/components/library/Artist.vue:119
+#: front/src/components/manage/library/FilesTable.vue:38
+#: front/src/components/manage/library/RequestsTable.vue:49
+#: front/src/components/metadata/Search.vue:130
+msgid "Artist"
+msgstr "Wykonawca"
+
+#: front/src/components/requests/Form.vue:5
+msgid "Artist name"
+msgstr "Nazwa wykonawcy"
+
+#: front/src/components/library/Album.vue:22
+#: src/components/library/Track.vue:23
+msgid "Artist page"
+msgstr "Strona wykonawcy"
+
+#: front/src/components/audio/Search.vue:65
+msgid "Artist, album, track..."
+msgstr "Wykonawca, album, utwór…"
+
+#: front/src/components/audio/Search.vue:10
+#: src/components/instance/Stats.vue:42
+#: front/src/components/library/Artists.vue:119
+#: src/components/library/Library.vue:7
+msgid "Artists"
+msgstr "Wykonawcy"
+
+#: front/src/components/favorites/List.vue:33
+#: front/src/components/federation/LibraryTrackTable.vue:28
+#: front/src/components/library/Artists.vue:25
+#: src/components/library/Radios.vue:44
+#: front/src/components/manage/library/FilesTable.vue:19
+#: front/src/components/manage/library/RequestsTable.vue:19
+#: front/src/components/manage/users/UsersTable.vue:19
+#: front/src/views/federation/LibraryList.vue:28
+#: src/views/playlists/List.vue:27
+msgid "Ascending"
+msgstr "RosnÄ…co"
+
+#: front/src/views/auth/PasswordReset.vue:27
+msgid "Ask for a password reset"
+msgstr "Poproś o zresetowanie hasła"
+
+#: front/src/views/federation/LibraryDetail.vue:56
+msgid "Auto importing"
+msgstr "Automatyczne importowanie"
+
+#: front/src/components/playlists/PlaylistModal.vue:26
+msgid "Available playlists"
+msgstr "Dostępne playlisty"
+
+#: front/src/components/auth/Settings.vue:34
+msgid "Avatar"
+msgstr "Awatar"
+
+#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24
+#: front/src/views/auth/PasswordResetConfirm.vue:18
+msgid "Back to login"
+msgstr "Wróć do logowania"
+
+#: front/src/views/federation/LibraryFollowersList.vue:5
+msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library."
+msgstr "Zachowaj ostrożność akceptując prośby o możliwość śledzenia, ponieważ śledzący będzie miał dostęp do całej Twojej biblioteki."
+
+#: front/src/components/library/Track.vue:80
+#: front/src/components/manage/library/FilesTable.vue:42
+msgid "Bitrate"
+msgstr "Bitrate"
+
+#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
+msgid "Browse"
+msgstr "PrzeglÄ…daj"
+
+#: front/src/components/Sidebar.vue:50
+msgid "Browse library"
+msgstr "PrzeglÄ…daj bibliotekÄ™"
+
+#: front/src/components/library/Artists.vue:4
+msgid "Browsing artists"
+msgstr "Przeglądanie wykonawców"
+
+#: front/src/views/federation/LibraryTrackList.vue:3
+msgid "Browsing federated tracks"
+msgstr "Przeglądanie sfederowanych utworów"
+
+#: front/src/views/federation/LibraryFollowersList.vue:3
+msgid "Browsing followers"
+msgstr "Przeglądanie śledzących"
+
+#: front/src/views/federation/LibraryList.vue:3
+msgid "Browsing libraries"
+msgstr "PrzeglÄ…danie bibliotek"
+
+#: front/src/views/playlists/List.vue:3
+msgid "Browsing playlists"
+msgstr "PrzeglÄ…danie list odtwarzania"
+
+#: front/src/components/library/Radios.vue:4
+msgid "Browsing radios"
+msgstr "Przeglądanie radiów"
+
+#: front/src/components/library/radios/Builder.vue:5
+msgid "Builder"
+msgstr "Budowanie"
+
+#: front/src/components/audio/album/Card.vue:13
+msgid "By %{ artist }"
+msgstr "Od %{ artist }"
+
+#: front/src/components/federation/LibraryFollowTable.vue:57
+msgid "By confirming, %{ username } will be denied access to your library."
+msgstr "Po potwierdzeniu %{ username } nie będzie miał dostępu do Twojej biblioteki."
+
+#: front/src/components/federation/LibraryFollowTable.vue:73
+msgid "By confirming, %{ username } will be granted access to your library."
+msgstr "Po potwierdzeniu %{ username } uzyska dostęp do Twojej biblioteki."
+
+#: front/src/components/audio/track/Table.vue:43
+#: front/src/components/common/DangerousButton.vue:17
+#: front/src/components/library/radios/Filter.vue:53
+#: front/src/components/playlists/PlaylistModal.vue:63
+msgid "Cancel"
+msgstr "Anuluj"
+
+#: front/src/components/library/radios/Builder.vue:59
+msgid "Candidates"
+msgstr "Kandydaci"
+
+#: front/src/components/auth/Settings.vue:76
+msgid "Cannot change your password"
+msgstr "Nie udało się zmienić Twojego hasła"
+
+#: front/src/App.vue:66
+msgid "Change language"
+msgstr "Zmień język"
+
+#: front/src/components/auth/Settings.vue:67
+msgid "Change my password"
+msgstr "Zmień moje hasło"
+
+#: front/src/components/auth/Settings.vue:95
+msgid "Change password"
+msgstr "Zmień hasło"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:4
+#: front/src/views/auth/PasswordResetConfirm.vue:62
+msgid "Change your password"
+msgstr "Zmień swoje hasło"
+
+#: front/src/components/auth/Settings.vue:96
+msgid "Change your password?"
+msgstr "Zmienić Twoje hasło?"
+
+#: front/src/components/playlists/Editor.vue:21
+msgid "Changes synced with server"
+msgstr "Zsynchronizowano zmiany z serwerem"
+
+#: front/src/components/auth/Settings.vue:70
+msgid "Changing your password will also change your Subsonic API password if you have requested one."
+msgstr "ZMiana Twojego hasła zmieni też Twoje hasło API Subsonic, jeżeli uzyskałeś je."
+
+#: front/src/components/auth/Settings.vue:98
+msgid "Changing your password will have the following consequences"
+msgstr "Zmiana hasła będzie miała następujące konsekwencje"
+
+#: front/src/App.vue:4
+msgid "Choose your instance"
+msgstr "Wybierz instancjÄ™"
+
+#: front/src/components/Home.vue:64
+msgid "Clean library"
+msgstr "Przejrzysta biblioteka"
+
+#: front/src/components/manage/users/InvitationForm.vue:37
+msgid "Clear"
+msgstr "Wyczyść"
+
+#: front/src/components/playlists/Editor.vue:40
+#: front/src/components/playlists/Editor.vue:45
+msgid "Clear playlist"
+msgstr "Wyczyść listę odtwarzania"
+
+#: front/src/components/audio/Player.vue:270
+msgid "Clear your queue"
+msgstr "Wyczyść swoją kolejkę"
+
+#: front/src/components/library/import/BatchList.vue:23
+msgid "CLI"
+msgstr "CLI"
+
+#: front/src/components/Home.vue:44
+msgid "Click once, listen for hours using built-in radios"
+msgstr "Naciśnij raz, słuchaj godzinami dzięki wbudowanemu radio"
+
+#: front/src/components/manage/library/RequestsTable.vue:30
+#: front/src/components/manage/library/RequestsTable.vue:64
+msgid "Closed"
+msgstr "Zamknięte"
+
+#: front/src/components/manage/users/InvitationForm.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:42
+msgid "Code"
+msgstr "Kod"
+
+#: front/src/components/audio/album/Card.vue:43
+#: front/src/components/audio/artist/Card.vue:33
+#: front/src/components/discussion/Comment.vue:20
+msgid "Collapse"
+msgstr "Zwiń"
+
+#: front/src/components/manage/library/RequestsTable.vue:51
+#: front/src/components/requests/Form.vue:14
+msgid "Comment"
+msgstr "Komentarz"
+
+#: front/src/components/library/radios/Builder.vue:58
+msgid "Config"
+msgstr "Konfiguracja"
+
+#: front/src/components/common/DangerousButton.vue:21
+msgid "Confirm"
+msgstr "Potwierdź"
+
+#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20
+#: front/src/views/auth/EmailConfirm.vue:51
+msgid "Confirm your email"
+msgstr "Potwierdź swój e-mail"
+
+#: front/src/views/auth/EmailConfirm.vue:13
+msgid "Confirmation code"
+msgstr "Kod potwierdzajÄ…cy"
+
+#: front/src/components/playlists/Editor.vue:163
+msgid "Copy tracks from current queue to playlist"
+msgstr "Skopiuj utwory z obecnej kolejki do listy odtwarzania"
+
+#: front/src/components/Home.vue:88
+msgid "Covers, lyrics, our goal is to have them all ;)"
+msgstr "Covery, teksty, naszym celem jest mieć je wszystkie ;)"
+
+#: front/src/components/auth/Signup.vue:4
+msgid "Create a funkwhale account"
+msgstr "Utwórz konto funkwhale"
+
+#: front/src/components/playlists/Form.vue:2
+msgid "Create a new playlist"
+msgstr "Utwórz nową listę odtwarzania"
+
+#: front/src/components/auth/Login.vue:17
+msgid "Create an account"
+msgstr "Utwórz konto"
+
+#: front/src/components/manage/library/RequestsTable.vue:88
+#: front/src/components/requests/Card.vue:25
+msgid "Create import"
+msgstr "Utwórz importowanie"
+
+#: front/src/components/auth/Signup.vue:51
+msgid "Create my account"
+msgstr "Utwórz konto"
+
+#: front/src/components/playlists/Form.vue:34
+msgid "Create playlist"
+msgstr "Utwórz listę odtwarzania"
+
+#: front/src/components/library/Radios.vue:23
+msgid "Create your own radio"
+msgstr "Utwórz własne radio"
+
+#: front/src/components/federation/LibraryFollowTable.vue:22
+#: front/src/components/manage/library/RequestsTable.vue:52
+#: front/src/components/manage/users/InvitationsTable.vue:40
+msgid "Creation date"
+msgstr "Data utworzenia"
+
+#: front/src/components/auth/Settings.vue:54
+msgid "Current avatar"
+msgstr "Obecny awatar"
+
+#: front/src/components/playlists/PlaylistModal.vue:8
+msgid "Current track"
+msgstr "Obecny utwór"
+
+#: front/src/components/manage/library/FilesTable.vue:189
+#: front/src/components/manage/library/RequestsTable.vue:195
+#: front/src/components/manage/users/InvitationsTable.vue:166
+#: front/src/views/playlists/Detail.vue:33
+msgid "Delete"
+msgstr "Usuń"
+
+#: front/src/views/playlists/Detail.vue:38
+msgid "Delete playlist"
+msgstr "Usuń listę odtwarzania"
+
+#: front/src/views/radios/Detail.vue:28
+msgid "Delete radio"
+msgstr "Usuń radio"
+
+#: front/src/components/federation/LibraryFollowTable.vue:52
+#: front/src/components/federation/LibraryFollowTable.vue:63
+msgid "Deny"
+msgstr "Odmów"
+
+#: front/src/components/federation/LibraryFollowTable.vue:54
+msgid "Deny access?"
+msgstr "Odmówić dostępu?"
+
+#: front/src/components/favorites/List.vue:34
+#: front/src/components/federation/LibraryTrackTable.vue:29
+#: front/src/components/library/Artists.vue:26
+#: src/components/library/Radios.vue:47
+#: front/src/components/manage/library/FilesTable.vue:20
+#: front/src/components/manage/library/RequestsTable.vue:20
+#: front/src/components/manage/users/UsersTable.vue:20
+#: front/src/views/federation/LibraryList.vue:29
+#: src/views/playlists/List.vue:28
+msgid "Descending"
+msgstr "MalejÄ…co"
+
+#: front/src/components/federation/LibraryCard.vue:50
+msgid "Detail"
+msgstr "Szczegół"
+
+#: front/src/views/admin/users/UsersDetail.vue:146
+msgid "Determine if the user account is active or not. Inactive users cannot login or use the service."
+msgstr "Określa, czy konto użytkownika jest aktywne. Nieaktywni użytkownicy nie mogą zalogować się i korzystać z usługi."
+
+#: front/src/components/auth/Settings.vue:104
+#: front/src/components/auth/SubsonicTokenForm.vue:52
+msgid "Disable access"
+msgstr "Wyłącz dostęp"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:49
+msgid "Disable Subsonic access"
+msgstr "Wyłącz dostęp Subsonic"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:50
+msgid "Disable Subsonic API access?"
+msgstr "Wyłączyć dostęp do API Subsonic?"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:14
+msgid "Discover how to use Funkwhale from other apps"
+msgstr "Odkryj, jak korzystać z Funkwhale z innych aplikacji"
+
+#: front/src/components/library/radios/Builder.vue:26
+msgid "Display publicly"
+msgstr "Wyświetlaj publicznie"
+
+#: front/src/components/playlists/Editor.vue:42
+msgid "Do you want to clear the playlist \"%{ playlist }\"?"
+msgstr "Czy chcesz wyczyścić listę odtwarzania „%{ playlist }”?"
+
+#: front/src/components/common/DangerousButton.vue:7
+msgid "Do you want to confirm this action?"
+msgstr "Czy chcesz potwierdzić to działanie?"
+
+#: front/src/views/playlists/Detail.vue:35
+msgid "Do you want to delete the playlist \"%{ playlist }\"?"
+msgstr "Czy chcesz usunąć listę odtwarzania „%{ playlist }”?"
+
+#: front/src/views/radios/Detail.vue:26
+#, fuzzy
+msgid "Do you want to delete the radio \"%{ radio }\"?"
+msgstr "Czy chcesz usunąć radio „{{ radio }}”?"
+
+#: front/src/components/common/ActionTable.vue:29
+msgid "Do you want to launch %{ action } on %{ count } element?"
+msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
+msgstr[0] "Czy chcesz wykonać działanie %{ action } na %{ count } elemencie?"
+msgstr[1] "Czy chcesz wykonać działanie %{ action } na %{ count } elementach?"
+msgstr[2] "Czy chcesz wykonać działanie %{ action } na %{ count } elementach?"
+
+#: front/src/components/Sidebar.vue:113
+msgid "Do you want to restore your previous queue?"
+msgstr "Czy chcesz przywrócić poprzednią kolejkę?"
+
+#: front/src/App.vue:38
+msgid "Documentation"
+msgstr "Dokumentacja"
+
+#: front/src/components/audio/track/Table.vue:24
+#: src/components/library/Track.vue:48
+msgid "Download"
+msgstr "Pobierz"
+
+#: front/src/components/audio/track/Table.vue:27
+msgid "Download tracks"
+msgstr "Pobierz utwory"
+
+#: front/src/components/playlists/Editor.vue:49
+msgid "Drag and drop rows to reorder tracks in the playlist"
+msgstr "Przeciągnij i upuść aby zmienić kolejność utworów w liście odtwarzania"
+
+#: front/src/components/library/Track.vue:58
+#: front/src/components/manage/library/FilesTable.vue:43
+msgid "Duration"
+msgstr "Długość"
+
+#: front/src/components/Home.vue:96
+msgid "Easy to use"
+msgstr "Prosty w użyciu"
+
+#: front/src/components/About.vue:21
+msgid "Edit instance info"
+msgstr "Edytuj informacje o instancji"
+
+#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30
+msgid "Edit..."
+msgstr "Edytuj…"
+
+#: front/src/components/auth/Signup.vue:29
+#: front/src/components/manage/users/UsersTable.vue:38
+msgid "Email"
+msgstr "E-mail"
+
+#: front/src/views/admin/users/UsersDetail.vue:29
+msgid "Email address"
+msgstr "Adres e-mail"
+
+#: front/src/views/auth/EmailConfirm.vue:23
+msgid "Email confirmed"
+msgstr "Potwierdzono e-mail"
+
+#: front/src/views/playlists/Detail.vue:29
+msgid "End edition"
+msgstr "Zakończ edytowanie"
+
+#: front/src/components/library/import/FileUpload.vue:4
+msgid "Ensure your music files are properly tagged before uploading them."
+msgstr "Upewnij się, że pliki muzyczne są odpowiednio otagowane zanim je wyślesz."
+
+#: front/src/components/library/Radios.vue:140
+msgid "Enter a radio name..."
+msgstr "Wprowadź nazwę radia…"
+
+#: front/src/components/library/Artists.vue:118
+msgid "Enter an artist name..."
+msgstr "Wprowadź nazwę wykonawcy…"
+
+#: front/src/views/federation/LibraryList.vue:122
+msgid "Enter an library domain name..."
+msgstr "Wprowadź nazwę domeny biblioteki…"
+
+#: front/src/views/playlists/List.vue:104
+msgid "Enter an playlist name..."
+msgstr "Wprowadź nazwę listy odtwarzania…"
+
+#: front/src/components/auth/Signup.vue:98
+msgid "Enter your email"
+msgstr "Wprowadź swój e-mail"
+
+#: front/src/components/auth/Signup.vue:96
+msgid "Enter your invitation code (case insensitive)"
+msgstr "Wprowadź swój kod zapraszający (wielkość znaków nie ma znaczenia)"
+
+#: front/src/components/metadata/Search.vue:114
+msgid "Enter your search query..."
+msgstr "Wprowadź swoje kryterium wyszukiwania…"
+
+#: front/src/components/auth/Signup.vue:97
+msgid "Enter your username"
+msgstr "Wprowadź swoją nazwę użytkownika"
+
+#: front/src/components/auth/Login.vue:77
+msgid "Enter your username or email"
+msgstr "Wprowadź swoją nazwę użytkownika lub e-mail"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:20
+msgid "Error"
+msgstr "BÅ‚Ä…d"
+
+#: front/src/views/admin/Settings.vue:87
+msgid "Error reporting"
+msgstr "Zgłaszanie błędów"
+
+#: front/src/components/common/ActionTable.vue:75
+msgid "Error while applying action"
+msgstr "Błąd podczas zastosowywania działania"
+
+#: front/src/views/auth/PasswordReset.vue:7
+msgid "Error while asking for a password reset"
+msgstr "Wystąpił błąd podczas prośby o zresetowanie hasła"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:7
+msgid "Error while changing your password"
+msgstr "Wystąpił błąd podczas zmiany hasła"
+
+#: front/src/views/auth/EmailConfirm.vue:7
+msgid "Error while confirming your email"
+msgstr "Wystąpił błąd podczas potwierdzania adresu e-mail"
+
+#: front/src/components/manage/users/InvitationForm.vue:4
+msgid "Error while creating invitation"
+msgstr "Wystąpił błąd podczas tworzenia zaproszenia"
+
+#: front/src/components/admin/SettingsGroup.vue:5
+msgid "Error while saving settings"
+msgstr "Wystąpił błąd podczas zapisywania ustawień"
+
+#: front/src/components/federation/LibraryForm.vue:10
+msgid "Error while scanning library"
+msgstr "Wystąpił błąd podczas przeszukiwania biblioteki"
+
+#: front/src/components/library/import/BatchDetail.vue:41
+#: front/src/components/library/import/BatchDetail.vue:70
+#: front/src/components/library/import/BatchList.vue:15
+msgid "Errored"
+msgstr "Zakończono błędem"
+
+#: front/src/components/playlists/Form.vue:89
+msgid "Everyone"
+msgstr "Wszyscy"
+
+#: front/src/components/playlists/Form.vue:85
+msgid "Everyone on this instance"
+msgstr "Wszyscy na tej instancji"
+
+#: front/src/components/library/radios/Builder.vue:57
+msgid "Exclude"
+msgstr "Wyłącz"
+
+#: front/src/components/discussion/Comment.vue:14
+msgid "Expand"
+msgstr "Rozwiń"
+
+#: front/src/components/manage/users/InvitationsTable.vue:41
+msgid "Expiration date"
+msgstr "Data wygaśnięcia"
+
+#: front/src/components/manage/users/InvitationsTable.vue:50
+msgid "Expired"
+msgstr "Wyczerpany"
+
+#: front/src/components/manage/users/InvitationsTable.vue:21
+msgid "Expired/used"
+msgstr "Wyczerpany/zużyty"
+
+#: front/src/components/library/import/Main.vue:65
+msgid "External source. Supported backends"
+msgstr "Zewnętrzne źródło. Obsługiwane back-endy"
+
+#: front/src/components/Sidebar.vue:51
+msgid "Favorites"
+msgstr "Ulubione"
+
+#: front/src/components/federation/LibraryForm.vue:3
+msgid "Federate with a new instance"
+msgstr "Federuj z nowÄ… instancjÄ…"
+
+#: front/src/views/federation/LibraryTrackList.vue:21
+msgid "Federated tracks"
+msgstr "Sfederowane utwory"
+
+#: front/src/components/Sidebar.vue:87
+#: src/components/library/import/BatchList.vue:25
+#: front/src/components/manage/users/UsersTable.vue:180
+#: front/src/views/admin/Settings.vue:84
+#: src/views/admin/users/UsersDetail.vue:161
+#: front/src/views/federation/Base.vue:35
+#: src/views/federation/LibraryDetail.vue:40
+msgid "Federation"
+msgstr "Federacja"
+
+#: front/src/views/federation/LibraryDetail.vue:3
+msgid "File mirroring"
+msgstr "Powielanie plików"
+
+#: front/src/components/library/import/FileUpload.vue:43
+msgid "File name"
+msgstr "Nazwa pliku"
+
+#: front/src/components/library/import/Main.vue:76
+msgid "File upload"
+msgstr "Wysyłanie pliku"
+
+#: front/src/views/admin/library/Base.vue:5
+#: src/views/admin/library/FilesList.vue:21
+msgid "Files"
+msgstr "Pliki"
+
+#: front/src/components/library/import/ArtistImport.vue:7
+msgid "Filter album types"
+msgstr "Filtruj rodzaje albumów"
+
+#: front/src/components/library/radios/Builder.vue:56
+msgid "Filter name"
+msgstr "Filtruj nazwÄ™"
+
+#: front/src/components/library/import/Main.vue:52
+msgid "Finish import"
+msgstr "Zakończ importowanie"
+
+#: front/src/components/library/import/BatchDetail.vue:54
+msgid "Finished"
+msgstr "Ukończono"
+
+#: front/src/components/library/import/Main.vue:59
+msgid "First, choose where you want to import the music from"
+msgstr "Najpierw wybierz, skąd chcesz zaimportować muzykę"
+
+#: front/src/components/federation/LibraryCard.vue:44
+msgid "Follow"
+msgstr "Śledź"
+
+#: front/src/components/federation/LibraryCard.vue:36
+msgid "Follow request pending approval"
+msgstr "Prośba o możliwość śledzenia oczekuje na zatwierdzenie"
+
+#: front/src/views/federation/LibraryDetail.vue:21
+msgid "Follow status"
+msgstr "Stan śledzenia"
+
+#: front/src/views/federation/Base.vue:13
+#: front/src/views/federation/LibraryFollowersList.vue:24
+msgid "Followers"
+msgstr "ÅšledzÄ…cy"
+
+#: front/src/components/federation/LibraryCard.vue:18
+msgid "Followers only"
+msgstr "Tylko dla śledzących"
+
+#: front/src/components/federation/LibraryCard.vue:15
+#: front/src/views/federation/LibraryDetail.vue:29
+msgid "Following"
+msgstr "Åšledzisz"
+
+#: front/src/components/activity/Like.vue:12
+#: src/components/activity/Listen.vue:12
+msgid "from %{ album } by %{ artist }"
+msgstr "z %{ album } od %{ artist }"
+
+#: front/src/components/library/Track.vue:13
+msgid "From album %{ album } by %{ artist }"
+msgstr "Z albumu %{ album } od %{ artist }"
+
+#: front/src/App.vue:56
+msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!"
+msgstr "Funkwhale jest wolnym i otwartoźródłowym projektem rozwijanym przez wolontariuszy. Możesz pomóc nam ulepszać platformę zgłaszając błędy, propozycje funkcji i polecając projekt znajomym!"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgid "Funkwhale is compatible with other music players that support the Subsonic API."
+msgstr "Funkwhale jest kompatybilny z innymi odtwarzaczami muzycznymi obsługującymi API Subsonic."
+
+#: front/src/components/Home.vue:98
+msgid "Funkwhale is dead simple to use."
+msgstr "Funkwhale jest niezwykle prosty w użyciu."
+
+#: front/src/components/Home.vue:39
+msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists."
+msgstr "Funkwhale został zaprojektowany, aby uczynić słuchanie muzyki którą lubisz i poznawanie nowych wykonawców prostym."
+
+#: front/src/components/Home.vue:119
+msgid "Funkwhale is free and gives you control on your music."
+msgstr "Funkwhale jest wolny i oddaje Ci kontrolÄ™ nad TwojÄ… muzykÄ…."
+
+#: front/src/components/Home.vue:66
+msgid "Funkwhale takes care of handling your music"
+msgstr "Funkwhale dba o TwojÄ… bibliotekÄ™ muzycznÄ…"
+
+#: front/src/components/manage/users/InvitationForm.vue:16
+msgid "Get a new invitation"
+msgstr "Uzyskaj nowe zaproszenie"
+
+#: front/src/components/Home.vue:13
+msgid "Get me to the library"
+msgstr "Pokaż mi bibliotekę"
+
+#: front/src/components/Home.vue:77
+msgid ""
+"Get quality metadata about your music thanks to\n"
+"              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
+msgstr ""
+"Uzyskaj dobrej jakości metadane o Twojej muzyce dzięki\n"
+"              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
+
+#: front/src/components/common/ActionTable.vue:21
+#: front/src/components/common/ActionTable.vue:27
+msgid "Go"
+msgstr "Przejdź"
+
+#: front/src/components/PageNotFound.vue:14
+msgid "Go to home page"
+msgstr "Przejdź na stronę główną"
+
+#: front/src/components/library/import/Main.vue:13
+msgid "Grab corresponding metadata"
+msgstr "Uzyskaj odpowiednie metadane"
+
+#: front/src/App.vue:74
+msgid "Help us translate Funkwhale"
+msgstr ""
+
+#: front/src/components/library/Home.vue:65
+msgid "Home"
+msgstr "Strona główna"
+
+#: front/src/components/instance/Stats.vue:36
+msgid "Hours of music"
+msgstr "Godziny muzyki"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:11
+msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
+msgstr "Korzystanie z Funkwhale z tych klientów wymaga jednak oddzielnego hasła, które możesz ustawić poniżej."
+
+#: front/src/components/library/import/BatchList.vue:34
+msgid "ID"
+msgstr "ID"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:24
+msgid "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."
+msgstr "Jeżeli adres e-mail podany w poprzednim kroku jest prawidłowy i przypisany do konta użytkownika, powinieneś dostać wiadomość z instrukcjami resetowania hasła w przeciągu kilku minut."
+
+#: front/src/components/federation/LibraryTrackTable.vue:196
+#: front/src/components/library/Library.vue:17
+msgid "Import"
+msgstr "Importuj"
+
+#: front/src/components/federation/LibraryTrackTable.vue:57
+msgid "Import #%{ id } launched"
+msgstr "Rozpoczęto importowanie #%{ id }"
+
+#: front/src/components/library/import/Main.vue:38
+msgid "Import %{ count } track"
+msgid_plural "Import %{ count } tracks"
+msgstr[0] "Importuj %{ count } utwór"
+msgstr[1] "Importuj %{ count } utwory"
+msgstr[2] "Importuj %{ count } utwów"
+
+#: front/src/components/library/import/BatchDetail.vue:10
+msgid "Import batch"
+msgstr "Importowanie wsadowe"
+
+#: front/src/components/library/import/BatchDetail.vue:185
+msgid "Import Batch #%{ id }"
+msgstr "Importowanie wsadowe #%{ id }"
+
+#: front/src/components/library/Library.vue:20
+msgid "Import batches"
+msgstr "Importuj wsadowo"
+
+#: front/src/components/library/import/BatchList.vue:117
+msgid "Import Batches"
+msgstr "Importowania wsadowe"
+
+#: front/src/components/manage/library/FilesTable.vue:40
+#: front/src/components/manage/library/RequestsTable.vue:53
+msgid "Import date"
+msgstr "Data zaimportowania"
+
+#: front/src/components/library/import/FileUpload.vue:38
+msgid "Import detail page"
+msgstr "Strona szczegółów importowania"
+
+#: front/src/components/Sidebar.vue:81
+msgid "Import music"
+msgstr "Importuj muzykÄ™"
+
+#: front/src/components/library/import/Main.vue:267
+msgid "Import Music"
+msgstr "Importuj muzykÄ™"
+
+#: front/src/components/Home.vue:71
+msgid "Import music from various platforms, such as YouTube or SoundCloud"
+msgstr "Importuj muzykę z różnych platform, takich jak YouTube i SoundCloud"
+
+#: front/src/components/federation/LibraryTrackTable.vue:14
+#: front/src/components/federation/LibraryTrackTable.vue:66
+msgid "Import pending"
+msgstr "OczekujÄ…ce importowanie"
+
+#: front/src/views/admin/library/Base.vue:9
+#: front/src/views/admin/library/RequestsList.vue:3
+#: front/src/views/admin/library/RequestsList.vue:21
+msgid "Import requests"
+msgstr "Prośby o zaimportowanie"
+
+#: front/src/components/library/import/BatchList.vue:20
+#: front/src/components/library/import/Main.vue:6
+msgid "Import source"
+msgstr "Źródło importu"
+
+#: front/src/components/federation/LibraryTrackTable.vue:9
+msgid "Import status"
+msgstr "Stan importu"
+
+#: front/src/components/library/import/ReleaseImport.vue:14
+msgid "Import this release"
+msgstr "Importuj to wydanie"
+
+#: front/src/components/library/import/TrackImport.vue:11
+msgid "Import this track"
+msgstr "Importuj ten utwór"
+
+#: front/src/components/federation/LibraryTrackTable.vue:12
+#: front/src/components/manage/library/RequestsTable.vue:29
+#: front/src/components/manage/library/RequestsTable.vue:61
+msgid "Imported"
+msgstr "Zaimportowano"
+
+#: front/src/components/library/import/TrackImport.vue:44
+msgid "Imported URL"
+msgstr "Zaimportowany URL"
+
+#: front/src/views/admin/Settings.vue:82
+msgid "Imports"
+msgstr "Importy"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:3
+msgid "In favorites"
+msgstr "W ulubionych"
+
+#: front/src/components/federation/LibraryTrackTable.vue:65
+msgid "In library"
+msgstr "W bibliotece"
+
+#: front/src/components/manage/users/UsersTable.vue:54
+msgid "Inactive"
+msgstr "Nieaktywny"
+
+#: front/src/components/library/import/Main.vue:96
+msgid "Input a MusicBrainz ID manually:"
+msgstr "Wprowadź ID MusicBrainz ręcznie:"
+
+#: front/src/views/auth/PasswordReset.vue:53
+msgid "Input the email address binded to your account"
+msgstr "Wprowadź adres e-mail przypisany do Twojego konta"
+
+#: front/src/components/playlists/Editor.vue:31
+msgid "Insert from queue (%{ count } track)"
+msgid_plural "Insert from queue (%{ count } tracks)"
+msgstr[0] "Dodaj z kolejki (%{ count } utwór)"
+msgstr[1] "Dodaj z kolejki (%{ count } utwory)"
+msgstr[2] "Dodaj z kolejki (%{ count } utworów)"
+
+#: front/src/views/admin/Settings.vue:80
+msgid "Instance information"
+msgstr "Informacje o instancji"
+
+#: front/src/components/library/Radios.vue:9
+msgid "Instance radios"
+msgstr "Radia instancji"
+
+#: front/src/views/admin/Settings.vue:75
+msgid "Instance settings"
+msgstr "Ustawienia instancji"
+
+#: front/src/views/instance/Timeline.vue:57
+msgid "Instance Timeline"
+msgstr "OÅ› czasu instancji"
+
+#: front/src/components/auth/Signup.vue:42
+#: front/src/components/manage/users/InvitationForm.vue:11
+msgid "Invitation code"
+msgstr "Kod zapraszajÄ…cy"
+
+#: front/src/components/auth/Signup.vue:43
+msgid "Invitation code (optional)"
+msgstr "Kod zapraszajÄ…cy (nieobowiÄ…zkowy)"
+
+#: front/src/views/admin/users/Base.vue:8
+#: src/views/admin/users/InvitationsList.vue:3
+#: front/src/views/admin/users/InvitationsList.vue:24
+msgid "Invitations"
+msgstr "Zaproszenia"
+
+#: front/src/App.vue:43
+msgid "Issue tracker"
+msgstr "Śledzenie błędów"
+
+#: front/src/components/library/import/BatchDetail.vue:80
+msgid "Job ID"
+msgstr "ID zadania"
+
+#: front/src/components/library/import/BatchList.vue:36
+msgid "Jobs"
+msgstr "Zadania"
+
+#: front/src/components/Home.vue:50
+msgid "Keep a track of your favorite songs"
+msgstr "Zachowaj kontrolÄ™ nad ulubionymi utworami"
+
+#: front/src/components/audio/track/Table.vue:33
+msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account."
+msgstr "Zachowaj swój PRIVATE_TOKEN dla siebie, ponieważ daje on dostęp do Twojego konta."
+
+#: front/src/components/manage/users/UsersTable.vue:41
+#: front/src/views/admin/users/UsersDetail.vue:45
+msgid "Last activity"
+msgstr "Ostatnia aktywność"
+
+#: front/src/views/federation/LibraryDetail.vue:101
+msgid "Last fetched"
+msgstr "Ostatnio dodane"
+
+#: front/src/components/playlists/PlaylistModal.vue:32
+msgid "Last modification"
+msgstr "Ostatnia modyfikacja"
+
+#: front/src/components/common/ActionTable.vue:39
+msgid "Launch"
+msgstr "Uruchom"
+
+#: front/src/components/library/import/BatchDetail.vue:18
+#: front/src/components/library/import/BatchList.vue:35
+msgid "Launch date"
+msgstr "Data uruchomienia"
+
+#: front/src/components/federation/LibraryForm.vue:31
+msgid "Launch scan"
+msgstr "Uruchom skanowanie"
+
+#: front/src/components/Home.vue:10
+msgid "Learn more about this instance"
+msgstr "Dowiedz się więcej o tej instancji"
+
+#: front/src/components/manage/users/InvitationForm.vue:58
+msgid "Leave empty for a random code"
+msgstr "Pozostaw puste, aby wygenerować kod"
+
+#: front/src/components/requests/Form.vue:10
+msgid "Leave this field empty if you're requesting the whole discography."
+msgstr "Pozostaw to pole puste, jeżeli chcesz całą dyskografię."
+
+#: front/src/views/federation/Base.vue:5
+#: src/views/federation/LibraryList.vue:123
+msgid "Libraries"
+msgstr "Biblioteki"
+
+#: front/src/components/Sidebar.vue:70
+#: front/src/components/federation/LibraryTrackTable.vue:51
+#: front/src/components/instance/Stats.vue:30
+#: front/src/components/manage/users/UsersTable.vue:176
+#: front/src/views/admin/users/UsersDetail.vue:157
+#: front/src/views/federation/LibraryDetail.vue:194
+msgid "Library"
+msgstr "Biblioteka"
+
+#: front/src/views/admin/library/FilesList.vue:3
+msgid "Library files"
+msgstr "Pliki z biblioteki"
+
+#: front/src/components/federation/LibraryForm.vue:20
+msgid "Library name"
+msgstr "Nazwa biblioteki"
+
+#: front/src/views/federation/LibraryDetail.vue:84
+msgid "Library size"
+msgstr "Rozmiar biblioteki"
+
+#: front/src/components/federation/LibraryForm.vue:96
+msgid "library@demo.funkwhale.audio"
+msgstr "library@demo.funkwhale.audio"
+
+#: front/src/App.vue:29
+msgid "Links"
+msgstr "Odnośniki"
+
+#: front/src/views/instance/Timeline.vue:4
+msgid "Loading timeline..."
+msgstr "Ładowanie osi czasu…"
+
+#: front/src/components/favorites/List.vue:5
+msgid "Loading your favorites..."
+msgstr "Ładowanie Twoich ulubionych…"
+
+#: front/src/components/auth/Login.vue:78
+msgid "Log In"
+msgstr "Zaloguj siÄ™"
+
+#: front/src/components/auth/Login.vue:4
+msgid "Log in to your Funkwhale account"
+msgstr "Zaloguj siÄ™ na swoje konto Funkwhale"
+
+#: front/src/components/auth/Logout.vue:20
+msgid "Log Out"
+msgstr "Wyloguj siÄ™"
+
+#: front/src/components/Sidebar.vue:38
+msgid "Logged in as %{ username }"
+msgstr "Zalogowano jako %{ username }"
+
+#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41
+msgid "Login"
+msgstr "Logowanie"
+
+#: front/src/components/Sidebar.vue:43
+msgid "Logout"
+msgstr "Wyloguj siÄ™"
+
+#: front/src/components/audio/Player.vue:266
+msgid "Looping disabled. Click to switch to single-track looping."
+msgstr "Zapętlanie jest wyłączone. Naciśnij, aby przełączyć na powtarzanie jednego utworu."
+
+#: front/src/components/audio/Player.vue:267
+msgid "Looping on a single track. Click to switch to whole queue looping."
+msgstr "Zapętlanie jednego utworu jest włączone. Naciśnij, aby przełączyć na powtarzanie całej kolejki."
+
+#: front/src/components/audio/Player.vue:268
+msgid "Looping on whole queue. Click to disable looping."
+msgstr "Zapętlanie całej kolejki jest włączone. Naciśnij, aby wyłączyć zapętlanie."
+
+#: front/src/components/library/Track.vue:94
+msgid "Lyrics"
+msgstr "Tekst"
+
+#: front/src/views/admin/library/Base.vue:25
+msgid "Manage library"
+msgstr "ZarzÄ…dzaj bibliotekÄ…"
+
+#: front/src/components/playlists/PlaylistModal.vue:3
+msgid "Manage playlists"
+msgstr "ZarzÄ…dzaj listami odtwarzania"
+
+#: front/src/views/admin/users/Base.vue:20
+msgid "Manage users"
+msgstr "Zarządzaj użytkownikami"
+
+#: front/src/views/playlists/List.vue:8
+msgid "Manage your playlists"
+msgstr "ZarzÄ…dzaj swoimi listami odtwarzania"
+
+#: front/src/components/manage/library/RequestsTable.vue:197
+msgid "Mark as closed"
+msgstr "Oznacz jako zamkniętą"
+
+#: front/src/components/manage/library/RequestsTable.vue:196
+msgid "Mark as imported"
+msgstr "Oznacz jako zaimportowanÄ…"
+
+#: front/src/components/library/import/Main.vue:12
+msgid "Metadata"
+msgstr "Metadane"
+
+#: front/src/components/library/import/Main.vue:115
+msgid ""
+"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n"
+"            <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"              MusicBrainz\n"
+"            </a>\n"
+"            project, which you can think about as the Wikipedia of music."
+msgstr ""
+"Metadane to dane związane z muzyką, którą chcesz zaimportować. Zaliczają się do nicj wszystkie dane o wykonawcy, albumach i utworach. Aby uzyskać dopracowaną bibliotekę, polecamy uzyskać dane z projektu\n"
+"            <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"              MusicBrainz\n"
+"            </a>,\n"
+"            który jest czymś w stylu Wikipedii dla muzyki."
+
+#: front/src/components/Sidebar.vue:48
+#: src/components/library/import/Main.vue:18
+msgid "Music"
+msgstr "Muzyka"
+
+#: front/src/components/library/import/Main.vue:147
+msgid "Music request"
+msgstr "Prośba o muzykę"
+
+#: front/src/components/audio/Player.vue:265
+msgid "Mute"
+msgstr "Wycisz"
+
+#: front/src/components/Sidebar.vue:34
+msgid "My account"
+msgstr "Moje konto"
+
+#: front/src/components/playlists/Form.vue:74
+msgid "My awesome playlist"
+msgstr "Moja wspaniała playlista"
+
+#: front/src/components/library/radios/Builder.vue:227
+msgid "My awesome radio"
+msgstr "Moje wspaniałe radio"
+
+#: front/src/components/library/Track.vue:64
+#: src/components/library/Track.vue:75
+#: front/src/components/library/Track.vue:86
+#: front/src/components/manage/library/FilesTable.vue:63
+#: front/src/components/manage/library/FilesTable.vue:69
+#: front/src/components/manage/library/FilesTable.vue:75
+#: front/src/components/manage/library/FilesTable.vue:81
+#: front/src/components/manage/library/RequestsTable.vue:71
+#: front/src/components/manage/library/RequestsTable.vue:75
+#: front/src/components/manage/library/RequestsTable.vue:82
+#: front/src/components/manage/users/UsersTable.vue:61
+#: front/src/views/admin/users/UsersDetail.vue:49
+msgid "N/A"
+msgstr "N/A"
+
+#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/views/admin/users/UsersDetail.vue:21
+msgid "Name"
+msgstr "Nazwa"
+
+#: front/src/components/auth/Settings.vue:88
+#: front/src/views/auth/PasswordResetConfirm.vue:14
+msgid "New password"
+msgstr "Nowe hasło"
+
+#: front/src/components/Sidebar.vue:158
+msgid "New tracks will be appended here automatically."
+msgstr "Nowe utwory automatycznie pojawiÄ… siÄ™ tutaj."
+
+#: front/src/components/library/import/Main.vue:29
+msgid "Next step"
+msgstr "Następny krok"
+
+#: front/src/components/audio/Player.vue:263
+msgid "Next track"
+msgstr "Następny utwór"
+
+#: front/src/components/Sidebar.vue:125
+msgid "No"
+msgstr "Nie"
+
+#: front/src/components/Home.vue:103
+msgid "No add-ons, no plugins : you only need a web library"
+msgstr "Brak wtyczek, brak dodatków: potrzebujesz tylko biblioteki sieciowej"
+
+#: front/src/components/library/Track.vue:102
+msgid "No lyrics available for this track."
+msgstr "Tekst nie jest dostępny dla tego utworu."
+
+#: front/src/components/playlists/Form.vue:81
+msgid "Nobody except me"
+msgstr "Nikt poza mnÄ…"
+
+#: front/src/views/federation/LibraryDetail.vue:32
+msgid "Not following"
+msgstr "Nie śledzisz"
+
+#: front/src/components/federation/LibraryTrackTable.vue:13
+#: front/src/components/federation/LibraryTrackTable.vue:67
+msgid "Not imported"
+msgstr "Nie zaimportowano"
+
+#: front/src/components/manage/users/InvitationsTable.vue:51
+msgid "Not used"
+msgstr "Nie użyty"
+
+#: front/src/App.vue:37
+msgid "Official website"
+msgstr "Oficjalna strona"
+
+#: front/src/components/auth/Settings.vue:83
+msgid "Old password"
+msgstr "Poprzednie hasło"
+
+#: front/src/components/library/import/FileUpload.vue:36
+msgid "Once all your files are uploaded, simply click the following button to check the import status."
+msgstr "Kiedy wszystkie pliki z zostaną wysłane, naciśnij następujący przycisk, aby sprawdzić stan importowania."
+
+#: front/src/components/federation/LibraryCard.vue:21
+#: front/src/components/manage/users/InvitationsTable.vue:20
+msgid "Open"
+msgstr "Otwórz"
+
+#: front/src/App.vue:63
+msgid "Options"
+msgstr "Opcje"
+
+#: front/src/components/library/import/Main.vue:93
+msgid "Or"
+msgstr "Lub"
+
+#: front/src/components/favorites/List.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:18
+#: front/src/components/library/Artists.vue:15
+#: src/components/library/Radios.vue:33
+#: front/src/components/manage/library/FilesTable.vue:9
+#: front/src/components/manage/library/RequestsTable.vue:9
+#: front/src/components/manage/users/InvitationsTable.vue:9
+#: front/src/components/manage/users/UsersTable.vue:9
+#: front/src/views/federation/LibraryList.vue:18
+#: src/views/playlists/List.vue:17
+msgid "Ordering"
+msgstr "PorzÄ…dkowanie"
+
+#: front/src/components/favorites/List.vue:31
+#: front/src/components/federation/LibraryTrackTable.vue:26
+#: front/src/components/library/Artists.vue:23
+#: src/components/library/Radios.vue:41
+#: front/src/components/manage/library/FilesTable.vue:17
+#: front/src/components/manage/library/RequestsTable.vue:17
+#: front/src/components/manage/users/UsersTable.vue:17
+#: front/src/views/federation/LibraryList.vue:26
+#: src/views/playlists/List.vue:25
+msgid "Ordering direction"
+msgstr "Kolejność porządkowania"
+
+#: front/src/components/manage/users/InvitationsTable.vue:38
+msgid "Owner"
+msgstr "Właściciel"
+
+#: front/src/components/PageNotFound.vue:33
+msgid "Page Not Found"
+msgstr "Nie odnaleziono strony"
+
+#: front/src/components/PageNotFound.vue:7
+msgid "Page not found!"
+msgstr "Nie odnaleziono strony!"
+
+#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38
+msgid "Password"
+msgstr "Haslo"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:95
+msgid "Password updated"
+msgstr "Zmieniono hasło"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:28
+msgid "Password updated successfully"
+msgstr "Pomyślnie zmieniono hasło"
+
+#: front/src/components/audio/Player.vue:262
+msgid "Pause track"
+msgstr "Wstrzymaj utwór"
+
+#: front/src/components/federation/LibraryFollowTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:33
+#: front/src/components/library/import/BatchDetail.vue:69
+#: front/src/components/library/import/BatchList.vue:14
+#: front/src/components/library/import/FileUpload.vue:59
+#: front/src/components/manage/library/RequestsTable.vue:27
+#: front/src/components/manage/library/RequestsTable.vue:63
+msgid "Pending"
+msgstr "OczekujÄ…ce"
+
+#: front/src/components/federation/LibraryFollowTable.vue:11
+#: front/src/views/federation/LibraryDetail.vue:26
+msgid "Pending approval"
+msgstr "Oczekiwanie na przyjęcie"
+
+#: front/src/components/Sidebar.vue:217
+msgid "Pending follow requests"
+msgstr "Oczekujące prośby o możliwość śledzenia"
+
+#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26
+msgid "Pending import requests"
+msgstr "Oczekujące prośby o zaimportowanie"
+
+#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36
+msgid "Pending requests"
+msgstr "Oczekujące prośby"
+
+#: front/src/components/manage/users/UsersTable.vue:42
+#: front/src/views/admin/users/UsersDetail.vue:68
+msgid "Permissions"
+msgstr "Uprawnienia"
+
+#: front/src/components/audio/PlayButton.vue:9
+#: src/components/library/Track.vue:30
+msgid "Play"
+msgstr "Odtwórz"
+
+#: front/src/components/audio/album/Card.vue:50
+#: front/src/components/audio/artist/Card.vue:44
+#: src/components/library/Album.vue:28 front/src/views/playlists/Detail.vue:23
+msgid "Play all"
+msgstr "Odtwórz wszystkie"
+
+#: front/src/components/library/Artist.vue:26
+msgid "Play all albums"
+msgstr "Odtwórz wszystkie albumy"
+
+#: front/src/components/audio/PlayButton.vue:58
+msgid "Play immediatly"
+msgstr "Odtwórz natychmiastowo"
+
+#: front/src/components/audio/PlayButton.vue:15
+msgid "Play next"
+msgstr "Odtwórz następny"
+
+#: front/src/components/audio/PlayButton.vue:16
+msgid "Play now"
+msgstr "Odtwórz teraz"
+
+#: front/src/components/audio/Player.vue:261
+msgid "Play track"
+msgstr "Odtwórz utwór"
+
+#: front/src/views/playlists/Detail.vue:90
+msgid "Playlist"
+msgstr "Lista odtwarzania"
+
+#: front/src/views/playlists/Detail.vue:12
+msgid "Playlist containing %{ count } track, by %{ username }"
+msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
+msgstr[0] "Lista odtwarzania zawierająca %{ count } utwór od %{ username }"
+msgstr[1] "Lista odtwarzania zawierajÄ…ca %{ count } utwory od %{ username }"
+msgstr[2] "Lista odtwarzania zawierająca %{ count } utworów od %{ username }"
+
+#: front/src/components/playlists/Form.vue:9
+msgid "Playlist created"
+msgstr "Utworzono listÄ™ odtwarzania"
+
+#: front/src/components/playlists/Editor.vue:4
+msgid "Playlist editor"
+msgstr "Edytor list odtwarzania"
+
+#: front/src/components/playlists/Form.vue:21
+msgid "Playlist name"
+msgstr "Nazwa listy odtwarzania"
+
+#: front/src/components/playlists/Form.vue:6
+msgid "Playlist updated"
+msgstr "Zaktualizowano listÄ™ odtwarzania"
+
+#: front/src/components/playlists/Form.vue:25
+msgid "Playlist visibility"
+msgstr "Widoczność listy odtwarzania"
+
+#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16
+#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83
+#: front/src/views/playlists/List.vue:103
+msgid "Playlists"
+msgstr "Listy odtwarzania"
+
+#: front/src/components/Home.vue:56
+msgid "Playlists? We got them"
+msgstr "Listy odtwarzania? Mamy je"
+
+#: front/src/components/auth/Settings.vue:79
+msgid "Please double-check your password is correct"
+msgstr "Sprawdź dwukrotnie, czy Twoje hasło jest poprawne"
+
+#: front/src/components/auth/Login.vue:9
+msgid "Please double-check your username/password couple is correct"
+msgstr "Sprawdź dwukrotnie, czy połączenie nazwy użytkownika i hasła jest poprawne"
+
+#: front/src/components/auth/Settings.vue:46
+msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
+msgstr "PNG, GIF lub JPG. Maksymalnie 2MB. Zostanie pomniejszony do 400x400 pikseli."
+
+#: front/src/components/library/import/Main.vue:26
+msgid "Previous step"
+msgstr "Poprzedni krok"
+
+#: front/src/components/audio/Player.vue:260
+msgid "Previous track"
+msgstr "Poprzedni utwór"
+
+#: front/src/views/auth/EmailConfirm.vue:26
+#: front/src/views/auth/PasswordResetConfirm.vue:31
+msgid "Proceed to login"
+msgstr "Przejdź, aby zalogować się"
+
+#: front/src/components/federation/LibraryTrackTable.vue:50
+msgid "Published date"
+msgstr "Data opublikowania"
+
+#: front/src/components/library/import/ArtistImport.vue:17
+msgid "Query template"
+msgstr "Szablon zapytania"
+
+#: front/src/components/Sidebar.vue:20
+msgid "Queue"
+msgstr "Kolejka"
+
+#: front/src/components/audio/Player.vue:203
+msgid "Queue shuffled!"
+msgstr "Wymieszano kolejkÄ™!"
+
+#: front/src/views/radios/Detail.vue:80
+msgid "Radio"
+msgstr "Radio"
+
+#: front/src/components/library/radios/Builder.vue:226
+msgid "Radio Builder"
+msgstr "Tworzenie radia"
+
+#: front/src/components/library/radios/Builder.vue:15
+#, fuzzy
+msgid "Radio created"
+msgstr "Nazwa radia"
+
+#: front/src/components/library/radios/Builder.vue:21
+msgid "Radio name"
+msgstr "Nazwa radia"
+
+#: front/src/components/library/radios/Builder.vue:12
+#, fuzzy
+msgid "Radio updated"
+msgstr "Nazwa radia"
+
+#: front/src/components/library/Library.vue:10
+#: src/components/library/Radios.vue:141
+msgid "Radios"
+msgstr "Radia"
+
+#: front/src/views/instance/Timeline.vue:7
+msgid "Recent activity on this instance"
+msgstr "Ostatnia aktywność na tej instancji"
+
+#: front/src/components/library/Home.vue:24
+msgid "Recently added"
+msgstr "Ostatnio dodane"
+
+#: front/src/components/library/Home.vue:11
+msgid "Recently favorited"
+msgstr "Ostatnio dodane do ulubionych"
+
+#: front/src/components/library/Home.vue:6
+msgid "Recently listened"
+msgstr "Ostatnio słuchane"
+
+#: front/src/components/library/import/BatchDetail.vue:81
+msgid "Recording MusicBrainz ID"
+msgstr "ID MusicBrainz nagrania"
+
+#: front/src/views/admin/users/UsersDetail.vue:84
+#: front/src/views/federation/LibraryDetail.vue:122
+msgid "Refresh"
+msgstr "Odśwież"
+
+#: front/src/components/federation/LibraryFollowTable.vue:42
+msgid "Refused"
+msgstr "Odmówiono"
+
+#: front/src/components/auth/Profile.vue:12
+msgid "Registered since %{ date }"
+msgstr "Zarejestrowany od %{ date }"
+
+#: front/src/components/auth/Signup.vue:9
+msgid "Registration are closed on this instance, you will need an invitation code to signup."
+msgstr "Rejestracja na tej instancji jest wyłączona, potrzebujesz kodu zapraszającego aby zarejestrować się."
+
+#: front/src/components/manage/users/UsersTable.vue:71
+msgid "regular user"
+msgstr "zwykły użytkownik"
+
+#: front/src/components/library/radios/Filter.vue:59
+msgid "Remove"
+msgstr "Usuń"
+
+#: front/src/components/auth/Settings.vue:58
+msgid "Remove avatar"
+msgstr "Usuń awatar"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:19
+msgid "Remove from favorites"
+msgstr "Usuń z ulubionych"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:34
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+msgid "Request a new password"
+msgstr "Poproś o nowe hasło"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:35
+msgid "Request a new Subsonic API password?"
+msgstr "Poprosić o nowe hasło API Subsonic?"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:43
+msgid "Request a password"
+msgstr "Poproś o nowe hasło"
+
+#: front/src/App.vue:35
+msgid "Request music"
+msgstr "Wyślij prośbę o muzykę"
+
+#: front/src/views/library/MusicRequest.vue:4
+#: src/views/library/MusicRequest.vue:21
+msgid "Request some music"
+msgstr "PoproÅ› o trochÄ™ muzyki"
+
+#: front/src/components/requests/Form.vue:20
+msgid "Request submitted!"
+msgstr "Wysłano prośbę!"
+
+#: front/src/components/library/import/BatchDetail.vue:49
+msgid "Rerun errored jobs"
+msgstr "Uruchom ponownie zadania zakończone błędem"
+
+#: front/src/components/library/import/BatchDetail.vue:187
+msgid "Rerun job"
+msgstr "Uruchom ponownie zadanie"
+
+#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4
+#: front/src/views/auth/PasswordReset.vue:52
+msgid "Reset your password"
+msgstr "Ustaw nowe hasło"
+
+#: front/src/components/library/import/TrackImport.vue:31
+msgid "Result %{ current }/%{ total }"
+msgstr "Wynik %{ current }/%{ total }"
+
+#: front/src/components/favorites/List.vue:38
+#: src/components/library/Artists.vue:30
+#: front/src/components/library/Radios.vue:52
+#: src/views/federation/LibraryList.vue:33
+#: front/src/views/playlists/List.vue:32
+msgid "Results per page"
+msgstr "Wyniki na stronÄ™"
+
+#: front/src/components/admin/SettingsGroup.vue:63
+#: front/src/components/library/radios/Builder.vue:29
+msgid "Save"
+msgstr "Zapisz"
+
+#: front/src/views/federation/LibraryDetail.vue:112
+msgid "Scan triggered!"
+msgstr "Wywołano skanowanie!"
+
+#: front/src/components/federation/LibraryTrackTable.vue:5
+#: front/src/components/library/Artists.vue:10
+#: src/components/library/Radios.vue:29
+#: front/src/components/library/import/BatchDetail.vue:62
+#: front/src/components/library/import/BatchList.vue:7
+#: front/src/components/manage/library/FilesTable.vue:5
+#: front/src/components/manage/library/RequestsTable.vue:5
+#: front/src/components/manage/users/InvitationsTable.vue:5
+#: front/src/components/manage/users/UsersTable.vue:5
+#: front/src/views/federation/LibraryList.vue:14
+#: src/views/playlists/List.vue:13
+msgid "Search"
+msgstr "Szukaj"
+
+#: front/src/components/library/import/Main.vue:85
+msgid "Search an entity you want to import:"
+msgstr "Szukaj zawartości którą chcesz zaimportować:"
+
+#: front/src/components/manage/library/RequestsTable.vue:180
+msgid "Search by artist, username, comment..."
+msgstr "Szukaj według wykonawcy, nazwy użytkownika, komentarzu…"
+
+#: front/src/components/library/import/BatchDetail.vue:188
+msgid "Search by source..."
+msgstr "Szukaj według źródła…"
+
+#: front/src/components/library/import/BatchList.vue:116
+msgid "Search by submitter, source..."
+msgstr "Szukaj według wysyłającego, źródła…"
+
+#: front/src/components/federation/LibraryTrackTable.vue:182
+#: front/src/components/manage/library/FilesTable.vue:175
+msgid "Search by title, artist, domain..."
+msgstr "Szukaj według tytułu, wykonawcy, domeny…"
+
+#: front/src/components/federation/LibraryFollowTable.vue:140
+msgid "Search by username, domain..."
+msgstr "Szukaj według nazwy użytkownika, domeny…"
+
+#: front/src/components/manage/users/InvitationsTable.vue:152
+msgid "Search by username, email, code..."
+msgstr "Szukaj według nazwy użytkownika, adresu e-mail, kodu…"
+
+#: front/src/components/manage/users/UsersTable.vue:162
+msgid "Search by username, email, name..."
+msgstr "Szukaj według nazwy użytkownika, adresu e-mail, nazwy…"
+
+#: front/src/components/audio/SearchBar.vue:20
+msgid "Search for artists, albums, tracks..."
+msgstr "Szukaj wykonawców, albumów, utworów…"
+
+#: front/src/components/audio/Search.vue:2
+msgid "Search for some music"
+msgstr "Wyszukaj trochÄ™ muzyki"
+
+#: front/src/components/library/Track.vue:105
+msgid "Search on lyrics.wikia.com"
+msgstr "Szukaj na lyrics.wikia.com"
+
+#: front/src/components/library/Album.vue:33
+#: src/components/library/Artist.vue:31
+#: front/src/components/library/Track.vue:40
+msgid "Search on Wikipedia"
+msgstr "Szukaj na Wikipedii"
+
+#: front/src/components/library/import/TrackImport.vue:42
+msgid "Search query"
+msgstr "Kryterium wyszukiwania"
+
+#: front/src/views/admin/Settings.vue:15
+msgid "Sections"
+msgstr "Sekcje"
+
+#: front/src/components/library/radios/Builder.vue:41
+msgid "Select a filter"
+msgstr "Zaznacz filtr"
+
+#: front/src/components/common/ActionTable.vue:61
+msgid "Select all %{ total } elements"
+msgid_plural "Select all %{ total } elements"
+msgstr[0] "Zaznacz %{ total } element"
+msgstr[1] "Zaznacz wszystkie %{ total } elementy"
+msgstr[2] "Zaznacz wszystkie %{ total } elementów"
+
+#: front/src/components/library/import/FileUpload.vue:22
+msgid "Select files to upload..."
+msgstr "Wybierz pliki do wysłania…"
+
+#: front/src/components/common/ActionTable.vue:69
+msgid "Select only current page"
+msgstr "Zaznacz tylko obecnÄ… stronÄ™"
+
+#: front/src/components/library/import/Main.vue:19
+msgid "Select relevant sources or files for import"
+msgstr "Wybierz odpowiednie źródła i pliki do zaimportowania"
+
+#: front/src/components/federation/LibraryCard.vue:43
+msgid "Send a follow request"
+msgstr "Wyślij prośbę o możliwość śledzenia"
+
+#: front/src/components/Sidebar.vue:97
+#: src/components/manage/users/UsersTable.vue:184
+#: front/src/views/admin/users/UsersDetail.vue:165
+msgid "Settings"
+msgstr "Ustawienia"
+
+#: front/src/components/auth/Settings.vue:10
+msgid "Settings updated"
+msgstr "Zaktualizowano ustawienia"
+
+#: front/src/components/admin/SettingsGroup.vue:11
+msgid "Settings updated successfully."
+msgstr "Pomyślnie zaktualizowano ustawienia."
+
+#: front/src/components/auth/Profile.vue:24
+msgid "Settings..."
+msgstr "Ustawienia…"
+
+#: front/src/components/manage/users/InvitationForm.vue:27
+msgid "Share link"
+msgstr "Udostępnij odnośnik"
+
+#: front/src/components/audio/artist/Card.vue:30
+msgid "Show 1 more album"
+msgid_plural "Show %{ count } more albums"
+msgstr[0] "Pokaż 1 kolejny album"
+msgstr[1] "Pokaż %{ count } kolejne albumy"
+msgstr[2] "Pokaż %{ count } kolejnych albumów"
+
+#: front/src/components/audio/album/Card.vue:40
+msgid "Show 1 more track"
+msgid_plural "Show %{ count } more tracks"
+msgstr[0] "Pokaż 1 kolejny utwór"
+msgstr[1] "Pokaż %{ count } kolejne utwory"
+msgstr[2] "Pokaż %{ count } kolejnych utworów"
+
+#: front/src/components/forms/PasswordInput.vue:25
+msgid "Show/hide password"
+msgstr "Pokaż/ukryj hasło"
+
+#: front/src/components/federation/LibraryFollowTable.vue:97
+#: front/src/components/federation/LibraryTrackTable.vue:98
+#: front/src/components/library/import/BatchDetail.vue:128
+#: front/src/components/library/import/BatchList.vue:73
+#: front/src/components/manage/library/FilesTable.vue:97
+#: front/src/components/manage/library/RequestsTable.vue:104
+#: front/src/components/manage/users/InvitationsTable.vue:76
+#: front/src/components/manage/users/UsersTable.vue:87
+msgid "Showing results %{ start }-%{ end } on %{ total }"
+msgstr "Wyświetlanie wyników %{ start }-%{ end } z %{ total }"
+
+#: front/src/components/audio/Player.vue:269
+msgid "Shuffle your queue"
+msgstr "Wymieszaj kolejkÄ™"
+
+#: front/src/components/auth/Signup.vue:95
+msgid "Sign Up"
+msgstr "Rejestracja"
+
+#: front/src/components/manage/users/UsersTable.vue:40
+#: front/src/views/admin/users/UsersDetail.vue:37
+msgid "Sign-up"
+msgstr "Rejestracja"
+
+#: front/src/components/audio/track/Table.vue:31
+msgid "Simply copy paste the snippet below into a terminal to launch the download."
+msgstr "Po prostu skopiuj i wklej poniższy urywek do terminala aby zacząć pobieranie."
+
+#: front/src/components/library/Track.vue:69
+#: front/src/components/library/import/FileUpload.vue:44
+#: front/src/components/manage/library/FilesTable.vue:44
+msgid "Size"
+msgstr "Rozmiar"
+
+#: front/src/components/library/import/BatchDetail.vue:37
+#: front/src/components/library/import/BatchDetail.vue:72
+msgid "Skipped"
+msgstr "Pominięto"
+
+#: front/src/components/requests/Form.vue:3
+msgid "Something's missing in the library? Let us know what you would like to listen!"
+msgstr "Brakuje czegoś w bibliotece? Powiedz nam, czego chcesz posłuchać!"
+
+#: front/src/components/audio/Search.vue:25
+msgid "Sorry, we did not found any album matching your query"
+msgstr "Przepraszamy, nie znaleziono albumu spełniającego Twoje kryteria"
+
+#: front/src/components/audio/Search.vue:16
+msgid "Sorry, we did not found any artist matching your query"
+msgstr "Przepraszamy, nie znaleziono wykonawcy spełniającego Twoje kryteria"
+
+#: front/src/components/library/import/BatchDetail.vue:82
+#: front/src/components/library/import/BatchList.vue:38
+#: front/src/components/library/import/TrackImport.vue:17
+msgid "Source"
+msgstr "Źródło"
+
+#: front/src/App.vue:41
+msgid "Source code"
+msgstr "Kod źródłowy"
+
+#: front/src/App.vue:40
+msgid "Source code (%{version})"
+msgstr "Kod źródłowy (%{version})"
+
+#: front/src/components/auth/Profile.vue:20
+#: front/src/components/manage/users/UsersTable.vue:70
+msgid "Staff member"
+msgstr "Członek administracji"
+
+#: front/src/components/radios/Button.vue:4
+msgid "Start"
+msgstr "Rozpocznij"
+
+#: front/src/components/library/import/FileUpload.vue:28
+msgid "Start Upload"
+msgstr "Rozpocznij wysyłanie"
+
+#: front/src/views/admin/Settings.vue:86
+msgid "Statistics"
+msgstr "Statystyki"
+
+#: front/src/components/federation/LibraryFollowTable.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:66
+#: front/src/components/library/import/BatchDetail.vue:83
+#: front/src/components/library/import/BatchList.vue:11
+#: front/src/components/library/import/BatchList.vue:37
+#: front/src/components/library/import/FileUpload.vue:45
+#: front/src/components/manage/library/RequestsTable.vue:24
+#: front/src/components/manage/library/RequestsTable.vue:48
+#: front/src/components/manage/users/InvitationsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:39
+#: front/src/components/manage/users/UsersTable.vue:43
+msgid "Status"
+msgstr "Stan"
+
+#: front/src/components/radios/Button.vue:3
+msgid "Stop"
+msgstr "Zatrzymaj"
+
+#: front/src/components/Sidebar.vue:159
+msgid "Stop radio"
+msgstr "Zatrzymaj radio"
+
+#: front/src/components/library/import/FileUpload.vue:32
+msgid "Stop Upload"
+msgstr "Zatrzymaj wysyłanie"
+
+#: front/src/App.vue:9 src/components/requests/Form.vue:17
+msgid "Submit"
+msgstr "Wyślij"
+
+#: front/src/components/requests/Form.vue:22
+msgid "Submit another request"
+msgstr "Wyślij kolejną prośbę"
+
+#: front/src/components/library/import/BatchDetail.vue:26
+#: front/src/components/library/import/BatchList.vue:39
+msgid "Submitted by"
+msgstr "Wysłano przez"
+
+#: front/src/views/admin/Settings.vue:85
+msgid "Subsonic"
+msgstr "Subsonic"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:2
+msgid "Subsonic API password"
+msgstr "Hasło API Subsonic"
+
+#: front/src/components/library/import/BatchDetail.vue:71
+#: front/src/components/library/import/BatchList.vue:16
+#: front/src/components/library/import/FileUpload.vue:56
+msgid "Success"
+msgstr "Powodzenie"
+
+#: front/src/App.vue:11
+msgid "Suggested choices"
+msgstr "Polecane wybory"
+
+#: front/src/components/playlists/Editor.vue:9
+msgid "Syncing changes to server..."
+msgstr "Synchronizowanie zmian z serwerem…"
+
+#: front/src/components/Home.vue:26
+msgid "That's simple: we loved Grooveshark and we want to build something even better."
+msgstr "To proste: kochamy Grooveshark i chcemy utworzyć coś jeszcze lepszego."
+
+#: front/src/components/requests/Form.vue:73
+msgid "The Beatles, Mickael Jackson…"
+msgstr "The Beatles, Klocuch…"
+
+#: front/src/App.vue:59
+msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
+msgstr "Logo Funkwhale zostało zaprojektowane i dostarczone przez Francisa Gadinga."
+
+#: front/src/components/Home.vue:124
+msgid "The plaform is free and open-source, you can install it and modify it without worries"
+msgstr "Platforma jest wolna i otwartoźródłowa, każdy może bez zmartwień zainstalować i modyfikować ją"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:4
+msgid "The Subsonic API is not available on this Funkwhale instance."
+msgstr "API Subsonic nie jest dostępne na tej instancji Funkwhale."
+
+#: front/src/components/requests/Form.vue:74
+msgid "The White Album, Thriller…"
+msgstr "The White Album, Aezakmi…"
+
+#: front/src/components/audio/track/Table.vue:30
+msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks."
+msgstr "Obecnie nie istnieje sposób na bezpośrednie pobranie wielu utworów z funkwhale jako archiwum ZIP. Możesz jednak użyć narzędzi takich jak cURL, aby łatwo pobrać listę utworów."
+
+#: front/src/components/library/import/Main.vue:149
+msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled."
+msgstr "To importowanie zostanie przypisane do poniższego żądania. Gdy importowanie zakończy się, żądanie zostanie oznaczone jako wypełnione."
+
+#: front/src/views/federation/LibraryDetail.vue:195
+msgid "This indicate if the remote library granted you access"
+msgstr "Wskazuje to, czy masz dostęp do zdalnej biblioteki"
+
+#: front/src/components/auth/Profile.vue:16
+msgid "This is you!"
+msgstr "To Ty!"
+
+#: front/src/components/common/ActionTable.vue:37
+msgid "This may affect a lot of elements, please double check this is really what you want."
+msgstr "Może to wpływać na wiele rzeczy, sprawdź dwukrotnie czy to na pewno to, czego chcesz."
+
+#: front/src/components/audio/PlayButton.vue:61
+msgid "This track is not imported and cannot be played"
+msgstr "Ten utwór nie został zaimportowany i nie może zostać odtworzony"
+
+#: front/src/views/playlists/Detail.vue:37
+msgid "This will completely delete this playlist and cannot be undone."
+msgstr "To całkowicie usunie listę odtwarzania i nie może zostać cofnięte."
+
+#: front/src/views/radios/Detail.vue:27
+msgid "This will completely delete this radio and cannot be undone."
+msgstr "To bezpowrotnie usunie radio."
+
+#: front/src/components/auth/SubsonicTokenForm.vue:51
+msgid "This will completely disable access to the Subsonic API using from account."
+msgstr "To całkowicie wyłączy dostęp do API Subsonic z tego konta."
+
+#: front/src/App.vue:137
+msgid "This will erase your local data and disconnect you, do you want to continue?"
+msgstr "To wyczyści Twoje lokalne dane i rozłączy Cię, czy chcesz kontynuować?"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:36
+msgid "This will log you out from existing devices that use the current password."
+msgstr "To wyloguje Cię z urządzeń na których jesteś obecnie zalogowany."
+
+#: front/src/components/playlists/Editor.vue:44
+msgid "This will remove all tracks from this playlist and cannot be undone."
+msgstr "To bezpowrotnie usunie wszystkie utwory z tej listy odtwarzania."
+
+#: front/src/components/audio/track/Table.vue:6
+#: front/src/components/federation/LibraryTrackTable.vue:47
+#: front/src/components/manage/library/FilesTable.vue:37
+msgid "Title"
+msgstr "Tytuł"
+
+#: front/src/components/audio/SearchBar.vue:27
+#: src/components/library/Track.vue:174
+#: front/src/components/library/import/BatchDetail.vue:84
+#: front/src/components/metadata/Search.vue:138
+msgid "Track"
+msgstr "Utwór"
+
+#: front/src/components/library/Track.vue:53
+msgid "Track information"
+msgstr "Informacje o utworze"
+
+#: front/src/components/library/radios/Filter.vue:44
+msgid "Track matching filter"
+msgstr "Utwór zgodny z filtrem"
+
+#: front/src/components/instance/Stats.vue:54
+msgid "tracks"
+msgstr "utwory"
+
+#: front/src/components/library/Album.vue:43
+#: front/src/components/playlists/PlaylistModal.vue:33
+#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50
+#: front/src/views/radios/Detail.vue:34
+msgid "Tracks"
+msgstr "Utwory"
+
+#: front/src/views/federation/LibraryDetail.vue:125
+msgid "Tracks available in this library"
+msgstr "Utwory dostępne w bibliotece"
+
+#: front/src/components/library/Artist.vue:54
+msgid "Tracks by this artist"
+msgstr "Utwory tego wykonawcy"
+
+#: front/src/components/instance/Stats.vue:25
+msgid "Tracks favorited"
+msgstr "Ulubione utwory"
+
+#: front/src/components/instance/Stats.vue:19
+msgid "tracks listened"
+msgstr "wysłuchane utwory"
+
+#: front/src/views/federation/LibraryDetail.vue:109
+msgid "Trigger scan"
+msgstr "Wywołaj skanowanie"
+
+#: front/src/components/manage/library/FilesTable.vue:41
+msgid "Type"
+msgstr "Rodzaj"
+
+#: front/src/components/About.vue:15
+msgid "Unfortunately, owners of this instance did not yet take the time to complete this page."
+msgstr "Niestety, właściciele tej instancji nie znaleźli czasu na wypełnienie tej strony."
+
+#: front/src/views/federation/LibraryDetail.vue:95
+msgid "Unknown"
+msgstr "Nieznany"
+
+#: front/src/components/Home.vue:37
+msgid "Unlimited music"
+msgstr "Nieograniczona muzyka"
+
+#: front/src/components/audio/Player.vue:264
+msgid "Unmute"
+msgstr "Cofnij wyciszenie"
+
+#: front/src/components/auth/Settings.vue:50
+msgid "Update avatar"
+msgstr "Aktualizuj awatar"
+
+#: front/src/components/playlists/Form.vue:33
+msgid "Update playlist"
+msgstr "Aktualizuj listÄ™ odtwarzania"
+
+#: front/src/components/auth/Settings.vue:27
+msgid "Update settings"
+msgstr "Aktualizuj ustawienia"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:21
+msgid "Update your password"
+msgstr "Aktualizuj swoje hasło"
+
+#: front/src/components/manage/users/UsersTable.vue:172
+#: front/src/views/admin/users/UsersDetail.vue:153
+msgid "Upload"
+msgstr "Wyślij"
+
+#: front/src/components/auth/Settings.vue:45
+msgid "Upload a new avatar"
+msgstr "Dodaj nowy awatar"
+
+#: front/src/components/library/import/Main.vue:7
+msgid "Uploaded files or external source"
+msgstr "Wysłane pliki lub z zewnętrznego źródła"
+
+#: front/src/components/library/import/FileUpload.vue:57
+msgid "Uploading..."
+msgstr "Wysyłanie…"
+
+#: front/src/App.vue:45
+msgid "Use another instance"
+msgstr "Skorzystaj z innej instancji"
+
+#: front/src/components/requests/Form.vue:75
+msgid "Use this comment box to add details to your request if needed"
+msgstr "Użyj tego pola komentarzy, aby dodać szczegóły zgłoszenia, jeżeli potrzebne"
+
+#: front/src/views/federation/LibraryDetail.vue:196
+msgid "Use this flag to enable/disable federation with this library"
+msgstr "Użyj tej opcji aby wyłączyć/włączyć federację dla tej biblioteki"
+
+#: front/src/views/auth/PasswordReset.vue:12
+msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
+msgstr "Użyj tego formularza aby poprosić o zresetowanie hasła. Otrzymasz e-mail z instrukcjami resetowania hasła na podany adres."
+
+#: front/src/components/federation/LibraryForm.vue:6
+msgid "Use this form to scan an instance and setup federation."
+msgstr "Użyj tego formularza aby przeskanować instancję i skonfigurować federację."
+
+#: front/src/components/manage/users/InvitationsTable.vue:49
+msgid "Used"
+msgstr "Zużyty"
+
+#: front/src/components/manage/library/RequestsTable.vue:47
+msgid "User"
+msgstr "Użytkownik"
+
+#: front/src/components/instance/Stats.vue:5
+msgid "User activity"
+msgstr "Aktywność użytkownika"
+
+#: front/src/components/library/Radios.vue:20
+msgid "User radios"
+msgstr "Radia użytkownika"
+
+#: front/src/components/auth/Signup.vue:19
+#: front/src/components/manage/users/UsersTable.vue:37
+msgid "Username"
+msgstr "Nazwa użytkownika"
+
+#: front/src/components/auth/Login.vue:15
+msgid "Username or email"
+msgstr "Nazwa użytkownika lub adres e-mail"
+
+#: front/src/components/instance/Stats.vue:13
+msgid "users"
+msgstr "użytkownicy"
+
+#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81
+#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3
+#: front/src/views/admin/users/UsersList.vue:21
+msgid "Users"
+msgstr "Użytkownicy"
+
+#: front/src/components/library/Album.vue:37
+#: src/components/library/Artist.vue:35
+#: front/src/components/library/Track.vue:44
+#: front/src/components/library/import/ArtistImport.vue:131
+#: front/src/components/metadata/ArtistCard.vue:49
+#: front/src/components/metadata/ReleaseCard.vue:53
+msgid "View on MusicBrainz"
+msgstr "Wyświetl na MusicBrainz"
+
+#: front/src/components/playlists/PlaylistModal.vue:20
+msgid "We cannot add the track to a playlist"
+msgstr "Nie udało się dodać tego utworu do listy odtwarzania"
+
+#: front/src/components/playlists/Form.vue:14
+msgid "We cannot create the playlist"
+msgstr "Nie udało się utworzyć listy odtwarzania"
+
+#: front/src/components/auth/Signup.vue:13
+msgid "We cannot create your account"
+msgstr "Nie udało się utworzyć Ci konta"
+
+#: front/src/components/auth/Login.vue:7
+msgid "We cannot log you in"
+msgstr "Nie udało się zalogować Cię"
+
+#: front/src/components/auth/Settings.vue:38
+msgid "We cannot save your avatar"
+msgstr "Nie udało się zapisać awatara"
+
+#: front/src/components/auth/Settings.vue:14
+msgid "We cannot save your settings"
+msgstr "Nie udało się zapisać ustawień"
+
+#: front/src/components/Home.vue:130
+msgid "We do not track you or bother you with ads"
+msgstr "Nie śledzimy Cię i nie wyświetlamy Ci reklam"
+
+#: front/src/components/library/import/FileUpload.vue:5
+msgid "We recommend using Picard for that purpose."
+msgstr "Polecamy używać do tego Picard."
+
+#: front/src/components/Home.vue:7
+msgid "We think listening to music should be simple."
+msgstr "Uważamy, że słuchanie muzyki powinno być proste."
+
+#: front/src/components/PageNotFound.vue:10
+msgid "We're sorry, the page you asked for does not exist:"
+msgstr "Przepraszamy, strona której szukasz nie istnieje:"
+
+#: front/src/components/requests/Form.vue:21
+msgid "We've received your request, you'll get some groove soon ;)"
+msgstr "Otrzymaliśmy Twoje zgłoszenie, wkrótce dostaniesz trochę groove-u ;)"
+
+#: front/src/components/Home.vue:152
+msgid "Welcome"
+msgstr "Witamy"
+
+#: front/src/components/Home.vue:5
+msgid "Welcome on Funkwhale"
+msgstr "Witamy na Funkwhale"
+
+#: front/src/components/library/import/Main.vue:114
+msgid "What is metadata?"
+msgstr "Czym sÄ… metadane?"
+
+#: front/src/views/federation/LibraryDetail.vue:197
+msgid "When enabled, auto importing will automatically import new tracks published in this library"
+msgstr "Jeżeli włączone, automatyczne importowanie będzie automatycznie importować nowe utwory opublikowane w tej bibliotece"
+
+#: front/src/components/Home.vue:24
+msgid "Why funkwhale?"
+msgstr "Dlaczego funkwhale?"
+
+#: front/src/components/Sidebar.vue:124
+msgid "Yes"
+msgstr "Tak"
+
+#: front/src/components/auth/Logout.vue:8
+msgid "Yes, log me out!"
+msgstr "Tak, wyloguj mnie!"
+
+#: front/src/components/auth/Logout.vue:7
+msgid "You are currently logged in as %{ username }"
+msgstr "JesteÅ› obecnie zalogowany jako %{ username }"
+
+#: front/src/components/library/import/Main.vue:111
+msgid "You can also skip this step and enter metadata manually."
+msgstr "Możesz też pominąć ten krok i wprowadzić metadane ręcznie."
+
+#: front/src/components/Home.vue:136
+msgid "You can invite friends and family to your instance so they can enjoy your music"
+msgstr "Możesz zaprosić znajomych i rodzinę na swoją instancję, aby mogli się cieszyć dodaną przez Ciebie muzyką"
+
+#: front/src/components/library/radios/Builder.vue:7
+msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria."
+msgstr "Możesz używać tego interfejsu aby utworzyć własne radio, które będzie odtwarzać utwory pasujące do Twoich kryteriów."
+
+#: front/src/components/auth/SubsonicTokenForm.vue:8
+msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
+msgstr "Możesz używać tego, aby cieszyć się muzyką i swoją listą odtwarzania w trybie offline, na przykład na smartfonie i tablecie."
+
+#: front/src/components/Sidebar.vue:156
+msgid "You have a radio playing"
+msgstr "Odtwarzasz radio"
+
+#: front/src/App.vue:6
+msgid "You need to select an instance in order to continue"
+msgstr "Musisz wybrać instancję aby kontynuować"
+
+#: front/src/components/auth/Settings.vue:100
+msgid "You will be logged out from this session and have to log in with the new one"
+msgstr "Zostaniesz wylogowany z tej sesji i musisz zalogować się nowym hasłem"
+
+#: front/src/components/auth/Settings.vue:71
+msgid "You will have to update your password on your clients that use this password."
+msgstr "Będziesz musiał zmienić hasło na klientach używających tego hasła."
+
+#: front/src/components/library/import/Main.vue:103
+msgid "You will import:"
+msgstr "Zaimportujesz:"
+
+#: front/src/views/auth/EmailConfirm.vue:24
+msgid "Your email address was confirmed, you can now use the service without limitations."
+msgstr "Twój adres e-mail został potwierdzony, możesz używać usługi bez ograniczeń."
+
+#: front/src/components/favorites/List.vue:109
+msgid "Your Favorites"
+msgstr "Twoje ulubione"
+
+#: front/src/components/Home.vue:117
+msgid "Your music, your way"
+msgstr "Twoja muzyka, po Twojemu"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:29
+msgid "Your password has been updated successfully."
+msgstr "Twoje hasło zostało pomyślnie zmienione."
+
+#: front/src/components/auth/Settings.vue:101
+msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
+msgstr "Twoje hasło Subsonic zostanie zmienione na nowe, losowe i zostaniesz wylogowany z urządzeń korzystających ze starego hasła Subsonic"
+
+#: front/src/components/audio/PlayButton.vue:156
+msgid "%{ count } track was added to your queue"
+msgid_plural "%{ count } tracks were added to your queue"
+msgstr[0] "Dodano %{ count } utwór do kolejki"
+msgstr[1] "Dodano %{ count } utwory do kolejki"
+msgstr[2] "Dodano %{ count } utworów do kolejki"
diff --git a/front/locales/pt_PT/LC_MESSAGES/app.po b/front/locales/pt_PT/LC_MESSAGES/app.po
new file mode 100644
index 0000000000000000000000000000000000000000..03361742c8a791864a7c7cac10499b3a2b007247
--- /dev/null
+++ b/front/locales/pt_PT/LC_MESSAGES/app.po
@@ -0,0 +1,2442 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the front package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: front 1.0.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-07-17 19:29+0200\n"
+"PO-Revision-Date: 2018-07-22 20:29+0000\n"
+"Last-Translator: troll <my_name_is_troll@protonmail.com>\n"
+"Language-Team: none\n"
+"Language: pt_PT\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.20\n"
+
+#: front/src/components/playlists/PlaylistModal.vue:9
+msgid "\"%{ title }\", by %{ artist }"
+msgstr "\"%{ title }\", de %{ artist }"
+
+#: front/src/components/Sidebar.vue:24
+msgid "(%{ index } of %{ length })"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:22
+msgid "(empty)"
+msgstr "(vazio)"
+
+#: front/src/components/common/ActionTable.vue:43
+#: front/src/components/common/ActionTable.vue:51
+msgid "%{ count } on %{ total } selected"
+msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/Sidebar.vue:116 src/views/federation/LibraryDetail.vue:87
+msgid "%{ count } track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{ count } tema"
+msgstr[1] "%{ count } temas"
+
+#: front/src/components/library/Artist.vue:13
+msgid "%{ count } track in %{ albumsCount } albums"
+msgid_plural "%{ count } tracks in %{ albumsCount } albums"
+msgstr[0] "%{ count } tema em %{ albumsCount } álbuns"
+msgstr[1] "%{ count } temas em %{ albumsCount } álbuns"
+
+#: front/src/components/library/radios/Builder.vue:66
+msgid "%{ count } track matching combined filters"
+msgid_plural "%{ count } tracks matching combined filters"
+msgstr[0] "%{ count } música corresponde aos filtros selecionados"
+msgstr[1] "%{ count } músicas correspondem aos filtros selecionados"
+
+#: front/src/components/playlists/Card.vue:18
+msgid "%{ count} track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{ count} música"
+msgstr[1] "%{ count } músicas"
+
+#: front/src/components/common/Duration.vue:2
+#, fuzzy
+msgid "%{ hours } h %{ minutes } min"
+msgstr "%{ hours } h %{ minutes } min"
+
+#: front/src/components/common/Duration.vue:5
+#, fuzzy
+msgid "%{ minutes } min"
+msgstr "%{ minutes } min"
+
+#: front/src/components/activity/Like.vue:7
+msgid "%{ user } favorited a track"
+msgstr "%{ user } gostou de uma música"
+
+#: front/src/components/activity/Listen.vue:7
+msgid "%{ user } listened to a track"
+msgstr "%{ user } escutou uma música"
+
+#: front/src/components/auth/Profile.vue:49
+msgid "%{ username }'s profile"
+msgstr "%{ username } perfil"
+
+#: front/src/components/audio/artist/Card.vue:41
+msgid "1 album"
+msgid_plural "%{ count } albums"
+msgstr[0] "1 álbum"
+msgstr[1] "%{ count } álbums"
+
+#: front/src/components/favorites/List.vue:10
+msgid "1 favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "1 preferida"
+msgstr[1] "%{ count } preferidas"
+
+#: front/src/components/audio/album/Card.vue:54
+#: front/src/components/federation/LibraryCard.vue:25
+msgid "1 track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "1 música"
+msgstr[1] "%{ count } músicas"
+
+#: front/src/components/About.vue:5
+msgid "About %{ instance }"
+msgstr "Sobre %{ instance }"
+
+#: front/src/App.vue:54
+msgid "About Funkwhale"
+msgstr "Sobre Funkwhale"
+
+#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55
+msgid "About this instance"
+msgstr "Sobre esta instância"
+
+#: front/src/components/manage/library/RequestsTable.vue:28
+#: front/src/components/manage/library/RequestsTable.vue:62
+msgid "Accepted"
+msgstr "Aceitado"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:111
+msgid "Access disabled"
+msgstr "Acesso desativado"
+
+#: front/src/components/Home.vue:109
+msgid "Access your music from a clean interface that focus on what really matters"
+msgstr ""
+"Acesse sua música a partir de uma interface limpa que se concentra no que "
+"realmente importa"
+
+#: front/src/views/admin/users/UsersDetail.vue:54
+msgid "Account active"
+msgstr "Conta ativa"
+
+#: front/src/components/auth/Settings.vue:5
+msgid "Account settings"
+msgstr "Configurações da conta"
+
+#: front/src/components/auth/Settings.vue:257
+msgid "Account Settings"
+msgstr "Configurações da conta"
+
+#: front/src/components/manage/users/UsersTable.vue:39
+msgid "Account status"
+msgstr "Status da Conta"
+
+#: front/src/views/auth/PasswordReset.vue:14
+msgid "Account's email"
+msgstr "Email da conta"
+
+#: front/src/components/common/ActionTable.vue:82
+msgid "Action %{ action } was launched successfully on %{ count } element"
+msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
+msgstr[0] "A ação %{ action } foi lançada com sucesso em %{ count } item"
+msgstr[1] "A ação %{ action } foi lançada com sucesso em %{ count } itens"
+
+#: front/src/components/common/ActionTable.vue:8
+#: front/src/components/federation/LibraryFollowTable.vue:24
+#: front/src/components/library/radios/Builder.vue:50
+#: front/src/components/manage/library/RequestsTable.vue:54
+msgid "Actions"
+msgstr "Ações"
+
+#: front/src/components/manage/users/UsersTable.vue:53
+msgid "Active"
+msgstr "Ativo"
+
+#: front/src/components/Sidebar.vue:60
+msgid "Activity"
+msgstr "Atividade"
+
+#: front/src/components/federation/LibraryFollowTable.vue:21
+msgid "Actor"
+msgstr "Ator"
+
+#: front/src/views/federation/LibraryList.vue:8
+msgid "Add a new library"
+msgstr "Adicione uma nova biblioteca"
+
+#: front/src/components/library/radios/Builder.vue:36
+msgid "Add filter"
+msgstr "Adicionar um filtro"
+
+#: front/src/components/library/radios/Builder.vue:26
+msgid "Add filters to customize your radio"
+msgstr "Adicione filtros para personalizar seu rádio"
+
+#: front/src/components/audio/PlayButton.vue:53
+msgid "Add to current queue"
+msgstr "Adicionar à fila atual"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:4
+#: front/src/components/favorites/TrackFavoriteIcon.vue:21
+msgid "Add to favorites"
+msgstr "Adicionar aos favoritos"
+
+#: front/src/components/playlists/TrackPlaylistIcon.vue:6
+#: front/src/components/playlists/TrackPlaylistIcon.vue:32
+msgid "Add to playlist..."
+msgstr "Adicionar à Playlist..."
+
+#: front/src/components/audio/PlayButton.vue:14
+msgid "Add to queue"
+msgstr "Adicionar à fila"
+
+#: front/src/components/playlists/PlaylistModal.vue:115
+msgid "Add to this playlist"
+msgstr "Adicionar a esta playlist"
+
+#: front/src/components/playlists/PlaylistModal.vue:54
+msgid "Add track"
+msgstr "Adicionar música"
+
+#: front/src/components/manage/users/UsersTable.vue:69
+msgid "Admin"
+msgstr "Admin"
+
+#: front/src/components/Sidebar.vue:64
+msgid "Administration"
+msgstr "Administração"
+
+#: front/src/components/audio/SearchBar.vue:26 src/components/audio/track/Table.vue:8
+#: front/src/components/federation/LibraryTrackTable.vue:49
+#: front/src/components/library/Album.vue:91
+#: front/src/components/manage/library/FilesTable.vue:39
+#: front/src/components/metadata/Search.vue:134
+msgid "Album"
+msgstr "Álbum"
+
+#: front/src/components/library/import/ReleaseImport.vue:3
+msgid "Album %{ title } (%{ count } track) by %{ artist }"
+msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/Album.vue:12
+msgid "Album containing %{ count } track, by %{ artist }"
+msgid_plural "Album containing %{ count } tracks, by %{ artist }"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/Track.vue:20
+msgid "Album page"
+msgstr "Página do álbum"
+
+#: front/src/components/audio/Search.vue:19 src/components/instance/Stats.vue:48
+#: front/src/components/manage/library/RequestsTable.vue:50
+#: front/src/components/requests/Form.vue:9
+msgid "Albums"
+msgstr "Álbuns"
+
+#: front/src/components/library/Artist.vue:44
+msgid "Albums by this artist"
+msgstr "Álbuns deste artista"
+
+#: front/src/components/manage/library/RequestsTable.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:19
+msgid "All"
+msgstr "Tudo"
+
+#: front/src/components/playlists/Editor.vue:13
+msgid "An error occured while saving your changes"
+msgstr "Ocorreu um erro ao salvar suas mudanças"
+
+#: front/src/components/auth/Login.vue:10
+msgid "An unknown error happend, this can mean the server is down or cannot be reached"
+msgstr ""
+"Um erro desconhecido aconteceu, isso pode significar que o servidor está "
+"inoperante ou não pode ser alcançado"
+
+#: front/src/components/federation/LibraryTrackTable.vue:11
+#: front/src/components/library/import/BatchDetail.vue:68
+#: front/src/components/library/import/BatchList.vue:13
+#: front/src/components/library/import/BatchList.vue:22
+msgid "Any"
+msgstr "Qualquer"
+
+#: front/src/components/library/import/BatchList.vue:24
+msgid "API"
+msgstr "API"
+
+#: front/src/components/federation/LibraryFollowTable.vue:68
+#: front/src/components/federation/LibraryFollowTable.vue:78
+msgid "Approve"
+msgstr "Aprovar"
+
+#: front/src/components/federation/LibraryFollowTable.vue:70
+msgid "Approve access?"
+msgstr "Aprovar acesso?"
+
+#: front/src/components/federation/LibraryFollowTable.vue:38
+msgid "Approved"
+msgstr "Aprovado"
+
+#: front/src/components/auth/Logout.vue:5
+msgid "Are you sure you want to log out?"
+msgstr "Tem certeza que deseja sair?"
+
+#: front/src/components/audio/SearchBar.vue:25 src/components/audio/track/Table.vue:7
+#: front/src/components/federation/LibraryTrackTable.vue:48
+#: front/src/components/library/Artist.vue:119
+#: front/src/components/manage/library/FilesTable.vue:38
+#: front/src/components/manage/library/RequestsTable.vue:49
+#: front/src/components/metadata/Search.vue:130
+msgid "Artist"
+msgstr "Artista"
+
+#: front/src/components/requests/Form.vue:5
+msgid "Artist name"
+msgstr "Nome do artista"
+
+#: front/src/components/library/Album.vue:22 src/components/library/Track.vue:23
+msgid "Artist page"
+msgstr "Página do artista"
+
+#: front/src/components/audio/Search.vue:65
+msgid "Artist, album, track..."
+msgstr "Artista, álbum, música ..."
+
+#: front/src/components/audio/Search.vue:10 src/components/instance/Stats.vue:42
+#: front/src/components/library/Artists.vue:119 src/components/library/Library.vue:7
+msgid "Artists"
+msgstr "Artistas"
+
+#: front/src/components/favorites/List.vue:33
+#: front/src/components/federation/LibraryTrackTable.vue:28
+#: front/src/components/library/Artists.vue:25 src/components/library/Radios.vue:44
+#: front/src/components/manage/library/FilesTable.vue:19
+#: front/src/components/manage/library/RequestsTable.vue:19
+#: front/src/components/manage/users/UsersTable.vue:19
+#: front/src/views/federation/LibraryList.vue:28 src/views/playlists/List.vue:27
+msgid "Ascending"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:27
+msgid "Ask for a password reset"
+msgstr "Peça uma redefinição de senha"
+
+#: front/src/views/federation/LibraryDetail.vue:56
+msgid "Auto importing"
+msgstr "Importação automática"
+
+#: front/src/components/playlists/PlaylistModal.vue:26
+msgid "Available playlists"
+msgstr "Playlists disponíveis"
+
+#: front/src/components/auth/Settings.vue:34
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24
+#: front/src/views/auth/PasswordResetConfirm.vue:18
+msgid "Back to login"
+msgstr "Volte ao login"
+
+#: front/src/views/federation/LibraryFollowersList.vue:5
+msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library."
+msgstr ""
+"Tenha cuidado ao aceitar as solicitações a seguir, pois isso significa que o "
+"seguidor terá acesso a toda a sua biblioteca."
+
+#: front/src/components/library/Track.vue:80
+#: front/src/components/manage/library/FilesTable.vue:42
+msgid "Bitrate"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
+msgid "Browse"
+msgstr "Procurar"
+
+#: front/src/components/Sidebar.vue:50
+msgid "Browse library"
+msgstr "Navegar pela biblioteca"
+
+#: front/src/components/library/Artists.vue:4
+msgid "Browsing artists"
+msgstr "Procurando artistas"
+
+#: front/src/views/federation/LibraryTrackList.vue:3
+msgid "Browsing federated tracks"
+msgstr "Procurando músicas federadas"
+
+#: front/src/views/federation/LibraryFollowersList.vue:3
+msgid "Browsing followers"
+msgstr "Navegando seguidores"
+
+#: front/src/views/federation/LibraryList.vue:3
+msgid "Browsing libraries"
+msgstr "Navegue por bibliotecas"
+
+#: front/src/views/playlists/List.vue:3
+msgid "Browsing playlists"
+msgstr "Procure playlists"
+
+#: front/src/components/library/Radios.vue:4
+msgid "Browsing radios"
+msgstr "Procure radios"
+
+#: front/src/components/library/radios/Builder.vue:5
+msgid "Builder"
+msgstr "Construtor"
+
+#: front/src/components/audio/album/Card.vue:13
+msgid "By %{ artist }"
+msgstr "Por %{ artist }"
+
+#: front/src/components/federation/LibraryFollowTable.vue:57
+msgid "By confirming, %{ username } will be denied access to your library."
+msgstr "Ao confirmar, %{ username } não terá acesso à sua biblioteca."
+
+#: front/src/components/federation/LibraryFollowTable.vue:73
+msgid "By confirming, %{ username } will be granted access to your library."
+msgstr "Ao confirmar, %{ username } terá acesso à sua biblioteca."
+
+#: front/src/components/audio/track/Table.vue:43
+#: front/src/components/common/DangerousButton.vue:17
+#: front/src/components/library/radios/Filter.vue:53
+#: front/src/components/playlists/PlaylistModal.vue:63
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: front/src/components/library/radios/Builder.vue:49
+msgid "Candidates"
+msgstr "Candidatos"
+
+#: front/src/components/auth/Settings.vue:76
+msgid "Cannot change your password"
+msgstr "Não é possível alterar sua senha"
+
+#: front/src/App.vue:66
+msgid "Change language"
+msgstr "Mudar idioma"
+
+#: front/src/components/auth/Settings.vue:67
+msgid "Change my password"
+msgstr "Mudar minha senha"
+
+#: front/src/components/auth/Settings.vue:95
+msgid "Change password"
+msgstr "Mudar senha"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:4
+#: front/src/views/auth/PasswordResetConfirm.vue:62
+msgid "Change your password"
+msgstr "Mude sua senha"
+
+#: front/src/components/auth/Settings.vue:96
+msgid "Change your password?"
+msgstr "Mude sua senha?"
+
+#: front/src/components/playlists/Editor.vue:21
+msgid "Changes synced with server"
+msgstr "Modificações sincronizadas com o servidor"
+
+#: front/src/components/auth/Settings.vue:70
+msgid "Changing your password will also change your Subsonic API password if you have requested one."
+msgstr ""
+"Mudar sua senha também muda sua senha da API Subsonic se você tiver "
+"solicitado uma."
+
+#: front/src/components/auth/Settings.vue:98
+msgid "Changing your password will have the following consequences"
+msgstr "Alterar sua senha terá as seguintes consequências"
+
+#: front/src/App.vue:4
+msgid "Choose your instance"
+msgstr "Escolha sua instância"
+
+#: front/src/components/Home.vue:64
+msgid "Clean library"
+msgstr "Biblioteca limpa"
+
+#: front/src/components/manage/users/InvitationForm.vue:37
+msgid "Clear"
+msgstr "Claro"
+
+#: front/src/components/playlists/Editor.vue:40
+#: front/src/components/playlists/Editor.vue:45
+msgid "Clear playlist"
+msgstr "Limpar playlist"
+
+#: front/src/components/audio/Player.vue:270
+msgid "Clear your queue"
+msgstr "Limpar sua fila"
+
+#: front/src/components/library/import/BatchList.vue:23
+msgid "CLI"
+msgstr "CLI"
+
+#: front/src/components/Home.vue:44
+msgid "Click once, listen for hours using built-in radios"
+msgstr "Clique uma vez, ouça por horas usando rádios"
+
+#: front/src/components/manage/library/RequestsTable.vue:30
+#: front/src/components/manage/library/RequestsTable.vue:64
+msgid "Closed"
+msgstr "Fechado"
+
+#: front/src/components/manage/users/InvitationForm.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:42
+msgid "Code"
+msgstr "Código"
+
+#: front/src/components/audio/album/Card.vue:43
+#: front/src/components/audio/artist/Card.vue:33
+#: front/src/components/discussion/Comment.vue:20
+msgid "Collapse"
+msgstr "Colapso"
+
+#: front/src/components/manage/library/RequestsTable.vue:51
+#: front/src/components/requests/Form.vue:14
+msgid "Comment"
+msgstr "Comentário"
+
+#: front/src/components/library/radios/Builder.vue:48
+msgid "Config"
+msgstr "Configuração"
+
+#: front/src/components/common/DangerousButton.vue:21
+msgid "Confirm"
+msgstr "Confirme"
+
+#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20
+#: front/src/views/auth/EmailConfirm.vue:51
+msgid "Confirm your email"
+msgstr "Confirme seu email"
+
+#: front/src/views/auth/EmailConfirm.vue:13
+msgid "Confirmation code"
+msgstr "Código de confirmação"
+
+#: front/src/components/playlists/Editor.vue:163
+msgid "Copy tracks from current queue to playlist"
+msgstr "Copiar músicas da fila atual para a playlist"
+
+#: front/src/components/Home.vue:88
+msgid "Covers, lyrics, our goal is to have them all ;)"
+msgstr "Capas, letras, nosso objetivo é tê-los todos ;)"
+
+#: front/src/components/auth/Signup.vue:4
+msgid "Create a funkwhale account"
+msgstr "Crie uma conta funkwhale"
+
+#: front/src/components/playlists/Form.vue:2
+msgid "Create a new playlist"
+msgstr "Crie uma nova playlist"
+
+#: front/src/components/auth/Login.vue:17
+msgid "Create an account"
+msgstr "Crie a sua conta"
+
+#: front/src/components/manage/library/RequestsTable.vue:88
+#: front/src/components/requests/Card.vue:25
+msgid "Create import"
+msgstr "Criar importação"
+
+#: front/src/components/auth/Signup.vue:51
+msgid "Create my account"
+msgstr "Criar a minha conta"
+
+#: front/src/components/playlists/Form.vue:34
+msgid "Create playlist"
+msgstr "Crie uma playlist"
+
+#: front/src/components/library/Radios.vue:23
+msgid "Create your own radio"
+msgstr "Crie seu próprio rádio"
+
+#: front/src/components/federation/LibraryFollowTable.vue:22
+#: front/src/components/manage/library/RequestsTable.vue:52
+#: front/src/components/manage/users/InvitationsTable.vue:40
+msgid "Creation date"
+msgstr "Data de criação"
+
+#: front/src/components/auth/Settings.vue:54
+msgid "Current avatar"
+msgstr "Avatar atual"
+
+#: front/src/components/playlists/PlaylistModal.vue:8
+msgid "Current track"
+msgstr "Música atual"
+
+#: front/src/components/manage/library/FilesTable.vue:189
+#: front/src/components/manage/library/RequestsTable.vue:195
+#: front/src/components/manage/users/InvitationsTable.vue:166
+#: front/src/views/playlists/Detail.vue:33
+msgid "Delete"
+msgstr "Suprimir"
+
+#: front/src/views/playlists/Detail.vue:38
+msgid "Delete playlist"
+msgstr "Suprimir Playlist"
+
+#: front/src/views/radios/Detail.vue:28
+msgid "Delete radio"
+msgstr "Suprimir radio"
+
+#: front/src/components/federation/LibraryFollowTable.vue:52
+#: front/src/components/federation/LibraryFollowTable.vue:63
+msgid "Deny"
+msgstr "Negar"
+
+#: front/src/components/federation/LibraryFollowTable.vue:54
+msgid "Deny access?"
+msgstr "Negar acesso?"
+
+#: front/src/components/favorites/List.vue:34
+#: front/src/components/federation/LibraryTrackTable.vue:29
+#: front/src/components/library/Artists.vue:26 src/components/library/Radios.vue:47
+#: front/src/components/manage/library/FilesTable.vue:20
+#: front/src/components/manage/library/RequestsTable.vue:20
+#: front/src/components/manage/users/UsersTable.vue:20
+#: front/src/views/federation/LibraryList.vue:29 src/views/playlists/List.vue:28
+msgid "Descending"
+msgstr "Descendente"
+
+#: front/src/components/federation/LibraryCard.vue:50
+msgid "Detail"
+msgstr "Detalhe"
+
+#: front/src/views/admin/users/UsersDetail.vue:146
+msgid "Determine if the user account is active or not. Inactive users cannot login or use the service."
+msgstr ""
+"Determine se a conta do usuário está ativa ou não. Usuários inativos não "
+"podem fazer autenticação ou usar o serviço."
+
+#: front/src/components/auth/Settings.vue:104
+#: front/src/components/auth/SubsonicTokenForm.vue:52
+msgid "Disable access"
+msgstr "Desativar acesso"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:49
+msgid "Disable Subsonic access"
+msgstr "Desativar o acesso a Subsonic"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:50
+msgid "Disable Subsonic API access?"
+msgstr "Desativar o acesso o API Subsonic?"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:14
+msgid "Discover how to use Funkwhale from other apps"
+msgstr "Descubra como usar o Funkwhale em outros aplicativos"
+
+#: front/src/components/library/radios/Builder.vue:16
+msgid "Display publicly"
+msgstr "Exibir publicamente"
+
+#: front/src/components/playlists/Editor.vue:42
+msgid "Do you want to clear the playlist \"%{ playlist }\"?"
+msgstr "Você quer limpar a playlist \"%{ playlist }\"?"
+
+#: front/src/components/common/DangerousButton.vue:7
+msgid "Do you want to confirm this action?"
+msgstr "Você quer confirmar esta ação?"
+
+#: front/src/views/playlists/Detail.vue:35
+msgid "Do you want to delete the playlist \"%{ playlist }\"?"
+msgstr "Você deseja excluir a playlist \"%{ playlist }\"?"
+
+#: front/src/views/radios/Detail.vue:26
+msgid "Do you want to delete the radio \"{{ radio }}\"?"
+msgstr "Você deseja excluir a radio \"{{ radio }}\"?"
+
+#: front/src/components/common/ActionTable.vue:29
+msgid "Do you want to launch %{ action } on %{ count } element?"
+msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
+msgstr[0] "Deseja lançar %{ action } no %{ count } elemento?"
+msgstr[1] "Deseja lançar %{ action } nos %{ count } elementos?"
+
+#: front/src/components/Sidebar.vue:113
+msgid "Do you want to restore your previous queue?"
+msgstr "Você quer restaurar sua fila anterior?"
+
+#: front/src/App.vue:38
+msgid "Documentation"
+msgstr "Documentação"
+
+#: front/src/components/audio/track/Table.vue:24 src/components/library/Track.vue:48
+msgid "Download"
+msgstr "Descarregar"
+
+#: front/src/components/audio/track/Table.vue:27
+msgid "Download tracks"
+msgstr "Descarregar músicas"
+
+#: front/src/components/playlists/Editor.vue:49
+msgid "Drag and drop rows to reorder tracks in the playlist"
+msgstr "Arraste e solte as linhas para reordenar as músicas da playlist"
+
+#: front/src/components/library/Track.vue:58
+#: front/src/components/manage/library/FilesTable.vue:43
+msgid "Duration"
+msgstr "Duração"
+
+#: front/src/components/Home.vue:96
+msgid "Easy to use"
+msgstr "Fácil de usar"
+
+#: front/src/components/About.vue:21
+msgid "Edit instance info"
+msgstr "Editar informações da instância"
+
+#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30
+msgid "Edit..."
+msgstr "Editar..."
+
+#: front/src/components/auth/Signup.vue:29
+#: front/src/components/manage/users/UsersTable.vue:38
+msgid "Email"
+msgstr "Email"
+
+#: front/src/views/admin/users/UsersDetail.vue:29
+msgid "Email address"
+msgstr "Endereço de e-mail"
+
+#: front/src/views/auth/EmailConfirm.vue:23
+msgid "Email confirmed"
+msgstr "E-mail confirmado"
+
+#: front/src/views/playlists/Detail.vue:29
+msgid "End edition"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:4
+msgid "Ensure your music files are properly tagged before uploading them."
+msgstr ""
+"Certifique-se de que seus arquivos de música estejam marcados corretamente "
+"antes de carregá-los."
+
+#: front/src/components/library/Radios.vue:140
+msgid "Enter a radio name..."
+msgstr "Indicar um nome de rádio ..."
+
+#: front/src/components/library/Artists.vue:118
+msgid "Enter an artist name..."
+msgstr "Indicar um nome de artista ..."
+
+#: front/src/views/federation/LibraryList.vue:122
+msgid "Enter an library domain name..."
+msgstr "Indicar um nome de domínio de biblioteca ..."
+
+#: front/src/views/playlists/List.vue:104
+msgid "Enter an playlist name..."
+msgstr "Indicar um nome de playlist..."
+
+#: front/src/components/auth/Signup.vue:98
+msgid "Enter your email"
+msgstr "Insira seu email"
+
+#: front/src/components/auth/Signup.vue:96
+msgid "Enter your invitation code (case insensitive)"
+msgstr "Indicar seu código de convite (não diferencia maiúsculas de minúsculas)"
+
+#: front/src/components/metadata/Search.vue:114
+msgid "Enter your search query..."
+msgstr "Insira sua consulta de pesquisa ..."
+
+#: front/src/components/auth/Signup.vue:97
+msgid "Enter your username"
+msgstr "Indicar seu nome de usuário"
+
+#: front/src/components/auth/Login.vue:77
+msgid "Enter your username or email"
+msgstr "Indicar seu nome de usuário ou email"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:20
+msgid "Error"
+msgstr "Erro"
+
+#: front/src/views/admin/Settings.vue:87
+msgid "Error reporting"
+msgstr "Relatório de erros"
+
+#: front/src/components/common/ActionTable.vue:75
+msgid "Error while applying action"
+msgstr "Erro ao aplicar a ação"
+
+#: front/src/views/auth/PasswordReset.vue:7
+msgid "Error while asking for a password reset"
+msgstr "Erro ao solicitar uma redefinição de senha"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:7
+msgid "Error while changing your password"
+msgstr "Erro ao alterar sua senha"
+
+#: front/src/views/auth/EmailConfirm.vue:7
+msgid "Error while confirming your email"
+msgstr "Erro ao confirmar seu email"
+
+#: front/src/components/manage/users/InvitationForm.vue:4
+msgid "Error while creating invitation"
+msgstr "Erro ao criar convite"
+
+#: front/src/components/admin/SettingsGroup.vue:5
+msgid "Error while saving settings"
+msgstr "Erro ao salvar configurações"
+
+#: front/src/components/federation/LibraryForm.vue:10
+msgid "Error while scanning library"
+msgstr "Erro ao verificar biblioteca"
+
+#: front/src/components/library/import/BatchDetail.vue:41
+#: front/src/components/library/import/BatchDetail.vue:70
+#: front/src/components/library/import/BatchList.vue:15
+msgid "Errored"
+msgstr "Errado"
+
+#: front/src/components/playlists/Form.vue:89
+msgid "Everyone"
+msgstr "Todo o mundo"
+
+#: front/src/components/playlists/Form.vue:85
+msgid "Everyone on this instance"
+msgstr "Todos nessa instância"
+
+#: front/src/components/library/radios/Builder.vue:47
+msgid "Exclude"
+msgstr "Excluir"
+
+#: front/src/components/discussion/Comment.vue:14
+msgid "Expand"
+msgstr "Expandir"
+
+#: front/src/components/manage/users/InvitationsTable.vue:41
+msgid "Expiration date"
+msgstr "Data de vencimento"
+
+#: front/src/components/manage/users/InvitationsTable.vue:50
+msgid "Expired"
+msgstr "Expirado"
+
+#: front/src/components/manage/users/InvitationsTable.vue:21
+msgid "Expired/used"
+msgstr "Expirado / usados"
+
+#: front/src/components/library/import/Main.vue:65
+msgid "External source. Supported backends"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:51
+msgid "Favorites"
+msgstr "Favoritas"
+
+#: front/src/components/federation/LibraryForm.vue:3
+msgid "Federate with a new instance"
+msgstr "Federar com uma nova instância"
+
+#: front/src/views/federation/LibraryTrackList.vue:21
+msgid "Federated tracks"
+msgstr "Músicas federadas"
+
+#: front/src/components/Sidebar.vue:87 src/components/library/import/BatchList.vue:25
+#: front/src/components/manage/users/UsersTable.vue:180
+#: front/src/views/admin/Settings.vue:84 src/views/admin/users/UsersDetail.vue:161
+#: front/src/views/federation/Base.vue:35 src/views/federation/LibraryDetail.vue:40
+msgid "Federation"
+msgstr "Federação"
+
+#: front/src/views/federation/LibraryDetail.vue:3
+msgid "File mirroring"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:43
+msgid "File name"
+msgstr "Nome do ficheiro"
+
+#: front/src/components/library/import/Main.vue:76
+msgid "File upload"
+msgstr "Enviar ficheiros"
+
+#: front/src/views/admin/library/Base.vue:5 src/views/admin/library/FilesList.vue:21
+msgid "Files"
+msgstr "Ficheiros"
+
+#: front/src/components/library/import/ArtistImport.vue:7
+msgid "Filter album types"
+msgstr "Filtrar tipos de álbuns"
+
+#: front/src/components/library/radios/Builder.vue:46
+msgid "Filter name"
+msgstr "Nome do filtro"
+
+#: front/src/components/library/import/Main.vue:52
+msgid "Finish import"
+msgstr "Acabar a importação"
+
+#: front/src/components/library/import/BatchDetail.vue:54
+msgid "Finished"
+msgstr "Acabado"
+
+#: front/src/components/library/import/Main.vue:59
+msgid "First, choose where you want to import the music from"
+msgstr "Primeiro, escolha onde você quer importar a música de"
+
+#: front/src/components/federation/LibraryCard.vue:44
+msgid "Follow"
+msgstr "Segue"
+
+#: front/src/components/federation/LibraryCard.vue:36
+msgid "Follow request pending approval"
+msgstr "Aprovar a solicitação de seguir pendente"
+
+#: front/src/views/federation/LibraryDetail.vue:21
+msgid "Follow status"
+msgstr "Siga o status"
+
+#: front/src/views/federation/Base.vue:13
+#: front/src/views/federation/LibraryFollowersList.vue:24
+msgid "Followers"
+msgstr "Seguidores"
+
+#: front/src/components/federation/LibraryCard.vue:18
+msgid "Followers only"
+msgstr "Só seguidores"
+
+#: front/src/components/federation/LibraryCard.vue:15
+#: front/src/views/federation/LibraryDetail.vue:29
+msgid "Following"
+msgstr "Seguir"
+
+#: front/src/components/activity/Like.vue:12 src/components/activity/Listen.vue:12
+msgid "from %{ album } by %{ artist }"
+msgstr "de %{ album } por %{ artist }"
+
+#: front/src/components/library/Track.vue:13
+msgid "From album %{ album } by %{ artist }"
+msgstr "Do álbum %{ album } por %{ artist }"
+
+#: front/src/App.vue:56
+msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!"
+msgstr ""
+"O Funkwhale é um projeto gratuito e de código aberto executado por "
+"voluntários. Você pode nos ajudar a melhorar a plataforma reportando bugs, "
+"sugerindo recursos e compartilhando o projeto com seus amigos!"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgid "Funkwhale is compatible with other music players that support the Subsonic API."
+msgstr ""
+"O Funkwhale é compatível com outros players de música que suportam a API "
+"Subsonic."
+
+#: front/src/components/Home.vue:98
+msgid "Funkwhale is dead simple to use."
+msgstr "Funkwhale é muito simples de usar."
+
+#: front/src/components/Home.vue:39
+msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists."
+msgstr ""
+"O Funkwhale foi projetado para facilitar a escuta da música que você gosta "
+"ou descobrir novos artistas."
+
+#: front/src/components/Home.vue:119
+msgid "Funkwhale is free and gives you control on your music."
+msgstr "O Funkwhale é gratuito e permite controlar sua música."
+
+#: front/src/components/Home.vue:66
+msgid "Funkwhale takes care of handling your music"
+msgstr "Funkwhale cuida da sua música"
+
+#: front/src/components/manage/users/InvitationForm.vue:16
+msgid "Get a new invitation"
+msgstr "Receba um novo convite"
+
+#: front/src/components/Home.vue:13
+msgid "Get me to the library"
+msgstr "Me leve para a biblioteca"
+
+#: front/src/components/Home.vue:77
+msgid ""
+"Get quality metadata about your music thanks to\n"
+"              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
+msgstr ""
+"Obtenha metadados de qualidade sobre sua música\n"
+"              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
+
+#: front/src/components/common/ActionTable.vue:21
+#: front/src/components/common/ActionTable.vue:27
+msgid "Go"
+msgstr "Vá"
+
+#: front/src/components/PageNotFound.vue:14
+msgid "Go to home page"
+msgstr "Vá para a página inicial"
+
+#: front/src/components/library/import/Main.vue:13
+msgid "Grab corresponding metadata"
+msgstr "Pegue os metadados correspondentes"
+
+#: front/src/components/library/Home.vue:65
+msgid "Home"
+msgstr "Casa"
+
+#: front/src/components/instance/Stats.vue:36
+msgid "Hours of music"
+msgstr "Horas de música"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:11
+msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
+msgstr ""
+"No entanto, acessar o Funkwhale desses clientes requer uma senha separada "
+"que você pode definir abaixo."
+
+#: front/src/components/library/import/BatchList.vue:34
+msgid "ID"
+msgstr "ID"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:24
+msgid "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."
+msgstr ""
+"Se o endereço de e-mail fornecido na etapa anterior for válido e vinculado a "
+"uma conta de usuário, você deverá receber um e-mail com instruções de "
+"redefinição nos próximos minutos."
+
+#: front/src/components/federation/LibraryTrackTable.vue:196
+#: front/src/components/library/Library.vue:17
+msgid "Import"
+msgstr "Importação"
+
+#: front/src/components/federation/LibraryTrackTable.vue:57
+msgid "Import #%{ id } launched"
+msgstr "Importação#%{ id } lançado"
+
+#: front/src/components/library/import/Main.vue:38
+msgid "Import %{ count } track"
+msgid_plural "Import %{ count } tracks"
+msgstr[0] "Importar %{ count } música"
+msgstr[1] "Importar %{ count } músicas"
+
+#: front/src/components/library/import/BatchDetail.vue:10
+msgid "Import batch"
+msgstr "Importa lote"
+
+#: front/src/components/library/import/BatchDetail.vue:185
+msgid "Import Batch #%{ id }"
+msgstr "Importa lote #%{ id }"
+
+#: front/src/components/library/Library.vue:20
+msgid "Import batches"
+msgstr "Importação de lotes"
+
+#: front/src/components/library/import/BatchList.vue:117
+msgid "Import Batches"
+msgstr "Importação de lotes"
+
+#: front/src/components/manage/library/FilesTable.vue:40
+#: front/src/components/manage/library/RequestsTable.vue:53
+msgid "Import date"
+msgstr "Data de importação"
+
+#: front/src/components/library/import/FileUpload.vue:38
+msgid "Import detail page"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:81
+msgid "Import music"
+msgstr "Importar música"
+
+#: front/src/components/library/import/Main.vue:267
+msgid "Import Music"
+msgstr "Importar Música"
+
+#: front/src/components/Home.vue:71
+msgid "Import music from various platforms, such as YouTube or SoundCloud"
+msgstr "Importe músicas de várias plataformas, como o YouTube ou o SoundCloud"
+
+#: front/src/components/federation/LibraryTrackTable.vue:14
+#: front/src/components/federation/LibraryTrackTable.vue:66
+msgid "Import pending"
+msgstr "Importação pendente"
+
+#: front/src/views/admin/library/Base.vue:9
+#: front/src/views/admin/library/RequestsList.vue:3
+#: front/src/views/admin/library/RequestsList.vue:21
+msgid "Import requests"
+msgstr "Solicitações de importação"
+
+#: front/src/components/library/import/BatchList.vue:20
+#: front/src/components/library/import/Main.vue:6
+msgid "Import source"
+msgstr "Origem de importação"
+
+#: front/src/components/federation/LibraryTrackTable.vue:9
+msgid "Import status"
+msgstr "Status de Importação"
+
+#: front/src/components/library/import/ReleaseImport.vue:14
+msgid "Import this release"
+msgstr "Importar esta publicação"
+
+#: front/src/components/library/import/TrackImport.vue:11
+msgid "Import this track"
+msgstr "Importar esta música"
+
+#: front/src/components/federation/LibraryTrackTable.vue:12
+#: front/src/components/manage/library/RequestsTable.vue:29
+#: front/src/components/manage/library/RequestsTable.vue:61
+msgid "Imported"
+msgstr "Importado"
+
+#: front/src/components/library/import/TrackImport.vue:44
+msgid "Imported URL"
+msgstr "URL importado"
+
+#: front/src/views/admin/Settings.vue:82
+msgid "Imports"
+msgstr "Importações"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:3
+msgid "In favorites"
+msgstr "Nos favoritos"
+
+#: front/src/components/federation/LibraryTrackTable.vue:65
+msgid "In library"
+msgstr "Na biblioteca"
+
+#: front/src/components/manage/users/UsersTable.vue:54
+msgid "Inactive"
+msgstr "Inativo"
+
+#: front/src/components/library/import/Main.vue:96
+msgid "Input a MusicBrainz ID manually:"
+msgstr "Insira um ID do MusicBrainz manualmente:"
+
+#: front/src/views/auth/PasswordReset.vue:53
+msgid "Input the email address binded to your account"
+msgstr "Insira o endereço de e-mail vinculado à sua conta"
+
+#: front/src/components/playlists/Editor.vue:31
+msgid "Insert from queue (%{ count } track)"
+msgid_plural "Insert from queue (%{ count } tracks)"
+msgstr[0] "Inserir da fila (%{ count } música)"
+msgstr[1] "Inserir da fila (%{ count } músicas)"
+
+#: front/src/views/admin/Settings.vue:80
+msgid "Instance information"
+msgstr "Informação da instância"
+
+#: front/src/components/library/Radios.vue:9
+msgid "Instance radios"
+msgstr "Rádios da instância"
+
+#: front/src/views/admin/Settings.vue:75
+msgid "Instance settings"
+msgstr "Configurações da instância"
+
+#: front/src/views/instance/Timeline.vue:57
+msgid "Instance Timeline"
+msgstr "Linha do tempo da instância"
+
+#: front/src/components/auth/Signup.vue:42
+#: front/src/components/manage/users/InvitationForm.vue:11
+msgid "Invitation code"
+msgstr "Código de Convite"
+
+#: front/src/components/auth/Signup.vue:43
+msgid "Invitation code (optional)"
+msgstr "Código de convite (opcional)"
+
+#: front/src/views/admin/users/Base.vue:8 src/views/admin/users/InvitationsList.vue:3
+#: front/src/views/admin/users/InvitationsList.vue:24
+msgid "Invitations"
+msgstr "Convites"
+
+#: front/src/App.vue:43
+msgid "Issue tracker"
+msgstr "Rastreador de problemas"
+
+#: front/src/components/library/import/BatchDetail.vue:80
+msgid "Job ID"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:36
+msgid "Jobs"
+msgstr ""
+
+#: front/src/components/Home.vue:50
+msgid "Keep a track of your favorite songs"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:33
+msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account."
+msgstr "Mantenha o seu PRIVATE_TOKEN segredo, pois dá acesso à sua conta."
+
+#: front/src/components/manage/users/UsersTable.vue:41
+#: front/src/views/admin/users/UsersDetail.vue:45
+msgid "Last activity"
+msgstr "Ultima atividade"
+
+#: front/src/views/federation/LibraryDetail.vue:101
+msgid "Last fetched"
+msgstr "Última recuperação"
+
+#: front/src/components/playlists/PlaylistModal.vue:32
+msgid "Last modification"
+msgstr "Última modificação"
+
+#: front/src/components/common/ActionTable.vue:39
+msgid "Launch"
+msgstr "Lançamento"
+
+#: front/src/components/library/import/BatchDetail.vue:18
+#: front/src/components/library/import/BatchList.vue:35
+msgid "Launch date"
+msgstr "Data de lançamento"
+
+#: front/src/components/federation/LibraryForm.vue:31
+msgid "Launch scan"
+msgstr ""
+
+#: front/src/components/Home.vue:10
+msgid "Learn more about this instance"
+msgstr "Saiba mais sobre esta instância"
+
+#: front/src/components/manage/users/InvitationForm.vue:58
+msgid "Leave empty for a random code"
+msgstr "Deixar vazio para um código aleatório"
+
+#: front/src/components/requests/Form.vue:10
+msgid "Leave this field empty if you're requesting the whole discography."
+msgstr "Deixe essa área vazia se você estiver solicitando toda a discografia."
+
+#: front/src/views/federation/Base.vue:5 src/views/federation/LibraryList.vue:123
+msgid "Libraries"
+msgstr "Bibliotecas"
+
+#: front/src/components/Sidebar.vue:70
+#: front/src/components/federation/LibraryTrackTable.vue:51
+#: front/src/components/instance/Stats.vue:30
+#: front/src/components/manage/users/UsersTable.vue:176
+#: front/src/views/admin/users/UsersDetail.vue:157
+#: front/src/views/federation/LibraryDetail.vue:194
+msgid "Library"
+msgstr "Biblioteca"
+
+#: front/src/views/admin/library/FilesList.vue:3
+msgid "Library files"
+msgstr "Ficheiros da biblioteca"
+
+#: front/src/components/federation/LibraryForm.vue:20
+msgid "Library name"
+msgstr "Nome da biblioteca"
+
+#: front/src/views/federation/LibraryDetail.vue:84
+msgid "Library size"
+msgstr "Tamanho da biblioteca"
+
+#: front/src/components/federation/LibraryForm.vue:96
+msgid "library@demo.funkwhale.audio"
+msgstr "library@demo.funkwhale.audio"
+
+#: front/src/App.vue:29
+msgid "Links"
+msgstr "Ligações"
+
+#: front/src/views/instance/Timeline.vue:4
+msgid "Loading timeline..."
+msgstr "Carregando a linha do tempo ..."
+
+#: front/src/components/favorites/List.vue:5
+msgid "Loading your favorites..."
+msgstr "Carregando seus favoritos ..."
+
+#: front/src/components/auth/Login.vue:78
+msgid "Log In"
+msgstr "Autenticação"
+
+#: front/src/components/auth/Login.vue:4
+msgid "Log in to your Funkwhale account"
+msgstr "Logar na sua conta Funkwhale"
+
+#: front/src/components/auth/Logout.vue:20
+msgid "Log Out"
+msgstr "Sair"
+
+#: front/src/components/Sidebar.vue:38
+msgid "Logged in as %{ username }"
+msgstr "Conectado como %{ username }"
+
+#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41
+msgid "Login"
+msgstr "Entrar"
+
+#: front/src/components/Sidebar.vue:43
+msgid "Logout"
+msgstr "Sair"
+
+#: front/src/components/audio/Player.vue:266
+msgid "Looping disabled. Click to switch to single-track looping."
+msgstr "Looping desativado. Clique para alternar para um loop de musica única."
+
+#: front/src/components/audio/Player.vue:267
+msgid "Looping on a single track. Click to switch to whole queue looping."
+msgstr ""
+"Looping em uma única música. Clique para alternar para todo o loop da fila."
+
+#: front/src/components/audio/Player.vue:268
+msgid "Looping on whole queue. Click to disable looping."
+msgstr "Looping na fila inteira. Clique para desativar o loop."
+
+#: front/src/components/library/Track.vue:94
+msgid "Lyrics"
+msgstr "Letras"
+
+#: front/src/views/admin/library/Base.vue:25
+msgid "Manage library"
+msgstr "Gerenciar biblioteca"
+
+#: front/src/components/playlists/PlaylistModal.vue:3
+msgid "Manage playlists"
+msgstr "Gerenciar playlists"
+
+#: front/src/views/admin/users/Base.vue:20
+msgid "Manage users"
+msgstr "Gerenciar usuários"
+
+#: front/src/views/playlists/List.vue:8
+msgid "Manage your playlists"
+msgstr "Gerenciar suas playlists"
+
+#: front/src/components/manage/library/RequestsTable.vue:197
+msgid "Mark as closed"
+msgstr "Marcar como fechado"
+
+#: front/src/components/manage/library/RequestsTable.vue:196
+msgid "Mark as imported"
+msgstr "Marcar como importado"
+
+#: front/src/components/library/import/Main.vue:12
+msgid "Metadata"
+msgstr "Metadados"
+
+#: front/src/components/library/import/Main.vue:115
+msgid ""
+"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n"
+"            <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"              MusicBrainz\n"
+"            </a>\n"
+"            project, which you can think about as the Wikipedia of music."
+msgstr ""
+"Metadados são os dados relacionados à música que você deseja importar. Isso "
+"inclui todas as informações sobre os artistas, álbuns e músicas. Para ter "
+"uma biblioteca de alta qualidade, recomenda-se obter dados do\n"
+"            <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"              MusicBrainz\n"
+"            </a>\n"
+"            projeto, que você pode considerar como a Wikipedia da música."
+
+#: front/src/components/Sidebar.vue:48 src/components/library/import/Main.vue:18
+msgid "Music"
+msgstr "Música"
+
+#: front/src/components/library/import/Main.vue:147
+msgid "Music request"
+msgstr "Pedido de música"
+
+#: front/src/components/audio/Player.vue:265
+msgid "Mute"
+msgstr "Mudo"
+
+#: front/src/components/Sidebar.vue:34
+msgid "My account"
+msgstr "Minha conta"
+
+#: front/src/components/playlists/Form.vue:74
+msgid "My awesome playlist"
+msgstr "Minha playlist incrível"
+
+#: front/src/components/library/radios/Builder.vue:206
+msgid "My awesome radio"
+msgstr "Meu rádio incrível"
+
+#: front/src/components/library/Track.vue:64 src/components/library/Track.vue:75
+#: front/src/components/library/Track.vue:86
+#: front/src/components/manage/library/FilesTable.vue:63
+#: front/src/components/manage/library/FilesTable.vue:69
+#: front/src/components/manage/library/FilesTable.vue:75
+#: front/src/components/manage/library/FilesTable.vue:81
+#: front/src/components/manage/library/RequestsTable.vue:71
+#: front/src/components/manage/library/RequestsTable.vue:75
+#: front/src/components/manage/library/RequestsTable.vue:82
+#: front/src/components/manage/users/UsersTable.vue:61
+#: front/src/views/admin/users/UsersDetail.vue:49
+msgid "N/A"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/views/admin/users/UsersDetail.vue:21
+msgid "Name"
+msgstr "Nome"
+
+#: front/src/components/auth/Settings.vue:88
+#: front/src/views/auth/PasswordResetConfirm.vue:14
+msgid "New password"
+msgstr "Nova senha"
+
+#: front/src/components/Sidebar.vue:158
+msgid "New tracks will be appended here automatically."
+msgstr "Novas músicas serão adicionadas automaticamente aqui."
+
+#: front/src/components/library/import/Main.vue:29
+msgid "Next step"
+msgstr "Próxima etapa"
+
+#: front/src/components/audio/Player.vue:263
+msgid "Next track"
+msgstr "Música seguinte"
+
+#: front/src/components/Sidebar.vue:125
+msgid "No"
+msgstr "Não"
+
+#: front/src/components/Home.vue:103
+msgid "No add-ons, no plugins : you only need a web library"
+msgstr "Sem add-ons, sem plugins: você só precisa de uma biblioteca da Web"
+
+#: front/src/components/library/Track.vue:102
+msgid "No lyrics available for this track."
+msgstr "Nenhuma letra disponível para esta música."
+
+#: front/src/components/playlists/Form.vue:81
+msgid "Nobody except me"
+msgstr "Ninguém, exceto eu"
+
+#: front/src/views/federation/LibraryDetail.vue:32
+msgid "Not following"
+msgstr "Não seguir"
+
+#: front/src/components/federation/LibraryTrackTable.vue:13
+#: front/src/components/federation/LibraryTrackTable.vue:67
+msgid "Not imported"
+msgstr "Não importado"
+
+#: front/src/components/manage/users/InvitationsTable.vue:51
+msgid "Not used"
+msgstr "Não usado"
+
+#: front/src/App.vue:37
+msgid "Official website"
+msgstr "Website oficial"
+
+#: front/src/components/auth/Settings.vue:83
+msgid "Old password"
+msgstr "Senha Antiga"
+
+#: front/src/components/library/import/FileUpload.vue:36
+msgid "Once all your files are uploaded, simply click the following button to check the import status."
+msgstr ""
+"Depois que todos os seus ficheiros foram carregados, basta clicar no botão a "
+"seguir para verificar o status de importação."
+
+#: front/src/components/federation/LibraryCard.vue:21
+#: front/src/components/manage/users/InvitationsTable.vue:20
+#, fuzzy
+msgid "Open"
+msgstr "Aberto"
+
+#: front/src/App.vue:63
+msgid "Options"
+msgstr "Opções"
+
+#: front/src/components/library/import/Main.vue:93
+#, fuzzy
+msgid "Or"
+msgstr "Ou"
+
+#: front/src/components/favorites/List.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:18
+#: front/src/components/library/Artists.vue:15 src/components/library/Radios.vue:33
+#: front/src/components/manage/library/FilesTable.vue:9
+#: front/src/components/manage/library/RequestsTable.vue:9
+#: front/src/components/manage/users/InvitationsTable.vue:9
+#: front/src/components/manage/users/UsersTable.vue:9
+#: front/src/views/federation/LibraryList.vue:18 src/views/playlists/List.vue:17
+msgid "Ordering"
+msgstr "Ordenar"
+
+#: front/src/components/favorites/List.vue:31
+#: front/src/components/federation/LibraryTrackTable.vue:26
+#: front/src/components/library/Artists.vue:23 src/components/library/Radios.vue:41
+#: front/src/components/manage/library/FilesTable.vue:17
+#: front/src/components/manage/library/RequestsTable.vue:17
+#: front/src/components/manage/users/UsersTable.vue:17
+#: front/src/views/federation/LibraryList.vue:26 src/views/playlists/List.vue:25
+msgid "Ordering direction"
+msgstr "Direção de ordenar"
+
+#: front/src/components/manage/users/InvitationsTable.vue:38
+msgid "Owner"
+msgstr "Proprietário"
+
+#: front/src/components/PageNotFound.vue:33
+msgid "Page Not Found"
+msgstr "Página não encontrada"
+
+#: front/src/components/PageNotFound.vue:7
+msgid "Page not found!"
+msgstr "Página não encontrada!"
+
+#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38
+msgid "Password"
+msgstr "Palavra-passe"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:95
+msgid "Password updated"
+msgstr "Senha atualizada"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:28
+msgid "Password updated successfully"
+msgstr "Senha atualizada com sucesso"
+
+#: front/src/components/audio/Player.vue:262
+msgid "Pause track"
+msgstr "Parar música"
+
+#: front/src/components/federation/LibraryFollowTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:33
+#: front/src/components/library/import/BatchDetail.vue:69
+#: front/src/components/library/import/BatchList.vue:14
+#: front/src/components/library/import/FileUpload.vue:59
+#: front/src/components/manage/library/RequestsTable.vue:27
+#: front/src/components/manage/library/RequestsTable.vue:63
+msgid "Pending"
+msgstr "Pendente"
+
+#: front/src/components/federation/LibraryFollowTable.vue:11
+#: front/src/views/federation/LibraryDetail.vue:26
+msgid "Pending approval"
+msgstr "Aprovação pendente"
+
+#: front/src/components/Sidebar.vue:217
+msgid "Pending follow requests"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26
+msgid "Pending import requests"
+msgstr "Pedidos de importação pendentes"
+
+#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36
+msgid "Pending requests"
+msgstr "Solicitações pendentes"
+
+#: front/src/components/manage/users/UsersTable.vue:42
+#: front/src/views/admin/users/UsersDetail.vue:68
+msgid "Permissions"
+msgstr "Permissões"
+
+#: front/src/components/audio/PlayButton.vue:9 src/components/library/Track.vue:30
+#, fuzzy
+msgid "Play"
+msgstr "Tocar"
+
+#: front/src/components/audio/album/Card.vue:50
+#: front/src/components/audio/artist/Card.vue:44 src/components/library/Album.vue:28
+#: front/src/views/playlists/Detail.vue:23
+msgid "Play all"
+msgstr "Jogar tudo"
+
+#: front/src/components/library/Artist.vue:26
+msgid "Play all albums"
+msgstr "Jogar todos os álbuns"
+
+#: front/src/components/audio/PlayButton.vue:58
+msgid "Play immediatly"
+msgstr "Jogar imediatamente"
+
+#: front/src/components/audio/PlayButton.vue:15
+msgid "Play next"
+msgstr "Jogar seguinte"
+
+#: front/src/components/audio/PlayButton.vue:16
+msgid "Play now"
+msgstr "Jogue agora"
+
+#: front/src/components/audio/Player.vue:261
+msgid "Play track"
+msgstr "Jogar mũsica"
+
+#: front/src/views/playlists/Detail.vue:90
+msgid "Playlist"
+msgstr "Playlist"
+
+#: front/src/views/playlists/Detail.vue:12
+msgid "Playlist containing %{ count } track, by %{ username }"
+msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
+msgstr[0] "Playlist contendo%{ count } música, por %{ username }"
+msgstr[1] "Playlist contendo %{ count } músicas, por %{ username }"
+
+#: front/src/components/playlists/Form.vue:9
+msgid "Playlist created"
+msgstr "Playlist criada"
+
+#: front/src/components/playlists/Editor.vue:4
+msgid "Playlist editor"
+msgstr "Editor de playlist"
+
+#: front/src/components/playlists/Form.vue:21
+msgid "Playlist name"
+msgstr "Nome da playlist"
+
+#: front/src/components/playlists/Form.vue:6
+msgid "Playlist updated"
+msgstr "Playlist atualizada"
+
+#: front/src/components/playlists/Form.vue:25
+msgid "Playlist visibility"
+msgstr "Visibilidade da playlist"
+
+#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16
+#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83
+#: front/src/views/playlists/List.vue:103
+msgid "Playlists"
+msgstr "Playlists"
+
+#: front/src/components/Home.vue:56
+msgid "Playlists? We got them"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
+msgid "Please double-check your password is correct"
+msgstr "Por favor, verifique novamente se sua senha está correta"
+
+#: front/src/components/auth/Login.vue:9
+msgid "Please double-check your username/password couple is correct"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:46
+msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:26
+msgid "Previous step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:260
+msgid "Previous track"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:26
+#: front/src/views/auth/PasswordResetConfirm.vue:31
+msgid "Proceed to login"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:50
+msgid "Published date"
+msgstr ""
+
+#: front/src/components/library/import/ArtistImport.vue:17
+msgid "Query template"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:20
+msgid "Queue"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:203
+msgid "Queue shuffled!"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:80
+msgid "Radio"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:205
+msgid "Radio Builder"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:11
+msgid "Radio name"
+msgstr ""
+
+#: front/src/components/library/Library.vue:10 src/components/library/Radios.vue:141
+msgid "Radios"
+msgstr ""
+
+#: front/src/views/instance/Timeline.vue:7
+msgid "Recent activity on this instance"
+msgstr ""
+
+#: front/src/components/library/Home.vue:24
+msgid "Recently added"
+msgstr ""
+
+#: front/src/components/library/Home.vue:11
+msgid "Recently favorited"
+msgstr ""
+
+#: front/src/components/library/Home.vue:6
+msgid "Recently listened"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:81
+msgid "Recording MusicBrainz ID"
+msgstr ""
+
+#: front/src/views/admin/users/UsersDetail.vue:84
+#: front/src/views/federation/LibraryDetail.vue:122
+msgid "Refresh"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:42
+msgid "Refused"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:12
+msgid "Registered since %{ date }"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:9
+msgid "Registration are closed on this instance, you will need an invitation code to signup."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:71
+msgid "regular user"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:59
+msgid "Remove"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:58
+msgid "Remove avatar"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:19
+msgid "Remove from favorites"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:34
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+msgid "Request a new password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:35
+msgid "Request a new Subsonic API password?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:43
+msgid "Request a password"
+msgstr ""
+
+#: front/src/App.vue:35
+msgid "Request music"
+msgstr ""
+
+#: front/src/views/library/MusicRequest.vue:4 src/views/library/MusicRequest.vue:21
+msgid "Request some music"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:20
+msgid "Request submitted!"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:49
+msgid "Rerun errored jobs"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:187
+msgid "Rerun job"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4
+#: front/src/views/auth/PasswordReset.vue:52
+msgid "Reset your password"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:31
+msgid "Result %{ current }/%{ total }"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:38 src/components/library/Artists.vue:30
+#: front/src/components/library/Radios.vue:52 src/views/federation/LibraryList.vue:33
+#: front/src/views/playlists/List.vue:32
+msgid "Results per page"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:63
+#: front/src/components/library/radios/Builder.vue:19
+msgid "Save"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:112
+msgid "Scan triggered!"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:5
+#: front/src/components/library/Artists.vue:10 src/components/library/Radios.vue:29
+#: front/src/components/library/import/BatchDetail.vue:62
+#: front/src/components/library/import/BatchList.vue:7
+#: front/src/components/manage/library/FilesTable.vue:5
+#: front/src/components/manage/library/RequestsTable.vue:5
+#: front/src/components/manage/users/InvitationsTable.vue:5
+#: front/src/components/manage/users/UsersTable.vue:5
+#: front/src/views/federation/LibraryList.vue:14 src/views/playlists/List.vue:13
+msgid "Search"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:85
+msgid "Search an entity you want to import:"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:180
+msgid "Search by artist, username, comment..."
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:188
+msgid "Search by source..."
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:116
+msgid "Search by submitter, source..."
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:182
+#: front/src/components/manage/library/FilesTable.vue:175
+msgid "Search by title, artist, domain..."
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:140
+msgid "Search by username, domain..."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:152
+msgid "Search by username, email, code..."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:162
+msgid "Search by username, email, name..."
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:20
+msgid "Search for artists, albums, tracks..."
+msgstr ""
+
+#: front/src/components/audio/Search.vue:2
+msgid "Search for some music"
+msgstr ""
+
+#: front/src/components/library/Track.vue:105
+msgid "Search on lyrics.wikia.com"
+msgstr ""
+
+#: front/src/components/library/Album.vue:33 src/components/library/Artist.vue:31
+#: front/src/components/library/Track.vue:40
+msgid "Search on Wikipedia"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:42
+msgid "Search query"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:15
+msgid "Sections"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:31
+msgid "Select a filter"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:61
+msgid "Select all %{ total } elements"
+msgid_plural "Select all %{ total } elements"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/import/FileUpload.vue:22
+msgid "Select files to upload..."
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:69
+msgid "Select only current page"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:19
+msgid "Select relevant sources or files for import"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:43
+msgid "Send a follow request"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:97 src/components/manage/users/UsersTable.vue:184
+#: front/src/views/admin/users/UsersDetail.vue:165
+msgid "Settings"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:10
+msgid "Settings updated"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:11
+msgid "Settings updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:24
+msgid "Settings..."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:27
+msgid "Share link"
+msgstr ""
+
+#: front/src/components/audio/artist/Card.vue:30
+msgid "Show 1 more album"
+msgid_plural "Show %{ count } more albums"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/audio/album/Card.vue:40
+msgid "Show 1 more track"
+msgid_plural "Show %{ count } more tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/forms/PasswordInput.vue:25
+msgid "Show/hide password"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:97
+#: front/src/components/federation/LibraryTrackTable.vue:98
+#: front/src/components/library/import/BatchDetail.vue:128
+#: front/src/components/library/import/BatchList.vue:73
+#: front/src/components/manage/library/FilesTable.vue:97
+#: front/src/components/manage/library/RequestsTable.vue:104
+#: front/src/components/manage/users/InvitationsTable.vue:76
+#: front/src/components/manage/users/UsersTable.vue:87
+msgid "Showing results %{ start }-%{ end } on %{ total }"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:269
+msgid "Shuffle your queue"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:95
+msgid "Sign Up"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:40
+#: front/src/views/admin/users/UsersDetail.vue:37
+msgid "Sign-up"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:31
+msgid "Simply copy paste the snippet below into a terminal to launch the download."
+msgstr ""
+
+#: front/src/components/library/Track.vue:69
+#: front/src/components/library/import/FileUpload.vue:44
+#: front/src/components/manage/library/FilesTable.vue:44
+msgid "Size"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:37
+#: front/src/components/library/import/BatchDetail.vue:72
+msgid "Skipped"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:3
+msgid "Something's missing in the library? Let us know what you would like to listen!"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:25
+msgid "Sorry, we did not found any album matching your query"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:16
+msgid "Sorry, we did not found any artist matching your query"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:82
+#: front/src/components/library/import/BatchList.vue:38
+#: front/src/components/library/import/TrackImport.vue:17
+msgid "Source"
+msgstr ""
+
+#: front/src/App.vue:41
+msgid "Source code"
+msgstr ""
+
+#: front/src/App.vue:40
+msgid "Source code (%{version})"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:20
+#: front/src/components/manage/users/UsersTable.vue:70
+msgid "Staff member"
+msgstr ""
+
+#: front/src/components/radios/Button.vue:4
+msgid "Start"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:28
+msgid "Start Upload"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:86
+msgid "Statistics"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:66
+#: front/src/components/library/import/BatchDetail.vue:83
+#: front/src/components/library/import/BatchList.vue:11
+#: front/src/components/library/import/BatchList.vue:37
+#: front/src/components/library/import/FileUpload.vue:45
+#: front/src/components/manage/library/RequestsTable.vue:24
+#: front/src/components/manage/library/RequestsTable.vue:48
+#: front/src/components/manage/users/InvitationsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:39
+#: front/src/components/manage/users/UsersTable.vue:43
+msgid "Status"
+msgstr ""
+
+#: front/src/components/radios/Button.vue:3
+msgid "Stop"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:159
+msgid "Stop radio"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:32
+msgid "Stop Upload"
+msgstr ""
+
+#: front/src/App.vue:9 src/components/requests/Form.vue:17
+msgid "Submit"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:22
+msgid "Submit another request"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:26
+#: front/src/components/library/import/BatchList.vue:39
+msgid "Submitted by"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:85
+msgid "Subsonic"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:2
+msgid "Subsonic API password"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:71
+#: front/src/components/library/import/BatchList.vue:16
+#: front/src/components/library/import/FileUpload.vue:56
+msgid "Success"
+msgstr ""
+
+#: front/src/App.vue:11
+msgid "Suggested choices"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:9
+msgid "Syncing changes to server..."
+msgstr ""
+
+#: front/src/components/Home.vue:26
+msgid "That's simple: we loved Grooveshark and we want to build something even better."
+msgstr ""
+
+#: front/src/components/requests/Form.vue:73
+msgid "The Beatles, Mickael Jackson…"
+msgstr ""
+
+#: front/src/App.vue:59
+msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
+msgstr ""
+
+#: front/src/components/Home.vue:124
+msgid "The plaform is free and open-source, you can install it and modify it without worries"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:4
+msgid "The Subsonic API is not available on this Funkwhale instance."
+msgstr ""
+
+#: front/src/components/requests/Form.vue:74
+msgid "The White Album, Thriller…"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:30
+msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:149
+msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled."
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:195
+msgid "This indicate if the remote library granted you access"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:16
+msgid "This is you!"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:37
+msgid "This may affect a lot of elements, please double check this is really what you want."
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:61
+msgid "This track is not imported and cannot be played"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:37
+msgid "This will completely delete this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:27
+msgid "This will completely delete this radio and cannot be undone."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:51
+msgid "This will completely disable access to the Subsonic API using from account."
+msgstr ""
+
+#: front/src/App.vue:133
+msgid "This will erase your local data and disconnect you, do you want to continue?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:36
+msgid "This will log you out from existing devices that use the current password."
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:44
+msgid "This will remove all tracks from this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:6
+#: front/src/components/federation/LibraryTrackTable.vue:47
+#: front/src/components/manage/library/FilesTable.vue:37
+msgid "Title"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:27 src/components/library/Track.vue:174
+#: front/src/components/library/import/BatchDetail.vue:84
+#: front/src/components/metadata/Search.vue:138
+msgid "Track"
+msgstr ""
+
+#: front/src/components/library/Track.vue:53
+msgid "Track information"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:44
+msgid "Track matching filter"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:54
+msgid "tracks"
+msgstr ""
+
+#: front/src/components/library/Album.vue:43
+#: front/src/components/playlists/PlaylistModal.vue:33
+#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50
+#: front/src/views/radios/Detail.vue:34
+msgid "Tracks"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:125
+msgid "Tracks available in this library"
+msgstr ""
+
+#: front/src/components/library/Artist.vue:54
+msgid "Tracks by this artist"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:25
+msgid "Tracks favorited"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:19
+msgid "tracks listened"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:109
+msgid "Trigger scan"
+msgstr ""
+
+#: front/src/components/manage/library/FilesTable.vue:41
+msgid "Type"
+msgstr ""
+
+#: front/src/components/About.vue:15
+msgid "Unfortunately, owners of this instance did not yet take the time to complete this page."
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:95
+msgid "Unknown"
+msgstr ""
+
+#: front/src/components/Home.vue:37
+msgid "Unlimited music"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:264
+msgid "Unmute"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:50
+msgid "Update avatar"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:33
+msgid "Update playlist"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:27
+msgid "Update settings"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:21
+msgid "Update your password"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:172
+#: front/src/views/admin/users/UsersDetail.vue:153
+msgid "Upload"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:45
+msgid "Upload a new avatar"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:7
+msgid "Uploaded files or external source"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:57
+msgid "Uploading..."
+msgstr ""
+
+#: front/src/App.vue:45
+msgid "Use another instance"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:75
+msgid "Use this comment box to add details to your request if needed"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:196
+msgid "Use this flag to enable/disable federation with this library"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:12
+msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:6
+msgid "Use this form to scan an instance and setup federation."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:49
+msgid "Used"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:47
+msgid "User"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:5
+msgid "User activity"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:20
+msgid "User radios"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:19
+#: front/src/components/manage/users/UsersTable.vue:37
+msgid "Username"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:15
+msgid "Username or email"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:13
+msgid "users"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81
+#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3
+#: front/src/views/admin/users/UsersList.vue:21
+msgid "Users"
+msgstr ""
+
+#: front/src/components/library/Album.vue:37 src/components/library/Artist.vue:35
+#: front/src/components/library/Track.vue:44
+#: front/src/components/library/import/ArtistImport.vue:131
+#: front/src/components/metadata/ArtistCard.vue:49
+#: front/src/components/metadata/ReleaseCard.vue:53
+msgid "View on MusicBrainz"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:20
+msgid "We cannot add the track to a playlist"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:14
+msgid "We cannot create the playlist"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:13
+msgid "We cannot create your account"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:7
+msgid "We cannot log you in"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:38
+msgid "We cannot save your avatar"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:14
+msgid "We cannot save your settings"
+msgstr ""
+
+#: front/src/components/Home.vue:130
+msgid "We do not track you or bother you with ads"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:5
+msgid "We recommend using Picard for that purpose."
+msgstr ""
+
+#: front/src/components/Home.vue:7
+msgid "We think listening to music should be simple."
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:10
+msgid "We're sorry, the page you asked for does not exist:"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:21
+msgid "We've received your request, you'll get some groove soon ;)"
+msgstr ""
+
+#: front/src/components/Home.vue:152
+msgid "Welcome"
+msgstr ""
+
+#: front/src/components/Home.vue:5
+msgid "Welcome on Funkwhale"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:114
+msgid "What is metadata?"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:197
+msgid "When enabled, auto importing will automatically import new tracks published in this library"
+msgstr ""
+
+#: front/src/components/Home.vue:24
+msgid "Why funkwhale?"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:124
+msgid "Yes"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:8
+msgid "Yes, log me out!"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:7
+msgid "You are currently logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:111
+msgid "You can also skip this step and enter metadata manually."
+msgstr ""
+
+#: front/src/components/Home.vue:136
+msgid "You can invite friends and family to your instance so they can enjoy your music"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:7
+msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:8
+msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:156
+msgid "You have a radio playing"
+msgstr ""
+
+#: front/src/App.vue:6
+msgid "You need to select an instance in order to continue"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:100
+msgid "You will be logged out from this session and have to log in with the new one"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:71
+msgid "You will have to update your password on your clients that use this password."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:103
+msgid "You will import:"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:24
+msgid "Your email address was confirmed, you can now use the service without limitations."
+msgstr ""
+
+#: front/src/components/favorites/List.vue:109
+msgid "Your Favorites"
+msgstr ""
+
+#: front/src/components/Home.vue:117
+msgid "Your music, your way"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:29
+msgid "Your password has been updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:101
+msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:156
+msgid "%{ count } track was added to your queue"
+msgid_plural "%{ count } tracks were added to your queue"
+msgstr[0] ""
+msgstr[1] ""
diff --git a/front/locales/sv/LC_MESSAGES/app.po b/front/locales/sv/LC_MESSAGES/app.po
new file mode 100644
index 0000000000000000000000000000000000000000..0fd43bceb065d002b1cf8476dbc89658b7f390d6
--- /dev/null
+++ b/front/locales/sv/LC_MESSAGES/app.po
@@ -0,0 +1,2407 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the front package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: front 1.0.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-07-17 19:29+0200\n"
+"PO-Revision-Date: 2018-07-21 21:30+0000\n"
+"Last-Translator: Tim Stahel <gitlab@swedneck.xyz>\n"
+"Language-Team: none\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.20\n"
+
+#: front/src/components/playlists/PlaylistModal.vue:9
+msgid "\"%{ title }\", by %{ artist }"
+msgstr "\"%{ title }\", av %{ artist }"
+
+#: front/src/components/Sidebar.vue:24
+msgid "(%{ index } of %{ length })"
+msgstr "(%{ index } av %{ length })"
+
+#: front/src/components/Sidebar.vue:22
+msgid "(empty)"
+msgstr "(tom)"
+
+#: front/src/components/common/ActionTable.vue:43
+#: front/src/components/common/ActionTable.vue:51
+msgid "%{ count } on %{ total } selected"
+msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] "%{ count } av %{ total } vald"
+msgstr[1] "%{ count } av %{ total } valda"
+
+#: front/src/components/Sidebar.vue:116 src/views/federation/LibraryDetail.vue:87
+msgid "%{ count } track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{ count } spår"
+msgstr[1] "%{ count } spår"
+
+#: front/src/components/library/Artist.vue:13
+msgid "%{ count } track in %{ albumsCount } albums"
+msgid_plural "%{ count } tracks in %{ albumsCount } albums"
+msgstr[0] "%{ count } spår i %{ albumsCount } album"
+msgstr[1] "%{ count } spår i %{ albumsCount } album"
+
+#: front/src/components/library/radios/Builder.vue:66
+msgid "%{ count } track matching combined filters"
+msgid_plural "%{ count } tracks matching combined filters"
+msgstr[0] "%{ count } spår som matchar kombinerade filter"
+msgstr[1] "%{ count } spår som matchar kombinerade filter"
+
+#: front/src/components/playlists/Card.vue:18
+msgid "%{ count} track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{ count } spår"
+msgstr[1] "%{ count } spår"
+
+#: front/src/components/common/Duration.vue:2
+msgid "%{ hours } h %{ minutes } min"
+msgstr "%{ hours } h %{ minutes } min"
+
+#: front/src/components/common/Duration.vue:5
+msgid "%{ minutes } min"
+msgstr "%{ minutes } min"
+
+#: front/src/components/activity/Like.vue:7
+msgid "%{ user } favorited a track"
+msgstr "%{ user } favoritmarkerade ett spår"
+
+#: front/src/components/activity/Listen.vue:7
+msgid "%{ user } listened to a track"
+msgstr "%{ user } lyssnade på ett spår"
+
+#: front/src/components/auth/Profile.vue:49
+msgid "%{ username }'s profile"
+msgstr "%{ username }s profil"
+
+#: front/src/components/audio/artist/Card.vue:41
+msgid "1 album"
+msgid_plural "%{ count } albums"
+msgstr[0] "1 album"
+msgstr[1] "%{ count } album"
+
+#: front/src/components/favorites/List.vue:10
+msgid "1 favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "1 favorit"
+msgstr[1] "%{ count } favoriter"
+
+#: front/src/components/audio/album/Card.vue:54
+#: front/src/components/federation/LibraryCard.vue:25
+msgid "1 track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "1 spår"
+msgstr[1] "%{ count } spår"
+
+#: front/src/components/About.vue:5
+msgid "About %{ instance }"
+msgstr "Om %{ instance }"
+
+#: front/src/App.vue:54
+msgid "About Funkwhale"
+msgstr "Om Funkwhale"
+
+#: front/src/App.vue:32 src/components/About.vue:8 src/components/About.vue:55
+msgid "About this instance"
+msgstr "Om denna instans"
+
+#: front/src/components/manage/library/RequestsTable.vue:28
+#: front/src/components/manage/library/RequestsTable.vue:62
+msgid "Accepted"
+msgstr "Accepterad"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:111
+msgid "Access disabled"
+msgstr "Tillgång inaktiverad"
+
+#: front/src/components/Home.vue:109
+msgid "Access your music from a clean interface that focus on what really matters"
+msgstr ""
+"Få tillgång till din musik via ett rent gränssnitt som fokuserar på det som "
+"verkligen är viktigt"
+
+#: front/src/views/admin/users/UsersDetail.vue:54
+msgid "Account active"
+msgstr "Konto aktivt"
+
+#: front/src/components/auth/Settings.vue:5
+msgid "Account settings"
+msgstr "Kontoinställningar"
+
+#: front/src/components/auth/Settings.vue:257
+msgid "Account Settings"
+msgstr "Kontoinställningar"
+
+#: front/src/components/manage/users/UsersTable.vue:39
+msgid "Account status"
+msgstr "Kontostatus"
+
+#: front/src/views/auth/PasswordReset.vue:14
+msgid "Account's email"
+msgstr "Kontots e-postadress"
+
+#: front/src/components/common/ActionTable.vue:82
+msgid "Action %{ action } was launched successfully on %{ count } element"
+msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
+msgstr[0] "Åtgärd %{ action } togs framgångrikt på %{ count } element"
+msgstr[1] "Åtgärd %{ action } togs framgångrikt på %{ count } element"
+
+#: front/src/components/common/ActionTable.vue:8
+#: front/src/components/federation/LibraryFollowTable.vue:24
+#: front/src/components/library/radios/Builder.vue:50
+#: front/src/components/manage/library/RequestsTable.vue:54
+msgid "Actions"
+msgstr "Åtgärder"
+
+#: front/src/components/manage/users/UsersTable.vue:53
+msgid "Active"
+msgstr "Aktiv"
+
+#: front/src/components/Sidebar.vue:60
+msgid "Activity"
+msgstr "Aktivitet"
+
+#: front/src/components/federation/LibraryFollowTable.vue:21
+msgid "Actor"
+msgstr "Aktör"
+
+#: front/src/views/federation/LibraryList.vue:8
+msgid "Add a new library"
+msgstr "Lägg till ett nytt bibliotek"
+
+#: front/src/components/library/radios/Builder.vue:36
+msgid "Add filter"
+msgstr "Lägg till filter"
+
+#: front/src/components/library/radios/Builder.vue:26
+msgid "Add filters to customize your radio"
+msgstr "Lägg till filter för att skräddarsy din radio"
+
+#: front/src/components/audio/PlayButton.vue:53
+msgid "Add to current queue"
+msgstr "Lägg till i nuvarande kö"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:4
+#: front/src/components/favorites/TrackFavoriteIcon.vue:21
+msgid "Add to favorites"
+msgstr "Lägg till i favoriter"
+
+#: front/src/components/playlists/TrackPlaylistIcon.vue:6
+#: front/src/components/playlists/TrackPlaylistIcon.vue:32
+msgid "Add to playlist..."
+msgstr "Lägg till i spellista..."
+
+#: front/src/components/audio/PlayButton.vue:14
+msgid "Add to queue"
+msgstr "Lägg till i kö"
+
+#: front/src/components/playlists/PlaylistModal.vue:115
+msgid "Add to this playlist"
+msgstr "Lägg till i denna spellista"
+
+#: front/src/components/playlists/PlaylistModal.vue:54
+msgid "Add track"
+msgstr "Lägg till spår"
+
+#: front/src/components/manage/users/UsersTable.vue:69
+msgid "Admin"
+msgstr "Administratör"
+
+#: front/src/components/Sidebar.vue:64
+msgid "Administration"
+msgstr "Administration"
+
+#: front/src/components/audio/SearchBar.vue:26 src/components/audio/track/Table.vue:8
+#: front/src/components/federation/LibraryTrackTable.vue:49
+#: front/src/components/library/Album.vue:91
+#: front/src/components/manage/library/FilesTable.vue:39
+#: front/src/components/metadata/Search.vue:134
+msgid "Album"
+msgstr "Album"
+
+#: front/src/components/library/import/ReleaseImport.vue:3
+msgid "Album %{ title } (%{ count } track) by %{ artist }"
+msgid_plural "Album %{ title } (%{ count } tracks) by %{ artist }"
+msgstr[0] "Album %{ title } (%{ count } spår) av %{ artist }"
+msgstr[1] "Album %{ title } (%{ count } spår) av %{ artist }"
+
+#: front/src/components/library/Album.vue:12
+msgid "Album containing %{ count } track, by %{ artist }"
+msgid_plural "Album containing %{ count } tracks, by %{ artist }"
+msgstr[0] "Album med %{ count } spår, av %{ artist }"
+msgstr[1] "Album med %{ count } spår, av %{ artist }"
+
+#: front/src/components/library/Track.vue:20
+msgid "Album page"
+msgstr "Albumsida"
+
+#: front/src/components/audio/Search.vue:19 src/components/instance/Stats.vue:48
+#: front/src/components/manage/library/RequestsTable.vue:50
+#: front/src/components/requests/Form.vue:9
+msgid "Albums"
+msgstr "Album"
+
+#: front/src/components/library/Artist.vue:44
+msgid "Albums by this artist"
+msgstr "Album av denna artist"
+
+#: front/src/components/manage/library/RequestsTable.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:19
+msgid "All"
+msgstr "Allt"
+
+#: front/src/components/playlists/Editor.vue:13
+msgid "An error occured while saving your changes"
+msgstr "Ett fel inträffade när dina ändringar sparades"
+
+#: front/src/components/auth/Login.vue:10
+msgid "An unknown error happend, this can mean the server is down or cannot be reached"
+msgstr ""
+"Ett okänt fel inträffade, detta kan betyda att servern är nere eller inte "
+"kan nås"
+
+#: front/src/components/federation/LibraryTrackTable.vue:11
+#: front/src/components/library/import/BatchDetail.vue:68
+#: front/src/components/library/import/BatchList.vue:13
+#: front/src/components/library/import/BatchList.vue:22
+msgid "Any"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:24
+msgid "API"
+msgstr "API"
+
+#: front/src/components/federation/LibraryFollowTable.vue:68
+#: front/src/components/federation/LibraryFollowTable.vue:78
+msgid "Approve"
+msgstr "Godkänn"
+
+#: front/src/components/federation/LibraryFollowTable.vue:70
+msgid "Approve access?"
+msgstr "Godkänn åtkomst?"
+
+#: front/src/components/federation/LibraryFollowTable.vue:38
+msgid "Approved"
+msgstr "Godkännt"
+
+#: front/src/components/auth/Logout.vue:5
+msgid "Are you sure you want to log out?"
+msgstr "Är du säker på att du vill logga ut?"
+
+#: front/src/components/audio/SearchBar.vue:25 src/components/audio/track/Table.vue:7
+#: front/src/components/federation/LibraryTrackTable.vue:48
+#: front/src/components/library/Artist.vue:119
+#: front/src/components/manage/library/FilesTable.vue:38
+#: front/src/components/manage/library/RequestsTable.vue:49
+#: front/src/components/metadata/Search.vue:130
+msgid "Artist"
+msgstr "Artist"
+
+#: front/src/components/requests/Form.vue:5
+msgid "Artist name"
+msgstr "Artistnamn"
+
+#: front/src/components/library/Album.vue:22 src/components/library/Track.vue:23
+msgid "Artist page"
+msgstr "Artistsida"
+
+#: front/src/components/audio/Search.vue:65
+msgid "Artist, album, track..."
+msgstr "Artist, album, spår..."
+
+#: front/src/components/audio/Search.vue:10 src/components/instance/Stats.vue:42
+#: front/src/components/library/Artists.vue:119 src/components/library/Library.vue:7
+msgid "Artists"
+msgstr "Artister"
+
+#: front/src/components/favorites/List.vue:33
+#: front/src/components/federation/LibraryTrackTable.vue:28
+#: front/src/components/library/Artists.vue:25 src/components/library/Radios.vue:44
+#: front/src/components/manage/library/FilesTable.vue:19
+#: front/src/components/manage/library/RequestsTable.vue:19
+#: front/src/components/manage/users/UsersTable.vue:19
+#: front/src/views/federation/LibraryList.vue:28 src/views/playlists/List.vue:27
+msgid "Ascending"
+msgstr "Stigande"
+
+#: front/src/views/auth/PasswordReset.vue:27
+msgid "Ask for a password reset"
+msgstr "Begär lösenordsåterställning"
+
+#: front/src/views/federation/LibraryDetail.vue:56
+msgid "Auto importing"
+msgstr "Automatisk import"
+
+#: front/src/components/playlists/PlaylistModal.vue:26
+msgid "Available playlists"
+msgstr "Tillgängliga spellistor"
+
+#: front/src/components/auth/Settings.vue:34
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/views/auth/EmailConfirm.vue:17 src/views/auth/PasswordReset.vue:24
+#: front/src/views/auth/PasswordResetConfirm.vue:18
+msgid "Back to login"
+msgstr "Tillbaka till inloggning"
+
+#: front/src/views/federation/LibraryFollowersList.vue:5
+msgid "Be careful when accepting follow requests, as it means the follower will have access to your entire library."
+msgstr ""
+"Var försiktig när du accepterar följare, då det innebär att följaren får "
+"tillgång till hela ditt bibliotek."
+
+#: front/src/components/library/Track.vue:80
+#: front/src/components/manage/library/FilesTable.vue:42
+msgid "Bitrate"
+msgstr "Bitrate"
+
+#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
+msgid "Browse"
+msgstr "Bläddra"
+
+#: front/src/components/Sidebar.vue:50
+msgid "Browse library"
+msgstr "Bläddra i biblioteket"
+
+#: front/src/components/library/Artists.vue:4
+msgid "Browsing artists"
+msgstr "Bläddra artister"
+
+#: front/src/views/federation/LibraryTrackList.vue:3
+msgid "Browsing federated tracks"
+msgstr ""
+
+#: front/src/views/federation/LibraryFollowersList.vue:3
+msgid "Browsing followers"
+msgstr ""
+
+#: front/src/views/federation/LibraryList.vue:3
+msgid "Browsing libraries"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:3
+msgid "Browsing playlists"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:4
+msgid "Browsing radios"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:5
+msgid "Builder"
+msgstr ""
+
+#: front/src/components/audio/album/Card.vue:13
+msgid "By %{ artist }"
+msgstr "Av %{ artist }"
+
+#: front/src/components/federation/LibraryFollowTable.vue:57
+msgid "By confirming, %{ username } will be denied access to your library."
+msgstr ""
+"Genom att bekräfta kommer %{ username } att nekas åtkomst till ditt "
+"bibliotek."
+
+#: front/src/components/federation/LibraryFollowTable.vue:73
+msgid "By confirming, %{ username } will be granted access to your library."
+msgstr "Genom att godkänna ger du %{ username } tillgång till ditt bibliotek."
+
+#: front/src/components/audio/track/Table.vue:43
+#: front/src/components/common/DangerousButton.vue:17
+#: front/src/components/library/radios/Filter.vue:53
+#: front/src/components/playlists/PlaylistModal.vue:63
+msgid "Cancel"
+msgstr "Ã…ngra"
+
+#: front/src/components/library/radios/Builder.vue:49
+msgid "Candidates"
+msgstr "Kandidater"
+
+#: front/src/components/auth/Settings.vue:76
+msgid "Cannot change your password"
+msgstr "Kan inte ändra lösenord"
+
+#: front/src/App.vue:66
+msgid "Change language"
+msgstr "Ändra språk"
+
+#: front/src/components/auth/Settings.vue:67
+msgid "Change my password"
+msgstr "Ändra mitt lösenord"
+
+#: front/src/components/auth/Settings.vue:95
+msgid "Change password"
+msgstr "Ändra lösenord"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:4
+#: front/src/views/auth/PasswordResetConfirm.vue:62
+msgid "Change your password"
+msgstr "Ändra ditt lösenord"
+
+#: front/src/components/auth/Settings.vue:96
+msgid "Change your password?"
+msgstr "Ändra ditt lösenord?"
+
+#: front/src/components/playlists/Editor.vue:21
+msgid "Changes synced with server"
+msgstr "Ändringar synkade med servern"
+
+#: front/src/components/auth/Settings.vue:70
+msgid "Changing your password will also change your Subsonic API password if you have requested one."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:98
+msgid "Changing your password will have the following consequences"
+msgstr ""
+
+#: front/src/App.vue:4
+msgid "Choose your instance"
+msgstr ""
+
+#: front/src/components/Home.vue:64
+msgid "Clean library"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:37
+msgid "Clear"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:40
+#: front/src/components/playlists/Editor.vue:45
+msgid "Clear playlist"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:270
+msgid "Clear your queue"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:23
+msgid "CLI"
+msgstr ""
+
+#: front/src/components/Home.vue:44
+msgid "Click once, listen for hours using built-in radios"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:30
+#: front/src/components/manage/library/RequestsTable.vue:64
+msgid "Closed"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:42
+msgid "Code"
+msgstr ""
+
+#: front/src/components/audio/album/Card.vue:43
+#: front/src/components/audio/artist/Card.vue:33
+#: front/src/components/discussion/Comment.vue:20
+msgid "Collapse"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:51
+#: front/src/components/requests/Form.vue:14
+msgid "Comment"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:48
+msgid "Config"
+msgstr ""
+
+#: front/src/components/common/DangerousButton.vue:21
+msgid "Confirm"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:4 src/views/auth/EmailConfirm.vue:20
+#: front/src/views/auth/EmailConfirm.vue:51
+msgid "Confirm your email"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:13
+msgid "Confirmation code"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:163
+msgid "Copy tracks from current queue to playlist"
+msgstr ""
+
+#: front/src/components/Home.vue:88
+msgid "Covers, lyrics, our goal is to have them all ;)"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:4
+msgid "Create a funkwhale account"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:2
+msgid "Create a new playlist"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:17
+msgid "Create an account"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:88
+#: front/src/components/requests/Card.vue:25
+msgid "Create import"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:51
+msgid "Create my account"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:34
+msgid "Create playlist"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:23
+msgid "Create your own radio"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:22
+#: front/src/components/manage/library/RequestsTable.vue:52
+#: front/src/components/manage/users/InvitationsTable.vue:40
+msgid "Creation date"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:54
+msgid "Current avatar"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:8
+msgid "Current track"
+msgstr ""
+
+#: front/src/components/manage/library/FilesTable.vue:189
+#: front/src/components/manage/library/RequestsTable.vue:195
+#: front/src/components/manage/users/InvitationsTable.vue:166
+#: front/src/views/playlists/Detail.vue:33
+msgid "Delete"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:38
+msgid "Delete playlist"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:28
+msgid "Delete radio"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:52
+#: front/src/components/federation/LibraryFollowTable.vue:63
+msgid "Deny"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:54
+msgid "Deny access?"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:34
+#: front/src/components/federation/LibraryTrackTable.vue:29
+#: front/src/components/library/Artists.vue:26 src/components/library/Radios.vue:47
+#: front/src/components/manage/library/FilesTable.vue:20
+#: front/src/components/manage/library/RequestsTable.vue:20
+#: front/src/components/manage/users/UsersTable.vue:20
+#: front/src/views/federation/LibraryList.vue:29 src/views/playlists/List.vue:28
+msgid "Descending"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:50
+msgid "Detail"
+msgstr ""
+
+#: front/src/views/admin/users/UsersDetail.vue:146
+msgid "Determine if the user account is active or not. Inactive users cannot login or use the service."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:104
+#: front/src/components/auth/SubsonicTokenForm.vue:52
+msgid "Disable access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:49
+msgid "Disable Subsonic access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:50
+msgid "Disable Subsonic API access?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:14
+msgid "Discover how to use Funkwhale from other apps"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:16
+msgid "Display publicly"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:42
+msgid "Do you want to clear the playlist \"%{ playlist }\"?"
+msgstr ""
+
+#: front/src/components/common/DangerousButton.vue:7
+msgid "Do you want to confirm this action?"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:35
+msgid "Do you want to delete the playlist \"%{ playlist }\"?"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:26
+msgid "Do you want to delete the radio \"{{ radio }}\"?"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:29
+msgid "Do you want to launch %{ action } on %{ count } element?"
+msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/Sidebar.vue:113
+msgid "Do you want to restore your previous queue?"
+msgstr ""
+
+#: front/src/App.vue:38
+msgid "Documentation"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:24 src/components/library/Track.vue:48
+msgid "Download"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:27
+msgid "Download tracks"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:49
+msgid "Drag and drop rows to reorder tracks in the playlist"
+msgstr ""
+
+#: front/src/components/library/Track.vue:58
+#: front/src/components/manage/library/FilesTable.vue:43
+msgid "Duration"
+msgstr ""
+
+#: front/src/components/Home.vue:96
+msgid "Easy to use"
+msgstr ""
+
+#: front/src/components/About.vue:21
+msgid "Edit instance info"
+msgstr ""
+
+#: front/src/components/radios/Card.vue:20 src/views/playlists/Detail.vue:30
+msgid "Edit..."
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:29
+#: front/src/components/manage/users/UsersTable.vue:38
+msgid "Email"
+msgstr ""
+
+#: front/src/views/admin/users/UsersDetail.vue:29
+msgid "Email address"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:23
+msgid "Email confirmed"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:29
+msgid "End edition"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:4
+msgid "Ensure your music files are properly tagged before uploading them."
+msgstr ""
+
+#: front/src/components/library/Radios.vue:140
+msgid "Enter a radio name..."
+msgstr ""
+
+#: front/src/components/library/Artists.vue:118
+msgid "Enter an artist name..."
+msgstr ""
+
+#: front/src/views/federation/LibraryList.vue:122
+msgid "Enter an library domain name..."
+msgstr ""
+
+#: front/src/views/playlists/List.vue:104
+msgid "Enter an playlist name..."
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:98
+msgid "Enter your email"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:96
+msgid "Enter your invitation code (case insensitive)"
+msgstr ""
+
+#: front/src/components/metadata/Search.vue:114
+msgid "Enter your search query..."
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:97
+msgid "Enter your username"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:77
+msgid "Enter your username or email"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:20
+msgid "Error"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:87
+msgid "Error reporting"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:75
+msgid "Error while applying action"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:7
+msgid "Error while asking for a password reset"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:7
+msgid "Error while changing your password"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:7
+msgid "Error while confirming your email"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:4
+msgid "Error while creating invitation"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:5
+msgid "Error while saving settings"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:10
+msgid "Error while scanning library"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:41
+#: front/src/components/library/import/BatchDetail.vue:70
+#: front/src/components/library/import/BatchList.vue:15
+msgid "Errored"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:89
+msgid "Everyone"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:85
+msgid "Everyone on this instance"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:47
+msgid "Exclude"
+msgstr ""
+
+#: front/src/components/discussion/Comment.vue:14
+msgid "Expand"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:41
+msgid "Expiration date"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:50
+msgid "Expired"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:21
+msgid "Expired/used"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:65
+msgid "External source. Supported backends"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:51
+msgid "Favorites"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:3
+msgid "Federate with a new instance"
+msgstr ""
+
+#: front/src/views/federation/LibraryTrackList.vue:21
+msgid "Federated tracks"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:87 src/components/library/import/BatchList.vue:25
+#: front/src/components/manage/users/UsersTable.vue:180
+#: front/src/views/admin/Settings.vue:84 src/views/admin/users/UsersDetail.vue:161
+#: front/src/views/federation/Base.vue:35 src/views/federation/LibraryDetail.vue:40
+msgid "Federation"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:3
+msgid "File mirroring"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:43
+msgid "File name"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:76
+msgid "File upload"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:5 src/views/admin/library/FilesList.vue:21
+msgid "Files"
+msgstr ""
+
+#: front/src/components/library/import/ArtistImport.vue:7
+msgid "Filter album types"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:46
+msgid "Filter name"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:52
+msgid "Finish import"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:54
+msgid "Finished"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:59
+msgid "First, choose where you want to import the music from"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:44
+msgid "Follow"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:36
+msgid "Follow request pending approval"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:21
+msgid "Follow status"
+msgstr ""
+
+#: front/src/views/federation/Base.vue:13
+#: front/src/views/federation/LibraryFollowersList.vue:24
+msgid "Followers"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:18
+msgid "Followers only"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:15
+#: front/src/views/federation/LibraryDetail.vue:29
+msgid "Following"
+msgstr ""
+
+#: front/src/components/activity/Like.vue:12 src/components/activity/Listen.vue:12
+msgid "from %{ album } by %{ artist }"
+msgstr ""
+
+#: front/src/components/library/Track.vue:13
+msgid "From album %{ album } by %{ artist }"
+msgstr ""
+
+#: front/src/App.vue:56
+msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgid "Funkwhale is compatible with other music players that support the Subsonic API."
+msgstr ""
+
+#: front/src/components/Home.vue:98
+msgid "Funkwhale is dead simple to use."
+msgstr ""
+
+#: front/src/components/Home.vue:39
+msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists."
+msgstr ""
+
+#: front/src/components/Home.vue:119
+msgid "Funkwhale is free and gives you control on your music."
+msgstr ""
+
+#: front/src/components/Home.vue:66
+msgid "Funkwhale takes care of handling your music"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:16
+msgid "Get a new invitation"
+msgstr ""
+
+#: front/src/components/Home.vue:13
+msgid "Get me to the library"
+msgstr ""
+
+#: front/src/components/Home.vue:77
+msgid ""
+"Get quality metadata about your music thanks to\n"
+"              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:21
+#: front/src/components/common/ActionTable.vue:27
+msgid "Go"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:14
+msgid "Go to home page"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:13
+msgid "Grab corresponding metadata"
+msgstr ""
+
+#: front/src/components/library/Home.vue:65
+msgid "Home"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:36
+msgid "Hours of music"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:11
+msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:34
+msgid "ID"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:24
+msgid "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."
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:196
+#: front/src/components/library/Library.vue:17
+msgid "Import"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:57
+msgid "Import #%{ id } launched"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:38
+msgid "Import %{ count } track"
+msgid_plural "Import %{ count } tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/import/BatchDetail.vue:10
+msgid "Import batch"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:185
+msgid "Import Batch #%{ id }"
+msgstr ""
+
+#: front/src/components/library/Library.vue:20
+msgid "Import batches"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:117
+msgid "Import Batches"
+msgstr ""
+
+#: front/src/components/manage/library/FilesTable.vue:40
+#: front/src/components/manage/library/RequestsTable.vue:53
+msgid "Import date"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:38
+msgid "Import detail page"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:81
+msgid "Import music"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:267
+msgid "Import Music"
+msgstr ""
+
+#: front/src/components/Home.vue:71
+msgid "Import music from various platforms, such as YouTube or SoundCloud"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:14
+#: front/src/components/federation/LibraryTrackTable.vue:66
+msgid "Import pending"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:9
+#: front/src/views/admin/library/RequestsList.vue:3
+#: front/src/views/admin/library/RequestsList.vue:21
+msgid "Import requests"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:20
+#: front/src/components/library/import/Main.vue:6
+msgid "Import source"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:9
+msgid "Import status"
+msgstr ""
+
+#: front/src/components/library/import/ReleaseImport.vue:14
+msgid "Import this release"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:11
+msgid "Import this track"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:12
+#: front/src/components/manage/library/RequestsTable.vue:29
+#: front/src/components/manage/library/RequestsTable.vue:61
+msgid "Imported"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:44
+msgid "Imported URL"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:82
+msgid "Imports"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:3
+msgid "In favorites"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:65
+msgid "In library"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:54
+msgid "Inactive"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:96
+msgid "Input a MusicBrainz ID manually:"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:53
+msgid "Input the email address binded to your account"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:31
+msgid "Insert from queue (%{ count } track)"
+msgid_plural "Insert from queue (%{ count } tracks)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/views/admin/Settings.vue:80
+msgid "Instance information"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:9
+msgid "Instance radios"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:75
+msgid "Instance settings"
+msgstr ""
+
+#: front/src/views/instance/Timeline.vue:57
+msgid "Instance Timeline"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:42
+#: front/src/components/manage/users/InvitationForm.vue:11
+msgid "Invitation code"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:43
+msgid "Invitation code (optional)"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:8 src/views/admin/users/InvitationsList.vue:3
+#: front/src/views/admin/users/InvitationsList.vue:24
+msgid "Invitations"
+msgstr ""
+
+#: front/src/App.vue:43
+msgid "Issue tracker"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:80
+msgid "Job ID"
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:36
+msgid "Jobs"
+msgstr ""
+
+#: front/src/components/Home.vue:50
+msgid "Keep a track of your favorite songs"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:33
+msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:41
+#: front/src/views/admin/users/UsersDetail.vue:45
+msgid "Last activity"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:101
+msgid "Last fetched"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:32
+msgid "Last modification"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:39
+msgid "Launch"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:18
+#: front/src/components/library/import/BatchList.vue:35
+msgid "Launch date"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:31
+msgid "Launch scan"
+msgstr ""
+
+#: front/src/components/Home.vue:10
+msgid "Learn more about this instance"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:58
+msgid "Leave empty for a random code"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:10
+msgid "Leave this field empty if you're requesting the whole discography."
+msgstr ""
+
+#: front/src/views/federation/Base.vue:5 src/views/federation/LibraryList.vue:123
+msgid "Libraries"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:70
+#: front/src/components/federation/LibraryTrackTable.vue:51
+#: front/src/components/instance/Stats.vue:30
+#: front/src/components/manage/users/UsersTable.vue:176
+#: front/src/views/admin/users/UsersDetail.vue:157
+#: front/src/views/federation/LibraryDetail.vue:194
+msgid "Library"
+msgstr ""
+
+#: front/src/views/admin/library/FilesList.vue:3
+msgid "Library files"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:20
+msgid "Library name"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:84
+msgid "Library size"
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:96
+msgid "library@demo.funkwhale.audio"
+msgstr ""
+
+#: front/src/App.vue:29
+msgid "Links"
+msgstr ""
+
+#: front/src/views/instance/Timeline.vue:4
+msgid "Loading timeline..."
+msgstr ""
+
+#: front/src/components/favorites/List.vue:5
+msgid "Loading your favorites..."
+msgstr ""
+
+#: front/src/components/auth/Login.vue:78
+msgid "Log In"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:4
+msgid "Log in to your Funkwhale account"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:20
+msgid "Log Out"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:38
+msgid "Logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41
+msgid "Login"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:43
+msgid "Logout"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:266
+msgid "Looping disabled. Click to switch to single-track looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:267
+msgid "Looping on a single track. Click to switch to whole queue looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:268
+msgid "Looping on whole queue. Click to disable looping."
+msgstr ""
+
+#: front/src/components/library/Track.vue:94
+msgid "Lyrics"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:25
+msgid "Manage library"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:3
+msgid "Manage playlists"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:20
+msgid "Manage users"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:8
+msgid "Manage your playlists"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:197
+msgid "Mark as closed"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:196
+msgid "Mark as imported"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:12
+msgid "Metadata"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:115
+msgid ""
+"Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the\n"
+"            <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"              MusicBrainz\n"
+"            </a>\n"
+"            project, which you can think about as the Wikipedia of music."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:48 src/components/library/import/Main.vue:18
+msgid "Music"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:147
+msgid "Music request"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:265
+msgid "Mute"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:34
+msgid "My account"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:74
+msgid "My awesome playlist"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:206
+msgid "My awesome radio"
+msgstr ""
+
+#: front/src/components/library/Track.vue:64 src/components/library/Track.vue:75
+#: front/src/components/library/Track.vue:86
+#: front/src/components/manage/library/FilesTable.vue:63
+#: front/src/components/manage/library/FilesTable.vue:69
+#: front/src/components/manage/library/FilesTable.vue:75
+#: front/src/components/manage/library/FilesTable.vue:81
+#: front/src/components/manage/library/RequestsTable.vue:71
+#: front/src/components/manage/library/RequestsTable.vue:75
+#: front/src/components/manage/library/RequestsTable.vue:82
+#: front/src/components/manage/users/UsersTable.vue:61
+#: front/src/views/admin/users/UsersDetail.vue:49
+msgid "N/A"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/views/admin/users/UsersDetail.vue:21
+msgid "Name"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:88
+#: front/src/views/auth/PasswordResetConfirm.vue:14
+msgid "New password"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:158
+msgid "New tracks will be appended here automatically."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:29
+msgid "Next step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:263
+msgid "Next track"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:125
+msgid "No"
+msgstr ""
+
+#: front/src/components/Home.vue:103
+msgid "No add-ons, no plugins : you only need a web library"
+msgstr ""
+
+#: front/src/components/library/Track.vue:102
+msgid "No lyrics available for this track."
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:81
+msgid "Nobody except me"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:32
+msgid "Not following"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:13
+#: front/src/components/federation/LibraryTrackTable.vue:67
+msgid "Not imported"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:51
+msgid "Not used"
+msgstr ""
+
+#: front/src/App.vue:37
+msgid "Official website"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:83
+msgid "Old password"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:36
+msgid "Once all your files are uploaded, simply click the following button to check the import status."
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:21
+#: front/src/components/manage/users/InvitationsTable.vue:20
+msgid "Open"
+msgstr ""
+
+#: front/src/App.vue:63
+msgid "Options"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:93
+msgid "Or"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:18
+#: front/src/components/library/Artists.vue:15 src/components/library/Radios.vue:33
+#: front/src/components/manage/library/FilesTable.vue:9
+#: front/src/components/manage/library/RequestsTable.vue:9
+#: front/src/components/manage/users/InvitationsTable.vue:9
+#: front/src/components/manage/users/UsersTable.vue:9
+#: front/src/views/federation/LibraryList.vue:18 src/views/playlists/List.vue:17
+msgid "Ordering"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:31
+#: front/src/components/federation/LibraryTrackTable.vue:26
+#: front/src/components/library/Artists.vue:23 src/components/library/Radios.vue:41
+#: front/src/components/manage/library/FilesTable.vue:17
+#: front/src/components/manage/library/RequestsTable.vue:17
+#: front/src/components/manage/users/UsersTable.vue:17
+#: front/src/views/federation/LibraryList.vue:26 src/views/playlists/List.vue:25
+msgid "Ordering direction"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:38
+msgid "Owner"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:33
+msgid "Page Not Found"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:7
+msgid "Page not found!"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:32 src/components/auth/Signup.vue:38
+msgid "Password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:95
+msgid "Password updated"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:28
+msgid "Password updated successfully"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:262
+msgid "Pause track"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:33
+#: front/src/components/library/import/BatchDetail.vue:69
+#: front/src/components/library/import/BatchList.vue:14
+#: front/src/components/library/import/FileUpload.vue:59
+#: front/src/components/manage/library/RequestsTable.vue:27
+#: front/src/components/manage/library/RequestsTable.vue:63
+msgid "Pending"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:11
+#: front/src/views/federation/LibraryDetail.vue:26
+msgid "Pending approval"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:217
+msgid "Pending follow requests"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:216 src/views/admin/library/Base.vue:26
+msgid "Pending import requests"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:26 src/views/federation/Base.vue:36
+msgid "Pending requests"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:42
+#: front/src/views/admin/users/UsersDetail.vue:68
+msgid "Permissions"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:9 src/components/library/Track.vue:30
+msgid "Play"
+msgstr ""
+
+#: front/src/components/audio/album/Card.vue:50
+#: front/src/components/audio/artist/Card.vue:44 src/components/library/Album.vue:28
+#: front/src/views/playlists/Detail.vue:23
+msgid "Play all"
+msgstr ""
+
+#: front/src/components/library/Artist.vue:26
+msgid "Play all albums"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:58
+msgid "Play immediatly"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:15
+msgid "Play next"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:16
+msgid "Play now"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:261
+msgid "Play track"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:90
+msgid "Playlist"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:12
+msgid "Playlist containing %{ count } track, by %{ username }"
+msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/playlists/Form.vue:9
+msgid "Playlist created"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:4
+msgid "Playlist editor"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:21
+msgid "Playlist name"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:6
+msgid "Playlist updated"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:25
+msgid "Playlist visibility"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:56 src/components/library/Home.vue:16
+#: front/src/components/library/Library.vue:13 src/views/admin/Settings.vue:83
+#: front/src/views/playlists/List.vue:103
+msgid "Playlists"
+msgstr ""
+
+#: front/src/components/Home.vue:56
+msgid "Playlists? We got them"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
+msgid "Please double-check your password is correct"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:9
+msgid "Please double-check your username/password couple is correct"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:46
+msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:26
+msgid "Previous step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:260
+msgid "Previous track"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:26
+#: front/src/views/auth/PasswordResetConfirm.vue:31
+msgid "Proceed to login"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:50
+msgid "Published date"
+msgstr ""
+
+#: front/src/components/library/import/ArtistImport.vue:17
+msgid "Query template"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:20
+msgid "Queue"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:203
+msgid "Queue shuffled!"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:80
+msgid "Radio"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:205
+msgid "Radio Builder"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:11
+msgid "Radio name"
+msgstr ""
+
+#: front/src/components/library/Library.vue:10 src/components/library/Radios.vue:141
+msgid "Radios"
+msgstr ""
+
+#: front/src/views/instance/Timeline.vue:7
+msgid "Recent activity on this instance"
+msgstr ""
+
+#: front/src/components/library/Home.vue:24
+msgid "Recently added"
+msgstr ""
+
+#: front/src/components/library/Home.vue:11
+msgid "Recently favorited"
+msgstr ""
+
+#: front/src/components/library/Home.vue:6
+msgid "Recently listened"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:81
+msgid "Recording MusicBrainz ID"
+msgstr ""
+
+#: front/src/views/admin/users/UsersDetail.vue:84
+#: front/src/views/federation/LibraryDetail.vue:122
+msgid "Refresh"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:42
+msgid "Refused"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:12
+msgid "Registered since %{ date }"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:9
+msgid "Registration are closed on this instance, you will need an invitation code to signup."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:71
+msgid "regular user"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:59
+msgid "Remove"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:58
+msgid "Remove avatar"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:19
+msgid "Remove from favorites"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:34
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+msgid "Request a new password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:35
+msgid "Request a new Subsonic API password?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:43
+msgid "Request a password"
+msgstr ""
+
+#: front/src/App.vue:35
+msgid "Request music"
+msgstr ""
+
+#: front/src/views/library/MusicRequest.vue:4 src/views/library/MusicRequest.vue:21
+msgid "Request some music"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:20
+msgid "Request submitted!"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:49
+msgid "Rerun errored jobs"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:187
+msgid "Rerun job"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:34 src/views/auth/PasswordReset.vue:4
+#: front/src/views/auth/PasswordReset.vue:52
+msgid "Reset your password"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:31
+msgid "Result %{ current }/%{ total }"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:38 src/components/library/Artists.vue:30
+#: front/src/components/library/Radios.vue:52 src/views/federation/LibraryList.vue:33
+#: front/src/views/playlists/List.vue:32
+msgid "Results per page"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:63
+#: front/src/components/library/radios/Builder.vue:19
+msgid "Save"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:112
+msgid "Scan triggered!"
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:5
+#: front/src/components/library/Artists.vue:10 src/components/library/Radios.vue:29
+#: front/src/components/library/import/BatchDetail.vue:62
+#: front/src/components/library/import/BatchList.vue:7
+#: front/src/components/manage/library/FilesTable.vue:5
+#: front/src/components/manage/library/RequestsTable.vue:5
+#: front/src/components/manage/users/InvitationsTable.vue:5
+#: front/src/components/manage/users/UsersTable.vue:5
+#: front/src/views/federation/LibraryList.vue:14 src/views/playlists/List.vue:13
+msgid "Search"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:85
+msgid "Search an entity you want to import:"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:180
+msgid "Search by artist, username, comment..."
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:188
+msgid "Search by source..."
+msgstr ""
+
+#: front/src/components/library/import/BatchList.vue:116
+msgid "Search by submitter, source..."
+msgstr ""
+
+#: front/src/components/federation/LibraryTrackTable.vue:182
+#: front/src/components/manage/library/FilesTable.vue:175
+msgid "Search by title, artist, domain..."
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:140
+msgid "Search by username, domain..."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:152
+msgid "Search by username, email, code..."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:162
+msgid "Search by username, email, name..."
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:20
+msgid "Search for artists, albums, tracks..."
+msgstr ""
+
+#: front/src/components/audio/Search.vue:2
+msgid "Search for some music"
+msgstr ""
+
+#: front/src/components/library/Track.vue:105
+msgid "Search on lyrics.wikia.com"
+msgstr ""
+
+#: front/src/components/library/Album.vue:33 src/components/library/Artist.vue:31
+#: front/src/components/library/Track.vue:40
+msgid "Search on Wikipedia"
+msgstr ""
+
+#: front/src/components/library/import/TrackImport.vue:42
+msgid "Search query"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:15
+msgid "Sections"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:31
+msgid "Select a filter"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:61
+msgid "Select all %{ total } elements"
+msgid_plural "Select all %{ total } elements"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/import/FileUpload.vue:22
+msgid "Select files to upload..."
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:69
+msgid "Select only current page"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:19
+msgid "Select relevant sources or files for import"
+msgstr ""
+
+#: front/src/components/federation/LibraryCard.vue:43
+msgid "Send a follow request"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:97 src/components/manage/users/UsersTable.vue:184
+#: front/src/views/admin/users/UsersDetail.vue:165
+msgid "Settings"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:10
+msgid "Settings updated"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:11
+msgid "Settings updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:24
+msgid "Settings..."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:27
+msgid "Share link"
+msgstr ""
+
+#: front/src/components/audio/artist/Card.vue:30
+msgid "Show 1 more album"
+msgid_plural "Show %{ count } more albums"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/audio/album/Card.vue:40
+msgid "Show 1 more track"
+msgid_plural "Show %{ count } more tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/forms/PasswordInput.vue:25
+msgid "Show/hide password"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:97
+#: front/src/components/federation/LibraryTrackTable.vue:98
+#: front/src/components/library/import/BatchDetail.vue:128
+#: front/src/components/library/import/BatchList.vue:73
+#: front/src/components/manage/library/FilesTable.vue:97
+#: front/src/components/manage/library/RequestsTable.vue:104
+#: front/src/components/manage/users/InvitationsTable.vue:76
+#: front/src/components/manage/users/UsersTable.vue:87
+msgid "Showing results %{ start }-%{ end } on %{ total }"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:269
+msgid "Shuffle your queue"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:95
+msgid "Sign Up"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:40
+#: front/src/views/admin/users/UsersDetail.vue:37
+msgid "Sign-up"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:31
+msgid "Simply copy paste the snippet below into a terminal to launch the download."
+msgstr ""
+
+#: front/src/components/library/Track.vue:69
+#: front/src/components/library/import/FileUpload.vue:44
+#: front/src/components/manage/library/FilesTable.vue:44
+msgid "Size"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:37
+#: front/src/components/library/import/BatchDetail.vue:72
+msgid "Skipped"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:3
+msgid "Something's missing in the library? Let us know what you would like to listen!"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:25
+msgid "Sorry, we did not found any album matching your query"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:16
+msgid "Sorry, we did not found any artist matching your query"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:82
+#: front/src/components/library/import/BatchList.vue:38
+#: front/src/components/library/import/TrackImport.vue:17
+msgid "Source"
+msgstr ""
+
+#: front/src/App.vue:41
+msgid "Source code"
+msgstr ""
+
+#: front/src/App.vue:40
+msgid "Source code (%{version})"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:20
+#: front/src/components/manage/users/UsersTable.vue:70
+msgid "Staff member"
+msgstr ""
+
+#: front/src/components/radios/Button.vue:4
+msgid "Start"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:28
+msgid "Start Upload"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:86
+msgid "Statistics"
+msgstr ""
+
+#: front/src/components/federation/LibraryFollowTable.vue:23
+#: front/src/components/federation/LibraryTrackTable.vue:46
+#: front/src/components/library/import/BatchDetail.vue:66
+#: front/src/components/library/import/BatchDetail.vue:83
+#: front/src/components/library/import/BatchList.vue:11
+#: front/src/components/library/import/BatchList.vue:37
+#: front/src/components/library/import/FileUpload.vue:45
+#: front/src/components/manage/library/RequestsTable.vue:24
+#: front/src/components/manage/library/RequestsTable.vue:48
+#: front/src/components/manage/users/InvitationsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:39
+#: front/src/components/manage/users/UsersTable.vue:43
+msgid "Status"
+msgstr ""
+
+#: front/src/components/radios/Button.vue:3
+msgid "Stop"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:159
+msgid "Stop radio"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:32
+msgid "Stop Upload"
+msgstr ""
+
+#: front/src/App.vue:9 src/components/requests/Form.vue:17
+msgid "Submit"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:22
+msgid "Submit another request"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:26
+#: front/src/components/library/import/BatchList.vue:39
+msgid "Submitted by"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:85
+msgid "Subsonic"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:2
+msgid "Subsonic API password"
+msgstr ""
+
+#: front/src/components/library/import/BatchDetail.vue:71
+#: front/src/components/library/import/BatchList.vue:16
+#: front/src/components/library/import/FileUpload.vue:56
+msgid "Success"
+msgstr ""
+
+#: front/src/App.vue:11
+msgid "Suggested choices"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:9
+msgid "Syncing changes to server..."
+msgstr ""
+
+#: front/src/components/Home.vue:26
+msgid "That's simple: we loved Grooveshark and we want to build something even better."
+msgstr ""
+
+#: front/src/components/requests/Form.vue:73
+msgid "The Beatles, Mickael Jackson…"
+msgstr ""
+
+#: front/src/App.vue:59
+msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
+msgstr ""
+
+#: front/src/components/Home.vue:124
+msgid "The plaform is free and open-source, you can install it and modify it without worries"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:4
+msgid "The Subsonic API is not available on this Funkwhale instance."
+msgstr ""
+
+#: front/src/components/requests/Form.vue:74
+msgid "The White Album, Thriller…"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:30
+msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:149
+msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled."
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:195
+msgid "This indicate if the remote library granted you access"
+msgstr ""
+
+#: front/src/components/auth/Profile.vue:16
+msgid "This is you!"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:37
+msgid "This may affect a lot of elements, please double check this is really what you want."
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:61
+msgid "This track is not imported and cannot be played"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:37
+msgid "This will completely delete this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:27
+msgid "This will completely delete this radio and cannot be undone."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:51
+msgid "This will completely disable access to the Subsonic API using from account."
+msgstr ""
+
+#: front/src/App.vue:133
+msgid "This will erase your local data and disconnect you, do you want to continue?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:36
+msgid "This will log you out from existing devices that use the current password."
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:44
+msgid "This will remove all tracks from this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:6
+#: front/src/components/federation/LibraryTrackTable.vue:47
+#: front/src/components/manage/library/FilesTable.vue:37
+msgid "Title"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:27 src/components/library/Track.vue:174
+#: front/src/components/library/import/BatchDetail.vue:84
+#: front/src/components/metadata/Search.vue:138
+msgid "Track"
+msgstr ""
+
+#: front/src/components/library/Track.vue:53
+msgid "Track information"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:44
+msgid "Track matching filter"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:54
+msgid "tracks"
+msgstr ""
+
+#: front/src/components/library/Album.vue:43
+#: front/src/components/playlists/PlaylistModal.vue:33
+#: front/src/views/federation/Base.vue:8 src/views/playlists/Detail.vue:50
+#: front/src/views/radios/Detail.vue:34
+msgid "Tracks"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:125
+msgid "Tracks available in this library"
+msgstr ""
+
+#: front/src/components/library/Artist.vue:54
+msgid "Tracks by this artist"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:25
+msgid "Tracks favorited"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:19
+msgid "tracks listened"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:109
+msgid "Trigger scan"
+msgstr ""
+
+#: front/src/components/manage/library/FilesTable.vue:41
+msgid "Type"
+msgstr ""
+
+#: front/src/components/About.vue:15
+msgid "Unfortunately, owners of this instance did not yet take the time to complete this page."
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:95
+msgid "Unknown"
+msgstr ""
+
+#: front/src/components/Home.vue:37
+msgid "Unlimited music"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:264
+msgid "Unmute"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:50
+msgid "Update avatar"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:33
+msgid "Update playlist"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:27
+msgid "Update settings"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:21
+msgid "Update your password"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:172
+#: front/src/views/admin/users/UsersDetail.vue:153
+msgid "Upload"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:45
+msgid "Upload a new avatar"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:7
+msgid "Uploaded files or external source"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:57
+msgid "Uploading..."
+msgstr ""
+
+#: front/src/App.vue:45
+msgid "Use another instance"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:75
+msgid "Use this comment box to add details to your request if needed"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:196
+msgid "Use this flag to enable/disable federation with this library"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:12
+msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
+msgstr ""
+
+#: front/src/components/federation/LibraryForm.vue:6
+msgid "Use this form to scan an instance and setup federation."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:49
+msgid "Used"
+msgstr ""
+
+#: front/src/components/manage/library/RequestsTable.vue:47
+msgid "User"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:5
+msgid "User activity"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:20
+msgid "User radios"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:19
+#: front/src/components/manage/users/UsersTable.vue:37
+msgid "Username"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:15
+msgid "Username or email"
+msgstr ""
+
+#: front/src/components/instance/Stats.vue:13
+msgid "users"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:103 src/views/admin/Settings.vue:81
+#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:3
+#: front/src/views/admin/users/UsersList.vue:21
+msgid "Users"
+msgstr ""
+
+#: front/src/components/library/Album.vue:37 src/components/library/Artist.vue:35
+#: front/src/components/library/Track.vue:44
+#: front/src/components/library/import/ArtistImport.vue:131
+#: front/src/components/metadata/ArtistCard.vue:49
+#: front/src/components/metadata/ReleaseCard.vue:53
+msgid "View on MusicBrainz"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:20
+msgid "We cannot add the track to a playlist"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:14
+msgid "We cannot create the playlist"
+msgstr ""
+
+#: front/src/components/auth/Signup.vue:13
+msgid "We cannot create your account"
+msgstr ""
+
+#: front/src/components/auth/Login.vue:7
+msgid "We cannot log you in"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:38
+msgid "We cannot save your avatar"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:14
+msgid "We cannot save your settings"
+msgstr ""
+
+#: front/src/components/Home.vue:130
+msgid "We do not track you or bother you with ads"
+msgstr ""
+
+#: front/src/components/library/import/FileUpload.vue:5
+msgid "We recommend using Picard for that purpose."
+msgstr ""
+
+#: front/src/components/Home.vue:7
+msgid "We think listening to music should be simple."
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:10
+msgid "We're sorry, the page you asked for does not exist:"
+msgstr ""
+
+#: front/src/components/requests/Form.vue:21
+msgid "We've received your request, you'll get some groove soon ;)"
+msgstr ""
+
+#: front/src/components/Home.vue:152
+msgid "Welcome"
+msgstr ""
+
+#: front/src/components/Home.vue:5
+msgid "Welcome on Funkwhale"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:114
+msgid "What is metadata?"
+msgstr ""
+
+#: front/src/views/federation/LibraryDetail.vue:197
+msgid "When enabled, auto importing will automatically import new tracks published in this library"
+msgstr ""
+
+#: front/src/components/Home.vue:24
+msgid "Why funkwhale?"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:124
+msgid "Yes"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:8
+msgid "Yes, log me out!"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:7
+msgid "You are currently logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:111
+msgid "You can also skip this step and enter metadata manually."
+msgstr ""
+
+#: front/src/components/Home.vue:136
+msgid "You can invite friends and family to your instance so they can enjoy your music"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:7
+msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:8
+msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:156
+msgid "You have a radio playing"
+msgstr ""
+
+#: front/src/App.vue:6
+msgid "You need to select an instance in order to continue"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:100
+msgid "You will be logged out from this session and have to log in with the new one"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:71
+msgid "You will have to update your password on your clients that use this password."
+msgstr ""
+
+#: front/src/components/library/import/Main.vue:103
+msgid "You will import:"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:24
+msgid "Your email address was confirmed, you can now use the service without limitations."
+msgstr ""
+
+#: front/src/components/favorites/List.vue:109
+msgid "Your Favorites"
+msgstr ""
+
+#: front/src/components/Home.vue:117
+msgid "Your music, your way"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:29
+msgid "Your password has been updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:101
+msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:156
+msgid "%{ count } track was added to your queue"
+msgid_plural "%{ count } tracks were added to your queue"
+msgstr[0] ""
+msgstr[1] ""
diff --git a/front/package.json b/front/package.json
index 3dec9c2571a25cf4e8592bb5da7a28e7699d636a..9837479badac5b9a1897c10ad2d375cf71d5e8a0 100644
--- a/front/package.json
+++ b/front/package.json
@@ -5,11 +5,11 @@
   "author": "Eliot Berriot <contact@eliotberriot.com>",
   "private": true,
   "scripts": {
-    "dev": "node build/dev-server.js",
-    "start": "node build/dev-server.js",
+    "dev": "scripts/i18n-compile.sh && node build/dev-server.js",
+    "start": "scripts/i18n-compile.sh && node build/dev-server.js",
     "build": "node build/build.js",
-    "i18n-extract": "find src/ -name '*.vue' | xargs vendor/vue-i18n-xgettext/index.js > ../po/en.po",
-    "i18n-compile": "node build/i18n.js",
+    "i18n-extract": "scripts/i18n-extract.sh",
+    "i18n-compile": "scripts/i18n-compile.sh",
     "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run",
     "unit-watch": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js",
     "e2e": "node test/e2e/runner.js",
@@ -21,9 +21,6 @@
     "axios": "^0.17.1",
     "dateformat": "^2.0.0",
     "django-channels": "^1.1.6",
-    "i18next": "^11.1.1",
-    "i18next-conv": "^6.0.0",
-    "i18next-fetch-backend": "^0.1.0",
     "js-logger": "^1.3.0",
     "jwt-decode": "^2.2.0",
     "lodash": "^4.17.4",
@@ -34,6 +31,7 @@
     "semantic-ui-css": "^2.2.10",
     "showdown": "^1.8.6",
     "vue": "^2.5.16",
+    "vue-gettext": "^2.0.31",
     "vue-lazyload": "^1.1.4",
     "vue-masonry": "^0.10.16",
     "vue-router": "^2.3.1",
@@ -61,6 +59,7 @@
     "cross-env": "^4.0.0",
     "cross-spawn": "^5.0.1",
     "css-loader": "^0.28.0",
+    "easygettext": "^2.5.0",
     "es6-promise": "^4.2.2",
     "eslint": "^3.19.0",
     "eslint-config-standard": "^6.2.1",
@@ -104,7 +103,6 @@
     "sinon-chai": "^2.8.0",
     "sinon-stub-promise": "^4.0.0",
     "url-loader": "^0.5.8",
-    "vue-i18n-xgettext": "^0.0.4",
     "vue-loader": "^12.1.0",
     "vue-style-loader": "^3.0.1",
     "vue-template-compiler": "^2.3.3",
diff --git a/front/scripts/i18n-compile.sh b/front/scripts/i18n-compile.sh
new file mode 100755
index 0000000000000000000000000000000000000000..211f8ee8c06264db2dbf0a935be0528175ae1e47
--- /dev/null
+++ b/front/scripts/i18n-compile.sh
@@ -0,0 +1,3 @@
+#!/bin/bash -eux
+locales=$(tail -n +2 src/locales.js | sed -e 's/export default //' | jq '.locales[].code' | xargs echo)
+find locales -name '*.po' | xargs $(yarn bin gettext-extract)/gettext-compile --output src/translations.json
diff --git a/front/scripts/i18n-extract.sh b/front/scripts/i18n-extract.sh
new file mode 100755
index 0000000000000000000000000000000000000000..149d3262daa9c95aaf98ba618a2bbb96f768e503
--- /dev/null
+++ b/front/scripts/i18n-extract.sh
@@ -0,0 +1,29 @@
+#!/bin/bash -eux
+locales=$(tail -n +2 src/locales.js | sed -e 's/export default //' | jq '.locales[].code' | xargs echo)
+locales_dir="locales"
+sources=$(find src -name '*.vue' -o -name '*.html' 2> /dev/null)
+js_sources=$(find src -name '*.vue' -o -name '*.js')
+touch $locales_dir/app.pot
+
+# Create a main .pot template, then generate .po files for each available language.
+# Extract gettext strings from templates files and create a POT dictionary template.
+$(yarn bin gettext-extract)/gettext-extract --attribute v-translate --quiet --output $locales_dir/app.pot $sources
+xgettext --language=JavaScript --keyword=npgettext:1c,2,3 \
+    --from-code=utf-8 --join-existing --no-wrap \
+    --package-name=$(node -e "console.log(require('./package.json').name);") \
+    --package-version=$(node -e "console.log(require('./package.json').version);") \
+    --output $locales_dir/app.pot $js_sources \
+    --no-wrap
+
+# Fix broken files path/lines in pot
+sed -e 's|#: src/|#: front/src/|' -i $locales_dir/app.pot
+
+# Generate .po files for each available language.
+echo $locales
+for lang in $locales; do \
+    po_file=$locales_dir/$lang/LC_MESSAGES/app.po; \
+    echo "msgmerge --update $po_file "; \
+    mkdir -p $(dirname $po_file); \
+    [ -f $po_file ] && msgmerge --lang=$lang --update $po_file $locales_dir/app.pot --no-wrap || msginit --no-wrap --no-translator --locale=$lang --input=$locales_dir/app.pot --output-file=$po_file; \
+    msgattrib --no-wrap --no-obsolete -o $po_file $po_file; \
+done;
diff --git a/front/scripts/i18n-weblate-to-origin.sh b/front/scripts/i18n-weblate-to-origin.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6150ff5696aa46739a85dbab95812aec06669650
--- /dev/null
+++ b/front/scripts/i18n-weblate-to-origin.sh
@@ -0,0 +1,12 @@
+#!/bin/bash -eux
+integration_branch="translations-integration"
+git remote add weblate https://translate.funkwhale.audio/git/funkwhale/front/ || echo "remote already exists"
+git fetch weblate
+git checkout weblate/develop
+git reset --hard weblate/develop
+git checkout -b $integration_branch || git checkout $integration_branch
+git reset --hard weblate/develop
+git push -f origin $integration_branch
+
+echo "Branch created on pushed on origin/$integration_branch"
+echo "Open a merge request by visiting https://code.eliotberriot.com/funkwhale/funkwhale/merge_requests/new?merge_request%5Bsource_branch%5D=$integration_branch"
diff --git a/front/src/App.vue b/front/src/App.vue
index 56dbe0aad41f7af3d382202832ab6828bb431837..58ed698aa98cc1236dbfebd7d5345b5739033b00 100644
--- a/front/src/App.vue
+++ b/front/src/App.vue
@@ -2,14 +2,14 @@
   <div id="app">
     <div class="ui main text container instance-chooser" v-if="!$store.state.instance.instanceUrl">
       <div class="ui padded segment">
-        <h1 class="ui header">{{ $t('Choose your instance') }}</h1>
+        <h1 class="ui header"><translate>Choose your instance</translate></h1>
         <form class="ui form" @submit.prevent="$store.dispatch('instance/setUrl', instanceUrl)">
-          <p>{{ $t('You need to select an instance in order to continue') }}</p>
+          <p><translate>You need to select an instance in order to continue</translate></p>
           <div class="ui action input">
             <input type="text" v-model="instanceUrl">
-            <button type="submit" class="ui button">{{ $t('Submit') }}</button>
+            <button type="submit" class="ui button"><translate>Submit</translate></button>
           </div>
-          <p>{{ $t('Suggested choices') }}</p>
+          <p><translate>Suggested choices</translate></p>
           <div class="ui bulleted list">
             <div class="ui item" v-for="url in suggestedInstances">
               <a @click="instanceUrl = url">{{ url }}</a>
@@ -27,20 +27,23 @@
         <div class="ui container">
           <div class="ui stackable equal height stackable grid">
             <div class="three wide column">
-              <i18next tag="h4" class="ui header" path="Links"></i18next>
+              <h4 v-translate class="ui header">Links</h4>
               <div class="ui link list">
                 <router-link class="item" to="/about">
-                  <i18next path="About this instance" />
+                  <translate>About this instance</translate>
                 </router-link>
-                <a href="https://funkwhale.audio" class="item" target="_blank">{{ $t('Official website') }}</a>
-                <a href="https://docs.funkwhale.audio" class="item" target="_blank">{{ $t('Documentation') }}</a>
+                <router-link class="item" :to="{name: 'library.request'}">
+                  <translate>Request music</translate>
+                </router-link>
+                <a href="https://funkwhale.audio" class="item" target="_blank"><translate>Official website</translate></a>
+                <a href="https://docs.funkwhale.audio" class="item" target="_blank"><translate>Documentation</translate></a>
                 <a href="https://code.eliotberriot.com/funkwhale/funkwhale" class="item" target="_blank">
-                  <template v-if="version">{{ $t('Source code ({% version %})', {version: version}) }}</template>
-                  <template v-else>{{ $t('Source code') }}</template>
+                  <translate :translate-params="{version: version}" v-if="version">Source code (%{version})</translate>
+                  <translate v-else>Source code</translate>
                 </a>
-                <a href="https://code.eliotberriot.com/funkwhale/funkwhale/issues" class="item" target="_blank">{{ $t('Issue tracker') }}</a>
+                <a href="https://code.eliotberriot.com/funkwhale/funkwhale/issues" class="item" target="_blank"><translate>Issue tracker</translate></a>
                 <a @click="switchInstance" class="item" >
-                  {{ $t('Use another instance') }}
+                  <translate>Use another instance</translate>
                   <template v-if="$store.state.instance.instanceUrl !== '/'">
                     <br>
                     ({{ $store.state.instance.instanceUrl }})
@@ -49,14 +52,30 @@
               </div>
             </div>
             <div class="ten wide column">
-              <i18next tag="h4" class="ui header" path="About funkwhale" />
+              <h4 v-translate class="ui header">About Funkwhale</h4>
               <p>
-                <i18next path="Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!"/>
+                <translate>Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!</translate>
               </p>
               <p>
-                <i18next path="The funkwhale logo was kindly designed and provided by Francis Gading."/>
+                <translate>The funkwhale logo was kindly designed and provided by Francis Gading.</translate>
               </p>
             </div>
+            <div class="three wide column">
+              <h4 v-translate class="ui header">Options</h4>
+              <div class="ui form">
+                <div class="ui field">
+                  <label><translate>Change language</translate></label>
+                  <select class="ui dropdown" v-model="$language.current">
+                    <option v-for="(language, key) in $language.available" :value="key">{{ language }}</option>
+                  </select>
+                </div>
+              </div>
+              <br>
+              <a target="_blank" href="https://translate.funkwhale.audio/engage/funkwhale/">
+                <translate>Help us translate Funkwhale</translate>
+              </a>
+            </div>
+
           </div>
         </div>
       </div>
@@ -74,6 +93,8 @@ import axios from 'axios'
 import _ from 'lodash'
 import {mapState} from 'vuex'
 
+import translations from '@/translations'
+
 import Sidebar from '@/components/Sidebar'
 import Raven from '@/components/Raven'
 import ServiceMessages from '@/components/ServiceMessages'
@@ -96,6 +117,7 @@ export default {
   },
   created () {
     let self = this
+    this.autodetectLanguage()
     setInterval(() => {
       // used to redraw ago dates every minute
       self.$store.commit('ui/computeLastDate')
@@ -115,10 +137,25 @@ export default {
       })
     },
     switchInstance () {
-      let confirm = window.confirm(this.$t('This will erase your local data and disconnect you, do you want to continue?'))
+      let confirm = window.confirm(this.$gettext('This will erase your local data and disconnect you, do you want to continue?'))
       if (confirm) {
         this.$store.commit('instance/instanceUrl', null)
       }
+    },
+    autodetectLanguage () {
+      let userLanguage = navigator.language || navigator.userLanguage
+      let available = _.keys(translations)
+      let matching = available.filter((a) => {
+        return userLanguage.replace('-', '_') === a
+      })
+      let almostMatching = available.filter((a) => {
+        return userLanguage.replace('-', '_').split('_')[0] === a.split('_')[0]
+      })
+      if (matching.length > 0) {
+        this.$language.current = matching[0]
+      } else if (almostMatching.length > 0) {
+        this.$language.current = almostMatching[0]
+      }
     }
   },
   computed: {
@@ -144,6 +181,9 @@ export default {
     '$store.state.instance.instanceUrl' () {
       this.$store.dispatch('instance/fetchSettings')
       this.fetchNodeInfo()
+    },
+    '$language.current' (newValue) {
+      this.$store.commit('ui/currentLanguage', newValue)
     }
   }
 }
@@ -176,9 +216,42 @@ html, body {
 .main.pusher, .footer {
   @include media(">desktop") {
     margin-left: 350px !important;
+    margin-top: 50px;
   }
   transform: none !important;
 }
+
+
+.main.pusher > .ui.secondary.menu {
+  margin-left: 0;
+  margin-right: 0;
+  border: none;
+  box-shadow: inset 0px -2px 0px 0px rgba(34, 36, 38, 0.15);
+  .ui.item {
+    border: none;
+    border-bottom-style: none;
+    margin-bottom: 0px;
+    &.active {
+      box-shadow: inset 0px -2px 0px 0px #000;
+    }
+  }
+  @include media(">tablet") {
+    padding: 0 2.5rem;
+  }
+  @include media(">desktop") {
+    position: fixed;
+    left: 350px;
+    right: 0px;
+    top: 0px;
+    z-index: 1;
+  }
+  background-color: white;
+  .item {
+    padding-top: 1.5em;
+    padding-bottom: 1.5em;
+  }
+}
+
 .service-messages {
   position: fixed;
   bottom: 1em;
@@ -221,6 +294,7 @@ html, body {
 
 .discrete.link {
     color: rgba(0, 0, 0, 0.87);
+    cursor: pointer;
 }
 
 .floated.buttons .button ~ .dropdown {
diff --git a/front/src/audio/backend.js b/front/src/audio/backend.js
index 5a82719a3a0d403ce6ee264eed47e2f5926068f0..c371566758631cf2a6f8c58547d01a47c318e3dd 100644
--- a/front/src/audio/backend.js
+++ b/front/src/audio/backend.js
@@ -2,7 +2,6 @@ var Album = {
   clean (album) {
     // we manually rebind the album and artist to each child track
     album.tracks = album.tracks.map((track) => {
-      track.artist = album.artist
       track.album = album
       return track
     })
diff --git a/front/src/components/About.vue b/front/src/components/About.vue
index 59c8411ac131fe65ec72fa6ed1e4769eed5b361a..438fed67db518c4b99a29b8cf7b3a870d8e5c412 100644
--- a/front/src/components/About.vue
+++ b/front/src/components/About.vue
@@ -1,23 +1,25 @@
 <template>
-  <div class="main pusher" v-title="'About This Instance'">
+  <div class="main pusher" v-title="labels.title">
     <div class="ui vertical center aligned stripe segment">
       <div class="ui text container">
         <h1 class="ui huge header">
-            <template v-if="instance.name.value">{{ $t('About {%instance%}', { instance: instance.name.value }) }}</template>
-            <template v-else="instance.name.value">{{ $t('About this instance') }}</template>
+            <translate v-if="instance.name.value" :translate-params="{instance: instance.name.value}">
+             About %{ instance }
+            </translate>
+            <translate v-else>About this instance</translate>
         </h1>
         <stats></stats>
       </div>
     </div>
     <div class="ui vertical stripe segment">
       <p v-if="!instance.short_description.value && !instance.long_description.value">
-        {{ $t('Unfortunately, owners of this instance did not yet take the time to complete this page.') }}
+        <translate>Unfortunately, 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>{{ $t('Edit instance info') }}
+        <i class="pencil icon"></i><translate>Edit instance info</translate>
       </router-link>
       <div
         v-if="instance.short_description.value"
@@ -47,7 +49,12 @@ export default {
   computed: {
     ...mapState({
       instance: state => state.instance.settings.instance
-    })
+    }),
+    labels () {
+      return {
+        title: this.$gettext('About this instance')
+      }
+    }
   }
 }
 </script>
diff --git a/front/src/components/Home.vue b/front/src/components/Home.vue
index 2af1bfc35b1b65a60a686268a31594c2604ada9a..648b1afc76728d53d4d4a66d9b9d5ff2a1590423 100644
--- a/front/src/components/Home.vue
+++ b/front/src/components/Home.vue
@@ -1,17 +1,17 @@
 <template>
-  <div class="main pusher" v-title="'Welcome'">
+  <div class="main pusher" v-title="labels.title">
     <div class="ui vertical center aligned stripe segment">
       <div class="ui text container">
         <h1 class="ui huge header">
-          {{ $t('Welcome on Funkwhale') }}
+          <translate>Welcome on Funkwhale</translate>
         </h1>
-        <p>{{ $t('We think listening to music should be simple.') }}</p>
+        <p><translate>We think listening to music should be simple.</translate></p>
         <router-link class="ui icon button" to="/about">
           <i class="info icon"></i>
-          {{ $t('Learn more about this instance') }}
+          <translate>Learn more about this instance</translate>
         </router-link>
         <router-link class="ui icon teal button" to="/library">
-          {{ $t('Get me to the library') }}
+          <translate>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">
-                {{ $t('Why funkwhale?') }}
+                <translate>Why funkwhale?</translate>
               </h2>
-              <p>{{ $t('That\'s simple: we loved Grooveshark and we want to build something even better.') }}</p>
+              <p><translate>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">
-          {{ $t('Unlimited music') }}
+          <translate>Unlimited music</translate>
         </h2>
-        <p>{{ $t('Funkwhale is designed to make it easy to listen to music you like, or to discover new artists.') }}</p>
+        <p><translate>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">
-              {{ $t('Click once, listen for hours using built-in radios') }}
+              <translate>Click once, listen for hours using built-in radios</translate>
             </div>
           </div>
           <div class="item">
             <i class="heart icon"></i>
             <div class="content">
-              {{ $t('Keep a track of your favorite songs') }}
+              <translate>Keep a track of your favorite songs</translate>
             </div>
           </div>
           <div class="item">
             <i class="list icon"></i>
             <div class="content">
-              {{ $t('Playlists? We got them') }}
+              <translate>Playlists? We got them</translate>
             </div>
           </div>
         </div>
@@ -62,28 +62,31 @@
       <div class="ui middle aligned stackable text container">
         <div class="ui hidden divider"></div>
         <h2 class="ui header">
-          {{ $t('Clean library') }}
+          <translate>Clean library</translate>
         </h2>
-        <p>{{ $t('Funkwhale takes care of handling your music') }}.</p>
+        <p><translate>Funkwhale takes care of handling your music</translate>.</p>
         <div class="ui list">
           <div class="item">
             <i class="download icon"></i>
             <div class="content">
-              {{ $t('Import music from various platforms, such as YouTube or SoundCloud') }}
+              <translate>Import music from various platforms, such as YouTube or SoundCloud</translate>
             </div>
           </div>
           <div class="item">
             <i class="tag icon"></i>
             <div class="content">
-              <i18next path="Get quality metadata about your music thanks to {%0%}">
-                <a href="https://musicbrainz.org" target="_blank">{{ $t('MusicBrainz') }}</a>
-              </i18next>
+              <template v-translate>
+                Get quality metadata about your music thanks to
+                <a href="https://musicbrainz.org" target="_blank">
+                  MusicBrainz
+                </a>
+              </template>
             </div>
           </div>
           <div class="item">
             <i class="plus icon"></i>
             <div class="content">
-              {{ $t('Covers, lyrics, our goal is to have them all ;)') }}
+              <translate>Covers, lyrics, our goal is to have them all ;)</translate>
             </div>
           </div>
         </div>
@@ -91,20 +94,20 @@
       <div class="ui middle aligned stackable text container">
         <div class="ui hidden divider"></div>
         <h2 class="ui header">
-          {{ $t('Easy to use') }}
+          <translate>Easy to use</translate>
         </h2>
-        <p>{{ $t('Funkwhale is dead simple to use.') }}</p>
+        <p><translate>Funkwhale is dead simple to use.</translate></p>
         <div class="ui list">
           <div class="item">
             <i class="book icon"></i>
             <div class="content">
-              {{ $t('No add-ons, no plugins : you only need a web library') }}
+              <translate>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">
-              {{ $t('Access your music from a clean interface that focus on what really matters') }}
+              <translate>Access your music from a clean interface that focus on what really matters</translate>
             </div>
           </div>
         </div>
@@ -112,26 +115,26 @@
       <div class="ui middle aligned stackable text container">
         <div class="ui hidden divider"></div>
         <h2 class="ui header">
-          {{ $t('Your music, your way') }}
+          <translate>Your music, your way</translate>
         </h2>
-        <p>{{ $t('Funkwhale is free and gives you control on your music.') }}</p>
+        <p><translate>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">
-              {{ $t('The plaform is free and open-source, you can install it and modify it without worries') }}
+              <translate>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">
-              {{ $t('We do not track you or bother you with ads') }}
+              <translate>We do not track you or bother you with ads</translate>
             </div>
           </div>
           <div class="item">
             <i class="users icon"></i>
             <div class="content">
-              {{ $t('You can invite friends and family to your instance so they can enjoy your music') }}
+              <translate>You can invite friends and family to your instance so they can enjoy your music</translate>
             </div>
           </div>
         </div>
@@ -143,9 +146,12 @@
 <script>
 
 export default {
-  name: 'home',
-  data () {
-    return {}
+  computed: {
+    labels () {
+      return {
+        title: this.$gettext('Welcome')
+      }
+    }
   }
 }
 </script>
diff --git a/front/src/components/PageNotFound.vue b/front/src/components/PageNotFound.vue
index b4d2250ca061db4b36c729b42dc22901d684cd7d..115bc5d023f1745f1399a868bff86c63c8d12c6a 100644
--- a/front/src/components/PageNotFound.vue
+++ b/front/src/components/PageNotFound.vue
@@ -1,17 +1,18 @@
 <template>
-  <div class="main pusher" v-title="'Page Not Found'">
+  <div class="main pusher" :v-title="labels.title">
     <div class="ui vertical stripe segment">
       <div class="ui text container">
         <h1 class="ui huge header">
           <i class="warning icon"></i>
           <div class="content">
-            <strike>{{ $t('Whale') }}</strike> {{ $t('Page not found!') }}
+            <translate>Page not found!</translate>
           </div>
         </h1>
-        <p>{{ $t('We\'re sorry, the page you asked for does not exists.') }}</p>
-        <i18next path="Requested URL: {%0%}"><a :href="path">{{ path }}</a></i18next>
+        <p><translate>We're sorry, the page you asked for does not exist:</translate></p>
+        <a :href="path">{{ path }}</a>
+        <div class="ui hidden divider"></div>
         <router-link class="ui icon button" to="/">
-          {{ $t('Go to home page') }}
+          <translate>Go to home page</translate>
           <i class="right arrow icon"></i>
         </router-link>
       </div>
@@ -25,6 +26,13 @@ export default {
     return {
       path: window.location.href
     }
+  },
+  computed: {
+    labels () {
+      return {
+        title: this.$gettext('Page Not Found')
+      }
+    }
   }
 }
 </script>
diff --git a/front/src/components/Sidebar.vue b/front/src/components/Sidebar.vue
index 9eec6c0e2721f50ba9209474cabddf028ca4c163..4a3f42c773a23c268a943ef77cbdd4bcb33eab13 100644
--- a/front/src/components/Sidebar.vue
+++ b/front/src/components/Sidebar.vue
@@ -2,7 +2,7 @@
 <div :class="['ui', 'vertical', 'left', 'visible', 'wide', {'collapsed': isCollapsed}, 'sidebar',]">
   <div class="ui inverted segment header-wrapper">
     <search-bar @search="isCollapsed = false">
-      <router-link :title="'Funkwhale'" :to="{name: 'index'}">
+      <router-link :title="'Funkwhale'" :to="{name: logoUrl}">
         <i class="logo bordered inverted orange big icon">
           <logo class="logo"></logo>
         </i>
@@ -16,15 +16,15 @@
 
   <div class="menu-area">
     <div class="ui compact fluid two item inverted menu">
-      <a class="active item" @click="selectedTab = 'library'" data-tab="library">Browse</a>
+      <a class="active item" @click="selectedTab = 'library'" data-tab="library"><translate>Browse</translate></a>
       <a class="item" @click="selectedTab = 'queue'" data-tab="queue">
-        {{ $t('Queue') }}
+        <translate>Queue</translate>&nbsp;
          <template v-if="queue.tracks.length === 0">
-           {{ $t('(empty)') }}
-         </template>
-         <template v-else>
-           {{ $t('({%index%} of {%length%})', { index: queue.currentIndex + 1, length: queue.tracks.length }) }}
+           <translate>(empty)</translate>
          </template>
+         <translate v-else :translate-params="{index: queue.currentIndex + 1, length: queue.tracks.length}">
+          (%{ index } of %{ length })
+         </translate>
       </a>
     </div>
   </div>
@@ -32,40 +32,46 @@
     <div class="ui bottom attached active tab" data-tab="library">
       <div class="ui inverted vertical large fluid menu">
         <div class="item">
-          <div class="header">{{ $t('My account') }}</div>
+          <div class="header"><translate>My account</translate></div>
           <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>{{ $t('Logged in as {%name%}', { name: $store.state.auth.username }) }}</router-link>
-            <router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'logout'}"><i class="sign out icon"></i>{{ $t('Logout') }}</router-link>
-            <router-link class="item" v-else :to="{name: 'login'}"><i class="sign in icon"></i>{{ $t('Login') }}</router-link>
+            <router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'profile', params: {username: $store.state.auth.username}}">
+              <i class="user icon"></i>
+              <translate :translate-params="{username: $store.state.auth.username}">
+                Logged in as %{ username }
+              </translate>
+              <img class="ui right floated circular tiny avatar image" v-if="$store.state.auth.profile.avatar.square_crop" :src="$store.getters['instance/absoluteUrl']($store.state.auth.profile.avatar.square_crop)" />
+            </router-link>
+            <router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'logout'}"><i class="sign out icon"></i><translate>Logout</translate></router-link>
+            <router-link class="item" v-else :to="{name: 'login'}"><i class="sign in icon"></i><translate>Login</translate></router-link>
           </div>
         </div>
         <div class="item">
-          <div class="header">{{ $t('Music') }}</div>
+          <div class="header"><translate>Music</translate></div>
           <div class="menu">
-            <router-link class="item" :to="{path: '/library'}"><i class="sound icon"> </i>{{ $t('Browse library') }}</router-link>
-            <router-link class="item" v-if="$store.state.auth.authenticated" :to="{path: '/favorites'}"><i class="heart icon"></i>{{ $t('Favorites') }}</router-link>
+            <router-link class="item" :to="{path: '/library'}"><i class="sound icon"></i><translate>Browse library</translate></router-link>
+            <router-link class="item" v-if="$store.state.auth.authenticated" :to="{path: '/favorites'}"><i class="heart icon"></i><translate>Favorites</translate></router-link>
             <a
               @click="$store.commit('playlists/chooseTrack', null)"
               v-if="$store.state.auth.authenticated"
               class="item">
-              <i class="list icon"></i>{{ $t('Playlists') }}
+              <i class="list icon"></i><translate>Playlists</translate>
             </a>
             <router-link
               v-if="$store.state.auth.authenticated"
-              class="item" :to="{path: '/activity'}"><i class="bell icon"></i>{{ $t('Activity') }}</router-link>
+              class="item" :to="{path: '/activity'}"><i class="bell icon"></i><translate>Activity</translate></router-link>
           </div>
         </div>
         <div class="item" v-if="showAdmin">
-          <div class="header">{{ $t('Administration') }}</div>
+          <div class="header"><translate>Administration</translate></div>
           <div class="menu">
             <router-link
               class="item"
               v-if="$store.state.auth.availablePermissions['library']"
               :to="{name: 'manage.library.files'}">
-              <i class="book icon"></i>{{ $t('Library') }}
+              <i class="book icon"></i><translate>Library</translate>
               <div
                 :class="['ui', {'teal': $store.state.ui.notifications.importRequests > 0}, 'label']"
-                :title="$t('Pending import requests')">
+                :title="labels.pendingRequests">
                 {{ $store.state.ui.notifications.importRequests }}</div>
 
             </router-link>
@@ -73,29 +79,29 @@
               class="item"
               v-else-if="$store.state.auth.availablePermissions['upload']"
               to="/library/import/launch">
-              <i class="download icon"></i>{{ $t('Import music') }}
+              <i class="download icon"></i><translate>Import music</translate>
             </router-link>
             <router-link
               class="item"
               v-if="$store.state.auth.availablePermissions['federation']"
               :to="{path: '/manage/federation/libraries'}">
-              <i class="sitemap icon"></i>{{ $t('Federation') }}
+              <i class="sitemap icon"></i><translate>Federation</translate>
               <div
                 :class="['ui', {'teal': $store.state.ui.notifications.federation > 0}, 'label']"
-                :title="$t('Pending follow requests')">
+                :title="labels.pendingFollows">
                 {{ $store.state.ui.notifications.federation }}</div>
             </router-link>
             <router-link
               class="item"
               v-if="$store.state.auth.availablePermissions['settings']"
               :to="{path: '/manage/settings'}">
-              <i class="settings icon"></i>{{ $t('Settings') }}
+              <i class="settings icon"></i><translate>Settings</translate>
             </router-link>
             <router-link
               class="item"
               v-if="$store.state.auth.availablePermissions['settings']"
               :to="{name: 'manage.users.users.list'}">
-              <i class="users icon"></i>{{ $t('Users') }}
+              <i class="users icon"></i><translate>Users</translate>
             </router-link>
           </div>
         </div>
@@ -105,12 +111,19 @@
       <i class="history icon"></i>
       <div class="content">
         <div class="header">
-          {{ $t('Do you want to restore your previous queue?') }}
+          <translate>Do you want to restore your previous queue?</translate>
         </div>
-        <p>{{ $t('{%count%} tracks', { count: queue.previousQueue.tracks.length }) }}</p>
+        <p>
+          <translate
+            translate-plural="%{ count } tracks"
+            :translate-n="queue.previousQueue.tracks.length"
+            :translate-params="{count: queue.previousQueue.tracks.length}">
+            %{ count } track
+          </translate>
+        </p>
         <div class="ui two buttons">
-          <div @click="queue.restore()" class="ui basic inverted green button">{{ $t('Yes') }}</div>
-          <div @click="queue.removePrevious()" class="ui basic inverted red button">{{ $t('No') }}</div>
+          <div @click="queue.restore()" class="ui basic inverted green button"><translate>Yes</translate></div>
+          <div @click="queue.removePrevious()" class="ui basic inverted red button"><translate>No</translate></div>
         </div>
       </div>
     </div>
@@ -120,7 +133,7 @@
           <tr @click="$store.dispatch('queue/currentIndex', index)" v-for="(track, index) in tracks" :key="index" :class="[{'active': index === queue.currentIndex}]">
               <td class="right aligned">{{ index + 1}}</td>
               <td class="center aligned">
-                  <img class="ui mini image" v-if="track.album.cover" :src="$store.getters['instance/absoluteUrl'](track.album.cover)">
+                  <img class="ui mini image" v-if="track.album.cover && track.album.cover.original" :src="$store.getters['instance/absoluteUrl'](track.album.cover.small_square_crop)">
                   <img class="ui mini image" v-else src="../assets/audio/default-cover.png">
               </td>
               <td colspan="4">
@@ -141,10 +154,10 @@
       <div v-if="$store.state.radios.running" class="ui black message">
         <div class="content">
           <div class="header">
-            <i class="feed icon"></i> {{ $t('You have a radio playing') }}
+            <i class="feed icon"></i> <translate>You have a radio playing</translate>
           </div>
-          <p>{{ $t('New tracks will be appended here automatically.') }}</p>
-          <div @click="$store.dispatch('radios/stop')" class="ui basic inverted red button">{{ $t('Stop radio') }}</div>
+          <p><translate>New tracks will be appended here automatically.</translate></p>
+          <div @click="$store.dispatch('radios/stop')" class="ui basic inverted red button"><translate>Stop radio</translate></div>
         </div>
       </div>
     </div>
@@ -199,6 +212,14 @@ export default {
       queue: state => state.queue,
       url: state => state.route.path
     }),
+    labels () {
+      let pendingRequests = this.$gettext('Pending import requests')
+      let pendingFollows = this.$gettext('Pending follow requests')
+      return {
+        pendingRequests,
+        pendingFollows
+      }
+    },
     showAdmin () {
       let adminPermissions = [
         this.$store.state.auth.availablePermissions['federation'],
@@ -216,6 +237,13 @@ export default {
       set (value) {
         this.tracksChangeBuffer = value
       }
+    },
+    logoUrl () {
+      if (this.$store.state.auth.authenticated) {
+        return 'library.index'
+      } else {
+        return 'index'
+      }
     }
   },
   methods: {
@@ -352,6 +380,9 @@ $sidebar-color: #3d3e3f;
   tr {
     cursor: pointer;
   }
+  td:nth-child(2) {
+    width: 55px;
+  }
 }
 .tab[data-tab="library"] {
   flex-direction: column;
@@ -394,6 +425,10 @@ $sidebar-color: #3d3e3f;
 .ui.message.black {
   background: $sidebar-color;
 }
+
+.ui.mini.image {
+  width: 100%;
+}
 </style>
 
 <style lang="scss">
@@ -405,4 +440,9 @@ $sidebar-color: #3d3e3f;
     }
   }
 }
+.ui.tiny.avatar.image {
+  position: relative;
+  top: -0.5em;
+  width: 3em;
+}
 </style>
diff --git a/front/src/components/activity/Like.vue b/front/src/components/activity/Like.vue
index 5396accc233033222eca551364cc4da740f59a47..8e35598d532cb158bf1c53e8fc03970e297da869 100644
--- a/front/src/components/activity/Like.vue
+++ b/front/src/components/activity/Like.vue
@@ -5,20 +5,12 @@
    </div>
    <div class="content">
      <div class="summary">
-       <i18next path="{%0%} favorited a track">
-         <username class="user" :username="event.actor.local_id" />
-       </i18next>
+       <translate :translate-params="{user: event.actor.local_id}">%{ user } favorited a track</translate>
        <human-date class="date" :date="event.published" />
      </div>
      <div class="extra text">
        <router-link :to="{name: 'library.tracks.detail', params: {id: event.object.local_id }}">{{ event.object.name }}</router-link>
-        <i18next path="from album {%0%}, by {%1%}" v-if="event.object.album">
-          {{ event.object.album }}
-          <em>{{ event.object.artist }}</em>
-        </i18next>
-        <i18next path=", by {%0%}" v-else>
-          <em>{{ event.object.artist }}</em>
-        </i18next>
+       <translate :translate-params="{album: event.object.album, artist: event.object.artist}">from %{ album } by %{ artist }</translate>
       </div>
    </div>
  </div>
diff --git a/front/src/components/activity/Listen.vue b/front/src/components/activity/Listen.vue
index bfa3ca16450a69adfa086e1189ab0446e81e0733..2d1a3c1843d2901c728c5e7c4a14d140dbb06200 100644
--- a/front/src/components/activity/Listen.vue
+++ b/front/src/components/activity/Listen.vue
@@ -5,20 +5,12 @@
    </div>
    <div class="content">
      <div class="summary">
-       <i18next path="{%0%} listened to a track">
-         <username class="user" :username="event.actor.local_id" />
-       </i18next>
-       <human-date class="date" :date="event.published" />
-
+      <translate :translate-params="{user: event.actor.local_id}">%{ user } listened to a track</translate>
+      <human-date class="date" :date="event.published" />
      </div>
      <div class="extra text">
        <router-link :to="{name: 'library.tracks.detail', params: {id: event.object.local_id }}">{{ event.object.name }}</router-link>
-        <i18next path="from album {%0%}, by {%1%}" v-if="event.object.album">
-          {{ event.object.album }}<em>{{ event.object.artist }}</em>
-        </i18next>
-        <i18next path=", by {%0%}" v-else>
-          <em>{{ event.object.artist }}</em>
-        </i18next>
+       <translate :translate-params="{album: event.object.album, artist: event.object.artist}">from %{ album } by %{ artist }</translate>
       </div>
    </div>
  </div>
diff --git a/front/src/components/admin/SettingsGroup.vue b/front/src/components/admin/SettingsGroup.vue
index f6d57c239b0d4d6bff7c6b0af1f6e397f2da941c..c732213e2ce4833837e3df2652bc4c076c31f7be 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">{{ $t('Error while saving settings') }}</div>
+      <div class="header"><translate>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">
-      {{ $t('Settings updated successfully.') }}
+      <translate>Settings updated successfully.</translate>
     </div>
     <p v-if="group.help">{{ group.help }}</p>
     <div v-for="setting in settings" class="ui field">
@@ -61,7 +61,7 @@
     <button
       type="submit"
       :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']">
-        {{ $t('Save') }}
+        <translate>Save</translate>
     </button>
   </form>
 </template>
diff --git a/front/src/components/audio/PlayButton.vue b/front/src/components/audio/PlayButton.vue
index 9777fa83ca2d52605e39d37219e25694e49b614c..ad85e72ce82191d88edf18ccd3eb3fbb462bfb63 100644
--- a/front/src/components/audio/PlayButton.vue
+++ b/front/src/components/audio/PlayButton.vue
@@ -1,22 +1,23 @@
 <template>
-  <div :title="title" :class="['ui', {'tiny': discrete}, 'buttons']">
+  <span :title="title" :class="['ui', {'tiny': discrete}, {'buttons': !dropdownOnly && !iconOnly}]">
     <button
-      :title="$t('Add to current queue')"
+      v-if="!dropdownOnly"
+      :title="labels.addToQueue"
       @click="addNext(true)"
       :disabled="!playable"
-      :class="['ui', {loading: isLoading}, {'mini': discrete}, {disabled: !playable}, 'button']">
-      <i class="ui play icon"></i>
-      <template v-if="!discrete"><slot><i18next path="Play"/></slot></template>
+      :class="buttonClasses.concat(['ui', {loading: isLoading}, {'mini': discrete}, {disabled: !playable}])">
+      <i :class="[playIconClass, 'icon']"></i>
+      <template v-if="!discrete && !iconOnly"><slot><translate>Play</translate></slot></template>
     </button>
-    <div v-if="!discrete" :class="['ui', {disabled: !playable}, 'floating', 'dropdown', 'icon', 'button']">
-      <i class="dropdown icon"></i>
+    <div v-if="!discrete && !iconOnly" :class="['ui', {disabled: !playable}, 'floating', 'dropdown', {'icon': !dropdownOnly}, {'button': !dropdownOnly}]">
+      <i :class="dropdownIconClasses.concat(['icon'])"></i>
       <div class="menu">
-        <div class="item" :disabled="!playable" @click="add"><i class="plus icon"></i><i18next path="Add to queue"/></div>
-        <div class="item" :disabled="!playable" @click="addNext()"><i class="step forward icon"></i><i18next path="Play next"/></div>
-        <div class="item" :disabled="!playable" @click="addNext(true)"><i class="arrow down icon"></i><i18next path="Play now"/></div>
+        <div class="item" :disabled="!playable" @click="add"><i class="plus icon"></i><translate>Add to queue</translate></div>
+        <div class="item" :disabled="!playable" @click="addNext()"><i class="step forward icon"></i><translate>Play next</translate></div>
+        <div class="item" :disabled="!playable" @click="addNext(true)"><i class="arrow down icon"></i><translate>Play now</translate></div>
       </div>
     </div>
-  </div>
+  </span>
 </template>
 
 <script>
@@ -28,8 +29,13 @@ export default {
     // we can either have a single or multiple tracks to play when clicked
     tracks: {type: Array, required: false},
     track: {type: Object, required: false},
+    dropdownIconClasses: {type: Array, required: false, default: () => { return ['dropdown'] }},
+    playIconClass: {type: String, required: false, default: 'play icon'},
+    buttonClasses: {type: Array, required: false, default: () => { return ['button'] }},
     playlist: {type: Object, required: false},
     discrete: {type: Boolean, default: false},
+    dropdownOnly: {type: Boolean, default: false},
+    iconOnly: {type: Boolean, default: false},
     artist: {type: Number, required: false},
     album: {type: Number, required: false}
   },
@@ -42,12 +48,17 @@ export default {
     jQuery(this.$el).find('.ui.dropdown').dropdown()
   },
   computed: {
+    labels () {
+      return {
+        addToQueue: this.$gettext('Add to current queue')
+      }
+    },
     title () {
       if (this.playable) {
-        return this.$t('Play immediatly')
+        return this.$gettext('Play immediatly')
       } else {
         if (this.track) {
-          return this.$t('This track is not imported and cannot be played')
+          return this.$gettext('This track is not imported and cannot be played')
         }
       }
     },
@@ -142,8 +153,9 @@ export default {
       if (tracks.length < 1) {
         return
       }
+      let msg = this.$ngettext('%{ count } track was added to your queue', '%{ count } tracks were added to your queue', tracks.length)
       this.$store.commit('ui/addMessage', {
-        content: this.$t('{% tracks %} tracks were added to your queue.', {tracks: tracks.length}),
+        content: this.$gettextInterpolate(msg, {count: tracks.length}),
         date: new Date()
       })
     }
diff --git a/front/src/components/audio/Player.vue b/front/src/components/audio/Player.vue
index 8eecb232f67b770be9f28477c4a3380f56a3607d..704121d92e2fb98f0688634bbd184bb768258fd8 100644
--- a/front/src/components/audio/Player.vue
+++ b/front/src/components/audio/Player.vue
@@ -14,7 +14,7 @@
       <div v-if="currentTrack" class="track-area ui unstackable items">
         <div class="ui inverted item">
           <div class="ui tiny image">
-            <img ref="cover" @load="updateBackground" v-if="currentTrack.album.cover" :src="$store.getters['instance/absoluteUrl'](currentTrack.album.cover)">
+            <img ref="cover" @load="updateBackground" v-if="currentTrack.album.cover && currentTrack.album.cover.original" :src="$store.getters['instance/absoluteUrl'](currentTrack.album.cover.medium_square_crop)">
             <img v-else src="../../assets/audio/default-cover.png">
           </div>
           <div class="middle aligned content">
@@ -57,44 +57,60 @@
 
       <div class="two wide column controls ui grid">
         <div
-          :title="$t('Previous track')"
+          :title="labels.previousTrack"
           class="two wide column control"
           :disabled="emptyQueue">
-            <i @click="previous" :class="['ui', 'backward', {'disabled': emptyQueue}, 'big', 'icon']"></i>
+            <i @click="previous" :class="['ui', 'backward', {'disabled': emptyQueue}, 'secondary', 'icon']"></i>
         </div>
         <div
           v-if="!playing"
-          :title="$t('Play track')"
+          :title="labels.play"
           class="two wide column control">
-            <i @click="togglePlay" :class="['ui', 'play', {'disabled': !currentTrack}, 'big', 'icon']"></i>
+            <i @click="togglePlay" :class="['ui', 'play', {'disabled': !currentTrack}, 'secondary', 'icon']"></i>
         </div>
         <div
           v-else
-          :title="$t('Pause track')"
+          :title="labels.pause"
           class="two wide column control">
-            <i @click="togglePlay" :class="['ui', 'pause', {'disabled': !currentTrack}, 'big', 'icon']"></i>
+            <i @click="togglePlay" :class="['ui', 'pause', {'disabled': !currentTrack}, 'secondary', 'icon']"></i>
         </div>
         <div
-          :title="$t('Next track')"
+          :title="labels.next"
           class="two wide column control"
           :disabled="!hasNext">
-            <i @click="next" :class="['ui', {'disabled': !hasNext}, 'step', 'forward', 'big', 'icon']" ></i>
+            <i @click="next" :class="['ui', {'disabled': !hasNext}, 'step', 'forward', 'secondary', 'icon']" ></i>
         </div>
-        <div class="two wide column control volume-control">
-          <i :title="$t('Unmute')" @click="$store.commit('player/volume', 1)" v-if="volume === 0" class="volume off secondary icon"></i>
-          <i :title="$t('Mute')" @click="$store.commit('player/volume', 0)" v-else-if="volume < 0.5" class="volume down secondary icon"></i>
-          <i :title="$t('Mute')" @click="$store.commit('player/volume', 0)" v-else class="volume up secondary icon"></i>
-          <input type="range" step="0.05" min="0" max="1" v-model="sliderVolume" />
+        <div
+          class="wide column control volume-control"
+          v-on:mouseover="showVolume = true"
+          v-on:mouseleave="showVolume = false"
+          v-bind:class="{ active : showVolume }">
+          <i
+            :title="labels.unmute"
+            @click="$store.commit('player/volume', 1)" v-if="volume === 0" class="volume off secondary icon"></i>
+          <i
+            :title="labels.mute"
+            @click="$store.commit('player/volume', 0)" v-else-if="volume < 0.5" class="volume down secondary icon"></i>
+          <i
+            :title="labels.mute"
+            @click="$store.commit('player/volume', 0)" v-else class="volume up secondary icon"></i>
+          <input
+            type="range"
+            step="0.05"
+            min="0"
+            max="1"
+            v-model="sliderVolume"
+            v-if="showVolume" />
         </div>
-        <div class="two wide column control looping">
+        <div class="two wide column control looping" v-if="!showVolume">
           <i
-            :title="$t('Looping disabled. Click to switch to single-track looping.')"
+            :title="labels.loopingDisabled"
             v-if="looping === 0"
             @click="$store.commit('player/looping', 1)"
             :disabled="!currentTrack"
             :class="['ui', {'disabled': !currentTrack}, 'step', 'repeat', 'secondary', 'icon']"></i>
           <i
-            :title="$t('Looping on a single track. Click to switch to whole queue looping.')"
+            :title="labels.loopingSingle"
             v-if="looping === 1"
             @click="$store.commit('player/looping', 2)"
             :disabled="!currentTrack"
@@ -102,7 +118,7 @@
             <span class="ui circular tiny orange label">1</span>
           </i>
           <i
-            :title="$t('Looping on whole queue. Click to disable looping.')"
+            :title="labels.loopingWhole"
             v-if="looping === 2"
             @click="$store.commit('player/looping', 0)"
             :disabled="!currentTrack"
@@ -111,15 +127,17 @@
         </div>
         <div
           :disabled="queue.tracks.length === 0"
-          :title="$t('Shuffle your queue')"
+          :title="labels.shuffle"
+          v-if="!showVolume"
           class="two wide column control">
-          <div v-if="isShuffling" class="ui inline shuffling inverted small active loader"></div>
+          <div v-if="isShuffling" class="ui inline shuffling inverted tiny active loader"></div>
           <i v-else @click="shuffle()" :class="['ui', 'random', 'secondary', {'disabled': queue.tracks.length === 0}, 'icon']" ></i>
         </div>
-        <div class="one wide column"></div>
+        <div class="one wide column" v-if="!showVolume"></div>
         <div
           :disabled="queue.tracks.length === 0"
-          :title="$t('Clear your queue')"
+          :title="labels.clear"
+          v-if="!showVolume"
           class="two wide column control">
           <i @click="clean()" :class="['ui', 'trash', 'secondary', {'disabled': queue.tracks.length === 0}, 'icon']" ></i>
         </div>
@@ -162,6 +180,7 @@ export default {
       renderAudio: true,
       sliderVolume: this.volume,
       defaultAmbiantColors: defaultAmbiantColors,
+      showVolume: false,
       ambiantColors: defaultAmbiantColors
     }
   },
@@ -176,16 +195,18 @@ export default {
       updateProgress: 'player/updateProgress'
     }),
     shuffle () {
-      if (this.isShuffling) {
+      let disabled = this.queue.tracks.length === 0
+      if (this.isShuffling || disabled) {
         return
       }
       let self = this
+      let msg = this.$gettext('Queue shuffled!')
       this.isShuffling = true
       setTimeout(() => {
         self.$store.dispatch('queue/shuffle', () => {
           self.isShuffling = false
           self.$store.commit('ui/addMessage', {
-            content: self.$t('Queue shuffled!'),
+            content: msg,
             date: new Date()
           })
         })
@@ -235,6 +256,32 @@ export default {
       currentTimeFormatted: 'player/currentTimeFormatted',
       progress: 'player/progress'
     }),
+    labels () {
+      let previousTrack = this.$gettext('Previous track')
+      let play = this.$gettext('Play track')
+      let pause = this.$gettext('Pause track')
+      let next = this.$gettext('Next track')
+      let unmute = this.$gettext('Unmute')
+      let mute = this.$gettext('Mute')
+      let loopingDisabled = this.$gettext('Looping disabled. Click to switch to single-track looping.')
+      let loopingSingle = this.$gettext('Looping on a single track. Click to switch to whole queue looping.')
+      let loopingWhole = this.$gettext('Looping on whole queue. Click to disable looping.')
+      let shuffle = this.$gettext('Shuffle your queue')
+      let clear = this.$gettext('Clear your queue')
+      return {
+        previousTrack,
+        play,
+        pause,
+        next,
+        unmute,
+        mute,
+        loopingDisabled,
+        loopingSingle,
+        loopingWhole,
+        shuffle,
+        clear
+      }
+    },
     style: function () {
       let style = {
         'background': this.ambiantGradiant
@@ -337,16 +384,16 @@ export default {
 }
 .volume-control {
   position: relative;
+  width: 12.5% !important;
   .icon {
     // margin: 0;
   }
   [type="range"] {
-    max-width: 100%;
+    max-width: 70%;
     position: absolute;
-    bottom: 5px;
-    left: 10%;
+    bottom: 1.1rem;
+    left: 25%;
     cursor: pointer;
-    display: none;
   }
   input[type=range] {
     -webkit-appearance: none;
@@ -357,22 +404,32 @@ export default {
   input[type=range]::-webkit-slider-runnable-track {
     cursor: pointer;
     background: white;
+    opacity: 0.3;
   }
   input[type=range]::-webkit-slider-thumb {
     background: white;
     cursor: pointer;
     -webkit-appearance: none;
+    border-radius: 3px;
+    width: 10px;
   }
   input[type=range]:focus::-webkit-slider-runnable-track {
     background: #white;
+    opacity: 0.3;
   }
   input[type=range]::-moz-range-track {
     cursor: pointer;
     background: white;
+    opacity: 0.3;
+  }
+  input[type=range]::-moz-focus-outer {
+    border: 0;
   }
   input[type=range]::-moz-range-thumb {
     background: white;
     cursor: pointer;
+    border-radius: 3px;
+    width: 10px;
   }
   input[type=range]::-ms-track {
     cursor: pointer;
@@ -382,13 +439,17 @@ export default {
   }
   input[type=range]::-ms-fill-lower {
     background: white;
+    opacity: 0.3;
   }
   input[type=range]::-ms-fill-upper {
     background: white;
+    opacity: 0.3;
   }
   input[type=range]::-ms-thumb {
     background: white;
     cursor: pointer;
+    border-radius: 3px;
+    width: 10px;
   }
   input[type=range]:focus::-ms-fill-lower {
     background: white;
@@ -396,11 +457,10 @@ export default {
   input[type=range]:focus::-ms-fill-upper {
     background: #white;
   }
-  &:hover {
-    [type="range"] {
-      display: block;
-    }
-  }
+}
+
+.active.volume-control {
+  width: 60% !important;
 }
 
 .looping.control {
diff --git a/front/src/components/audio/Search.vue b/front/src/components/audio/Search.vue
index 9cfea3bc0cae5da768bbf1dbefe7e12b405f508c..06ae2c1cc7636020b3cd6710b2c3c8c81e56b9c4 100644
--- a/front/src/components/audio/Search.vue
+++ b/front/src/components/audio/Search.vue
@@ -1,29 +1,29 @@
 <template>
   <div>
-    <h2><i18next path="Search for some music"/></h2>
+    <h2><translate>Search for some music</translate></h2>
     <div :class="['ui', {'loading': isLoading }, 'search']">
       <div class="ui icon big input">
         <i class="search icon"></i>
-        <input ref="search" class="prompt" placeholder="Artist, album, track..." v-model.trim="query" type="text" />
+        <input ref="search" class="prompt" :placeholder="labels.searchPlaceholder" v-model.trim="query" type="text" />
       </div>
     </div>
     <template v-if="query.length > 0">
-      <h3 class="ui title"><i18next path="Artists"/></h3>
+      <h3 class="ui title"><translate>Artists</translate></h3>
       <div v-if="results.artists.length > 0" class="ui stackable three column grid">
         <div class="column" :key="artist.id" v-for="artist in results.artists">
           <artist-card class="fluid" :artist="artist" ></artist-card>
         </div>
       </div>
-      <p v-else><i18next path="Sorry, we did not found any artist matching your query"/></p>
+      <p v-else><translate>Sorry, we did not found any artist matching your query</translate></p>
     </template>
     <template v-if="query.length > 0">
-      <h3 class="ui title"><i18next path="Albums"/></h3>
+      <h3 class="ui title"><translate>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><i18next path="Sorry, we did not found any album matching your query"/></p>
+      <p v-else><translate>Sorry, we did not found any album matching your query</translate></p>
     </template>
   </div>
 </template>
@@ -59,6 +59,13 @@ export default {
     }
     this.search()
   },
+  computed: {
+    labels () {
+      return {
+        searchPlaceholder: this.$gettext('Artist, album, track...')
+      }
+    }
+  },
   methods: {
     search: _.debounce(function () {
       if (this.query.length < 1) {
diff --git a/front/src/components/audio/SearchBar.vue b/front/src/components/audio/SearchBar.vue
index d5cb39e3232fd83c1c807d457fecf78249e7951d..024a36906875791233438dc6a19e826798907f1f 100644
--- a/front/src/components/audio/SearchBar.vue
+++ b/front/src/components/audio/SearchBar.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="ui fluid category search">
     <slot></slot><div class="ui icon input">
-      <input class="prompt" placeholder="Search for artists, albums, tracks..." type="text">
+      <input class="prompt" :placeholder="labels.placeholder" type="text">
       <i class="search icon"></i>
     </div>
     <div class="results"></div>
@@ -14,7 +14,17 @@ import jQuery from 'jquery'
 import router from '@/router'
 
 export default {
+  computed: {
+    labels () {
+      return {
+        placeholder: this.$gettext('Search for artists, albums, tracks...')
+      }
+    }
+  },
   mounted () {
+    let artistLabel = this.$gettext('Artist')
+    let albumLabel = this.$gettext('Album')
+    let trackLabel = this.$gettext('Track')
     let self = this
     jQuery(this.$el).search({
       type: 'category',
@@ -39,7 +49,7 @@ export default {
             {
               code: 'artists',
               route: 'library.artists.detail',
-              name: 'Artist',
+              name: artistLabel,
               getTitle (r) {
                 return r.name
               },
@@ -50,7 +60,7 @@ export default {
             {
               code: 'albums',
               route: 'library.albums.detail',
-              name: 'Album',
+              name: albumLabel,
               getTitle (r) {
                 return r.title
               },
@@ -61,7 +71,7 @@ export default {
             {
               code: 'tracks',
               route: 'library.tracks.detail',
-              name: 'Track',
+              name: trackLabel,
               getTitle (r) {
                 return r.title
               },
diff --git a/front/src/components/audio/album/Card.vue b/front/src/components/audio/album/Card.vue
index 3782771803edce6432a125957e9d10346b073fbd..0c5a7c8032aea8e2c501b7005ce78950874c81ab 100644
--- a/front/src/components/audio/album/Card.vue
+++ b/front/src/components/audio/album/Card.vue
@@ -2,7 +2,7 @@
     <div class="ui card">
       <div class="content">
         <div class="right floated tiny ui image">
-          <img v-if="album.cover" v-lazy="$store.getters['instance/absoluteUrl'](album.cover)">
+          <img v-if="album.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](album.cover.square_crop)">
           <img v-else src="../../../assets/audio/default-cover.png">
         </div>
         <div class="header">
@@ -10,10 +10,9 @@
         </div>
         <div class="meta">
           <span>
-            <i18next path="By {%0%}">
-              <router-link tag="span" :to="{name: 'library.artists.detail', params: {id: album.artist.id }}">
-              {{ album.artist.name }}</router-link>
-            </i18next>
+            <router-link tag="span" :to="{name: 'library.artists.detail', params: {id: album.artist.id }}">
+              <translate :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>
         <div class="description" v-if="mode === 'rich'">
@@ -39,23 +38,21 @@
           </table>
           <div class="center aligned segment" v-if="album.tracks.length > initialTracks">
             <em v-if="!showAllTracks" @click="showAllTracks = true" class="expand">
-              <i18next path="Show {%0%} more tracks">{{ album.tracks.length - initialTracks }}</i18next>
+              <translate :translate-params="{count: album.tracks.length - initialTracks}" :translate-n="album.tracks.length - initialTracks" translate-plural="Show %{ count } more tracks">Show 1 more track</translate>
             </em>
             <em v-else @click="showAllTracks = false" class="expand">
-              <i18next path="Collapse" />
+              <translate>Collapse</translate>
             </em>
           </div>
         </div>
       </div>
       <div class="extra content">
         <play-button class="mini basic orange right floated" :tracks="album.tracks">
-          <i18next path="Play all"/>
+          <translate>Play all</translate>
         </play-button>
         <span>
           <i class="music icon"></i>
-          <i18next path="{%0%} tracks">
-            {{ album.tracks.length }}
-          </i18next>
+          <translate :translate-params="{count: album.tracks.length}" :translate-n="album.tracks.length" translate-plural="%{ count } tracks">1 track</translate>
         </span>
       </div>
     </div>
diff --git a/front/src/components/audio/album/Widget.vue b/front/src/components/audio/album/Widget.vue
new file mode 100644
index 0000000000000000000000000000000000000000..fa71808b3756b450d7d383c0e922b9410af245a3
--- /dev/null
+++ b/front/src/components/audio/album/Widget.vue
@@ -0,0 +1,134 @@
+<template>
+  <div>
+    <h3 class="ui header">
+      <slot name="title"></slot>
+    </h3>
+    <i @click="fetchData(previousPage)" :disabled="!previousPage" :class="['ui', {disabled: !previousPage}, 'circular', 'medium', 'angle left', 'icon']">
+    </i>
+    <i @click="fetchData(nextPage)" :disabled="!nextPage" :class="['ui', {disabled: !nextPage}, 'circular', 'medium', 'angle right', 'icon']">
+    </i>
+    <div class="ui hidden divider"></div>
+    <div class="ui five cards">
+      <div v-if="isLoading" class="ui inverted active dimmer">
+        <div class="ui loader"></div>
+      </div>
+      <div class="card" v-for="album in albums" :key="album.id">
+        <div :class="['ui', 'image', 'with-overlay', {'default-cover': !album.cover.original}]" :style="getImageStyle(album)">
+          <play-button class="play-overlay" :icon-only="true" :button-classes="['ui', 'circular', 'large', 'orange', 'icon', 'button']" :album="album.id"></play-button>
+        </div>
+        <div class="content">
+          <router-link :title="album.title" :to="{name: 'library.albums.detail', params: {id: album.id}}">
+            {{ album.title|truncate(25) }}
+          </router-link>
+          <div class="description">
+            <span>
+              <router-link :title="album.artist.name" class="discrete link" :to="{name: 'library.artists.detail', params: {id: album.artist.id}}">
+                {{ album.artist.name|truncate(23) }}
+              </router-link>
+            </span>
+          </div>
+        </div>
+        <div class="extra content">
+          <human-date class="left floated" :date="album.creation_date"></human-date>
+          <play-button class="right floated basic icon" :dropdown-only="true" :dropdown-icon-classes="['ellipsis', 'horizontal', 'large', 'grey']" :album="album.id"></play-button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import _ from 'lodash'
+import axios from 'axios'
+import PlayButton from '@/components/audio/PlayButton'
+
+export default {
+  props: {
+    filters: {type: Object, required: true}
+  },
+  components: {
+    PlayButton
+  },
+  data () {
+    return {
+      albums: [],
+      limit: 12,
+      isLoading: false,
+      errors: null,
+      previousPage: null,
+      nextPage: null
+    }
+  },
+  created () {
+    this.fetchData('albums/')
+  },
+  methods: {
+    fetchData (url) {
+      if (!url) {
+        return
+      }
+      this.isLoading = true
+      let self = this
+      let params = _.clone(this.filters)
+      params.page_size = this.limit
+      params.offset = this.offset
+      axios.get(url, {params: params}).then((response) => {
+        self.previousPage = response.data.previous
+        self.nextPage = response.data.next
+        self.isLoading = false
+        self.albums = response.data.results
+      }, error => {
+        self.isLoading = false
+        self.errors = error.backendErrors
+      })
+    },
+    updateOffset (increment) {
+      if (increment) {
+        this.offset += this.limit
+      } else {
+        this.offset = Math.max(this.offset - this.limit, 0)
+      }
+    },
+    getImageStyle (album) {
+      let url = '../../../assets/audio/default-cover.png'
+
+      if (album.cover.original) {
+        url = this.$store.getters['instance/absoluteUrl'](album.cover.medium_square_crop)
+      } else {
+        return {}
+      }
+      return {
+        'background-image': `url("${url}")`
+      }
+    }
+  },
+  watch: {
+    offset () {
+      this.fetchData()
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+@import '../../../style/vendor/media';
+
+.default-cover {
+  background-image: url('../../../assets/audio/default-cover.png') !important;
+}
+
+.ui.cards {
+  justify-content: center;
+}
+.ui.cards > .card {
+  width: 15em;
+}
+.with-overlay {
+  background-size: cover !important;
+  background-position: center !important;
+  height: 15em;
+  width: 15em;
+  display: flex !important;
+  justify-content: center !important;
+  align-items: center !important;
+}
+</style>
diff --git a/front/src/components/audio/artist/Card.vue b/front/src/components/audio/artist/Card.vue
index b19c5e12d727b6a32c6a57c04e9dab4b0b9c3134..dd32b4735310d46de665da5aa0da6cf75af7a113 100644
--- a/front/src/components/audio/artist/Card.vue
+++ b/front/src/components/audio/artist/Card.vue
@@ -11,7 +11,7 @@
             <tbody>
               <tr v-for="album in albums">
                 <td>
-                  <img class="ui mini image" v-if="album.cover" :src="$store.getters['instance/absoluteUrl'](album.cover)">
+                  <img class="ui mini image" v-if="album.cover.original" :src="$store.getters['instance/absoluteUrl'](album.cover.small_square_crop)">
                   <img class="ui mini image" v-else src="../../../assets/audio/default-cover.png">
                 </td>
                 <td colspan="4">
@@ -28,12 +28,10 @@
           </table>
           <div class="center aligned segment" v-if="artist.albums.length > initialAlbums">
             <em v-if="!showAllAlbums" @click="showAllAlbums = true" class="expand">
-              <i18next path="Show {%0%} more albums">
-                {{ artist.albums.length - initialAlbums }}
-              </i18next>
+              <translate :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">
-              <i18next path="Collapse"/>
+              <translate>Collapse</translate>
             </em>
           </div>
         </div>
@@ -41,12 +39,10 @@
     <div class="extra content">
         <span>
           <i class="sound icon"></i>
-          <i18next path="{%0%} albums">
-            {{ artist.albums.length }}
-          </i18next>
+            <translate :translate-params="{count: artist.albums.length}" :translate-n="artist.albums.length" translate-plural="%{ count } albums">1 album</translate>
         </span>
         <play-button class="mini basic orange right floated" :artist="artist.id">
-          <i18next path="Play all"/>
+          <translate>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 bd3ceb2aaa869350fa013ca36c709f16cc97cdbc..cf79267cfddf250206b4a8e8ec520528ba7ff0ed 100644
--- a/front/src/components/audio/track/Row.vue
+++ b/front/src/components/audio/track/Row.vue
@@ -4,8 +4,8 @@
       <play-button class="basic icon" :discrete="true" :track="track"></play-button>
     </td>
     <td>
-      <img class="ui mini image" v-if="track.album.cover" v-lazy="$store.getters['instance/absoluteUrl'](track.album.cover)">
-      <img class="ui mini image" v-else src="../../..//assets/audio/default-cover.png">
+      <img class="ui mini image" v-if="track.album.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](track.album.cover.small_square_crop)">
+      <img class="ui mini image" v-else src="../../../assets/audio/default-cover.png">
     </td>
     <td colspan="6">
       <router-link class="track" :to="{name: 'library.tracks.detail', params: {id: track.id }}">
@@ -16,9 +16,18 @@
       </router-link>
     </td>
     <td colspan="6">
-      <router-link class="artist discrete link" :to="{name: 'library.artists.detail', params: {id: track.artist.id }}">
+      <router-link v-if="track.artist.id === albumArtist.id" class="artist discrete link" :to="{name: 'library.artists.detail', params: {id: track.artist.id }}">
         {{ track.artist.name }}
       </router-link>
+      <template v-else>
+        <router-link class="artist discrete link" :to="{name: 'library.artists.detail', params: {id: albumArtist.id }}">
+          {{ albumArtist.name }}
+        </router-link>
+         /
+         <router-link class="artist discrete link" :to="{name: 'library.artists.detail', params: {id: track.artist.id }}">
+          {{ track.artist.name }}
+        </router-link>
+      </template>
     </td>
     <td colspan="6">
       <router-link class="album discrete link" :to="{name: 'library.albums.detail', params: {id: track.album.id }}">
@@ -35,8 +44,6 @@
 </template>
 
 <script>
-import backend from '@/audio/backend'
-
 import TrackFavoriteIcon from '@/components/favorites/TrackFavoriteIcon'
 import TrackPlaylistIcon from '@/components/playlists/TrackPlaylistIcon'
 import PlayButton from '@/components/audio/PlayButton'
@@ -44,6 +51,7 @@ import PlayButton from '@/components/audio/PlayButton'
 export default {
   props: {
     track: {type: Object, required: true},
+    artist: {type: Object, required: false},
     displayPosition: {type: Boolean, default: false}
   },
   components: {
@@ -51,9 +59,13 @@ export default {
     TrackPlaylistIcon,
     PlayButton
   },
-  data () {
-    return {
-      backend: backend
+  computed: {
+    albumArtist () {
+      if (this.artist) {
+        return this.artist
+      } else {
+        return this.track.album.artist
+      }
     }
   }
 }
diff --git a/front/src/components/audio/track/Table.vue b/front/src/components/audio/track/Table.vue
index 81869ff564af2f8b5ee5260535b7fda5f95f924e..03e9398f8a6b9ff9518bd9874db331bc5fabee6c 100644
--- a/front/src/components/audio/track/Table.vue
+++ b/front/src/components/audio/track/Table.vue
@@ -4,9 +4,9 @@
       <tr>
         <th></th>
         <th></th>
-        <i18next tag="th" colspan="6" path="Title"/>
-        <i18next tag="th" colspan="6" path="Artist"/>
-        <i18next tag="th" colspan="6" path="Album"/>
+        <th colspan="6"><translate>Title</translate></th>
+        <th colspan="6"><translate>Artist</translate></th>
+        <th colspan="6"><translate>Album</translate></th>
         <th></th>
       </tr>
     </thead>
@@ -14,6 +14,7 @@
       <track-row
         :display-position="displayPosition"
         :track="track"
+        :artist="artist"
         :key="index + '-' + track.id"
         v-for="(track, index) in tracks"></track-row>
     </tbody>
@@ -21,17 +22,17 @@
       <tr>
         <th colspan="3">
           <button @click="showDownloadModal = !showDownloadModal" class="ui basic button">
-            <i18next path="Download..."/>
+             <translate>Download</translate>
           </button>
           <modal :show.sync="showDownloadModal">
-            <i18next tag="div" path="Download tracks" class="header" />
+            <div class="header"><translate>Download tracks</translate></div>
             <div class="content">
               <div class="description">
-                <i18next tag="p" path="There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as {%0%} to easily download a list of tracks.">
-                  <a href="https://curl.haxx.se/" target="_blank">cURL</a>
-                </i18next>
-                <i18next path="Simply copy paste the snippet below into a terminal to launch the download."/>
-                <i18next tag="div" class="ui warning message" path="Keep your PRIVATE_TOKEN secret as it gives access to your account."/>
+                <p><translate>There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as cURL to easily download a list of tracks.</translate></p>
+                 <translate>Simply copy paste the snippet below into a terminal to launch the download.</translate>
+                <div class="ui warning message">
+                   <translate>Keep your PRIVATE_TOKEN secret as it gives access to your account.</translate>
+                </div>
                 <pre>
 export PRIVATE_TOKEN="{{ $store.state.auth.token }}"
 <template v-for="track in tracks"><template v-if="track.files.length > 0">
@@ -40,7 +41,7 @@ curl -G -o "{{ track.files[0].filename }}" <template v-if="$store.state.auth.aut
               </div>
             </div>
             <div class="actions">
-              <i18next tag="div" class="ui black deny button" path="Cancel" />
+              <div class="ui black deny button"><translate>Cancel</translate></div>
             </div>
           </modal>
         </th>
@@ -63,6 +64,7 @@ import Modal from '@/components/semantic/Modal'
 export default {
   props: {
     tracks: {type: Array, required: true},
+    artist: {type: Object, required: false},
     displayPosition: {type: Boolean, default: false}
   },
   components: {
diff --git a/front/src/components/audio/track/Widget.vue b/front/src/components/audio/track/Widget.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ca3ae2424b10da96de75216ced1d5ab1654ebd6c
--- /dev/null
+++ b/front/src/components/audio/track/Widget.vue
@@ -0,0 +1,129 @@
+<template>
+  <div>
+    <h3 class="ui header">
+      <slot name="title"></slot>
+    </h3>
+    <i @click="fetchData(previousPage)" :disabled="!previousPage" :class="['ui', {disabled: !previousPage}, 'circular', 'medium', 'angle up', 'icon']">
+    </i>
+    <i @click="fetchData(nextPage)" :disabled="!nextPage" :class="['ui', {disabled: !nextPage}, 'circular', 'medium', 'angle down', 'icon']">
+    </i>
+    <i @click="fetchData(url)" :class="['ui', 'circular', 'medium', 'refresh', 'icon']">
+    </i>
+    <div class="ui divided unstackable items">
+      <div v-if="isLoading" class="ui inverted active dimmer">
+        <div class="ui loader"></div>
+      </div>
+      <div class="item" v-for="object in objects" :key="object.id">
+        <div class="ui tiny image">
+          <img v-if="object.track.album.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](object.track.album.cover.medium_square_crop)">
+          <img v-else src="../../../assets/audio/default-cover.png">
+          <play-button class="play-overlay" :icon-only="true" :button-classes="['ui', 'circular', 'tiny', 'orange', 'icon', 'button']" :track="object.track"></play-button>
+        </div>
+        <div class="middle aligned content">
+          <div class="ui unstackable grid">
+            <div class="thirteen wide stretched column">
+              <div>
+                <router-link :title="object.track.title" :to="{name: 'library.tracks.detail', params: {id: object.track.id}}">
+                  {{ object.track.title|truncate(25) }}
+                </router-link>
+              </div>
+              <div class="meta">
+                <span>
+                  <router-link :title="object.track.artist.name" class="discrete link" :to="{name: 'library.artists.detail', params: {id: object.track.artist.id}}">
+                    {{ object.track.artist.name|truncate(25) }}
+                  </router-link>
+                </span>
+              </div>
+              <div class="extra">
+                <span class="left floated">@{{ object.user.username }}</span>
+                <span class="right floated"><human-date :date="object.creation_date" /></span>
+              </div>
+            </div>
+            <div class="one wide stretched column">
+              <play-button class="basic icon" :dropdown-only="true" :dropdown-icon-classes="['ellipsis', 'vertical', 'large', 'grey']" :track="object.track"></play-button>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import _ from 'lodash'
+import axios from 'axios'
+import PlayButton from '@/components/audio/PlayButton'
+
+export default {
+  props: {
+    filters: {type: Object, required: true},
+    url: {type: String, required: true}
+  },
+  components: {
+    PlayButton
+  },
+  data () {
+    return {
+      objects: [],
+      limit: 5,
+      isLoading: false,
+      errors: null,
+      previousPage: null,
+      nextPage: null
+    }
+  },
+  created () {
+    this.fetchData(this.url)
+  },
+  methods: {
+    fetchData (url) {
+      if (!url) {
+        return
+      }
+      this.isLoading = true
+      let self = this
+      let params = _.clone(this.filters)
+      params.page_size = this.limit
+      params.offset = this.offset
+      axios.get(url, {params: params}).then((response) => {
+        self.previousPage = response.data.previous
+        self.nextPage = response.data.next
+        self.isLoading = false
+        self.objects = response.data.results
+      }, error => {
+        self.isLoading = false
+        self.errors = error.backendErrors
+      })
+    },
+    updateOffset (increment) {
+      if (increment) {
+        this.offset += this.limit
+      } else {
+        this.offset = Math.max(this.offset - this.limit, 0)
+      }
+    }
+  },
+  watch: {
+    offset () {
+      this.fetchData()
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+@import '../../../style/vendor/media';
+
+.play-overlay {
+  position: absolute;
+  top: 4em;
+  left: 4em;
+  @include media(">tablet") {
+    top: 2.5em;
+    left: 2.5em;
+  }
+}
+.refresh.icon {
+  float: right;
+}
+</style>
diff --git a/front/src/components/auth/Login.vue b/front/src/components/auth/Login.vue
index 8286860bcaa051fdf2ee844dc878805c3402dcfd..88caa5afefccf12b0ac115613f45f94dec9046af 100644
--- a/front/src/components/auth/Login.vue
+++ b/front/src/components/auth/Login.vue
@@ -1,21 +1,21 @@
 <template>
-  <div class="main pusher" v-title="'Log In'">
+  <div class="main pusher" v-title="labels.title">
     <div class="ui vertical stripe segment">
       <div class="ui small text container">
-        <h2><i18next path="Log in to your Funkwhale account"/></h2>
+        <h2><translate>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"><i18next path="We cannot log you in"/></div>
+            <div class="header"><translate>We cannot log you in</translate></div>
             <ul class="list">
-              <i18next tag="li" v-if="error == 'invalid_credentials'" path="Please double-check your username/password couple is correct"/>
-              <i18next tag="li" v-else path="An unknown error happend, this can mean the server is down or cannot be reached"/>
+              <li v-if="error == 'invalid_credentials'"><translate>Please double-check your username/password couple is correct</translate></li>
+              <li v-else><translate>An unknown error happend, this can mean the server is down or cannot be reached</translate></li>
             </ul>
           </div>
           <div class="field">
             <label>
-              {{ $t('Username or email') }} |
+              <translate>Username or email</translate> |
               <router-link :to="{path: '/signup'}">
-                {{ $t('Create an account') }}
+                <translate>Create an account</translate>
               </router-link>
             </label>
             <input
@@ -24,21 +24,23 @@
             required
             type="text"
             autofocus
-            placeholder="Enter your username or email"
+            :placeholder="labels.usernamePlaceholder"
             v-model="credentials.username"
             >
           </div>
           <div class="field">
             <label>
-              {{ $t('Password') }} |
+              <translate>Password</translate> |
               <router-link :to="{name: 'auth.password-reset', query: {email: credentials.username}}">
-                {{ $t('Reset your password') }}
+                <translate>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"><i18next path="Login"/></button>
+          <button tabindex="3" :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit">
+             <translate>Login</translate>
+          </button>
         </form>
       </div>
     </div>
@@ -70,6 +72,16 @@ export default {
   mounted () {
     this.$refs.username.focus()
   },
+  computed: {
+    labels () {
+      let usernamePlaceholder = this.$gettext('Enter your username or email')
+      let title = this.$gettext('Log In')
+      return {
+        usernamePlaceholder,
+        title
+      }
+    }
+  },
   methods: {
     submit () {
       var self = this
diff --git a/front/src/components/auth/Logout.vue b/front/src/components/auth/Logout.vue
index f5a994e73ff71d96a77fb5bf2fa1b96da8ec7466..5f60a9dbeb8aaee8554dbb5f9d08402a4ba322da 100644
--- a/front/src/components/auth/Logout.vue
+++ b/front/src/components/auth/Logout.vue
@@ -1,11 +1,12 @@
 <template>
-  <div class="main pusher" v-title="'Log Out'">
+  <div class="main pusher" v-title="labels.title">
     <div class="ui vertical stripe segment">
       <div class="ui small text container">
-        <h2><i18next path="Are you sure you want to log out?"/></h2>
-        <i18next tag="p" path="You are currently logged in as {%0%}">{{ $store.state.auth.username }}</i18next>
-        <button class="ui button" @click="$store.dispatch('auth/logout')"><i18next path="Yes, log me out!"/></button>
-        </form>
+        <h2>
+          <translate>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>Yes, log me out!</translate></button>
       </div>
     </div>
   </div>
@@ -13,7 +14,13 @@
 
 <script>
 export default {
-  name: 'logout'
+  computed: {
+    labels () {
+      return {
+        title: this.$gettext('Log Out')
+      }
+    }
+  }
 }
 </script>
 
diff --git a/front/src/components/auth/Profile.vue b/front/src/components/auth/Profile.vue
index ab728c036beb8a29518bb1851a172ff38c1f62d0..23af78c616a3be26a63919812c7067442c678041 100644
--- a/front/src/components/auth/Profile.vue
+++ b/front/src/components/auth/Profile.vue
@@ -1,25 +1,28 @@
 <template>
-  <div class="main pusher" v-title="username + '\'s Profile'">
+  <div class="main pusher" v-title="labels.usernameProfile">
     <div v-if="isLoading" class="ui vertical segment">
       <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
     </div>
-    <template v-if="$store.state.auth.profile">
+    <template v-if="profile">
       <div :class="['ui', 'head', 'vertical', 'center', 'aligned', 'stripe', 'segment']">
         <h2 class="ui center aligned icon header">
-          <i class="circular inverted user green icon"></i>
+          <i v-if="!profile.avatar.square_crop" class="circular inverted user green icon"></i>
+          <img class="ui big circular image" v-else :src="$store.getters['instance/absoluteUrl'](profile.avatar.square_crop)" />
           <div class="content">
-            {{ $store.state.auth.profile.username }}
-            <i18next class="sub header" path="Registered since {%0%}">{{ signupDate }}</i18next>
+            {{ profile.username }}
+            <div class="sub header" v-translate="{date: signupDate}">Registered since %{ date }</div>
           </div>
         </h2>
-        <div class="ui basic green label"><i18next path="This is you!"/></div>
-        <div v-if="$store.state.auth.profile.is_staff" class="ui yellow label">
+        <div class="ui basic green label">
+          <translate>This is you!</translate>
+        </div>
+        <div v-if="profile.is_staff" class="ui yellow label">
           <i class="star icon"></i>
-          <i18next path="Staff member"/>
+          <translate>Staff member</translate>
         </div>
         <router-link class="ui tiny basic button" :to="{path: '/settings'}">
-          <i class="setting icon"> </i>
-          <i18next path="Settings..."/>
+          <i class="setting icon"></i>
+          <translate>Settings...</translate>
         </router-link>
 
       </div>
@@ -28,21 +31,33 @@
 </template>
 
 <script>
+import {mapState} from 'vuex'
+
 const dateFormat = require('dateformat')
 
 export default {
-  name: 'login',
   props: ['username'],
   created () {
     this.$store.dispatch('auth/fetchProfile')
   },
   computed: {
+
+    ...mapState({
+      profile: state => state.auth.profile
+    }),
+    labels () {
+      let msg = this.$gettext('%{ username }\'s profile')
+      let usernameProfile = this.$gettextInterpolate(msg, {username: this.username})
+      return {
+        usernameProfile
+      }
+    },
     signupDate () {
-      let d = new Date(this.$store.state.auth.profile.date_joined)
+      let d = new Date(this.profile.date_joined)
       return dateFormat(d, 'longDate')
     },
     isLoading () {
-      return !this.$store.state.auth.profile
+      return !this.profile
     }
   }
 }
@@ -50,4 +65,7 @@ export default {
 
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style scoped>
+.ui.header > img.image {
+  width: 8em;
+}
 </style>
diff --git a/front/src/components/auth/Settings.vue b/front/src/components/auth/Settings.vue
index 5468358aeb438ff768dc9e66d1845c1ecdf5e34d..1e5a9ecedfc146e7d7c732e77a3c4f50ec54ca84 100644
--- a/front/src/components/auth/Settings.vue
+++ b/front/src/components/auth/Settings.vue
@@ -1,14 +1,18 @@
 <template>
-  <div class="main pusher" v-title="'Account Settings'">
+  <div class="main pusher" v-title="labels.title">
     <div class="ui vertical stripe segment">
       <div class="ui small text container">
-        <h2 class="ui header"><i18next path="Account settings"/></h2>
+        <h2 class="ui header">
+          <translate>Account settings</translate>
+        </h2>
         <form class="ui form" @submit.prevent="submitSettings()">
           <div v-if="settings.success" class="ui positive message">
-            <div class="header"><i18next path="Settings updated"/></div>
+            <div class="header">
+              <translate>Settings updated</translate>
+            </div>
           </div>
           <div v-if="settings.errors.length > 0" class="ui negative message">
-            <i18next tag="div" class="header" path="We cannot save your settings"/>
+            <div class="header"><translate>We cannot save your settings</translate></div>
             <ul class="list">
               <li v-for="error in settings.errors">{{ error }}</li>
             </ul>
@@ -20,46 +24,85 @@
               <option :value="c.value" v-for="c in f.choices">{{ c.label }}</option>
             </select>
           </div>
-          <button :class="['ui', {'loading': isLoading}, 'button']" type="submit"><i18next path="Update settings"/></button>
+          <button :class="['ui', {'loading': isLoading}, 'button']" type="submit">
+            <translate>Update settings</translate>
+          </button>
         </form>
       </div>
       <div class="ui hidden divider"></div>
       <div class="ui small text container">
-        <h2 class="ui header"><i18next path="Change my password"/></h2>
+        <h2 class="ui header">
+          <translate>Avatar</translate>
+        </h2>
+        <div class="ui form">
+          <div v-if="avatarErrors.length > 0" class="ui negative message">
+            <div class="header"><translate>We cannot save your avatar</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>Upload a new avatar</translate></h3>
+              <p><translate>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>Update avatar</translate>
+              </button>
+            </div>
+            <div class="ui six wide column">
+              <h3 class="ui header"><translate>Current avatar</translate></h3>
+              <img class="ui circular image" v-if="currentAvatar && currentAvatar.square_crop" :src="$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>Remove avatar</translate>
+              </button>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="ui hidden divider"></div>
+      <div class="ui small text container">
+        <h2 class="ui header">
+          <translate>Change my password</translate>
+        </h2>
         <div class="ui message">
-          {{ $t('Changing your password will also change your Subsonic API password if you have requested one.') }}
-          {{ $t('You will have to update your password on your clients that use this password.') }}
+          <translate>Changing your password will also change your Subsonic API password if you have requested one.</translate>
+          <translate>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"><i18next path="Cannot change your password"/></div>
+            <div class="header">
+              <translate>Cannot change your password</translate>
+            </div>
             <ul class="list">
-              <i18next tag="li" v-if="passwordError == 'invalid_credentials'" path="Please double-check your password is correct"/>
+              <li v-if="passwordError == 'invalid_credentials'"><translate>Please double-check your password is correct</translate></li>
             </ul>
           </div>
           <div class="field">
-            <label><i18next path="Old password"/></label>
+            <label><translate>Old password</translate></label>
             <password-input required v-model="old_password" />
 
           </div>
           <div class="field">
-            <label><i18next path="New password"/></label>
+            <label><translate>New password</translate></label>
             <password-input required v-model="new_password" />
           </div>
           <dangerous-button
             color="yellow"
             :class="['ui', {'loading': isLoading}, 'button']"
             :action="submitPassword">
-            {{ $t('Change password') }}
-            <p slot="modal-header">{{ $t('Change your password?') }}</p>
+            <translate>Change password</translate>
+            <p slot="modal-header"><translate>Change your password?</translate></p>
             <div slot="modal-content">
-              <p>{{ $t("Changing your password will have the following consequences") }}</p>
+              <p><translate>Changing your password will have the following consequences</translate></p>
               <ul>
-                <li>{{ $t('You will be logged out from this session and have to log out with the new one') }}</li>
-                <li>{{ $t('Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password') }}</li>
+                <li><translate>You will be logged out from this session and have to log in with the new one</translate></li>
+                <li><translate>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>
-            <p slot="modal-confirm">{{ $t('Disable access') }}</p>
+            <p slot="modal-confirm"><translate>Disable access</translate></p>
           </dangerous-button>
         </form>
         <div class="ui hidden divider" />
@@ -87,8 +130,12 @@ export default {
       // properties that will be used in it
       old_password: '',
       new_password: '',
+      currentAvatar: this.$store.state.auth.profile.avatar,
       passwordError: '',
       isLoading: false,
+      isLoadingAvatar: false,
+      avatarErrors: [],
+      avatar: null,
       settings: {
         success: false,
         errors: [],
@@ -137,6 +184,46 @@ export default {
         self.settings.errors = error.backendErrors
       })
     },
+    submitAvatar () {
+      this.isLoadingAvatar = true
+      this.avatarErrors = []
+      let self = this
+      this.avatar = this.$refs.avatar.files[0]
+      let formData = new FormData()
+      formData.append('avatar', this.avatar)
+      axios.patch(
+        `users/users/${this.$store.state.auth.username}/`,
+        formData,
+        {
+          headers: {
+            'Content-Type': 'multipart/form-data'
+          }
+        }
+      ).then(response => {
+        this.isLoadingAvatar = false
+        self.currentAvatar = response.data.avatar
+        self.$store.commit('auth/avatar', self.currentAvatar)
+      }, error => {
+        self.isLoadingAvatar = false
+        self.avatarErrors = error.backendErrors
+      })
+    },
+    removeAvatar () {
+      this.isLoadingAvatar = true
+      let self = this
+      this.avatar = null
+      axios.patch(
+        `users/users/${this.$store.state.auth.username}/`,
+        {avatar: null}
+      ).then(response => {
+        this.isLoadingAvatar = false
+        self.currentAvatar = {}
+        self.$store.commit('auth/avatar', self.currentAvatar)
+      }, error => {
+        self.isLoadingAvatar = false
+        self.avatarErrors = error.backendErrors
+      })
+    },
     submitPassword () {
       var self = this
       self.isLoading = true
@@ -165,6 +252,11 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        title: this.$gettext('Account Settings')
+      }
+    },
     orderedSettingsFields () {
       let self = this
       return this.settings.order.map(id => {
diff --git a/front/src/components/auth/Signup.vue b/front/src/components/auth/Signup.vue
index e4e5cebbce950b7470204f710e06ffe01e7632e7..8d2e80470b63d1a651e383bcf546825a1f01cacb 100644
--- a/front/src/components/auth/Signup.vue
+++ b/front/src/components/auth/Signup.vue
@@ -1,55 +1,55 @@
 <template>
-  <div class="main pusher" v-title="'Sign Up'">
+  <div class="main pusher" v-title="labels.title">
     <div class="ui vertical stripe segment">
       <div class="ui small text container">
-        <h2>{{ $t("Create a funkwhale account") }}</h2>
+        <h2><translate>Create a funkwhale account</translate></h2>
         <form
           :class="['ui', {'loading': isLoadingInstanceSetting}, 'form']"
           @submit.prevent="submit()">
           <p class="ui message" v-if="!$store.state.instance.settings.users.registration_enabled.value">
-            {{ $t('Registration are closed on this instance, you will need an invitation code to signup.') }}
+            <translate>Registration are closed on this instance, you will need an invitation code to signup.</translate>
           </p>
 
           <div v-if="errors.length > 0" class="ui negative message">
-            <div class="header">{{ $t("We cannot create your account") }}</div>
+            <div class="header"><translate>We cannot create your account</translate></div>
             <ul class="list">
               <li v-for="error in errors">{{ error }}</li>
             </ul>
           </div>
           <div class="field">
-            <label>{{ $t("Username") }}</label>
+            <label><translate>Username</translate></label>
             <input
             ref="username"
             required
             type="text"
             autofocus
-            placeholder="Enter your username"
+            :placeholder="labels.usernamePlaceholder"
             v-model="username">
           </div>
           <div class="field">
-            <label>{{ $t("Email") }}</label>
+            <label><translate>Email</translate></label>
             <input
             ref="email"
             required
             type="email"
-            placeholder="Enter your email"
+            :placeholder="labels.emailPlaceholder"
             v-model="email">
           </div>
           <div class="field">
-            <label>{{ $t("Password") }}</label>
+            <label><translate>Password</translate></label>
             <password-input v-model="password" />
           </div>
           <div class="field">
-            <label v-if="!$store.state.instance.settings.users.registration_enabled.value">{{ $t("Invitation code") }}</label>
-            <label v-else>{{ $t("Invitation code (optional)") }}</label>
+            <label v-if="!$store.state.instance.settings.users.registration_enabled.value"><translate>Invitation code</translate></label>
+            <label v-else><translate>Invitation code (optional)</translate></label>
             <input
             :required="!$store.state.instance.settings.users.registration_enabled.value"
             type="text"
-            :placeholder="$t('Enter your invitation code (case insensitive)')"
+            :placeholder="labels.placeholder"
             v-model="invitation">
           </div>
           <button :class="['ui', 'green', {'loading': isLoading}, 'button']" type="submit">
-            {{ $t("Create my account") }}
+            <translate>Create my account</translate>
           </button>
         </form>
       </div>
@@ -65,7 +65,7 @@ import PasswordInput from '@/components/forms/PasswordInput'
 
 export default {
   props: {
-    invitation: {type: String, required: false, default: null},
+    defaultInvitation: {type: String, required: false, default: null},
     next: {type: String, default: '/'}
   },
   components: {
@@ -78,7 +78,8 @@ export default {
       password: '',
       isLoadingInstanceSetting: true,
       errors: [],
-      isLoading: false
+      isLoading: false,
+      invitation: this.defaultInvitation
     }
   },
   created () {
@@ -89,6 +90,20 @@ export default {
       }
     })
   },
+  computed: {
+    labels () {
+      let title = this.$gettext('Sign Up')
+      let placeholder = this.$gettext('Enter your invitation code (case insensitive)')
+      let usernamePlaceholder = this.$gettext('Enter your username')
+      let emailPlaceholder = this.$gettext('Enter your email')
+      return {
+        title,
+        usernamePlaceholder,
+        emailPlaceholder,
+        placeholder
+      }
+    }
+  },
   methods: {
     submit () {
       var self = this
diff --git a/front/src/components/auth/SubsonicTokenForm.vue b/front/src/components/auth/SubsonicTokenForm.vue
index 1fa4b5d1de90be9430ff4e81923b8f11d3184220..c5e6783deeeb305b5f5e60f0757219f456b55740 100644
--- a/front/src/components/auth/SubsonicTokenForm.vue
+++ b/front/src/components/auth/SubsonicTokenForm.vue
@@ -1,24 +1,24 @@
 <template>
   <form class="ui form" @submit.prevent="requestNewToken()">
-    <h2>{{ $t('Subsonic API password') }}</h2>
+    <h2><translate>Subsonic API password</translate></h2>
     <p class="ui message" v-if="!subsonicEnabled">
-      {{ $t('The Subsonic API is not available on this Funkwhale instance.') }}
+      <translate>The Subsonic API is not available on this Funkwhale instance.</translate>
     </p>
     <p>
-      {{ $t('Funkwhale is compatible with other music players that support the Subsonic API.') }}
-      {{ $t('You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance.') }}
+      <translate>Funkwhale is compatible with other music players that support the Subsonic API.</translate>
+      <translate>You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance.</translate>
     </p>
     <p>
-      {{ $t('However, accessing Funkwhale from those clients require a separate password you can set below.') }}
+      <translate>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">
-      {{ $t('Discover how to use Funkwhale from other apps') }}
+      <translate>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">{{ $t('Error') }}</div>
+      <div class="header"><translate>Error</translate></div>
       <ul class="list">
         <li v-for="error in errors">{{ error }}</li>
       </ul>
@@ -32,25 +32,25 @@
         color="grey"
         :class="['ui', {'loading': isLoading}, 'button']"
         :action="requestNewToken">
-        {{ $t('Request a new password') }}
-        <p slot="modal-header">{{ $t('Request a new Subsonic API password?') }}</p>
-        <p slot="modal-content">{{ $t('This will log you out from existing devices that use the current password.') }}</p>
-        <p slot="modal-confirm">{{ $t('Request a new password') }}</p>
+        <translate>Request a new password</translate>
+        <p slot="modal-header"><translate>Request a new Subsonic API password?</translate></p>
+        <p slot="modal-content"><translate>This will log you out from existing devices that use the current password.</translate></p>
+        <p slot="modal-confirm"><translate>Request a new password</translate></p>
       </dangerous-button>
       <button
         v-else
         color="grey"
         :class="['ui', {'loading': isLoading}, 'button']"
-        @click="requestNewToken">{{ $t('Request a password') }}</button>
+        @click="requestNewToken"><translate>Request a password</translate></button>
         <dangerous-button
           v-if="token"
           color="yellow"
           :class="['ui', {'loading': isLoading}, 'button']"
           :action="disable">
-          {{ $t('Disable Subsonic access') }}
-          <p slot="modal-header">{{ $t('Disable Subsonic API access?') }}</p>
-          <p slot="modal-content">{{ $t('This will completely disable access to the Subsonic API using from account.') }}</p>
-          <p slot="modal-confirm">{{ $t('Disable access') }}</p>
+          <translate>Disable Subsonic access</translate>
+          <p slot="modal-header"><translate>Disable Subsonic API access?</translate></p>
+          <p slot="modal-content"><translate>This will completely disable access to the Subsonic API using from account.</translate></p>
+          <p slot="modal-confirm"><translate>Disable access</translate></p>
         </dangerous-button>
     </template>
   </form>
@@ -92,7 +92,7 @@ export default {
       })
     },
     requestNewToken () {
-      this.successMessage = this.$t('Password updated')
+      this.successMessage = this.$gettext('Password updated')
       this.success = false
       this.errors = []
       this.isLoading = true
@@ -108,7 +108,7 @@ export default {
       })
     },
     disable () {
-      this.successMessage = this.$t('Access disabled')
+      this.successMessage = this.$gettext('Access disabled')
       this.success = false
       this.errors = []
       this.isLoading = true
diff --git a/front/src/components/common/ActionTable.vue b/front/src/components/common/ActionTable.vue
index 097fb29385eb495d00bc349d88f733c5d9ac5813..d74b0dfb749274c7a3dcccd43a7480fca89bed84 100644
--- a/front/src/components/common/ActionTable.vue
+++ b/front/src/components/common/ActionTable.vue
@@ -6,7 +6,7 @@
           <div class="ui small form">
             <div class="ui inline fields">
               <div class="field">
-                <label>{{ $t('Actions') }}</label>
+                <label><translate>Actions</translate></label>
                 <select class="ui dropdown" v-model="currentActionName">
                   <option v-for="action in actions" :value="action.name">
                     {{ action.label }}
@@ -19,41 +19,75 @@
                   @click="launchAction"
                   :disabled="checked.length === 0"
                   :class="['ui', {disabled: checked.length === 0}, {'loading': actionLoading}, 'button']">
-                  {{ $t('Go') }}</div>
+                  <translate>Go</translate></div>
                 <dangerous-button
                   v-else-if="!currentAction.isDangerous" :class="['ui', {disabled: checked.length === 0}, {'loading': actionLoading}, 'button']"
                   confirm-color="green"
                   color=""
                   @confirm="launchAction">
-                  {{ $t('Go') }}
-                  <p slot="modal-header">{{ $t('Do you want to launch action "{% action %}" on {% total %} elements?', {action: currentActionName, total: objectsData.count}) }}
+                  <translate>Go</translate>
+                  <p slot="modal-header">
+                    <translate
+                      :translate-n="objectsData.count"
+                      :translate-params="{count: objectsData.count, action: currentActionName}"
+                      translate-plural="Do you want to launch %{ action } on %{ count } elements?">
+                      Do you want to launch %{ action } on %{ count } element?
+                    </translate>
+                  </p>
                   <p slot="modal-content">
-                    {{ $t('This may affect a lot of elements, please double check this is really what you want.')}}
+                    <translate>This may affect a lot of elements, please double check this is really what you want.</translate>
                   </p>
-                  <p slot="modal-confirm">{{ $t('Launch') }}</p>
+                  <p slot="modal-confirm"><translate>Launch</translate></p>
                 </dangerous-button>
               </div>
               <div class="count field">
-                <span v-if="selectAll">{{ $t('{% count %} on {% total %} selected', {count: objectsData.count, total: objectsData.count}) }}</span>
-                <span v-else>{{ $t('{% count %} on {% total %} selected', {count: checked.length, total: objectsData.count}) }}</span>
+                <translate
+                  tag="span"
+                  v-if="selectAll"
+                  :translate-n="objectsData.count"
+                  :translate-params="{count: objectsData.count, total: objectsData.count}"
+                  translate-plural="%{ count } on %{ total } selected">
+                  %{ count } on %{ total } selected
+                </translate>
+                <translate
+                  tag="span"
+                  v-else
+                  :translate-n="checked.length"
+                  :translate-params="{count: checked.length, total: objectsData.count}"
+                  translate-plural="%{ count } on %{ total } selected">
+                  %{ count } on %{ total } selected
+                </translate>
                 <template v-if="!currentAction.isDangerous && checkable.length > 0 && checkable.length === checked.length">
                   <a @click="selectAll = true" v-if="!selectAll">
-                    {{ $t('Select all {% total %} elements', {total: objectsData.count}) }}
+                    <translate
+                      :translate-n="objectsData.count"
+                      :translate-params="{total: objectsData.count}"
+                      translate-plural="Select all %{ total } elements">
+                      Select all %{ total } elements
+                    </translate>
                   </a>
                   <a @click="selectAll = false" v-else>
-                    {{ $t('Select only current page') }}
+                    <translate>Select only current page</translate>
                   </a>
                 </template>
               </div>
             </div>
             <div v-if="actionErrors.length > 0" class="ui negative message">
-              <div class="header">{{ $t('Error while applying action') }}</div>
+              <div class="header"><translate>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>{{ $t('Action {% action %} was launched successfully on {% count %} objects.', {action: actionResult.action, count: actionResult.updated}) }}</p>
+              <p>
+                <translate
+                  :translate-n="actionResult.updated"
+                  :translate-params="{count: actionResult.updated, action: actionResult.action}"
+                  translate-plural="Action %{ action } was launched successfully on %{ count } elements">
+                  Action %{ action } was launched successfully on %{ count } element
+                </translate>
+              </p>
+
               <slot name="action-success-footer" :result="actionResult">
               </slot>
             </div>
@@ -81,7 +115,6 @@
             :disabled="checkable.indexOf(obj.id) === -1"
             @click="toggleCheck($event, obj.id, index)"
             :checked="checked.indexOf(obj.id) > -1"><label>&nbsp;</label>
-          </div>
         </td>
         <slot name="row-cells" :obj="obj"></slot>
       </tr>
diff --git a/front/src/components/common/DangerousButton.vue b/front/src/components/common/DangerousButton.vue
index 52fcdca6136528bea7cb7b36125074654e62800e..e6139203a7c6f96e1eb1fc57ec498b7318643590 100644
--- a/front/src/components/common/DangerousButton.vue
+++ b/front/src/components/common/DangerousButton.vue
@@ -4,7 +4,9 @@
 
     <modal class="small" :show.sync="showModal">
       <div class="header">
-        <slot name="modal-header"><i18next path="Do you want to confirm this action?"/></slot>
+        <slot name="modal-header">
+          <translate>Do you want to confirm this action?</translate>
+        </slot>
       </div>
       <div class="scrolling content">
         <div class="description">
@@ -12,9 +14,13 @@
         </div>
       </div>
       <div class="actions">
-        <div class="ui cancel button"><i18next path="Cancel"/></div>
+        <div class="ui cancel button">
+          <translate>Cancel</translate>
+        </div>
         <div :class="['ui', 'confirm', confirmButtonColor, 'button']" @click="confirm">
-          <slot name="modal-confirm"><i18next path="Confirm"/></slot>
+          <slot name="modal-confirm">
+            <translate>Confirm</translate>
+          </slot>
         </div>
       </div>
     </modal>
diff --git a/front/src/components/common/Duration.vue b/front/src/components/common/Duration.vue
new file mode 100644
index 0000000000000000000000000000000000000000..85b070fcd4f18a121e6ce76bdc52bf6fd9762e51
--- /dev/null
+++ b/front/src/components/common/Duration.vue
@@ -0,0 +1,22 @@
+<template>
+  <span>
+    <translate
+      v-if="durationData.hours > 0"
+      :translate-params="{minutes: durationData.minutes, hours: durationData.hours}">%{ hours } h %{ minutes } min</translate>
+    <translate
+      v-else
+      :translate-params="{minutes: durationData.minutes}">%{ minutes } min</translate>
+  </span>
+</template>
+<script>
+import {secondsToObject} from '@/filters'
+
+export default {
+  props: ['seconds'],
+  computed: {
+    durationData () {
+      return secondsToObject(this.seconds)
+    }
+  }
+}
+</script>
diff --git a/front/src/components/common/Message.vue b/front/src/components/common/Message.vue
index 772071db78c98881dab84405b2bc0903beff8106..bbde16a1250fdf7d8b4c8c53128580ed8595d2b4 100644
--- a/front/src/components/common/Message.vue
+++ b/front/src/components/common/Message.vue
@@ -12,9 +12,6 @@ import $ from 'jquery'
 export default {
   mounted () {
     let self = this
-    $(this.$el).find('.close.icon').on('click', function () {
-      $(self.$el).transition('fade', 125)
-    })
     $(this.$el).on('click', function () {
       $(self.$el).transition('fade', 125)
     })
diff --git a/front/src/components/common/UserLink.vue b/front/src/components/common/UserLink.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0ae4d4ec8f2f544506bfd0adab65457ecfd5d6a1
--- /dev/null
+++ b/front/src/components/common/UserLink.vue
@@ -0,0 +1,34 @@
+<template>
+  <span>
+    <img
+      class="ui tiny circular avatar"
+      v-if="user.avatar && user.avatar.small_square_crop"
+      :src="$store.getters['instance/absoluteUrl'](user.avatar.small_square_crop)" />
+    <span v-else :style="defaultAvatarStyle" class="ui circular label">{{ user.username[0]}}</span>
+    &nbsp;@{{ user.username }}
+  </span>
+</template>
+
+<script>
+import {hashCode, intToRGB} from '@/utils/color'
+
+export default {
+  props: ['user'],
+  computed: {
+    userColor () {
+      return intToRGB(hashCode(this.user.username + String(this.user.id)))
+    },
+    defaultAvatarStyle () {
+      return {
+        'background-color': `#${this.userColor}`
+      }
+    }
+  }
+}
+</script>
+<style scoped>
+.tiny.circular.avatar {
+  width: 1.7em;
+  height: 1.7em;
+}
+</style>
diff --git a/front/src/components/discussion/Comment.vue b/front/src/components/discussion/Comment.vue
index 0c0678d86221ea023fa1a319ce541e63b293304f..ee9ce9b1f84c851b0024d243a740cb3807eee5ae 100644
--- a/front/src/components/discussion/Comment.vue
+++ b/front/src/components/discussion/Comment.vue
@@ -11,13 +11,15 @@
         <span
           @click="collapsed = false"
           v-if="truncated && collapsed"
-          class="expand"
-          path="Expand"/>
-        <i18next
+          class="expand">
+          <translate>Expand</translate>
+        </span>
+        <span
           @click="collapsed = true"
           v-if="truncated && !collapsed"
-          class="collapse"
-          path="Collapse"/>
+          class="collapse">
+          <translate>Collapse</translate>
+        </span>
       </div>
     </div>
   </div>
diff --git a/front/src/components/favorites/List.vue b/front/src/components/favorites/List.vue
index 65d97cef9bf49a91e9e649257b758c05883b6750..eacea63eca01e52b3b96b22d541cac8e6ac623a2 100644
--- a/front/src/components/favorites/List.vue
+++ b/front/src/components/favorites/List.vue
@@ -1,14 +1,19 @@
 <template>
-  <div class="main pusher" v-title="'Your Favorites'">
+  <div class="main pusher" v-title="labels.title">
     <div class="ui vertical center aligned stripe segment">
       <div :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']">
-        <div class="ui text loader"><i18next path="Loading your favorites..."/></div>
+        <div class="ui text loader">
+          <translate>Loading your favorites...</translate>
+        </div>
       </div>
       <h2 v-if="results" class="ui center aligned icon header">
         <i class="circular inverted heart pink icon"></i>
-        <i18next path="{%0%} favorites">
-          {{ $store.state.favorites.count }}
-        </i18next>
+        <translate
+          translate-plural="%{ count } favorites"
+          :translate-n="$store.state.favorites.count"
+          :translate-params="{count: results.count}">
+          1 favorite
+        </translate>
       </h2>
       <radio-button type="favorites"></radio-button>
     </div>
@@ -16,7 +21,7 @@
       <div :class="['ui', {'loading': isLoading}, 'form']">
         <div class="fields">
           <div class="field">
-            <i18next tag="label" path="Ordering"/>
+            <label><translate>Ordering</translate></label>
             <select class="ui dropdown" v-model="ordering">
               <option v-for="option in orderingOptions" :value="option[0]">
                 {{ option[1] }}
@@ -24,14 +29,14 @@
             </select>
           </div>
           <div class="field">
-            <i18next tag="label" path="Ordering direction"/>
+            <label><translate>Ordering direction</translate></label>
             <select class="ui dropdown" v-model="orderingDirection">
-              <option value="+"><i18next path="Ascending"/></option>
-              <option value="-"><i18next path="Descending"/></option>
+              <option value="+"><translate>Ascending</translate></option>
+              <option value="-"><translate>Descending</translate></option>
             </select>
           </div>
           <div class="field">
-            <i18next tag="label" path="Results per page"/>
+            <label><translate>Results per page</translate></label>
             <select class="ui dropdown" v-model="paginateBy">
               <option :value="parseInt(12)">12</option>
               <option :value="parseInt(25)">25</option>
@@ -44,7 +49,7 @@
       <track-table v-if="results" :tracks="results.results"></track-table>
       <div class="ui center aligned basic segment">
         <pagination
-          v-if="results && results.count > 0"
+          v-if="results && results.count > paginateBy"
           @page-changed="selectPage"
           :current="page"
           :paginate-by="paginateBy"
@@ -98,6 +103,13 @@ export default {
   mounted () {
     $('.ui.dropdown').dropdown()
   },
+  computed: {
+    labels () {
+      return {
+        title: this.$gettext('Your Favorites')
+      }
+    }
+  },
   methods: {
     updateQueryString: function () {
       this.$router.replace({
diff --git a/front/src/components/favorites/TrackFavoriteIcon.vue b/front/src/components/favorites/TrackFavoriteIcon.vue
index d8d62afaaa363e520c45e600d18a18fded34cf1d..88402159c934b06ca7b6c5514ed9babbd5ef1b96 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}, 'button']">
     <i class="heart icon"></i>
-    <i18next v-if="isFavorite" path="In favorites"/>
-    <i18next v-else path="Add to favorites"/>
+    <translate v-if="isFavorite">In favorites</translate>
+    <translate v-else>Add to favorites</translate>
   </button>
   <i v-else @click="$store.dispatch('favorites/toggle', track.id)" :class="['favorite-icon', 'heart', {'pink': isFavorite}, {'favorited': isFavorite}, 'link', 'icon']" :title="title"></i>
 </template>
@@ -16,9 +16,9 @@ export default {
   computed: {
     title () {
       if (this.isFavorite) {
-        return this.$t('Remove from favorites')
+        return this.$gettext('Remove from favorites')
       } else {
-        return this.$t('Add to favorites')
+        return this.$gettext('Add to favorites')
       }
     },
     isFavorite () {
diff --git a/front/src/components/federation/LibraryCard.vue b/front/src/components/federation/LibraryCard.vue
index e7ef7a516e1eab553583f965b3443d134c7169d4..277606871cc383b4502724cc4e02f4cfa43f041a 100644
--- a/front/src/components/federation/LibraryCard.vue
+++ b/front/src/components/federation/LibraryCard.vue
@@ -13,39 +13,42 @@
     </div>
     <div class="content">
       <span class="right floated" v-if="following">
-        <i class="check icon"></i><i18next path="Following"/>
+        <i class="check icon"></i><translate>Following</translate>
       </span>
       <span class="right floated" v-else-if="manuallyApprovesFollowers">
-        <i class="lock icon"></i><i18next path="Followers only"/>
+        <i class="lock icon"></i><translate>Followers only</translate>
       </span>
       <span class="right floated" v-else>
-        <i class="open lock icon"></i><i18next path="Open"/>
+        <i class="open lock icon"></i><translate>Open</translate>
       </span>
       <span v-if="totalItems">
         <i class="music icon"></i>
-        <i18next path="{%0%} tracks">
-          {{ totalItems }}
-        </i18next>
+        <translate
+          translate-plural="%{ count } tracks"
+          :translate-n="totalItems"
+          :translate-params="{count: totalItems}">
+          1 track
+        </translate>
       </span>
     </div>
     <div class="extra content">
       <template v-if="awaitingApproval">
         <i class="clock icon"></i>
-        <i18next path="Follow request pending approval"/>
+        <translate>Follow request pending approval</translate>
       </template>
       <div
         v-if="!library"
         @click="follow"
         :disabled="isLoading"
         :class="['ui', 'basic', {loading: isLoading}, 'green', 'button']">
-        <i18next v-if="manuallyApprovesFollowers" path="Send a follow request"/>
-        <i18next v-else path="Follow"/>
+        <translate v-if="manuallyApprovesFollowers">Send a follow request</translate>
+        <translate v-else>Follow</translate>
       </div>
       <router-link
         v-else
         class="ui basic button"
         :to="{name: 'federation.libraries.detail', params: {id: library.uuid }}">
-        <i18next path="Detail"/>
+        <translate>Detail</translate>
       </router-link>
     </div>
   </div>
diff --git a/front/src/components/federation/LibraryFollowTable.vue b/front/src/components/federation/LibraryFollowTable.vue
index 4a7fe59f06c483d940a80d0cd57d89f8916b794f..a5dd08ced47936718c070570772209d4c42d8805 100644
--- a/front/src/components/federation/LibraryFollowTable.vue
+++ b/front/src/components/federation/LibraryFollowTable.vue
@@ -3,12 +3,14 @@
     <div class="ui form">
       <div class="fields">
         <div class="ui six wide field">
-          <input type="text" v-model="search" placeholder="Search by username, domain..." />
+          <input type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
         </div>
         <div class="ui four wide inline field">
           <div class="ui checkbox">
             <input v-model="pending" type="checkbox">
-            <label><i18next path="Pending approval"/></label>
+            <label>
+              <translate>Pending approval</translate>
+            </label>
           </div>
         </div>
       </div>
@@ -17,10 +19,10 @@
     <table v-if="result" class="ui very basic single line unstackable table">
       <thead>
         <tr>
-          <i18next tag="th" path="Actor"/>
-          <i18next tag="th" path="Creation date"/>
-          <i18next tag="th" path="Status"/>
-          <i18next tag="th" path="Actions"/>
+          <th><translate>Actor</translate></th>
+          <th><translate>Creation date</translate></th>
+          <th><translate>Status</translate></th>
+          <th><translate>Actions</translate></th>
         </tr>
       </thead>
       <tbody>
@@ -33,36 +35,49 @@
           </td>
           <td>
             <template v-if="follow.approved === true">
-              <i class="check icon"></i><i18next path="Approved"/>
+              <i class="check icon"></i>
+              <translate>Approved</translate>
             </template>
             <template v-else-if="follow.approved === false">
-              <i class="x icon"></i><i18next path="Refused"/>
+              <i class="x icon"></i>
+              <translate>Refused</translate>
             </template>
             <template v-else>
-              <i class="clock icon"></i><i18next path="Pending"/>
+              <i class="clock icon"></i>
+              <translate>Pending</translate>
             </template>
           </td>
           <td>
             <dangerous-button v-if="follow.approved !== false" class="tiny basic labeled icon" color='red' @confirm="updateFollow(follow, false)">
-              <i class="x icon"></i><i18next path="Deny"/>
-              <p slot="modal-header"><i18next path="Deny access?"/></p>
+              <i class="x icon"></i>
+              <translate>Deny</translate>
+              <p slot="modal-header">
+                <translate>Deny access?</translate>
+              </p>
               <p slot="modal-content">
-                <i18next path="By confirming, {%0%}@{%1%} will be denied access to your library.">
-                  {{ follow.actor.preferred_username }}
-                  {{ follow.actor.domain }}
-                </i18next>
+                <translate
+                  :translate-params="{username: follow.actor.preferred_username + '@' + follow.actor.domain}">
+                  By confirming, %{ username } will be denied access to your library.
+                </translate>
+              </p>
+              <p slot="modal-confirm">
+                <translate>Deny</translate>
               </p>
-              <p slot="modal-confirm"><i18next path="Deny"/></p>
             </dangerous-button>
             <dangerous-button v-if="follow.approved !== true" class="tiny basic labeled icon" color='green' @confirm="updateFollow(follow, true)">
-              <i class="check icon"></i> <i18next path="Approve"/>
-              <p slot="modal-header"><i18next path="Approve access?"/></p>
+              <i class="check icon"></i>
+              <translate>Approve</translate>
+              <p slot="modal-header">
+                <translate>Approve access?</translate>
+              </p>
               <p slot="modal-content">
-                <i18next path="By confirming, {%0%}@{%1%} will be granted access to your library.">
-                  {{ follow.actor.preferred_username }}
-                  {{ follow.actor.domain }}
-                </i18next>
-              <p slot="modal-confirm"><i18next path="Approve"/></p>
+                <translate
+                  :translate-params="{username: follow.actor.preferred_username + '@' + follow.actor.domain}">
+                  By confirming, %{ username } will be granted access to your library.
+                </translate>
+              <p slot="modal-confirm">
+                <translate>Approve</translate>
+              </p>
             </dangerous-button>
           </td>
         </tr>
@@ -71,7 +86,7 @@
         <tr>
           <th>
             <pagination
-            v-if="result && result.results.length > 0"
+            v-if="result && result.count > paginateBy"
             @page-changed="selectPage"
             :compact="true"
             :current="page"
@@ -80,11 +95,10 @@
             ></pagination>
           </th>
           <th v-if="result && result.results.length > 0">
-            <i18next path="Showing results {%0%}-{%1%} on {%2%}">
-              {{ ((page-1) * paginateBy) + 1 }}
-              {{ ((page-1) * paginateBy) + result.results.length }}
-              {{ result.count }}
-            </i18next>
+            <translate
+              :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
+              Showing results %{ start }-%{ end } on %{ total }
+            </translate>
           </th>
           <th></th>
           <th></th>
@@ -120,6 +134,13 @@ export default {
   created () {
     this.fetchData()
   },
+  computed: {
+    labels () {
+      return {
+        searchPlaceholder: this.$gettext('Search by username, domain...')
+      }
+    }
+  },
   methods: {
     fetchData () {
       let params = _.merge({
diff --git a/front/src/components/federation/LibraryForm.vue b/front/src/components/federation/LibraryForm.vue
index 7547c3718faebaecee8187bb2314d09ca62718a6..7039cb524b04330bcf5f913516d24726bb58c6c7 100644
--- a/front/src/components/federation/LibraryForm.vue
+++ b/front/src/components/federation/LibraryForm.vue
@@ -1,9 +1,15 @@
 <template>
   <form class="ui form" @submit.prevent="fetchInstanceInfo">
-    <h3 class="ui header"><i18next path="Federate with a new instance"/></h3>
-    <p><i18next path="Use this form to scan an instance and setup federation."/></p>
+    <h3 class="ui header">
+      <translate>Federate with a new instance</translate>
+    </h3>
+    <p>
+      <translate>Use this form to scan an instance and setup federation.</translate>
+    </p>
     <div v-if="errors.length > 0 || scanErrors.length > 0" class="ui negative message">
-      <div class="header"><i18next path="Error while scanning library"/></div>
+      <div class="header">
+        <translate>Error while scanning library</translate>
+      </div>
       <ul class="list">
         <li v-for="error in errors">{{ error }}</li>
         <li v-for="error in scanErrors">{{ error }}</li>
@@ -11,8 +17,10 @@
     </div>
     <div class="ui two fields">
       <div class="ui field">
-        <label><i18next path="Library name"/></label>
-        <input v-model="libraryUsername" type="text" placeholder="library@demo.funkwhale.audio" />
+        <label>
+          <translate>Library name</translate>
+        </label>
+        <input v-model="libraryUsername" type="text" :placeholder="labels.namePlaceholder" />
       </div>
       <div class="ui field">
         <label>&nbsp;</label>
@@ -21,7 +29,7 @@
           :disabled="isLoading"
           :class="['ui', 'icon', {loading: isLoading}, 'button']">
           <i class="search icon"></i>
-          <i18next path="Launch scan"/>
+          <translate>Launch scan</translate>
         </button>
       </div>
     </div>
@@ -83,6 +91,11 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        namePlaceholder: this.$gettext('library@demo.funkwhale.audio')
+      }
+    },
     scanErrors () {
       let errors = []
       if (!this.result) {
diff --git a/front/src/components/federation/LibraryTrackTable.vue b/front/src/components/federation/LibraryTrackTable.vue
index 43b52c835bb84ec3434f5a8fca110e70ecd24ff7..b24e1109987c7b8b8149b9921f7ed098f0033078 100644
--- a/front/src/components/federation/LibraryTrackTable.vue
+++ b/front/src/components/federation/LibraryTrackTable.vue
@@ -2,17 +2,32 @@
   <div>
     <div class="ui inline form">
       <div class="fields">
-        <div class="ui field">
-          <label>{{ $t('Search') }}</label>
-          <input type="text" v-model="search" placeholder="Search by title, artist, domain..." />
+        <div class="ui six wide field">
+          <label><translate>Search</translate></label>
+          <input type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
         </div>
         <div class="ui field">
-          <label>{{ $t('Import status') }}</label>
+          <label><translate>Import status</translate></label>
           <select class="ui dropdown" v-model="importedFilter">
-            <option :value="null">{{ $t('Any') }}</option>
-            <option :value="'imported'">{{ $t('Imported') }}</option>
-            <option :value="'not_imported'">{{ $t('Not imported') }}</option>
-            <option :value="'import_pending'">{{ $t('Import pending') }}</option>
+            <option :value="null"><translate>Any</translate></option>
+            <option :value="'imported'"><translate>Imported</translate></option>
+            <option :value="'not_imported'"><translate>Not imported</translate></option>
+            <option :value="'import_pending'"><translate>Import pending</translate></option>
+          </select>
+        </div>
+        <div class="field">
+          <label><translate>Ordering</translate></label>
+          <select class="ui dropdown" v-model="ordering">
+            <option v-for="option in orderingOptions" :value="option[0]">
+              {{ option[1] }}
+            </option>
+          </select>
+        </div>
+        <div class="field">
+          <label><translate>Ordering direction</translate></label>
+          <select class="ui dropdown" v-model="orderingDirection">
+            <option value="+"><translate>Ascending</translate></option>
+            <option value="-"><translate>Descending</translate></option>
           </select>
         </div>
       </div>
@@ -29,47 +44,50 @@
         :action-url="'federation/library-tracks/action/'"
         :filters="actionFilters">
         <template slot="header-cells">
-          <th>{{ $t('Status') }}</th>
-          <th>{{ $t('Title') }}</th>
-          <th>{{ $t('Artist') }}</th>
-          <th>{{ $t('Album') }}</th>
-          <th>{{ $t('Published date') }}</th>
-          <th v-if="showLibrary">{{ $t('Library') }}</th>
+          <th><translate>Status</translate></th>
+          <th><translate>Title</translate></th>
+          <th><translate>Artist</translate></th>
+          <th><translate>Album</translate></th>
+          <th><translate>Published date</translate></th>
+          <th v-if="showLibrary"><translate>Library</translate></th>
         </template>
         <template slot="action-success-footer" slot-scope="scope">
           <router-link
             v-if="scope.result.action === 'import'"
             :to="{name: 'library.import.batches.detail', params: {id: scope.result.result.batch.id }}">
-            {{ $t('Import #{% id %} launched', {id: scope.result.result.batch.id}) }}
+            <translate
+              :translate-params="{id: scope.result.result.batch.id}">
+              Import #%{ id } launched
+            </translate>
           </router-link>
         </template>
         <template slot="row-cells" slot-scope="scope">
           <td>
-            <span v-if="scope.obj.status === 'imported'" class="ui basic green label">{{ $t('In library') }}</span>
-            <span v-else-if="scope.obj.status === 'import_pending'" class="ui basic yellow label">{{ $t('Import pending') }}</span>
-            <span v-else class="ui basic label">{{ $t('Not imported') }}</span>
+            <span v-if="scope.obj.status === 'imported'" class="ui basic green label"><translate>In library</translate></span>
+            <span v-else-if="scope.obj.status === 'import_pending'" class="ui basic yellow label"><translate>Import pending</translate></span>
+            <span v-else class="ui basic label"><translate>Not imported</translate></span>
           </td>
           <td>
             <span :title="scope.obj.title">{{ scope.obj.title|truncate(30) }}</span>
           </td>
           <td>
-            <span :title="scope.obj.artist_name">{{ scope.obj.artist_name|truncate(30) }}</span>
+            <span class="discrete link" @click="updateSearch({key: 'artist', value: scope.obj.artist_name})" :title="scope.obj.artist_name">{{ scope.obj.artist_name|truncate(30) }}</span>
           </td>
           <td>
-            <span :title="scope.obj.album_title">{{ scope.obj.album_title|truncate(20) }}</span>
+            <span class="discrete link" @click="updateSearch({key: 'album', value: scope.obj.album_title})" :title="scope.obj.album_title">{{ scope.obj.album_title|truncate(20) }}</span>
           </td>
           <td>
             <human-date :date="scope.obj.published_date"></human-date>
           </td>
           <td v-if="showLibrary">
-            {{ scope.obj.library.actor.domain }}
+            <span class="discrete link" @click="updateSearch({key: 'domain', value: scope.obj.library.actor.domain})">{{ scope.obj.library.actor.domain }}</span>
           </td>
         </template>
       </action-table>
     </div>
     <div>
       <pagination
-        v-if="result && result.results.length > 0"
+        v-if="result && result.count > paginateBy"
         @page-changed="selectPage"
         :compact="true"
         :current="page"
@@ -78,7 +96,10 @@
         ></pagination>
 
       <span v-if="result && result.results.length > 0">
-        {{ $t('Showing results {%start%}-{%end%} on {%total%}', {start: ((page-1) * paginateBy) + 1 , end: ((page-1) * paginateBy) + result.results.length, total: result.count})}}
+        <translate
+          :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
+          Showing results %{ start }-%{ end } on %{ total }
+        </translate>
       </span>
     </div>
   </div>
@@ -90,8 +111,10 @@ import _ from 'lodash'
 
 import Pagination from '@/components/Pagination'
 import ActionTable from '@/components/common/ActionTable'
+import OrderingMixin from '@/components/mixins/Ordering'
 
 export default {
+  mixins: [OrderingMixin],
   props: {
     filters: {type: Object, required: false},
     showLibrary: {type: Boolean, default: false}
@@ -107,17 +130,32 @@ export default {
       page: 1,
       paginateBy: 25,
       search: '',
-      importedFilter: null
+      importedFilter: null,
+      orderingDirection: '-',
+      ordering: 'published_date',
+      orderingOptions: [
+        ['published_date', 'Published date'],
+        ['title', 'Title'],
+        ['album_title', 'Album title'],
+        ['artist_name', 'Artist name']
+      ]
     }
   },
   created () {
     this.fetchData()
   },
   methods: {
+    updateSearch ({key, value}) {
+      if (value.indexOf(' ') > -1) {
+        value = `"${value}"`
+      }
+      this.search = `${key}:${value}`
+    },
     fetchData () {
       let params = _.merge({
         'page': this.page,
         'page_size': this.paginateBy,
+        'ordering': this.getOrderingAsString(),
         'q': this.search
       }, this.filters)
       if (this.importedFilter !== null) {
@@ -139,6 +177,11 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        searchPlaceholder: this.$gettext('Search by title, artist, domain...')
+      }
+    },
     actionFilters () {
       var currentFilters = {
         q: this.search
@@ -150,16 +193,25 @@ export default {
       }
     },
     actions () {
+      let msg = this.$gettext('Import')
       return [
         {
           name: 'import',
-          label: this.$t('Import'),
+          label: msg,
           filterCheckable: (obj) => { return obj.status === 'not_imported' }
         }
       ]
     }
   },
   watch: {
+    orderingDirection: function () {
+      this.page = 1
+      this.fetchData()
+    },
+    ordering: function () {
+      this.page = 1
+      this.fetchData()
+    },
     search (newValue) {
       this.page = 1
       this.fetchData()
diff --git a/front/src/components/forms/PasswordInput.vue b/front/src/components/forms/PasswordInput.vue
index 624a92d87c8d204ec9b8e40b247e1e7835ed5951..377b2d3e4b111b38ea242e9e729dc29eb326499b 100644
--- a/front/src/components/forms/PasswordInput.vue
+++ b/front/src/components/forms/PasswordInput.vue
@@ -6,7 +6,7 @@
     :type="passwordInputType"
     @input="$emit('input', $event.target.value)"
     :value="value">
-    <span @click="showPassword = !showPassword" :title="$t('Show/hide password')" class="ui icon button">
+    <span @click="showPassword = !showPassword" :title="labels.title" class="ui icon button">
       <i class="eye icon"></i>
     </span>
   </div>
@@ -20,6 +20,11 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        title: this.$gettext('Show/hide password')
+      }
+    },
     passwordInputType () {
       if (this.showPassword) {
         return 'text'
diff --git a/front/src/components/globals.js b/front/src/components/globals.js
index 4ad09f70425a987fd99e86f6e4277cd07d797605..6865ac1bc55f74c20914169d48560b96759ec852 100644
--- a/front/src/components/globals.js
+++ b/front/src/components/globals.js
@@ -8,6 +8,14 @@ import Username from '@/components/common/Username'
 
 Vue.component('username', Username)
 
+import UserLink from '@/components/common/UserLink'
+
+Vue.component('user-link', UserLink)
+
+import Duration from '@/components/common/Duration'
+
+Vue.component('duration', Duration)
+
 import DangerousButton from '@/components/common/DangerousButton'
 
 Vue.component('dangerous-button', DangerousButton)
diff --git a/front/src/components/instance/Stats.vue b/front/src/components/instance/Stats.vue
index ac144ceb3a910e50e59ea9f9efd0575d2c037a0a..bb23b617c29cc43d3ef8484866d264c23068d026 100644
--- a/front/src/components/instance/Stats.vue
+++ b/front/src/components/instance/Stats.vue
@@ -2,55 +2,57 @@
   <div>
     <div v-if="stats" class="ui stackable two column grid">
       <div class="column">
-        <h3 class="ui left aligned header"><i18next path="User activity"/></h3>
+        <h3 class="ui left aligned header">
+          <translate>User activity</translate>
+        </h3>
         <div v-if="stats" class="ui mini horizontal statistics">
           <div class="statistic">
             <div class="value">
               <i class="green user icon"></i>
               {{ stats.users }}
             </div>
-            <i18next tag="div" class="label" path="users"/>
+            <div class="label"><translate>users</translate></div>
           </div>
           <div class="statistic">
             <div class="value">
               <i class="orange sound icon"></i> {{ stats.listenings }}
             </div>
-            <i18next tag="div" class="label" path="tracks listened"/>
+            <div class="label"><translate>tracks listened</translate></div>
           </div>
           <div class="statistic">
             <div class="value">
               <i class="pink heart icon"></i> {{ stats.trackFavorites }}
             </div>
-            <i18next tag="div" class="label" path="Tracks favorited"/>
+            <div class="label"><translate>Tracks favorited</translate></div>
           </div>
         </div>
       </div>
       <div class="column">
-        <h3 class="ui left aligned header">Library</h3>
+        <h3 class="ui left aligned header"><translate>Library</translate></h3>
         <div class="ui mini horizontal statistics">
           <div class="statistic">
             <div class="value">
               {{ parseInt(stats.musicDuration) }}
             </div>
-            <i18next tag="div" class="label" path="hours of music"/>
+            <div class="label"><translate>Hours of music</translate></div>
           </div>
           <div class="statistic">
             <div class="value">
               {{ stats.artists }}
             </div>
-            <i18next tag="div" class="label" path="Artists"/>
+            <div class="label"><translate>Artists</translate></div>
           </div>
           <div class="statistic">
             <div class="value">
               {{ stats.albums }}
             </div>
-            <i18next tag="div" class="label" path="Albums"/>
+            <div class="label"><translate>Albums</translate></div>
           </div>
           <div class="statistic">
             <div class="value">
               {{ stats.tracks }}
             </div>
-            <i18next tag="div" class="label" path="tracks"/>
+            <div class="label"><translate>tracks</translate></div>
           </div>
         </div>
       </div>
diff --git a/front/src/components/library/Album.vue b/front/src/components/library/Album.vue
index 9a4288b8ac46a8e584fa8dbf23bae3a96fa4e5cc..312640baa184916650fb911988b462b9eb268bb5 100644
--- a/front/src/components/library/Album.vue
+++ b/front/src/components/library/Album.vue
@@ -1,40 +1,49 @@
 <template>
   <div>
-    <div v-if="isLoading" class="ui vertical segment" v-title="'Album'">
+    <div v-if="isLoading" class="ui vertical segment" v-title="">
       <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
     </div>
     <template v-if="album">
-      <div :class="['ui', 'head', {'with-background': album.cover}, 'vertical', 'center', 'aligned', 'stripe', 'segment']" :style="headerStyle" v-title="album.title">
+      <div :class="['ui', 'head', {'with-background': album.cover.original}, 'vertical', 'center', 'aligned', 'stripe', 'segment']" :style="headerStyle" v-title="album.title">
         <div class="segment-content">
           <h2 class="ui center aligned icon header">
             <i class="circular inverted sound yellow icon"></i>
             <div class="content">
               {{ album.title }}
-              <i18next tag="div" class="sub header" path="Album containing {%0%} tracks, by {%1%}">
-                {{ album.tracks.length }}
-                <router-link :to="{name: 'library.artists.detail', params: {id: album.artist.id }}">
-                  {{ album.artist.name }}
-                </router-link>
-              </i18next>
+              <translate
+                tag="div"
+                translate-plural="Album containing %{ count } tracks, by %{ artist }"
+                :translate-n="album.tracks.length"
+                :translate-params="{count: album.tracks.length, artist: album.artist.name}">
+                Album containing %{ count } track, by %{ artist }
+              </translate>
+            </div>
+            <div class="ui basic buttons">
+              <router-link class="ui button" :to="{name: 'library.artists.detail', params: {id: album.artist.id }}">
+                <translate>Artist page</translate>
+              </router-link>
             </div>
           </h2>
           <div class="ui hidden divider"></div>
-          </button>
-          <play-button class="orange" :tracks="album.tracks"><i18next path="Play all"/></play-button>
+          <play-button class="orange" :tracks="album.tracks">
+            <translate>Play all</translate>
+          </play-button>
 
           <a :href="wikipediaUrl" target="_blank" class="ui button">
             <i class="wikipedia icon"></i>
-            <i18next path="Search on Wikipedia"/>
+            <translate>Search on Wikipedia</translate>
           </a>
           <a :href="musicbrainzUrl" target="_blank" class="ui button">
             <i class="external icon"></i>
-            <i18next path="View on MusicBrainz"/>
+            <translate>View on MusicBrainz</translate>
           </a>
         </div>
       </div>
       <div class="ui vertical stripe segment">
-        <h2><i18next path="Tracks"/></h2>
-        <track-table v-if="album" :display-position="true" :tracks="album.tracks"></track-table>
+        <h2>
+          <translate>Tracks</translate>
+        </h2>
+        <track-table v-if="album" :artist="album.artist" :display-position="true" :tracks="album.tracks"></track-table>
       </div>
     </template>
   </div>
@@ -77,6 +86,11 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        title: this.$gettext('Album')
+      }
+    },
     wikipediaUrl () {
       return 'https://en.wikipedia.org/w/index.php?search=' + this.album.title + ' ' + this.album.artist.name
     },
@@ -84,10 +98,10 @@ export default {
       return 'https://musicbrainz.org/release/' + this.album.mbid
     },
     headerStyle () {
-      if (!this.album.cover) {
+      if (!this.album.cover.original) {
         return ''
       }
-      return 'background-image: url(' + this.$store.getters['instance/absoluteUrl'](this.album.cover) + ')'
+      return 'background-image: url(' + this.$store.getters['instance/absoluteUrl'](this.album.cover.original) + ')'
     }
   },
   watch: {
diff --git a/front/src/components/library/Artist.vue b/front/src/components/library/Artist.vue
index 171b80e8b7b1f9a2ad8c7a65e9dc3c227e6e1b5a..0f0abe1e91756b12bbf1b19d075ce8b347155e21 100644
--- a/front/src/components/library/Artist.vue
+++ b/front/src/components/library/Artist.vue
@@ -1,6 +1,6 @@
 <template>
   <div>
-    <div v-if="isLoading" class="ui vertical segment" v-title="'Artist'">
+    <div v-if="isLoading" class="ui vertical segment" v-title="labels.title">
       <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
     </div>
     <template v-if="artist">
@@ -11,63 +11,80 @@
             <div class="content">
               {{ artist.name }}
               <div class="sub header" v-if="albums">
-                {{ $t('{% track_count %} tracks in {% album_count %} albums', {track_count: totalTracks, album_count: albums.length})}}
+                <translate
+                  tag="div"
+                  translate-plural="%{ count } tracks in %{ albumsCount } albums"
+                  :translate-n="totalTracks"
+                  :translate-params="{count: totalTracks, albumsCount: totalAlbums}">
+                  %{ count } track in %{ albumsCount } albums
+                </translate>
               </div>
             </div>
           </h2>
           <div class="ui hidden divider"></div>
           <radio-button type="artist" :object-id="artist.id"></radio-button>
-          </button>
-          <play-button class="orange" :artist="artist.id"><i18next path="Play all albums"/></play-button>
+          <play-button class="orange" :artist="artist.id">
+            <translate>Play all albums</translate>
+          </play-button>
 
           <a :href="wikipediaUrl" target="_blank" class="ui button">
             <i class="wikipedia icon"></i>
-            <i18next path="Search on Wikipedia"/>
+            <translate>Search on Wikipedia</translate>
           </a>
           <a :href="musicbrainzUrl" target="_blank" class="ui button">
             <i class="external icon"></i>
-            <i18next path="View on MusicBrainz"/>
+            <translate>View on MusicBrainz</translate>
           </a>
         </div>
       </div>
       <div v-if="isLoadingAlbums" class="ui vertical stripe segment">
         <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
       </div>
-      <div v-else-if="albums" class="ui vertical stripe segment">
-        <h2><i18next path="Albums by this artist"/></h2>
+      <div v-else-if="albums && albums.length > 0" class="ui vertical stripe segment">
+        <h2>
+          <translate>Albums by this artist</translate>
+        </h2>
         <div class="ui stackable doubling three column grid">
           <div class="column" :key="album.id" v-for="album in albums">
             <album-card :mode="'rich'" class="fluid" :album="album"></album-card>
           </div>
         </div>
       </div>
+      <div v-if="tracks.length > 0" class="ui vertical stripe segment">
+        <h2>
+          <translate>Tracks by this artist</translate>
+        </h2>
+        <track-table :display-position="true" :tracks="tracks"></track-table>
+      </div>
     </template>
   </div>
 </template>
 
 <script>
+import _ from 'lodash'
 import axios from 'axios'
 import logger from '@/logging'
 import backend from '@/audio/backend'
 import AlbumCard from '@/components/audio/album/Card'
 import RadioButton from '@/components/radios/Button'
 import PlayButton from '@/components/audio/PlayButton'
-
-const FETCH_URL = 'artists/'
+import TrackTable from '@/components/audio/track/Table'
 
 export default {
   props: ['id'],
   components: {
     AlbumCard,
     RadioButton,
-    PlayButton
+    PlayButton,
+    TrackTable
   },
   data () {
     return {
       isLoading: true,
       isLoadingAlbums: true,
       artist: null,
-      albums: null
+      albums: null,
+      tracks: []
     }
   },
   created () {
@@ -77,14 +94,17 @@ export default {
     fetchData () {
       var self = this
       this.isLoading = true
-      let url = FETCH_URL + this.id + '/'
       logger.default.debug('Fetching artist "' + this.id + '"')
-      axios.get(url).then((response) => {
+      axios.get('tracks/', {params: {artist: this.id}}).then((response) => {
+        self.tracks = response.data.results
+      })
+      axios.get('artists/' + this.id + '/').then((response) => {
         self.artist = response.data
         self.isLoading = false
         self.isLoadingAlbums = true
         axios.get('albums/', {params: {artist: this.id, ordering: '-release_date'}}).then((response) => {
-          self.albums = JSON.parse(JSON.stringify(response.data.results)).map((album) => {
+          let parsed = JSON.parse(JSON.stringify(response.data.results))
+          self.albums = parsed.map((album) => {
             return backend.Album.clean(album)
           })
 
@@ -94,12 +114,26 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        title: this.$gettext('Artist')
+      }
+    },
+    totalAlbums () {
+      let trackAlbums = _.uniqBy(this.tracks, (t) => {
+        return t.album.id
+      })
+      return this.albums.length + trackAlbums.length
+    },
     totalTracks () {
+      if (this.albums.length === 0) {
+        return 0 + this.tracks.length
+      }
       return this.albums.map((album) => {
         return album.tracks.length
       }).reduce((a, b) => {
         return a + b
-      })
+      }) + this.tracks.length
     },
     wikipediaUrl () {
       return 'https://en.wikipedia.org/w/index.php?search=' + this.artist.name
@@ -124,10 +158,10 @@ export default {
       })[0]
     },
     headerStyle () {
-      if (!this.cover) {
+      if (!this.cover.original) {
         return ''
       }
-      return 'background-image: url(' + this.$store.getters['instance/absoluteUrl'](this.cover) + ')'
+      return 'background-image: url(' + this.$store.getters['instance/absoluteUrl'](this.cover.original) + ')'
     }
   },
   watch: {
diff --git a/front/src/components/library/Artists.vue b/front/src/components/library/Artists.vue
index 9f324eef34535705afba60225bd81495a0d7686d..1c4849cc31f946c1069a8a48907ed297bec3b164 100644
--- a/front/src/components/library/Artists.vue
+++ b/front/src/components/library/Artists.vue
@@ -1,15 +1,19 @@
 <template>
-  <div v-title="'Artists'">
+  <div v-title="labels.title">
     <div class="ui vertical stripe segment">
-      <h2 class="ui header"><i18next path="Browsing artists"/></h2>
+      <h2 class="ui header">
+        <translate>Browsing artists</translate>
+      </h2>
       <div :class="['ui', {'loading': isLoading}, 'form']">
         <div class="fields">
           <div class="field">
-            <label><i18next path="Search"/></label>
-            <input type="text" v-model="query" placeholder="Enter an artist name..."/>
+            <label>
+              <translate>Search</translate>
+            </label>
+            <input type="text" v-model="query" :placeholder="labels.searchPlaceholder"/>
           </div>
           <div class="field">
-            <i18next tag="label" path="Ordering"/>
+            <label><translate>Ordering</translate></label>
             <select class="ui dropdown" v-model="ordering">
               <option v-for="option in orderingOptions" :value="option[0]">
                 {{ option[1] }}
@@ -17,14 +21,14 @@
             </select>
           </div>
           <div class="field">
-            <i18next tag="label" path="Ordering direction"/>
+            <label><translate>Ordering direction</translate></label>
             <select class="ui dropdown" v-model="orderingDirection">
-              <option value="+">Ascending</option>
-              <option value="-">Descending</option>
+              <option value="+"><translate>Ascending</translate></option>
+              <option value="-"><translate>Descending</translate></option>
             </select>
           </div>
           <div class="field">
-            <i18next tag="label" path="Results per page"/>
+            <label><translate>Results per page</translate></label>
             <select class="ui dropdown" v-model="paginateBy">
               <option :value="parseInt(12)">12</option>
               <option :value="parseInt(25)">25</option>
@@ -53,7 +57,7 @@
       </div>
       <div class="ui center aligned basic segment">
         <pagination
-          v-if="result && result.results.length > 0"
+          v-if="result && result.count > paginateBy"
           @page-changed="selectPage"
           :current="page"
           :paginate-by="paginateBy"
@@ -109,6 +113,16 @@ export default {
   mounted () {
     $('.ui.dropdown').dropdown()
   },
+  computed: {
+    labels () {
+      let searchPlaceholder = this.$gettext('Enter an artist name...')
+      let title = this.$gettext('Artists')
+      return {
+        searchPlaceholder,
+        title
+      }
+    }
+  },
   methods: {
     updateQueryString: _.debounce(function () {
       this.$router.replace({
diff --git a/front/src/components/library/Home.vue b/front/src/components/library/Home.vue
index 2be693fab2ed7a2a58934b36945f21ec8ca4e41d..0bb16e1dd9e01d316169c45151a45da5a1114cb6 100644
--- a/front/src/components/library/Home.vue
+++ b/front/src/components/library/Home.vue
@@ -1,26 +1,29 @@
 <template>
-  <div v-title="'Home'">
-    <div class="ui vertical stripe segment">
-      <search :autofocus="true"></search>
-    </div>
+  <div v-title="labels.title">
     <div class="ui vertical stripe segment">
       <div class="ui stackable three column grid">
         <div class="column">
-          <h2 class="ui header"><i18next path="Latest artists"/></h2>
-          <div :class="['ui', {'active': isLoadingArtists}, 'inline', 'loader']"></div>
-          <div v-if="artists.length > 0" v-for="artist in artists.slice(0, 3)" :key="artist.id" class="ui cards">
-            <artist-card :artist="artist"></artist-card>
-          </div>
+          <track-widget :url="'history/listenings/'" :filters="{scope: 'user', ordering: '-creation_date'}">
+            <template slot="title"><translate>Recently listened</translate></template>
+          </track-widget>
         </div>
         <div class="column">
-          <h2 class="ui header"><i18next path="Radios"/></h2>
-          <radio-card :type="'favorites'"></radio-card>
-          <radio-card :type="'random'"></radio-card>
-          <radio-card :type="'less-listened'"></radio-card>
+          <track-widget :url="'favorites/tracks/'" :filters="{scope: 'user', ordering: '-creation_date'}">
+            <template slot="title"><translate>Recently favorited</translate></template>
+          </track-widget>
         </div>
         <div class="column">
-          <h2 class="ui header"><i18next path="Music requests"/></h2>
-          <request-form v-if="$store.state.auth.authenticated"></request-form>
+          <playlist-widget :url="'playlists/'" :filters="{scope: 'user', listenable: true, ordering: '-creation_date'}">
+            <template slot="title"><translate>Playlists</translate></template>
+          </playlist-widget>
+        </div>
+      </div>
+      <div class="ui section hidden divider"></div>
+      <div class="ui grid">
+        <div class="ui row">
+          <album-widget :filters="{ordering: '-creation_date'}">
+            <template slot="title"><translate>Recently added</translate></template>
+          </album-widget>
         </div>
       </div>
     </div>
@@ -32,8 +35,9 @@ import axios from 'axios'
 import Search from '@/components/audio/Search'
 import logger from '@/logging'
 import ArtistCard from '@/components/audio/artist/Card'
-import RadioCard from '@/components/radios/Card'
-import RequestForm from '@/components/requests/Form'
+import TrackWidget from '@/components/audio/track/Widget'
+import AlbumWidget from '@/components/audio/album/Widget'
+import PlaylistWidget from '@/components/playlists/Widget'
 
 const ARTISTS_URL = 'artists/'
 
@@ -42,8 +46,9 @@ export default {
   components: {
     Search,
     ArtistCard,
-    RadioCard,
-    RequestForm
+    TrackWidget,
+    AlbumWidget,
+    PlaylistWidget
   },
   data () {
     return {
@@ -54,12 +59,20 @@ export default {
   created () {
     this.fetchArtists()
   },
+  computed: {
+    labels () {
+      return {
+        title: this.$gettext('Home')
+      }
+    }
+  },
   methods: {
     fetchArtists () {
       var self = this
       this.isLoadingArtists = true
       let params = {
-        ordering: '-creation_date'
+        ordering: '-creation_date',
+        listenable: true
       }
       let url = ARTISTS_URL
       logger.default.time('Loading latest artists')
diff --git a/front/src/components/library/Library.vue b/front/src/components/library/Library.vue
index 5360de16cd0d959a9dbda011dd5d408ac7f97115..d860ab6dc606c804662e654d8eee329fa7984085 100644
--- a/front/src/components/library/Library.vue
+++ b/front/src/components/library/Library.vue
@@ -1,16 +1,24 @@
 <template>
   <div class="main library pusher">
     <div class="ui secondary pointing menu">
-      <router-link class="ui item" to="/library" exact><i18next path="Browse"/></router-link>
-      <router-link class="ui item" to="/library/artists" exact><i18next path="Artists"/></router-link>
-      <router-link class="ui item" to="/library/radios" exact><i18next path="Radios"/></router-link>
-      <router-link class="ui item" to="/library/playlists" exact><i18next path="Playlists"/></router-link>
+      <router-link class="ui item" to="/library" exact>
+        <translate>Browse</translate>
+      </router-link>
+      <router-link class="ui item" to="/library/artists" exact>
+        <translate>Artists</translate>
+      </router-link>
+      <router-link class="ui item" to="/library/radios" exact>
+        <translate>Radios</translate>
+      </router-link>
+      <router-link class="ui item" to="/library/playlists" exact>
+        <translate>Playlists</translate>
+      </router-link>
       <div class="ui secondary right menu">
         <router-link v-if="showImports" class="ui item" to="/library/import/launch" exact>
-          <i18next path="Import"/>
+          <translate>Import</translate>
         </router-link>
         <router-link v-if="showImports" class="ui item" to="/library/import/batches">
-          <i18next path="Import batches"/>
+          <translate>Import batches</translate>
         </router-link>
       </div>
     </div>
@@ -32,16 +40,6 @@ export default {
 <style lang="scss">
 @import '../../style/vendor/media';
 
-.library.pusher > .ui.secondary.menu {
-  @include media(">tablet") {
-    margin: 0 2.5rem;
-  }
-  .item {
-    padding-top: 1.5em;
-    padding-bottom: 1.5em;
-  }
-}
-
 .library {
   .ui.segment.head {
     background-size: cover;
@@ -67,7 +65,7 @@ export default {
 
     }
   }
-
 }
 
+
 </style>
diff --git a/front/src/components/library/Radios.vue b/front/src/components/library/Radios.vue
index 794e3a13b602fa7908393dbf0cedefbf15239106..2b542a71bef62ed5bd9f958bf4d535a297b7eae3 100644
--- a/front/src/components/library/Radios.vue
+++ b/front/src/components/library/Radios.vue
@@ -1,19 +1,37 @@
 <template>
-  <div v-title="'Radios'">
+  <div v-title="labels.title">
     <div class="ui vertical stripe segment">
-      <h2 class="ui header"><i18next path="Browsing radios"/></h2>
+      <h2 class="ui header">
+        <translate>Browsing radios</translate>
+      </h2>
+      <div class="ui hidden divider"></div>
+      <div class="ui row">
+        <h3 class="ui header">
+          <translate>Instance radios</translate>
+        </h3>
+        <div class="ui cards">
+          <radio-card :type="'favorites'"></radio-card>
+          <radio-card :type="'random'"></radio-card>
+          <radio-card :type="'less-listened'"></radio-card>
+        </div>
+      </div>
+
+      <div class="ui hidden divider"></div>
+      <h3 class="ui header">
+        <translate>User radios</translate>
+      </h3>
       <router-link class="ui green basic button" to="/library/radios/build" exact>
-        <i18next path="Create your own radio"/>
+        <translate>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">
-            <i18next tag="label" path="Search"/>
-            <input type="text" v-model="query" placeholder="Enter a radio name..."/>
+            <label><translate>Search</translate></label>
+            <input type="text" v-model="query" :placeholder="labels.searchPlaceholder"/>
           </div>
           <div class="field">
-            <i18next tag="label" path="Ordering"/>
+            <label><translate>Ordering</translate></label>
             <select class="ui dropdown" v-model="ordering">
               <option v-for="option in orderingOptions" :value="option[0]">
                 {{ option[1] }}
@@ -21,14 +39,18 @@
             </select>
           </div>
           <div class="field">
-            <i18next tag="label" path="Ordering direction"/>
+            <label><translate>Ordering direction</translate></label>
             <select class="ui dropdown" v-model="orderingDirection">
-              <option value="+"><i18next path="Ascending"/></option>
-              <option value="-"><i18next path="Descending"/></option>
+              <option value="+">
+                <translate>Ascending</translate>
+              </option>
+              <option value="-">
+                <translate>Descending</translate>
+              </option>
             </select>
           </div>
           <div class="field">
-            <i18next tag="label" path="Results per page"/>
+            <label><translate>Results per page</translate></label>
             <select class="ui dropdown" v-model="paginateBy">
               <option :value="parseInt(12)">12</option>
               <option :value="parseInt(25)">25</option>
@@ -57,7 +79,7 @@
       </div>
       <div class="ui center aligned basic segment">
         <pagination
-          v-if="result && result.results.length > 0"
+          v-if="result && result.count > paginateBy"
           @page-changed="selectPage"
           :current="page"
           :paginate-by="paginateBy"
@@ -113,6 +135,16 @@ export default {
   mounted () {
     $('.ui.dropdown').dropdown()
   },
+  computed: {
+    labels () {
+      let searchPlaceholder = this.$gettext('Enter a radio name...')
+      let title = this.$gettext('Radios')
+      return {
+        searchPlaceholder,
+        title
+      }
+    }
+  },
   methods: {
     updateQueryString: _.debounce(function () {
       this.$router.replace({
diff --git a/front/src/components/library/Track.vue b/front/src/components/library/Track.vue
index af364e94d6af39e4d459e1cbdc9ab105560d2f5f..01824292fc24d0fcfbf61e96c38ee28f7c286336 100644
--- a/front/src/components/library/Track.vue
+++ b/front/src/components/library/Track.vue
@@ -1,6 +1,6 @@
 <template>
   <div>
-    <div v-if="isLoadingTrack" class="ui vertical segment" v-title="'Track'">
+    <div v-if="isLoadingTrack" class="ui vertical segment" v-title="labels.title">
       <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
     </div>
     <template v-if="track">
@@ -11,18 +11,25 @@
             <div class="content">
               {{ track.title }}
               <div class="sub header">
-                <i18next path="From album {%0%} by {%1%}">
-                  <router-link :to="{name: 'library.albums.detail', params: {id: track.album.id }}">
-                    {{ track.album.title }}
-                  </router-link><router-link :to="{name: 'library.artists.detail', params: {id: track.artist.id }}">
-                    {{ track.artist.name }}
-                  </router-link>
-                </i18next>
+                <translate :translate-params="{album: track.album.title, artist: track.artist.name}">
+                  From album %{ album } by %{ artist }
+                </translate>
+              </div>
+              <br>
+              <div class="ui basic buttons">
+                <router-link class="ui button" :to="{name: 'library.albums.detail', params: {id: track.album.id }}">
+                  <translate>Album page</translate>
+                </router-link>
+                <router-link class="ui button" :to="{name: 'library.artists.detail', params: {id: track.artist.id }}">
+                  <translate>Artist page</translate>
+                </router-link>
               </div>
             </div>
           </h2>
 
-          <play-button class="orange" :track="track"><i18next path="Play"/></play-button>
+          <play-button class="orange" :track="track">
+            <translate>Play</translate>
+          </play-button>
           <track-favorite-icon :track="track" :button="true"></track-favorite-icon>
           <track-playlist-icon
             :button="true"
@@ -31,70 +38,72 @@
 
           <a :href="wikipediaUrl" target="_blank" class="ui button">
             <i class="wikipedia icon"></i>
-            <i18next path="Search on Wikipedia"/>
+            <translate>Search on Wikipedia</translate>
           </a>
           <a :href="musicbrainzUrl" target="_blank" class="ui button">
             <i class="external icon"></i>
-            <i18next path="View on MusicBrainz"/>
+            <translate>View on MusicBrainz</translate>
           </a>
           <a v-if="downloadUrl" :href="downloadUrl" target="_blank" class="ui button">
             <i class="download icon"></i>
-            <i18next path="Download"/>
+            <translate>Download</translate>
           </a>
         </div>
       </div>
       <div v-if="file" class="ui vertical stripe center aligned segment">
-        <h2 class="ui header">{{ $t('Track information') }}</h2>
+        <h2 class="ui header"><translate>Track information</translate></h2>
         <table class="ui very basic collapsing celled center aligned table">
           <tbody>
             <tr>
               <td>
-                {{ $t('Duration') }}
+                <translate>Duration</translate>
               </td>
               <td v-if="file.duration">
                 {{ time.parse(file.duration) }}
               </td>
               <td v-else>
-                {{ $t('N/A') }}
+                <translate>N/A</translate>
               </td>
             </tr>
             <tr>
               <td>
-                {{ $t('Size') }}
+                <translate>Size</translate>
               </td>
               <td v-if="file.size">
                 {{ file.size | humanSize }}
               </td>
               <td v-else>
-                {{ $t('N/A') }}
+                <translate>N/A</translate>
               </td>
             </tr>
             <tr>
               <td>
-                {{ $t('Bitrate') }}
+                <translate>Bitrate</translate>
               </td>
               <td v-if="file.bitrate">
                 {{ file.bitrate | humanSize }}/s
               </td>
               <td v-else>
-                {{ $t('N/A') }}
+                <translate>N/A</translate>
               </td>
             </tr>
           </tbody>
         </table>
       </div>
       <div class="ui vertical stripe center aligned segment">
-        <h2><i18next path="Lyrics"/></h2>
+        <h2>
+          <translate>Lyrics</translate>
+        </h2>
         <div v-if="isLoadingLyrics" class="ui vertical segment">
           <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
         </div>
         <div v-if="lyrics" v-html="lyrics.content_rendered">
         </div>
         <template v-if="!isLoadingLyrics & !lyrics">
-          <i18next tag="p" path="No lyrics available for this track."/>
+          <p><translate>No lyrics available for this track.</translate></p>
           <a class="ui button" target="_blank" :href="lyricsSearchUrl">
             <i class="search icon"></i>
-            <i18next path="Search on lyrics.wikia.com"/>
+            <translate>Search on lyrics.wikia.com</translate>
           </a>
         </template>
       </div>
@@ -160,6 +169,11 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        title: this.$gettext('Track')
+      }
+    },
     wikipediaUrl () {
       return 'https://en.wikipedia.org/w/index.php?search=' + this.track.title + ' ' + this.track.artist.name
     },
diff --git a/front/src/components/library/import/ArtistImport.vue b/front/src/components/library/import/ArtistImport.vue
index b24be6dc831af6ad3b417aef6cce9a65907e0137..f86f71cce1000fb2c998bdbca1969add1426f7f2 100644
--- a/front/src/components/library/import/ArtistImport.vue
+++ b/front/src/components/library/import/ArtistImport.vue
@@ -1,10 +1,12 @@
 <template>
   <div>
     <h3 class="ui dividing block header">
-      <a :href="getMusicbrainzUrl('artist', metadata.id)" target="_blank" title="View on MusicBrainz">{{ metadata.name }}</a>
+      <a :href="getMusicbrainzUrl('artist', metadata.id)" target="_blank" :title="labels.viewOnMusicbrainz">{{ metadata.name }}</a>
     </h3>
     <form class="ui form" @submit.prevent="">
-      <h6 class="ui header"><i18next path="Filter album types"/></h6>
+      <h6 class="ui header">
+        <translate>Filter album types</translate>
+      </h6>
       <div class="inline fields">
         <div class="field" v-for="t in availableReleaseTypes">
           <div class="ui checkbox">
@@ -13,7 +15,7 @@
           </div>
         </div>
         <div class="field">
-          <i18next tag="label" path="Query template"/>
+          <label><translate>Query template</translate></label>
           <input v-model="customQueryTemplate" />
         </div>
       </div>
@@ -124,6 +126,11 @@ export default Vue.extend({
     }
   },
   computed: {
+    labels () {
+      return {
+        viewOnMusicbrainz: this.$gettext('View on MusicBrainz')
+      }
+    },
     type () {
       return 'artist'
     },
diff --git a/front/src/components/library/import/BatchDetail.vue b/front/src/components/library/import/BatchDetail.vue
index f0e6502f02dfbb4cde87a5ea87e6e5925d1400bf..fc5801ed18143be8dc911b00f66c7c828e02a18a 100644
--- a/front/src/components/library/import/BatchDetail.vue
+++ b/front/src/components/library/import/BatchDetail.vue
@@ -1,5 +1,5 @@
 <template>
-  <div v-title="'Import Batch #' + id">
+  <div v-title="labels.title">
     <div v-if="isLoading && !batch" class="ui vertical segment">
       <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
     </div>
@@ -8,7 +8,7 @@
         <tbody>
           <tr>
             <td>
-              <strong>{{ $t('Import batch') }}</strong>
+              <strong><translate>Import batch</translate></strong>
             </td>
             <td>
               #{{ batch.id }}
@@ -16,7 +16,7 @@
           </tr>
           <tr>
             <td>
-              <strong>{{ $t('Launch date') }}</strong>
+              <strong><translate>Launch date</translate></strong>
             </td>
             <td>
               <human-date :date="batch.creation_date"></human-date>
@@ -24,35 +24,35 @@
           </tr>
           <tr v-if="batch.user">
             <td>
-              <strong>{{ $t('Submitted by') }}</strong>
+              <strong><translate>Submitted by</translate></strong>
             </td>
             <td>
               <username :username="batch.user.username" />
             </td>
           </tr>
           <tr v-if="stats">
-            <td><strong>{{ $t('Pending') }}</strong></td>
+            <td><strong><translate>Pending</translate></strong></td>
             <td>{{ stats.pending }}</td>
           </tr>
           <tr v-if="stats">
-            <td><strong>{{ $t('Skipped') }}</strong></td>
+            <td><strong><translate>Skipped</translate></strong></td>
             <td>{{ stats.skipped }}</td>
           </tr>
           <tr v-if="stats">
-            <td><strong>{{ $t('Errored') }}</strong></td>
+            <td><strong><translate>Errored</translate></strong></td>
             <td>
               {{ stats.errored }}
               <button
                 @click="rerun({batches: [batch.id], jobs: []})"
-                v-if="stats.errored > 0"
+                v-if="stats.errored > 0 || stats.pending > 0"
                 class="ui tiny basic icon button">
                 <i class="redo icon" />
-                {{ $t('Rerun errored jobs')}}
+                <translate>Rerun errored jobs</translate>
               </button>
             </td>
           </tr>
           <tr v-if="stats">
-            <td><strong>{{ $t('Finished') }}</strong></td>
+            <td><strong><translate>Finished</translate></strong></td>
             <td>{{ stats.finished }}/{{ stats.count}}</td>
           </tr>
         </tbody>
@@ -60,17 +60,17 @@
       <div class="ui inline form">
         <div class="fields">
           <div class="ui field">
-            <label>{{ $t('Search') }}</label>
-            <input type="text" v-model="jobFilters.search" placeholder="Search by source..." />
+            <label><translate>Search</translate></label>
+            <input type="text" v-model="jobFilters.search" :placeholder="labels.searchPlaceholder" />
           </div>
           <div class="ui field">
-            <label>{{ $t('Status') }}</label>
+            <label><translate>Status</translate></label>
             <select class="ui dropdown" v-model="jobFilters.status">
-              <option :value="null">{{ $t('Any') }}</option>
-              <option :value="'pending'">{{ $t('Pending') }}</option>
-              <option :value="'errored'">{{ $t('Errored') }}</option>
-              <option :value="'finished'">{{ $t('Success') }}</option>
-              <option :value="'skipped'">{{ $t('Skipped') }}</option>
+              <option :value="null"><translate>Any</translate></option>
+              <option :value="'pending'"><translate>Pending</translate></option>
+              <option :value="'errored'"><translate>Errored</translate></option>
+              <option :value="'finished'"><translate>Success</translate></option>
+              <option :value="'skipped'"><translate>Skipped</translate></option>
             </select>
           </div>
         </div>
@@ -78,11 +78,11 @@
       <table v-if="jobResult" class="ui unstackable table">
         <thead>
           <tr>
-            <th>{{ $t('Job ID') }}</th>
-            <th>{{ $t('Recording MusicBrainz ID') }}</th>
-            <th>{{ $t('Source') }}</th>
-            <th>{{ $t('Status') }}</th>
-            <th>{{ $t('Track') }}</th>
+            <th><translate>Job ID</translate></th>
+            <th><translate>Recording MusicBrainz ID</translate></th>
+            <th><translate>Source</translate></th>
+            <th><translate>Status</translate></th>
+            <th><translate>Track</translate></th>
           </tr>
         </thead>
         <tbody>
@@ -102,8 +102,8 @@
                 {{ job.status }}</span>
                 <button
                   @click="rerun({batches: [], jobs: [job.id]})"
-                  v-if="job.status === 'errored'"
-                  :title="$t('Rerun job')"
+                  v-if="['errored', 'pending'].indexOf(job.status) > -1"
+                  :title="labels.rerun"
                   class="ui tiny basic icon button">
                   <i class="redo icon" />
                 </button>
@@ -117,7 +117,7 @@
           <tr>
             <th>
               <pagination
-              v-if="jobResult && jobResult.results.length > 0"
+              v-if="jobResult && jobResult.count > jobFilters.paginateBy"
               @page-changed="selectPage"
               :compact="true"
               :current="jobFilters.page"
@@ -126,7 +126,10 @@
               ></pagination>
             </th>
             <th v-if="jobResult && jobResult.results.length > 0">
-              {{ $t('Showing results {%start%}-{%end%} on {%total%}', {start: ((jobFilters.page-1) * jobFilters.paginateBy) + 1 , end: ((jobFilters.page-1) * jobFilters.paginateBy) + jobResult.results.length, total: jobResult.count})}}
+              <translate
+                :translate-params="{start: ((jobFilters.page-1) * jobFilters.paginateBy) + 1, end: ((jobFilters.page-1) * jobFilters.paginateBy) + jobResult.results.length, total: jobResult.count}">
+                Showing results %{ start }-%{ end } on %{ total }
+              </translate>
             <th>
             <th></th>
             <th></th>
@@ -177,6 +180,19 @@ export default {
       clearTimeout(this.timeout)
     }
   },
+  computed: {
+    labels () {
+      let msg = this.$gettext('Import Batch #%{ id }')
+      let title = this.$gettextInterpolate(msg, {id: this.id})
+      let rerun = this.$gettext('Rerun job')
+      let searchPlaceholder = this.$gettext('Search by source...')
+      return {
+        title,
+        searchPlaceholder,
+        rerun
+      }
+    }
+  },
   methods: {
     fetchData () {
       var self = this
diff --git a/front/src/components/library/import/BatchList.vue b/front/src/components/library/import/BatchList.vue
index bf5a0ca47599e79b56559563aca8291fb3aff0e4..9ef6bd9cd3a6338c2324d2944da14272ecf6882a 100644
--- a/front/src/components/library/import/BatchList.vue
+++ b/front/src/components/library/import/BatchList.vue
@@ -1,29 +1,29 @@
 <template>
-  <div v-title="'Import Batches'">
+  <div v-title="labels.title">
     <div class="ui vertical stripe segment">
       <div v-if="isLoading" :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
       <div class="ui inline form">
         <div class="fields">
           <div class="ui field">
-            <label>{{ $t('Search') }}</label>
-            <input type="text" v-model="filters.search" placeholder="Search by submitter, source..." />
+            <label><translate>Search</translate></label>
+            <input type="text" v-model="filters.search" :placeholder="labels.searchPlaceholder" />
           </div>
           <div class="ui field">
-            <label>{{ $t('Status') }}</label>
+            <label><translate>Status</translate></label>
             <select class="ui dropdown" v-model="filters.status">
-              <option :value="null">{{ $t('Any') }}</option>
-              <option :value="'pending'">{{ $t('Pending') }}</option>
-              <option :value="'errored'">{{ $t('Errored') }}</option>
-              <option :value="'finished'">{{ $t('Success') }}</option>
+              <option :value="null"><translate>Any</translate></option>
+              <option :value="'pending'"><translate>Pending</translate></option>
+              <option :value="'errored'"><translate>Errored</translate></option>
+              <option :value="'finished'"><translate>Success</translate></option>
             </select>
           </div>
           <div class="ui field">
-            <label>{{ $t('Import source') }}</label>
+            <label><translate>Import source</translate></label>
             <select class="ui dropdown" v-model="filters.source">
-              <option :value="null">{{ $t('Any') }}</option>
-              <option :value="'shell'">{{ $t('CLI') }}</option>
-              <option :value="'api'">{{ $t('API') }}</option>
-              <option :value="'federation'">{{ $t('Federation') }}</option>
+              <option :value="null"><translate>Any</translate></option>
+              <option :value="'shell'"><translate>CLI</translate></option>
+              <option :value="'api'"><translate>API</translate></option>
+              <option :value="'federation'"><translate>Federation</translate></option>
             </select>
           </div>
         </div>
@@ -32,12 +32,12 @@
       <table v-if="result && result.results.length > 0" class="ui unstackable table">
         <thead>
           <tr>
-            <th>{{ $t('ID') }}</th>
-            <th>{{ $t('Launch date') }}</th>
-            <th>{{ $t('Jobs') }}</th>
-            <th>{{ $t('Status') }}</th>
-            <th>{{ $t('Source') }}</th>
-            <th>{{ $t('Submitted by') }}</th>
+            <th><translate>ID</translate></th>
+            <th><translate>Launch date</translate></th>
+            <th><translate>Jobs</translate></th>
+            <th><translate>Status</translate></th>
+            <th><translate>Source</translate></th>
+            <th><translate>Submitted by</translate></th>
           </tr>
         </thead>
         <tbody>
@@ -62,7 +62,7 @@
           <tr>
             <th>
               <pagination
-              v-if="result && result.results.length > 0"
+              v-if="result && result.count > filters.paginateBy"
               @page-changed="selectPage"
               :compact="true"
               :current="filters.page"
@@ -71,7 +71,10 @@
               ></pagination>
             </th>
             <th v-if="result && result.results.length > 0">
-              {{ $t('Showing results {%start%}-{%end%} on {%total%}', {start: ((filters.page-1) * filters.paginateBy) + 1 , end: ((filters.page-1) * filters.paginateBy) + result.results.length, total: result.count})}}
+              <translate
+                :translate-params="{start: ((filters.page-1) * filters.paginateBy) + 1, end: ((filters.page-1) * filters.paginateBy) + result.results.length, total: result.count}">
+                Showing results %{ start }-%{ end } on %{ total }
+              </translate>
             <th>
             <th></th>
             <th></th>
@@ -108,6 +111,16 @@ export default {
   created () {
     this.fetchData()
   },
+  computed: {
+    labels () {
+      let searchPlaceholder = this.$gettext('Search by submitter, source...')
+      let title = this.$gettext('Import Batches')
+      return {
+        searchPlaceholder,
+        title
+      }
+    }
+  },
   methods: {
     fetchData () {
       let params = {
diff --git a/front/src/components/library/import/FileUpload.vue b/front/src/components/library/import/FileUpload.vue
index fb88c006d3a53a33116d64a1044ee1c0b7802dac..a9b685523ecac9181ba0260402c0942d739fa80c 100644
--- a/front/src/components/library/import/FileUpload.vue
+++ b/front/src/components/library/import/FileUpload.vue
@@ -2,8 +2,8 @@
   <div>
     <div v-if="batch" class="ui container">
       <div class="ui message">
-        {{ $t('Ensure your music files are properly tagged before uploading them.') }}
-        <a href="http://picard.musicbrainz.org/" target='_blank'>{{ $t('We recommend using Picard for that purpose.') }}</a>
+        <translate>Ensure your music files are properly tagged before uploading them.</translate>
+        <a href="http://picard.musicbrainz.org/" target='_blank'><translate>We recommend using Picard for that purpose.</translate></a>
       </div>
       <file-upload-widget
         :class="['ui', 'icon', 'left', 'floated', 'button']"
@@ -15,36 +15,35 @@
         accept="audio/*"
         v-model="files"
         name="audio_file"
-        :thread="3"
+        :thread="1"
         @input-filter="inputFilter"
         @input-file="inputFile"
         ref="upload">
         <i class="upload icon"></i>
-        <i18next path="Select files to upload..."/>
+        <translate>Select files to upload...</translate>
     </file-upload-widget>
       <button
         :class="['ui', 'right', 'floated', 'icon', {disabled: files.length === 0}, 'button']"
         v-if="!$refs.upload || !$refs.upload.active" @click.prevent="startUpload()">
         <i class="play icon" aria-hidden="true"></i>
-        <i18next path="Start Upload"/>
+        <translate>Start Upload</translate>
       </button>
       <button type="button" class="ui right floated icon yellow button" v-else @click.prevent="$refs.upload.active = false">
         <i class="pause icon" aria-hidden="true"></i>
-        <i18next path="Stop Upload"/>
+        <translate>Stop Upload</translate>
       </button>
     </div>
     <div class="ui hidden clearing divider"></div>
-    <i18next v-if="batch" path="Once all your files are uploaded, simply head over {%0%} to check the import status.">
-      <router-link :to="{name: 'library.import.batches.detail', params: {id: batch.id }}">
-        <i18next path="import detail page"/>
-      </router-link>
-    </i18next>
+    <template v-if="batch"><translate>Once all your files are uploaded, simply click the following button to check the import status.</translate></template>
+    <router-link class="ui basic button" v-if="batch" :to="{name: 'library.import.batches.detail', params: {id: batch.id }}">
+      <translate>Import detail page</translate>
+    </router-link>
     <table class="ui single line table">
       <thead>
         <tr>
-          <i18next tag="th" path="File name"/>
-          <i18next tag="th" path="Size"/>
-          <i18next tag="th" path="Status"/>
+          <th><translate>File name</translate></th>
+          <th><translate>Size</translate></th>
+          <th><translate>Status</translate></th>
         </tr>
       </thead>
       <tbody>
@@ -55,10 +54,10 @@
             <span v-if="file.error" class="ui red label">
               {{ file.error }}
             </span>
-            <i18next v-else-if="file.success" class="ui green label" path="Success"/>
-            <i18next v-else-if="file.active" class="ui yellow label" path="Uploading..."/>
+            <span v-else-if="file.success" class="ui green label"><translate>Success</translate></span>
+            <span v-else-if="file.active" class="ui yellow label"><translate>Uploading...</translate></span>
             <template v-else>
-              <i18next class="ui label" path="Pending"/>
+              <span class="ui label"><translate>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/import/Main.vue b/front/src/components/library/import/Main.vue
index eac1239a836a60d4393545253db392dc2b9ac12b..08047fd2fc1b09f020c6b8680f24548a5f0ce964 100644
--- a/front/src/components/library/import/Main.vue
+++ b/front/src/components/library/import/Main.vue
@@ -1,37 +1,47 @@
 <template>
-  <div v-title="'Import Music'">
+  <div v-title="labels.title">
     <div class="ui vertical stripe segment">
       <div class="ui top three attached ordered steps">
         <a @click="currentStep = 0" :class="['step', {'active': currentStep === 0}, {'completed': currentStep > 0}]">
           <div class="content">
-            <i18next tag="div" class="title" path="Import source"/>
-            <i18next tag="div" class="description" path="Uploaded files or external source"/>
+            <div class="title"><translate>Import source</translate></div>
+            <div class="description"><translate>Uploaded files or external source</translate></div>
           </div>
         </a>
         <a @click="currentStep = 1" :class="['step', {'active': currentStep === 1}, {'completed': currentStep > 1}]">
           <div class="content">
-            <i18next tag="div" class="title" path="Metadata"/>
-            <i18next tag="div" class="description" path="Grab corresponding metadata"/>
+            <div class="title"><translate>Metadata</translate></div>
+            <div class="description"><translate>Grab corresponding metadata</translate></div>
           </div>
         </a>
         <a @click="currentStep = 2" :class="['step', {'active': currentStep === 2}, {'completed': currentStep > 2}]">
           <div class="content">
-            <i18next tag="div" class="title" path="Music"/>
-            <i18next tag="div" class="description" path="Select relevant sources or files for import"/>
+            <div class="title"><translate>Music</translate></div>
+            <div class="description"><translate>Select relevant sources or files for import</translate></div>
           </div>
         </a>
       </div>
       <div class="ui hidden divider"></div>
       <div class="ui centered buttons">
-        <button @click="currentStep -= 1" :disabled="currentStep === 0" class="ui icon button"><i class="left arrow icon"></i><i18next path="Previous step"/></button>
-        <button @click="nextStep()" v-if="currentStep < 2" class="ui icon button"><i18next path="Next step"/><i class="right arrow icon"></i></button>
+        <button @click="currentStep -= 1" :disabled="currentStep === 0" class="ui icon button"><i class="left arrow icon"></i>
+          <translate>Previous step</translate>
+        </button>
+        <button @click="nextStep()" v-if="currentStep < 2" class="ui icon button">
+          <translate>Next step</translate>
+          <i class="right arrow icon"></i>
+        </button>
         <button
           @click="$refs.import.launchImport()"
           v-if="currentStep === 2 && currentSource != 'upload'"
           :class="['ui', 'positive', 'icon', {'loading': isImporting}, 'button']"
           :disabled="isImporting || importData.count === 0"
           >
-            <i18next path="Import {%0%} tracks">{{ importData.count }}</i18next>
+            <translate
+              :translate-params="{count: importData.count || 0}"
+              :translate-n="importData.count || 0"
+              translate-plural="Import %{ count } tracks">
+              Import %{ count } track
+            </translate>
             <i class="check icon"></i>
           </button>
         <button
@@ -40,20 +50,20 @@
           :class="['ui', 'positive', 'icon', {'disabled': !importBatch}, 'button']"
           :disabled="!importBatch"
           >
-            {{ $t('Finish import' )}}
+            <translate>Finish import</translate>
             <i class="check icon"></i>
           </button>
       </div>
       <div class="ui hidden divider"></div>
       <div class="ui attached segment">
         <template v-if="currentStep === 0">
-          <i18next tag="p" path="First, choose where you want to import the music from"/>
+          <p><translate>First, choose where you want to import the music from</translate></p>
           <form class="ui form">
             <div class="field">
               <div class="ui radio checkbox">
                 <input type="radio" id="external" value="external" v-model="currentSource">
                 <label for="external">
-                  <i18next path="External source. Supported backends"/>
+                  <translate>External source. Supported backends</translate>
                   <div v-for="backend in backends" class="ui basic label">
                     <i v-if="backend.icon" :class="[backend.icon, 'icon']"></i>
                     {{ backend.label }}
@@ -64,7 +74,7 @@
             <div class="field">
               <div class="ui radio checkbox">
                 <input type="radio" id="upload" value="upload" v-model="currentSource">
-                <i18next tag="label" for="upload" path="File upload" />
+                <label for="upload"><translate>File upload</translate></label>
               </div>
             </div>
           </form>
@@ -73,7 +83,7 @@
           <div class="column">
             <form class="ui form" @submit.prevent="">
               <div class="field">
-                <i18next tag="label" path="Search an entity you want to import:"/>
+                <label><translate>Search an entity you want to import:</translate></label>
                 <metadata-search
                   :mb-type="mbType"
                   :mb-id="mbId"
@@ -81,29 +91,35 @@
                   @type-changed="updateType"></metadata-search>
               </div>
             </form>
-            <i18next tag="div" class="ui horizontal divider" path="Or"/>
+            <div class="ui horizontal divider"><translate>Or</translate></div>
             <form class="ui form" @submit.prevent="">
               <div class="field">
-                <i18next tag="label" path="Input a MusicBrainz ID manually:"/>
+                <label><translate>Input a MusicBrainz ID manually:</translate></label>
                 <input type="text" v-model="currentId" />
               </div>
             </form>
             <div class="ui hidden divider"></div>
             <template v-if="currentType && currentId">
-              <h4 class="ui header"><i18next path="You will import:"/></h4>
+              <h4 class="ui header">
+                <translate>You will import:</translate>
+              </h4>
               <component
                 :mbId="currentId"
                 :is="metadataComponent"
                 @metadata-changed="this.updateMetadata"
                 ></component>
             </template>
-            <i18next tag="p" path="You can also skip this step and enter metadata manually."/>
+            <p><translate>You can also skip this step and enter metadata manually.</translate></p>
           </div>
           <div class="column">
-            <h5 class="ui header">What is metadata?</h5>
-            <i18next tag="p" path="Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the {%0%} project, which you can think about as the Wikipedia of music.">
-              <a href="http://musicbrainz.org/" target="_blank">MusicBrainz</a>
-            </i18next>
+            <h5 class="ui header"><translate>What is metadata?</translate></h5>
+            <template v-translate>
+              Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the
+              <a href="https://musicbrainz.org" target="_blank">
+                MusicBrainz
+              </a>
+              project, which you can think about as the Wikipedia of music.
+            </template>
           </div>
         </div>
         <div v-if="currentStep === 2">
@@ -128,8 +144,10 @@
       </div>
     </div>
     <div class="ui vertical stripe segment" v-if="currentRequest">
-      <h3 class="ui header"><i18next path="Music request"/></h3>
-      <i18next tag="p" path="This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled."/>
+      <h3 class="ui header">
+        <translate>Music request</translate>
+      </h3>
+      <p><translate>This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled.</translate></p>
       <request-card :request="currentRequest" :import-action="false"></request-card>
 
     </div>
@@ -244,6 +262,11 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        title: this.$gettext('Import Music')
+      }
+    },
     metadataComponent () {
       if (this.currentType === 'artist') {
         return 'ArtistCard'
diff --git a/front/src/components/library/import/ReleaseImport.vue b/front/src/components/library/import/ReleaseImport.vue
index 4b792b3921a2fa091c4db82962e24e0d93258bb4..0ec78903071224dbdbc613594228801a5c297a7f 100644
--- a/front/src/components/library/import/ReleaseImport.vue
+++ b/front/src/components/library/import/ReleaseImport.vue
@@ -1,16 +1,18 @@
 <template>
   <div>
     <h3 class="ui dividing block header">
-      <i18next path="Album {%0%} ({%1%} tracks) by {%2%}">
-        <a :href="getMusicbrainzUrl('release', metadata.id)" target="_blank" title="View on MusicBrainz">{{ metadata.title }}</a>
-        ({{ tracks.length}} tracks)
-        <a :href="getMusicbrainzUrl('artist', metadata['artist-credit'][0]['artist']['id'])" target="_blank" title="View on MusicBrainz">{{ metadata['artist-credit-phrase'] }}</a>
-      </i18next>
+      <translate
+        tag="div"
+        translate-plural="Album %{ title } (%{ count } tracks) by %{ artist }"
+        :translate-n="tracks.length"
+        :translate-params="{count: tracks.length, title: metadata.title, artist: metadata['artist-credit-phrase']}">
+        Album %{ title } (%{ count } track) by %{ artist }
+      </translate>
       <div class="ui divider"></div>
       <div class="sub header">
         <div class="ui toggle checkbox">
           <input type="checkbox" v-model="enabled" />
-          <i18next tag="label" path="Import this release"/>
+          <label><translate>Import this release</translate></label>
         </div>
       </div>
     </h3>
diff --git a/front/src/components/library/import/TrackImport.vue b/front/src/components/library/import/TrackImport.vue
index 7f07763bf3e260d69344efeef6bd2f4e5453453b..10a146344489bb54b6c73a30b7c24ac6d5d76434 100644
--- a/front/src/components/library/import/TrackImport.vue
+++ b/front/src/components/library/import/TrackImport.vue
@@ -9,13 +9,13 @@
       </h5>
       <div class="ui toggle checkbox">
         <input type="checkbox" v-model="enabled" />
-        <i18next tag="label" path="Import this track"/>
+        <label><translate>Import this track</translate></label>
       </div>
     </div>
     <div class="three wide column" v-if="enabled">
       <form class="ui mini form" @submit.prevent="">
         <div class="field">
-          <i18next tag="label" path="Source"/>
+          <label><translate>Source</translate></label>
           <select v-model="currentBackendId">
             <option v-for="backend in backends" :value="backend.id">
               {{ backend.label }}
@@ -28,10 +28,10 @@
         <button @click="currentResultIndex -= 1" class="ui basic tiny icon button" :disabled="currentResultIndex === 0">
           <i class="left arrow icon"></i>
         </button>
-        <i18next path="Result {%0%}/{%1%}">
-          {{ currentResultIndex + 1 }}
-          {{ results.length }}
-        </i18next>
+        {{ results.total }}
+        <translate :translate-params="{current: currentResultIndex + 1, total: results.length}">
+          Result %{ current }/%{ total }
+        </translate>
         <button @click="currentResultIndex += 1" class="ui basic tiny icon button" :disabled="currentResultIndex + 1 === results.length">
           <i class="right arrow icon"></i>
         </button>
@@ -40,9 +40,9 @@
     <div class="four wide column" v-if="enabled">
       <form class="ui mini form" @submit.prevent="">
         <div class="field">
-          <i18next tag="label" path="Search query"/>
+          <label><translate>Search query</translate></label>
           <input type="text" v-model="query" />
-          <i18next tag="label" path="Imported URL"/>
+          <label><translate>Imported URL</translate></label>
           <input type="text" v-model="importedUrl" />
         </div>
       </form>
diff --git a/front/src/components/library/radios/Builder.vue b/front/src/components/library/radios/Builder.vue
index 6c81f532f2a9478ca7a66ecfbeb255e103ba2c09..ff991431fbf59d52d573b7f454f2f31133259c7e 100644
--- a/front/src/components/library/radios/Builder.vue
+++ b/front/src/components/library/radios/Builder.vue
@@ -1,31 +1,51 @@
 <template>
-  <div class="ui vertical stripe segment" v-title="'Radio Builder'">
+  <div class="ui vertical stripe segment" v-title="labels.title">
     <div>
       <div>
-        <h2 class="ui header"><i18next path="Builder"/></h2>
-        <i18next tag="p" path="You can use this interface to build your own custom radio, which will play tracks according to your criteria"/>
-          <div class="ui form">
+        <h2 class="ui header">
+          <translate>Builder</translate>
+        </h2>
+        <p><translate>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>Radio updated</translate>
+              </template>
+              <template v-else>
+                <translate>Radio created</translate>
+              </template>
+            </div>
+          </div>
           <div class="inline fields">
             <div class="field">
-              <i18next tag="label" for="name" path="Radio name"/>
-              <input id="name" type="text" v-model="radioName" placeholder="My awesome radio" />
+              <label for="name"><translate>Radio name</translate></label>
+              <input id="name" type="text" v-model="radioName" :placeholder="labels.placeholder" />
             </div>
             <div class="field">
               <input id="public" type="checkbox" v-model="isPublic" />
-              <i18next tag="label" for="public" path="Display publicly"/>
+              <label for="public"><translate>Display publicly</translate></label>
             </div>
-            <button :disabled="!canSave" @click="save" class="ui green button"><i18next path="Save"/></button>
+            <button :disabled="!canSave" @click="save" :class="['ui', 'green', {loading: isLoading}, 'button']">
+              <translate>Save</translate>
+            </button>
             <radio-button v-if="id" type="custom" :custom-radio-id="id"></radio-button>
           </div>
         </div>
         <div class="ui form">
-          <p><i18next path="Add filters to customize your radio"/></p>
+          <p>
+            <translate>Add filters to customize your radio</translate>
+          </p>
           <div class="inline field">
             <select class="ui dropdown" v-model="currentFilterType">
-              <option value=""><i18next path="Select a filter"/></option>
+              <option value="">
+                <translate>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"><i18next path="Add filter"/></button>
+            <button :disabled="!currentFilterType" @click="add" class="ui button">
+              <translate>Add filter</translate>
+            </button>
           </div>
           <p v-if="currentFilter">
             {{ currentFilter.help_text }}
@@ -34,11 +54,11 @@
         <table class="ui table">
           <thead>
             <tr>
-              <i18next tag="th" class="two wide" path="Filter name"/>
-              <i18next tag="th" class="one wide" path="Exclude"/>
-              <i18next tag="th" class="six wide" path="Config"/>
-              <i18next tag="th" class="five wide" path="Candidates"/>
-              <i18next tag="th" class="two wide" path="Actions"/>
+              <th class="two wide"><translate>Filter name</translate></th>
+              <th class="one wide"><translate>Exclude</translate></th>
+              <th class="six wide"><translate>Config</translate></th>
+              <th class="five wide"><translate>Candidates</translate></th>
+              <th class="two wide"><translate>Actions</translate></th>
             </tr>
           </thead>
           <tbody>
@@ -54,9 +74,13 @@
           </tbody>
         </table>
         <template v-if="checkResult">
-          <i18next tag="h3" class="ui header" path="{%0%} tracks matching combined filters">
-            {{ checkResult.candidates.count }}
-          </i18next>
+          <h3
+            class="ui header"
+            v-translate="{count: checkResult.candidates.count}"
+            :translate-n="checkResult.candidates.count"
+            translate-plural="%{ count } tracks matching combined filters">
+            %{ count } track matching combined filters
+          </h3>
           <track-table v-if="checkResult.candidates.sample" :tracks="checkResult.candidates.sample"></track-table>
         </template>
       </div>
@@ -82,6 +106,8 @@ export default {
   },
   data: function () {
     return {
+      isLoading: false,
+      success: false,
       availableFilters: [],
       currentFilterType: null,
       filters: [],
@@ -127,6 +153,7 @@ export default {
     },
     fetch: function () {
       let self = this
+      self.isLoading = true
       let url = 'radios/radios/' + this.id + '/'
       axios.get(url).then((response) => {
         self.filters = response.data.config.map(f => {
@@ -138,6 +165,7 @@ export default {
         })
         self.radioName = response.data.name
         self.isPublic = response.data.is_public
+        self.isLoading = false
       })
     },
     fetchCandidates: function () {
@@ -159,6 +187,9 @@ export default {
     },
     save: function () {
       let self = this
+      self.success = false
+      self.isLoading = true
+
       let final = this.filters.map(f => {
         let c = _.clone(f.config)
         c.type = f.filter.type
@@ -172,10 +203,14 @@ export default {
       if (this.id) {
         let url = 'radios/radios/' + this.id + '/'
         axios.put(url, final).then((response) => {
+          self.isLoading = false
+          self.success = true
         })
       } else {
         let url = 'radios/radios/'
         axios.post(url, final).then((response) => {
+          self.success = true
+          self.isLoading = false
           self.$router.push({
             name: 'library.radios.detail',
             params: {
@@ -187,6 +222,14 @@ export default {
     }
   },
   computed: {
+    labels () {
+      let title = this.$gettext('Radio Builder')
+      let placeholder = this.$gettext('My awesome radio')
+      return {
+        title,
+        placeholder
+      }
+    },
     canSave: function () {
       return (
         this.radioName.length > 0 && this.checkErrors.length === 0
diff --git a/front/src/components/library/radios/Filter.vue b/front/src/components/library/radios/Filter.vue
index 0d268dc60faad8355650aed431ad4174d22ce464..470d852fadfda8f5e292e8d256584d550d55cc8c 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">
-          <i18next path="Track matching filter"/>
+          <translate>Track matching filter</translate>
         </div>
         <div class="content">
           <div class="description">
@@ -51,13 +51,13 @@
         </div>
         <div class="actions">
           <div class="ui black deny button">
-            <i18next path="Cancel"/>
+            <translate>Cancel</translate>
           </div>
         </div>
       </modal>
     </td>
     <td>
-      <button @click="$emit('delete', index)" class="ui basic red button"><i18next path="Remove"/></button>
+      <button @click="$emit('delete', index)" class="ui basic red button"><translate>Remove</translate></button>
     </td>
   </tr>
 </template>
diff --git a/front/src/components/manage/library/FilesTable.vue b/front/src/components/manage/library/FilesTable.vue
index 2788006f4a4b1c63ca3e5ff8445cad38f2ef7880..731e19471af4117e1fda989e8ea5f05bb7980f3a 100644
--- a/front/src/components/manage/library/FilesTable.vue
+++ b/front/src/components/manage/library/FilesTable.vue
@@ -3,11 +3,11 @@
     <div class="ui inline form">
       <div class="fields">
         <div class="ui field">
-          <label>{{ $t('Search') }}</label>
-          <input type="text" v-model="search" placeholder="Search by title, artist, domain..." />
+          <label><translate>Search</translate></label>
+          <input type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
         </div>
         <div class="field">
-          <i18next tag="label" path="Ordering"/>
+          <label><translate>Ordering</translate></label>
           <select class="ui dropdown" v-model="ordering">
             <option v-for="option in orderingOptions" :value="option[0]">
               {{ option[1] }}
@@ -15,10 +15,10 @@
           </select>
         </div>
         <div class="field">
-          <i18next tag="label" path="Ordering direction"/>
+          <label><translate>Ordering direction</translate></label>
           <select class="ui dropdown" v-model="orderingDirection">
-            <option value="+">Ascending</option>
-            <option value="-">Descending</option>
+            <option value="+"><translate>Ascending</translate></option>
+            <option value="-"><translate>Descending</translate></option>
           </select>
         </div>
       </div>
@@ -35,14 +35,14 @@
         :action-url="'manage/library/track-files/action/'"
         :filters="actionFilters">
         <template slot="header-cells">
-          <th>{{ $t('Title') }}</th>
-          <th>{{ $t('Artist') }}</th>
-          <th>{{ $t('Album') }}</th>
-          <th>{{ $t('Import date') }}</th>
-          <th>{{ $t('Type') }}</th>
-          <th>{{ $t('Bitrate') }}</th>
-          <th>{{ $t('Duration') }}</th>
-          <th>{{ $t('Size') }}</th>
+          <th><translate>Title</translate></th>
+          <th><translate>Artist</translate></th>
+          <th><translate>Album</translate></th>
+          <th><translate>Import date</translate></th>
+          <th><translate>Type</translate></th>
+          <th><translate>Bitrate</translate></th>
+          <th><translate>Duration</translate></th>
+          <th><translate>Size</translate></th>
         </template>
         <template slot="row-cells" slot-scope="scope">
           <td>
@@ -61,32 +61,32 @@
             {{ scope.obj.audio_mimetype }}
           </td>
           <td v-else>
-            {{ $t('N/A') }}
+            <translate>N/A</translate>
           </td>
           <td v-if="scope.obj.bitrate">
             {{ scope.obj.bitrate | humanSize }}/s
           </td>
           <td v-else>
-            {{ $t('N/A') }}
+            <translate>N/A</translate>
           </td>
           <td v-if="scope.obj.duration">
             {{ time.parse(scope.obj.duration) }}
           </td>
           <td v-else>
-            {{ $t('N/A') }}
+            <translate>N/A</translate>
           </td>
           <td v-if="scope.obj.size">
             {{ scope.obj.size | humanSize }}
           </td>
           <td v-else>
-            {{ $t('N/A') }}
+            <translate>N/A</translate>
           </td>
         </template>
       </action-table>
     </div>
     <div>
       <pagination
-        v-if="result && result.results.length > 0"
+        v-if="result && result.count > paginateBy"
         @page-changed="selectPage"
         :compact="true"
         :current="page"
@@ -95,7 +95,10 @@
         ></pagination>
 
       <span v-if="result && result.results.length > 0">
-        {{ $t('Showing results {%start%}-{%end%} on {%total%}', {start: ((page-1) * paginateBy) + 1 , end: ((page-1) * paginateBy) + result.results.length, total: result.count})}}
+        <translate
+          :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
+          Showing results %{ start }-%{ end } on %{ total }
+        </translate>
       </span>
     </div>
   </div>
@@ -167,6 +170,11 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        searchPlaceholder: this.$gettext('Search by title, artist, domain...')
+      }
+    },
     actionFilters () {
       var currentFilters = {
         q: this.search
@@ -178,10 +186,11 @@ export default {
       }
     },
     actions () {
+      let msg = this.$gettext('Delete')
       return [
         {
           name: 'delete',
-          label: this.$t('Delete'),
+          label: msg,
           isDangerous: true
         }
       ]
diff --git a/front/src/components/manage/library/RequestsTable.vue b/front/src/components/manage/library/RequestsTable.vue
index e51b911a762a46504f4783f376e63ac4180c4ce8..422c75287d25fec105be6fa08eaac52b9e507ace 100644
--- a/front/src/components/manage/library/RequestsTable.vue
+++ b/front/src/components/manage/library/RequestsTable.vue
@@ -3,11 +3,11 @@
     <div class="ui inline form">
       <div class="fields">
         <div class="ui field">
-          <label>{{ $t('Search') }}</label>
-          <input type="text" v-model="search" placeholder="Search by artist, username, comment..." />
+          <label><translate>Search</translate></label>
+          <input type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
         </div>
         <div class="field">
-          <i18next tag="label" path="Ordering"/>
+          <label><translate>Ordering</translate></label>
           <select class="ui dropdown" v-model="ordering">
             <option v-for="option in orderingOptions" :value="option[0]">
               {{ option[1] }}
@@ -15,20 +15,20 @@
           </select>
         </div>
         <div class="field">
-          <i18next tag="label" path="Ordering direction"/>
+          <label><translate>Ordering direction</translate></label>
           <select class="ui dropdown" v-model="orderingDirection">
-            <option value="+">Ascending</option>
-            <option value="-">Descending</option>
+            <option value="+"><translate>Ascending</translate></option>
+            <option value="-"><translate>Descending</translate></option>
           </select>
         </div>
         <div class="field">
-          <label>{{ $t("Status") }}</label>
+          <label><translate>Status</translate></label>
           <select class="ui dropdown" v-model="status">
-            <option :value="null">{{ $t('All') }}</option>
-            <option :value="'pending'">{{ $t('Pending') }}</option>
-            <option :value="'accepted'">{{ $t('Accepted') }}</option>
-            <option :value="'imported'">{{ $t('Imported') }}</option>
-            <option :value="'closed'">{{ $t('Closed') }}</option>
+            <option :value="null"><translate>All</translate></option>
+            <option :value="'pending'"><translate>Pending</translate></option>
+            <option :value="'accepted'"><translate>Accepted</translate></option>
+            <option :value="'imported'"><translate>Imported</translate></option>
+            <option :value="'closed'"><translate>Closed</translate></option>
           </select>
         </div>
       </div>
@@ -45,55 +45,55 @@
         :action-url="'manage/requests/import-requests/action/'"
         :filters="actionFilters">
         <template slot="header-cells">
-          <th>{{ $t('User') }}</th>
-          <th>{{ $t('Status') }}</th>
-          <th>{{ $t('Artist') }}</th>
-          <th>{{ $t('Albums') }}</th>
-          <th>{{ $t('Comment') }}</th>
-          <th>{{ $t('Creation date') }}</th>
-          <th>{{ $t('Import date') }}</th>
-          <th>{{ $t('Actions') }}</th>
+          <th><translate>User</translate></th>
+          <th><translate>Status</translate></th>
+          <th><translate>Artist</translate></th>
+          <th><translate>Albums</translate></th>
+          <th><translate>Comment</translate></th>
+          <th><translate>Creation date</translate></th>
+          <th><translate>Import date</translate></th>
+          <th><translate>Actions</translate></th>
         </template>
         <template slot="row-cells" slot-scope="scope">
           <td>
             {{ scope.obj.user.username }}
           </td>
           <td>
-            <span class="ui green basic label" v-if="scope.obj.status === 'imported'">{{ $t('Imported') }}</span>
-            <span class="ui pink basic label" v-else-if="scope.obj.status === 'accepted'">{{ $t('Accepted') }}</span>
-            <span class="ui yellow basic label" v-else-if="scope.obj.status === 'pending'">{{ $t('Pending') }}</span>
-            <span class="ui red basic label" v-else-if="scope.obj.status === 'closed'">{{ $t('Closed') }}</span>
+            <span class="ui green basic label" v-if="scope.obj.status === 'imported'"><translate>Imported</translate></span>
+            <span class="ui pink basic label" v-else-if="scope.obj.status === 'accepted'"><translate>Accepted</translate></span>
+            <span class="ui yellow basic label" v-else-if="scope.obj.status === 'pending'"><translate>Pending</translate></span>
+            <span class="ui red basic label" v-else-if="scope.obj.status === 'closed'"><translate>Closed</translate></span>
           </td>
           <td>
             <span :title="scope.obj.artist_name">{{ scope.obj.artist_name|truncate(30) }}</span>
           </td>
           <td>
             <span v-if="scope.obj.albums" :title="scope.obj.albums">{{ scope.obj.albums|truncate(30) }}</span>
-            <template v-else>{{ $t('N/A') }}</template>
+            <template v-else><translate>N/A</translate></template>
           </td>
           <td>
             <span v-if="scope.obj.comment" :title="scope.obj.comment">{{ scope.obj.comment|truncate(30) }}</span>
-            <template v-else>{{ $t('N/A') }}</template>
+            <template v-else><translate>N/A</translate></template>
           </td>
           <td>
             <human-date :date="scope.obj.creation_date"></human-date>
           </td>
           <td>
             <human-date v-if="scope.obj.imported_date" :date="scope.obj.creation_date"></human-date>
-            <template v-else>{{ $t('N/A') }}</template>
+            <template v-else><translate>N/A</translate></template>
           </td>
           <td>
             <router-link
               class="ui tiny basic button"
               :to="{name: 'library.import.launch', query: {request: scope.obj.id}}"
-              v-if="scope.obj.status === 'pending'">{{ $t('Create import') }}</router-link>
+              v-if="scope.obj.status === 'pending'"><translate>Create import</translate></router-link>
           </td>
         </template>
       </action-table>
     </div>
     <div>
       <pagination
-        v-if="result && result.results.length > 0"
+        v-if="result && result.count > paginateBy"
         @page-changed="selectPage"
         :compact="true"
         :current="page"
@@ -102,7 +102,10 @@
         ></pagination>
 
       <span v-if="result && result.results.length > 0">
-        {{ $t('Showing results {%start%}-{%end%} on {%total%}', {start: ((page-1) * paginateBy) + 1 , end: ((page-1) * paginateBy) + result.results.length, total: result.count})}}
+        <translate
+          :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
+          Showing results %{ start }-%{ end } on %{ total }
+        </translate>
       </span>
     </div>
   </div>
@@ -172,6 +175,11 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        searchPlaceholder: this.$gettext('Search by artist, username, comment...')
+      }
+    },
     actionFilters () {
       var currentFilters = {
         q: this.search
@@ -183,21 +191,25 @@ export default {
       }
     },
     actions () {
+      // somehow, extraction fails otherwise
+      let deleteLabel = this.$gettext('Delete')
+      let markImportedLabel = this.$gettext('Mark as imported')
+      let markClosedLabel = this.$gettext('Mark as closed')
       return [
         {
           name: 'delete',
-          label: this.$t('Delete'),
+          label: deleteLabel,
           isDangerous: true
         },
         {
           name: 'mark_imported',
-          label: this.$t('Mark as imported'),
+          label: markImportedLabel,
           filterCheckable: (obj) => { return ['pending', 'accepted'].indexOf(obj.status) > -1 },
           isDangerous: true
         },
         {
           name: 'mark_closed',
-          label: this.$t('Mark as closed'),
+          label: markClosedLabel,
           filterCheckable: (obj) => { return ['pending', 'accepted'].indexOf(obj.status) > -1 },
           isDangerous: true
         }
diff --git a/front/src/components/manage/users/InvitationForm.vue b/front/src/components/manage/users/InvitationForm.vue
index d9f0969e67853c841cbb0a10ebd9735792723d97..8ee5d0525e5894547f54cd0aa9c3ca07b7282fb9 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">{{ $t('Error while creating invitation') }}</div>
+        <div class="header"><translate>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>{{ $t('Invitation code')}}</label>
-          <input type="text" v-model="code" :placeholder="$t('Leave empty for a random code')" />
+          <label><translate>Invitation code</translate></label>
+          <input type="text" v-model="code" :placeholder="labels.placeholder" />
         </div>
         <div class="ui field">
           <button :class="['ui', {loading: isLoading}, 'button']" :disabled="isLoading" type="submit">
-            {{ $t('Get a new invitation') }}
+            <translate>Get a new invitation</translate>
           </button>
         </div>
       </div>
@@ -24,8 +24,8 @@
       <table class="ui ui basic table">
         <thead>
           <tr>
-            <th>{{ $t('Code') }}</th>
-            <th>{{ $t('Share link') }}</th>
+            <th><translate>Code</translate></th>
+            <th><translate>Share link</translate></th>
           </tr>
         </thead>
         <tbody>
@@ -35,7 +35,7 @@
           </tr>
         </tbody>
       </table>
-      <button class="ui basic button" @click="invitations = []">{{ $t('Clear') }}</button>
+      <button class="ui basic button" @click="invitations = []"><translate>Clear</translate></button>
     </div>
   </div>
 </template>
@@ -52,6 +52,13 @@ export default {
       errors: []
     }
   },
+  computed: {
+    labels () {
+      return {
+        placeholder: this.$gettext('Leave empty for a random code')
+      }
+    }
+  },
   methods: {
     submit () {
       let self = this
diff --git a/front/src/components/manage/users/InvitationsTable.vue b/front/src/components/manage/users/InvitationsTable.vue
index e8d0a2406aaf465d7e30803b05ace126b621606d..02a889be17679e95e05ed94ec925f9057e24914d 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>{{ $t('Search') }}</label>
-          <input type="text" v-model="search" placeholder="Search by username, email, code..." />
+          <label><translate>Search</translate></label>
+          <input type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
         </div>
         <div class="field">
-          <label>{{ $t("Ordering") }}</label>
+          <label><translate>Ordering</translate></label>
           <select class="ui dropdown" v-model="ordering">
             <option v-for="option in orderingOptions" :value="option[0]">
               {{ option[1] }}
@@ -15,11 +15,11 @@
           </select>
         </div>
         <div class="field">
-          <label>{{ $t("Status") }}</label>
+          <label><translate>Status</translate></label>
           <select class="ui dropdown" v-model="isOpen">
-            <option :value="null">{{ $t('All') }}</option>
-            <option :value="true">{{ $t('Open') }}</option>
-            <option :value="false">{{ $t('Expired/used') }}</option>
+            <option :value="null"><translate>All</translate></option>
+            <option :value="true"><translate>Open</translate></option>
+            <option :value="false"><translate>Expired/used</translate></option>
           </select>
         </div>
       </div>
@@ -36,20 +36,20 @@
         :action-url="'manage/users/invitations/action/'"
         :filters="actionFilters">
         <template slot="header-cells">
-          <th>{{ $t('Owner') }}</th>
-          <th>{{ $t('Status') }}</th>
-          <th>{{ $t('Creation date') }}</th>
-          <th>{{ $t('Expiration date') }}</th>
-          <th>{{ $t('Code') }}</th>
+          <th><translate>Owner</translate></th>
+          <th><translate>Status</translate></th>
+          <th><translate>Creation date</translate></th>
+          <th><translate>Expiration date</translate></th>
+          <th><translate>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>
+            <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">{{ $t('Used') }}</span>
-            <span v-else-if="moment().isAfter(scope.obj.expiration_date)" class="ui red basic label">{{ $t('Expired') }}</span>
-            <span v-else class="ui basic label">{{ $t('Not used') }}</span>
+            <span v-if="scope.obj.users.length > 0" class="ui green basic label"><translate>Used</translate></span>
+            <span v-else-if="moment().isAfter(scope.obj.expiration_date)" class="ui red basic label"><translate>Expired</translate></span>
+            <span v-else class="ui basic label"><translate>Not used</translate></span>
           </td>
           <td>
             <human-date :date="scope.obj.creation_date"></human-date>
@@ -65,7 +65,7 @@
     </div>
     <div>
       <pagination
-        v-if="result && result.results.length > 0"
+        v-if="result && result.count > paginateBy"
         @page-changed="selectPage"
         :compact="true"
         :current="page"
@@ -74,7 +74,10 @@
         ></pagination>
 
       <span v-if="result && result.results.length > 0">
-        {{ $t('Showing results {%start%}-{%end%} on {%total%}', {start: ((page-1) * paginateBy) + 1 , end: ((page-1) * paginateBy) + result.results.length, total: result.count})}}
+        <translate
+          :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
+          Showing results %{ start }-%{ end } on %{ total }
+        </translate>
       </span>
     </div>
   </div>
@@ -144,6 +147,11 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        searchPlaceholder: this.$gettext('Search by username, email, code...')
+      }
+    },
     actionFilters () {
       var currentFilters = {
         q: this.search
@@ -155,10 +163,11 @@ export default {
       }
     },
     actions () {
+      let deleteLabel = this.$gettext('Delete')
       return [
         {
           name: 'delete',
-          label: this.$t('Delete'),
+          label: deleteLabel,
           filterCheckable: (obj) => {
             return obj.users.length === 0 && moment().isBefore(obj.expiration_date)
           }
diff --git a/front/src/components/manage/users/UsersTable.vue b/front/src/components/manage/users/UsersTable.vue
index 855fbe2b5da53abf717dc819a5f2560c5e35bd54..0c16a9da785f06a82828f0674ea89faaf3a6ef46 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>{{ $t('Search') }}</label>
-          <input type="text" v-model="search" placeholder="Search by username, email, name..." />
+          <label><translate>Search</translate></label>
+          <input type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
         </div>
         <div class="field">
-          <i18next tag="label" path="Ordering"/>
+          <label><translate>Ordering</translate></label>
           <select class="ui dropdown" v-model="ordering">
             <option v-for="option in orderingOptions" :value="option[0]">
               {{ option[1] }}
@@ -15,10 +15,10 @@
           </select>
         </div>
         <div class="field">
-          <i18next tag="label" path="Ordering direction"/>
+          <label><translate>Ordering direction</translate></label>
           <select class="ui dropdown" v-model="orderingDirection">
-            <option value="+">{{ $t('Ascending') }}</option>
-            <option value="-">{{ $t('Descending') }}</option>
+            <option value="+"><translate>Ascending</translate></option>
+            <option value="-"><translate>Descending</translate></option>
           </select>
         </div>
       </div>
@@ -35,31 +35,31 @@
         :action-url="'manage/library/track-files/action/'"
         :filters="actionFilters">
         <template slot="header-cells">
-          <th>{{ $t('Username') }}</th>
-          <th>{{ $t('Email') }}</th>
-          <th>{{ $t('Account status') }}</th>
-          <th>{{ $t('Sign-up') }}</th>
-          <th>{{ $t('Last activity') }}</th>
-          <th>{{ $t('Permissions') }}</th>
-          <th>{{ $t('Status') }}</th>
+          <th><translate>Username</translate></th>
+          <th><translate>Email</translate></th>
+          <th><translate>Account status</translate></th>
+          <th><translate>Sign-up</translate></th>
+          <th><translate>Last activity</translate></th>
+          <th><translate>Permissions</translate></th>
+          <th><translate>Status</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.username }}</router-link>
+            <router-link :to="{name: 'manage.users.users.detail', params: {id: scope.obj.id }}">{{ scope.obj.username }}</router-link>
           </td>
           <td>
-            <span>{{ scope.obj.email }}</span>
+            <span>{{ scope.obj.email }}</span>
           </td>
           <td>
-            <span v-if="scope.obj.is_active" class="ui basic green label">{{ $t('Active') }}</span>
-            <span v-else class="ui basic grey label">{{ $t('Inactive') }}</span>
+            <span v-if="scope.obj.is_active" class="ui basic green label"><translate>Active</translate></span>
+            <span v-else class="ui basic grey label"><translate>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>{{ $t('N/A') }}</template>
+            <template v-else><translate>N/A</translate></template>
           </td>
           <td>
             <template v-for="p in permissions">
@@ -67,16 +67,16 @@
             </template>
           </td>
           <td>
-            <span v-if="scope.obj.is_superuser" class="ui pink label">{{ $t('Admin') }}</span>
-            <span v-else-if="scope.obj.is_staff" class="ui purple label">{{ $t('Staff member') }}</span>
-            <span v-else class="ui basic label">{{ $t('regular user') }}</span>
+            <span v-if="scope.obj.is_superuser" class="ui pink label"><translate>Admin</translate></span>
+            <span v-else-if="scope.obj.is_staff" class="ui purple label"><translate>Staff member</translate></span>
+            <span v-else class="ui basic label"><translate>regular user</translate></span>
           </td>
         </template>
       </action-table>
     </div>
     <div>
       <pagination
-        v-if="result && result.results.length > 0"
+        v-if="result && result.count > paginateBy"
         @page-changed="selectPage"
         :compact="true"
         :current="page"
@@ -85,7 +85,10 @@
         ></pagination>
 
       <span v-if="result && result.results.length > 0">
-        {{ $t('Showing results {%start%}-{%end%} on {%total%}', {start: ((page-1) * paginateBy) + 1 , end: ((page-1) * paginateBy) + result.results.length, total: result.count})}}
+        <translate
+          :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
+          Showing results %{ start }-%{ end } on %{ total }
+        </translate>
       </span>
     </div>
   </div>
@@ -154,6 +157,11 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        searchPlaceholder: this.$gettext('Search by username, email, name...')
+      }
+    },
     privacyLevels () {
       return {}
     },
@@ -161,19 +169,19 @@ export default {
       return [
         {
           'code': 'upload',
-          'label': this.$t('Upload')
+          'label': this.$gettext('Upload')
         },
         {
           'code': 'library',
-          'label': this.$t('Library')
+          'label': this.$gettext('Library')
         },
         {
           'code': 'federation',
-          'label': this.$t('Federation')
+          'label': this.$gettext('Federation')
         },
         {
           'code': 'settings',
-          'label': this.$t('Settings')
+          'label': this.$gettext('Settings')
         }
       ]
     },
@@ -191,7 +199,7 @@ export default {
       return [
         // {
         //   name: 'delete',
-        //   label: this.$t('Delete'),
+        //   label: this.$gettext('Delete'),
         //   isDangerous: true
         // }
       ]
diff --git a/front/src/components/metadata/ArtistCard.vue b/front/src/components/metadata/ArtistCard.vue
index c88438c0c0917e0394450affa04e1c1e5ec1958f..ef2fc616af41523a33fa564d97cdc0905a93024d 100644
--- a/front/src/components/metadata/ArtistCard.vue
+++ b/front/src/components/metadata/ArtistCard.vue
@@ -6,7 +6,7 @@
       </div>
       <template v-if="data.id">
         <div class="header">
-          <a :href="getMusicbrainzUrl('artist', data.id)" target="_blank" title="View on MusicBrainz">{{ data.name }}</a>
+          <a :href="getMusicbrainzUrl('artist', data.id)" target="_blank" :title="labels.musicbrainz">{{ data.name }}</a>
         </div>
         <div class="description">
           <table class="ui very basic fixed single line compact table">
@@ -16,7 +16,7 @@
                   {{ group['first-release-date'] }}
                 </td>
                 <td colspan="3">
-                  <a :href="getMusicbrainzUrl('release-group', group.id)" class="discrete link" target="_blank" :title="$t('View on MusicBrainz')">
+                  <a :href="getMusicbrainzUrl('release-group', group.id)" class="discrete link" target="_blank" :title="labels.musicbrainz">
                     {{ group.title }}
                   </a>
                 </td>
@@ -44,6 +44,11 @@ export default Vue.extend({
     }
   },
   computed: {
+    labels () {
+      return {
+        musicbrainz: this.$gettext('View on MusicBrainz')
+      }
+    },
     type () {
       return 'artist'
     },
diff --git a/front/src/components/metadata/ReleaseCard.vue b/front/src/components/metadata/ReleaseCard.vue
index 68bcd1284c06e84d0152d6e38b4803c32368236b..0da2c7e2c64e4f9ec98dd38d829ef08271e778b7 100644
--- a/front/src/components/metadata/ReleaseCard.vue
+++ b/front/src/components/metadata/ReleaseCard.vue
@@ -6,10 +6,10 @@
       </div>
       <template v-if="data.id">
         <div class="header">
-          <a :href="getMusicbrainzUrl('release', data.id)" target="_blank" title="View on MusicBrainz">{{ data.title }}</a>
+          <a :href="getMusicbrainzUrl('release', data.id)" target="_blank" :title="labels.musicbrainz">{{ data.title }}</a>
         </div>
         <div class="meta">
-          <a :href="getMusicbrainzUrl('artist', data['artist-credit'][0]['artist']['id'])" target="_blank" title="View on MusicBrainz">{{ data['artist-credit-phrase'] }}</a>
+          <a :href="getMusicbrainzUrl('artist', data['artist-credit'][0]['artist']['id'])" target="_blank" :title="labels.musicbrainz">{{ data['artist-credit-phrase'] }}</a>
         </div>
         <div class="description">
           <table class="ui very basic fixed single line compact table">
@@ -19,7 +19,7 @@
                   {{ track.position }}
                 </td>
                 <td colspan="3">
-                  <a :href="getMusicbrainzUrl('recording', track.id)" class="discrete link" target="_blank" :title="$t('View on MusicBrainz')">
+                  <a :href="getMusicbrainzUrl('recording', track.id)" class="discrete link" target="_blank" :title="labels.musicbrainz">
                     {{ track.recording.title }}
                   </a>
                 </td>
@@ -48,6 +48,11 @@ export default Vue.extend({
     }
   },
   computed: {
+    labels () {
+      return {
+        musicbrainz: this.$gettext('View on MusicBrainz')
+      }
+    },
     type () {
       return 'release'
     },
diff --git a/front/src/components/metadata/Search.vue b/front/src/components/metadata/Search.vue
index 3fcd8484edbe20c830c1f0078a0491554b9bfef8..4e8bf357d3fbd8e8e310c5971bf9015626e7c47f 100644
--- a/front/src/components/metadata/Search.vue
+++ b/front/src/components/metadata/Search.vue
@@ -12,7 +12,7 @@
     </div>
     <div class="ui fluid search">
       <div class="ui icon input">
-        <input class="prompt" :placeholder="$t('Enter your search query...')" type="text">
+        <input class="prompt" :placeholder="labels.placeholder" type="text">
         <i class="search icon"></i>
       </div>
       <div class="results"></div>
@@ -109,6 +109,11 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        placeholder: this.$gettext('Enter your search query...')
+      }
+    },
     currentTypeObject: function () {
       let self = this
       return this.types.filter(t => {
@@ -122,15 +127,15 @@ export default {
       return [
         {
           value: 'artist',
-          label: this.$t('Artist')
+          label: this.$gettext('Artist')
         },
         {
           value: 'release',
-          label: this.$t('Album')
+          label: this.$gettext('Album')
         },
         {
           value: 'recording',
-          label: this.$t('Track')
+          label: this.$gettext('Track')
         }
       ]
     }
diff --git a/front/src/components/playlists/Card.vue b/front/src/components/playlists/Card.vue
index 19932a4e80a983c545bcd256fc2da00dba115b2f..956a543a6cf66165c6808f3a4d2ffbf5b2c87959 100644
--- a/front/src/components/playlists/Card.vue
+++ b/front/src/components/playlists/Card.vue
@@ -1,27 +1,35 @@
 <template>
-  <div class="ui card">
+  <div class="ui playlist card">
+    <div class="ui top attached icon button" :style="coversStyle">
+    </div>
     <div class="content">
       <div class="header">
-        <router-link class="discrete link" :to="{name: 'library.playlists.detail', params: {id: playlist.id }}">
-          {{ playlist.name }}
+        <div class="right floated">
+          <play-button :icon-only="true" class="ui inline" :button-classes="['ui', 'circular', 'large', {orange: playlist.tracks_count > 0}, 'icon', 'button', {disabled: playlist.tracks_count === 0}]" :playlist="playlist"></play-button>
+          <play-button class="basic inline icon" :dropdown-only="true" :dropdown-icon-classes="['ellipsis', 'vertical', 'large', {disabled: playlist.tracks_count === 0}, 'grey']" :playlist="playlist"></play-button>
+        </div>
+        <router-link :title="playlist.name" class="discrete link" :to="{name: 'library.playlists.detail', params: {id: playlist.id }}">
+          {{ playlist.name | truncate(30) }}
         </router-link>
       </div>
       <div class="meta">
-        <i class="user icon"></i> {{ playlist.user.username }}
-      </div>
-      <div class="meta">
-        <i class="clock icon"></i>
-        <i18next path="Updated {%0%}">
-          <human-date :date="playlist.modification_date" />
-        </i18next>
+        <duration :seconds="playlist.duration" />
+         |
+        <i class="sound icon"></i>
+        <translate
+          translate-plural="%{ count } tracks"
+          :translate-n="playlist.tracks_count"
+          :translate-params="{count: playlist.tracks_count}">
+          %{ count} track
+        </translate>&nbsp;
       </div>
     </div>
     <div class="extra content">
-      <span>
-        <i class="sound icon"></i>
-        {{ $t('{%count%} tracks', { count: playlist.tracks_count }) }}
+      <user-link :user="playlist.user" class="left floated" />
+      <span class="right floated">
+        <i class="clock outline icon" />
+        <human-date :date="playlist.creation_date" />
       </span>
-      <play-button class="mini basic orange right floated" :playlist="playlist">Play all</play-button>
     </div>
   </div>
 </template>
@@ -33,11 +41,46 @@ export default {
   props: ['playlist'],
   components: {
     PlayButton
+  },
+  computed: {
+    coversStyle () {
+      let self = this
+      let urls = this.playlist.album_covers.map((url) => {
+        url = self.$store.getters['instance/absoluteUrl'](url)
+        return `url("${url}")`
+      }).slice(0, 4)
+      return {
+        'background-image': urls.join(', ')
+      }
+    }
   }
 }
 </script>
 
 <!-- Add "scoped" attribute to limit CSS to this component only -->
+<style>
+
+.playlist.card .header .ellipsis.vertical.large.grey {
+  font-size: 1.2em;
+  margin-right: 0;
+}
+
+</style>
 <style scoped>
+.card .header {
+  margin-bottom: 0.25em;
+}
+
+.attached.button {
+  background-color: rgb(243, 244, 245);
+  background-size: 25% ;
+  background-repeat: no-repeat;
+  background-origin: border-box;
+  background-position: 0 0, 33.33% 0, 66.67% 0, 100% 0;
+  /* background-position: 0 0, 50% 0, 100% 0; */
+  /* background-position: 0 0, 25% 0, 50% 0, 75% 0, 100% 0; */
+  font-size: 4em;
+  box-shadow: 0px 0px 0px 1px rgba(34, 36, 38, 0.15) inset !important;
+}
 
 </style>
diff --git a/front/src/components/playlists/Editor.vue b/front/src/components/playlists/Editor.vue
index c036737ce032461e8b02cd00d12593e27c960504..35374cb0fe2d5e4686b27171df9b9d8c3da3b300 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">
-      {{ $t('Playlist editor') }}
+      <translate>Playlist editor</translate>
     </h3>
     <div class="ui attached segment">
       <template v-if="status === 'loading'">
         <div class="ui active tiny inline loader"></div>
-        {{ $t('Syncing changes to server...') }}
+        <translate>Syncing changes to server...</translate>
       </template>
       <template v-else-if="status === 'errored'">
         <i class="red close icon"></i>
-        {{ $t('An error occured while saving your changes') }}
+        <translate>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> {{ $t('Changes synced with server') }}
+        <i class="green check icon"></i> <translate>Changes synced with server</translate>
       </template>
     </div>
     <div class="ui bottom attached segment">
@@ -27,20 +27,27 @@
         @click="insertMany(queueTracks)"
         :disabled="queueTracks.length === 0"
         :class="['ui', {disabled: queueTracks.length === 0}, 'labeled', 'icon', 'button']"
-        title="Copy tracks from current queue to playlist">
+        :title="labels.copyTitle">
           <i class="plus icon"></i>
-          {{ $t('Insert from queue ({%count%} tracks)', { count: queueTracks.length }) }}
+          <translate
+            translate-plural="Insert from queue (%{ count } tracks)"
+            :translate-n="queueTracks.length"
+            :translate-params="{count: queueTracks.length}">
+            Insert from queue (%{ count } track)
+          </translate>
         </div>
 
       <dangerous-button :disabled="plts.length === 0" class="labeled right floated icon" color='yellow' :action="clearPlaylist">
-        <i class="eraser icon"></i> {{ $t('Clear playlist') }}
-        <p slot="modal-header">{{ $t('Do you want to clear the playlist "{%name%}"?', { name: playlist.name }) }}</p>
-        <p slot="modal-content">{{ $t('This will remove all tracks from this playlist and cannot be undone.') }}</p>
-        <p slot="modal-confirm">{{ $t('Clear playlist') }}</p>
+        <i class="eraser icon"></i> <translate>Clear playlist</translate>
+        <p slot="modal-header">
+          <translate :translate-params="{playlist: playlist.name}">Do you want to clear the playlist "%{ playlist }"?</translate>
+        </p>
+        <p slot="modal-content"><translate>This will remove all tracks from this playlist and cannot be undone.</translate></p>
+        <p slot="modal-confirm"><translate>Clear playlist</translate></p>
       </dangerous-button>
       <div class="ui hidden divider"></div>
       <template v-if="plts.length > 0">
-        <p>Drag and drop rows to reorder tracks in the playlist</p>
+        <p><translate>Drag and drop rows to reorder tracks in the playlist</translate></p>
         <table class="ui compact very basic fixed single line unstackable table">
           <draggable v-model="plts" element="tbody" @update="reorder">
             <tr v-for="(plt, index) in plts" :key="plt.id">
@@ -151,6 +158,11 @@ export default {
     ...mapState({
       queueTracks: state => state.queue.tracks
     }),
+    labels () {
+      return {
+        copyTitle: this.$gettext('Copy tracks from current queue to playlist')
+      }
+    },
     status () {
       if (this.isLoading) {
         return 'loading'
diff --git a/front/src/components/playlists/Form.vue b/front/src/components/playlists/Form.vue
index d19cd687668dca71fae2fabd8926426ae24986b4..34c75eb97747d822470ffc10a336af126071b455 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">{{ $t('Create a new playlist') }}</h4>
+    <h4 v-if="title" class="ui header"><translate>Create a new playlist</translate></h4>
     <div v-if="success" class="ui positive message">
       <div class="header">
         <template v-if="playlist">
-          {{ $t('Playlist updated') }}
+          <translate>Playlist updated</translate>
         </template>
         <template v-else>
-          {{ $t('Playlist created') }}
+          <translate>Playlist created</translate>
         </template>
       </div>
     </div>
     <div v-if="errors.length > 0" class="ui negative message">
-      <div class="header">{{ $t('We cannot create the playlist') }}</div>
+      <div class="header"><translate>We cannot create the playlist</translate></div>
       <ul class="list">
         <li v-for="error in errors">{{ error }}</li>
       </ul>
     </div>
     <div class="three fields">
       <div class="field">
-        <label>{{ $t('Playlist name') }}</label>
-        <input v-model="name" required type="text" placeholder="My awesome playlist" />
+        <label><translate>Playlist name</translate></label>
+        <input v-model="name" required type="text" :placeholder="labels.placeholder" />
       </div>
       <div class="field">
-        <label>{{ $t('Playlist visibility') }}</label>
+        <label><translate>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">{{ $t('Update playlist') }}</template>
-          <template v-else>{{ $t('Create playlist') }}</template>
+          <template v-if="playlist"><translate>Update playlist</translate></template>
+          <template v-else><translate>Create playlist</translate></template>
         </button>
       </div>
     </div>
@@ -69,19 +69,24 @@ export default {
     return d
   },
   computed: {
+    labels () {
+      return {
+        placeholder: this.$gettext('My awesome playlist')
+      }
+    },
     privacyLevelChoices: function () {
       return [
         {
           value: 'me',
-          label: this.$t('Nobody except me')
+          label: this.$gettext('Nobody except me')
         },
         {
           value: 'instance',
-          label: this.$t('Everyone on this instance')
+          label: this.$gettext('Everyone on this instance')
         },
         {
           value: 'everyone',
-          label: this.$t('Everyone')
+          label: this.$gettext('Everyone')
         }
       ]
     }
diff --git a/front/src/components/playlists/PlaylistModal.vue b/front/src/components/playlists/PlaylistModal.vue
index da25241ce55dd697f2039797ce8e7d372e5b5ab3..a5a7e9ea0234c96ecea210c49e1e1444a305296a 100644
--- a/front/src/components/playlists/PlaylistModal.vue
+++ b/front/src/components/playlists/PlaylistModal.vue
@@ -1,33 +1,37 @@
 <template>
   <modal @update:show="update" :show="$store.state.playlists.showModal">
     <div class="header">
-      {{ $t('Manage playlists') }}
+      <translate>Manage playlists</translate>
     </div>
     <div class="scrolling content">
       <div class="description">
         <template v-if="track">
-          <h4 class="ui header">{{ $t('Current track') }}</h4>
-          <div v-html='trackDisplay'></div>
+          <h4 class="ui header"><translate>Current track</translate></h4>
+          <translate
+            v-translate="{artist: track.artist.name, title: track.title}"
+            :translate-params="{artist: track.artist.name, title: track.title}">
+            "%{ title }", by %{ artist }
+          </translate>
           <div class="ui divider"></div>
         </template>
 
-        <playlist-form></playlist-form>
+        <playlist-form :key="formKey"></playlist-form>
         <div class="ui divider"></div>
         <div v-if="errors.length > 0" class="ui negative message">
-          <div class="header">{{ $t('We cannot add the track to a playlist') }}</div>
+          <div class="header"><translate>We cannot add the track to a playlist</translate></div>
           <ul class="list">
             <li v-for="error in errors">{{ error }}</li>
           </ul>
         </div>
         </div>
-        <h4 class="ui header">{{ $t('Available playlists') }}</h4>
+        <h4 class="ui header"><translate>Available playlists</translate></h4>
         <table class="ui unstackable very basic table">
           <thead>
             <tr>
               <th></th>
-              <th>{{ $t('Name') }}</th>
-              <th class="sorted descending">{{ $t('Last modification') }}</th>
-              <th>{{ $t('Tracks') }}</th>
+              <th><translate>Name</translate></th>
+              <th class="sorted descending"><translate>Last modification</translate></th>
+              <th><translate>Tracks</translate></th>
               <th></th>
             </tr>
           </thead>
@@ -46,9 +50,9 @@
                 <div
                   v-if="track"
                   class="ui green icon basic small right floated button"
-                  :title="$t('Add to this playlist')"
+                  :title="labels.addToPlaylist"
                   @click="addToPlaylist(playlist.id)">
-                  <i class="plus icon"></i> {{ $t('Add track') }}
+                  <i class="plus icon"></i> <translate>Add track</translate>
                 </div>
               </td>
             </tr>
@@ -57,7 +61,7 @@
       </div>
     </div>
     <div class="actions">
-      <div class="ui cancel button">{{ $t('Cancel') }}</div>
+      <div class="ui cancel button"><translate>Cancel</translate></div>
     </div>
   </modal>
 </template>
@@ -78,6 +82,7 @@ export default {
   },
   data () {
     return {
+      formKey: String(new Date()),
       errors: []
     }
   },
@@ -106,21 +111,23 @@ export default {
       playlists: state => state.playlists.playlists,
       track: state => state.playlists.modalTrack
     }),
+    labels () {
+      return {
+        addToPlaylist: this.$gettext('Add to this playlist')
+      }
+    },
     sortedPlaylists () {
       let p = _.sortBy(this.playlists, [(e) => { return e.modification_date }])
       p.reverse()
       return p
-    },
-    trackDisplay () {
-      return this.$t('"{%title%}" by {%artist%}', {
-        title: this.track.title,
-        artist: this.track.artist.name }
-      )
     }
   },
   watch: {
     '$store.state.route.path' () {
       this.$store.commit('playlists/showModal', false)
+    },
+    '$store.state.playlists.showModal' () {
+      this.formKey = String(new Date())
     }
   }
 }
diff --git a/front/src/components/playlists/TrackPlaylistIcon.vue b/front/src/components/playlists/TrackPlaylistIcon.vue
index cd74b4d275996380122b2a134e7519f2e9f3a343..a75c217f4419935ee807fd7460404fcf756a677e 100644
--- a/front/src/components/playlists/TrackPlaylistIcon.vue
+++ b/front/src/components/playlists/TrackPlaylistIcon.vue
@@ -4,13 +4,13 @@
     v-if="button"
     :class="['ui', 'button']">
     <i class="list icon"></i>
-    {{ $t('Add to playlist...') }}
+    <translate>Add to playlist...</translate>
   </button>
   <i
     v-else
     @click="$store.commit('playlists/chooseTrack', track)"
     :class="['playlist-icon', 'list', 'link', 'icon']"
-    :title="$t('Add to playlist...')">
+    :title="labels.addToPlaylist">
   </i>
 </template>
 
@@ -25,6 +25,13 @@ export default {
     return {
       showModal: false
     }
+  },
+  computed: {
+    labels () {
+      return {
+        addToPlaylist: this.$gettext('Add to playlist...')
+      }
+    }
   }
 }
 </script>
diff --git a/front/src/components/playlists/Widget.vue b/front/src/components/playlists/Widget.vue
new file mode 100644
index 0000000000000000000000000000000000000000..65904a12447fc0a7d9e0250bbc987f1f286b72e8
--- /dev/null
+++ b/front/src/components/playlists/Widget.vue
@@ -0,0 +1,84 @@
+<template>
+  <div>
+    <h3 class="ui header">
+      <slot name="title"></slot>
+    </h3>
+    <i @click="fetchData(previousPage)" :disabled="!previousPage" :class="['ui', {disabled: !previousPage}, 'circular', 'medium', 'angle up', 'icon']">
+    </i>
+    <i @click="fetchData(nextPage)" :disabled="!nextPage" :class="['ui', {disabled: !nextPage}, 'circular', 'medium', 'angle down', 'icon']">
+    </i>
+    <i @click="fetchData(url)" :class="['ui', 'circular', 'medium', 'refresh', 'icon']">
+    </i>
+    <div v-if="isLoading" class="ui inverted active dimmer">
+      <div class="ui loader"></div>
+    </div>
+    <playlist-card class="fluid" v-for="playlist in objects" :key="playlist.id" :playlist="playlist"></playlist-card>
+  </div>
+</template>
+
+<script>
+import _ from 'lodash'
+import axios from 'axios'
+import PlaylistCard from '@/components/playlists/Card'
+
+export default {
+  props: {
+    filters: {type: Object, required: true},
+    url: {type: String, required: true}
+  },
+  components: {
+    PlaylistCard
+  },
+  data () {
+    return {
+      objects: [],
+      limit: 3,
+      isLoading: false,
+      errors: null,
+      previousPage: null,
+      nextPage: null
+    }
+  },
+  created () {
+    this.fetchData(this.url)
+  },
+  methods: {
+    fetchData (url) {
+      if (!url) {
+        return
+      }
+      this.isLoading = true
+      let self = this
+      let params = _.clone(this.filters)
+      params.page_size = this.limit
+      params.offset = this.offset
+      axios.get(url, {params: params}).then((response) => {
+        self.previousPage = response.data.previous
+        self.nextPage = response.data.next
+        self.isLoading = false
+        self.objects = response.data.results
+      }, error => {
+        self.isLoading = false
+        self.errors = error.backendErrors
+      })
+    },
+    updateOffset (increment) {
+      if (increment) {
+        this.offset += this.limit
+      } else {
+        this.offset = Math.max(this.offset - this.limit, 0)
+      }
+    }
+  },
+  watch: {
+    offset () {
+      this.fetchData()
+    }
+  }
+}
+</script>
+<style scoped>
+.refresh.icon {
+  float: right;
+}
+</style>
diff --git a/front/src/components/radios/Button.vue b/front/src/components/radios/Button.vue
index abdc660fcedf463ad4abfb4abbd9fff90317bb80..a33478c9d1e9e8932ffbb6781e3c5d7a8f4bdaa9 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}, 'button']">
     <i class="ui feed icon"></i>
-    <template v-if="running">{{ $t('Stop') }}</template>
-    <template v-else>{{ $t('Start') }}</template>
+    <template v-if="running"><translate>Stop</translate></template>
+    <template v-else><translate>Start</translate></template>
     radio
   </button>
 </template>
diff --git a/front/src/components/radios/Card.vue b/front/src/components/radios/Card.vue
index bab1e2a1de26a284c09a5314bd8db9346775cc04..68b453fabcd83dacfb486a473c063f3c40350c96 100644
--- a/front/src/components/radios/Card.vue
+++ b/front/src/components/radios/Card.vue
@@ -18,7 +18,7 @@
           class="ui basic yellow button"
           v-if="$store.state.auth.authenticated && type === 'custom' && customRadio.user === $store.state.auth.profile.id"
           :to="{name: 'library.radios.edit', params: {id: customRadioId }}">
-          {{ $t('Edit...') }}
+          <translate>Edit...</translate>
         </router-link>
         <radio-button class="right floated button" :type="type" :custom-radio-id="customRadioId"></radio-button>
       </div>
diff --git a/front/src/components/requests/Card.vue b/front/src/components/requests/Card.vue
index 7743bb6d4403653fedbc355983ec0bb4e7adecf1..36bbc944e5a6c0d47b4527235f6df2f9259351a3 100644
--- a/front/src/components/requests/Card.vue
+++ b/front/src/components/requests/Card.vue
@@ -23,7 +23,7 @@
       <button
         @click="createImport"
         v-if="request.status === 'pending' && importAction && $store.state.auth.availablePermissions['library']"
-        class="ui mini basic green right floated button">{{ $t('Create import') }}</button>
+        class="ui mini basic green right floated button"><translate>Create import</translate></button>
 
     </div>
   </div>
diff --git a/front/src/components/requests/Form.vue b/front/src/components/requests/Form.vue
index b03e1545ba4d7861fc6b02c71e752f630127fb98..667bd5f5acb7b7c6e0c0b00a3e5905d6f127f53c 100644
--- a/front/src/components/requests/Form.vue
+++ b/front/src/components/requests/Form.vue
@@ -1,30 +1,30 @@
 <template>
   <div>
     <form v-if="!over" class="ui form" @submit.prevent="submit">
-      <p>{{ $t('Something\'s missing in the library? Let us know what you would like to listen!') }}</p>
+      <p><translate>Something's missing in the library? Let us know what you would like to listen!</translate></p>
       <div class="required field">
-        <label>{{ $t('Artist name') }}</label>
-        <input v-model="currentArtistName" placeholder="The Beatles, Mickael Jackson…" required maxlength="200">
+        <label><translate>Artist name</translate></label>
+        <input v-model="currentArtistName" :placeholder="labels.artistNamePlaceholder" required maxlength="200">
       </div>
       <div class="field">
-        <label>{{ $t('Albums') }}</label>
-        <p>{{ $t('Leave this field empty if you\'re requesting the whole discography.') }}</p>
-        <input v-model="currentAlbums" placeholder="The White Album, Thriller…" maxlength="2000">
+        <label><translate>Albums</translate></label>
+        <p><translate>Leave this field empty if you're requesting the whole discography.</translate></p>
+        <input v-model="currentAlbums" :placeholder="labels.albumTitlePlaceholder" maxlength="2000">
       </div>
       <div class="field">
-        <label>{{ $t('Comment') }}</label>
-        <textarea v-model="currentComment" rows="3" placeholder="Use this comment box to add details to your request if needed" maxlength="2000"></textarea>
+        <label><translate>Comment</translate></label>
+        <textarea v-model="currentComment" rows="3" :placeholder="labels.commentPlaceholder" maxlength="2000"></textarea>
       </div>
-      <button class="ui submit button" type="submit">{{ $t('Submit') }}</button>
+      <button class="ui submit button" type="submit"><translate>Submit</translate></button>
     </form>
     <div v-else class="ui success message">
-      <div class="header">Request submitted!</div>
-      <p>{{ $t('We\'ve received your request, you\'ll get some groove soon ;)') }}</p>
-      <button @click="reset" class="ui button">{{ $t('Submit another request') }}</button>
+      <div class="header"><translate>Request submitted!</translate></div>
+      <p><translate>We've received your request, you'll get some groove soon ;)</translate></p>
+      <button @click="reset" class="ui button"><translate>Submit another request</translate></button>
     </div>
     <div v-if="requests.length > 0">
       <div class="ui divider"></div>
-      <h3 class="ui header">{{ $t('Pending requests') }}</h3>
+      <h3 class="ui header"><translate>Pending requests</translate></h3>
       <div class="ui list">
         <div v-for="request in requests" class="item">
           <div class="content">
@@ -68,6 +68,18 @@ export default {
       requests: []
     }
   },
+  computed: {
+    labels () {
+      let artistNamePlaceholder = this.$gettext('The Beatles, Mickael Jackson…')
+      let albumTitlePlaceholder = this.$gettext('The White Album, Thriller…')
+      let commentPlaceholder = this.$gettext('Use this comment box to add details to your request if needed')
+      return {
+        artistNamePlaceholder,
+        albumTitlePlaceholder,
+        commentPlaceholder
+      }
+    }
+  },
   methods: {
     fetchRequests () {
       let self = this
diff --git a/front/src/filters.js b/front/src/filters.js
index 11751559961c393b9d5bb3369aba199f8badf34a..878b3c9f2813756914afdbe62c8f4459768b61ac 100644
--- a/front/src/filters.js
+++ b/front/src/filters.js
@@ -28,6 +28,16 @@ export function ago (date) {
 
 Vue.filter('ago', ago)
 
+export function secondsToObject (seconds) {
+  let m = moment.duration(seconds, 'seconds')
+  return {
+    minutes: m.minutes(),
+    hours: parseInt(m.asHours())
+  }
+}
+
+Vue.filter('secondsToObject', secondsToObject)
+
 export function momentFormat (date, format) {
   format = format || 'lll'
   return moment(date).format(format)
diff --git a/front/src/locales.js b/front/src/locales.js
new file mode 100644
index 0000000000000000000000000000000000000000..39fb45532737c63aee111019e1fbf80478662267
--- /dev/null
+++ b/front/src/locales.js
@@ -0,0 +1,32 @@
+/* eslint-disable */
+export default {
+  "locales": [
+    {
+      "code": "ar",
+      "label": "العربية"
+    },
+    {
+      "code": "en_US",
+      "label": "English (United-States)"
+    },{
+      "code": "eo",
+      "label": "Esperanto"
+    },
+    {
+      "code": "fr_FR",
+      "label": "Français"
+    },
+    {
+      "code": "it",
+      "label": "Italiano"
+    },
+    {
+      "code": "oc",
+      "label": "Occitan"
+    },
+    {
+      "code": "pl",
+      "label": "Polszczyzna"
+    }
+  ]
+}
diff --git a/front/src/main.js b/front/src/main.js
index 181fd66b3b63197660794af819c24fa1751866fb..7f60c602c9559f71484c9e45d1bed0c9334adad5 100644
--- a/front/src/main.js
+++ b/front/src/main.js
@@ -11,11 +11,12 @@ import router from './router'
 import axios from 'axios'
 import {VueMasonryPlugin} from 'vue-masonry'
 import VueLazyload from 'vue-lazyload'
-import i18next from 'i18next'
-import i18nextFetch from 'i18next-fetch-backend'
-import VueI18Next from '@panter/vue-i18next'
 import store from './store'
+import GetTextPlugin from 'vue-gettext'
 import { sync } from 'vuex-router-sync'
+import translations from './translations.json'
+import locales from '@/locales'
+
 import filters from '@/filters' // eslint-disable-line
 import globals from '@/components/globals' // eslint-disable-line
 
@@ -28,8 +29,31 @@ window.$ = window.jQuery = require('jquery')
 // require('./semantic/semantic.css')
 require('semantic-ui-css/semantic.js')
 require('masonry-layout')
+let availableLanguages = (function () {
+  let l = {}
+  locales.locales.forEach(c => {
+    l[c.code] = c.label
+  })
+  return l
+})()
+let defaultLanguage = 'en_US'
+if (availableLanguages[store.state.ui.currentLanguage]) {
+  defaultLanguage = store.state.ui.currentLanguage
+}
+Vue.use(GetTextPlugin, {
+  availableLanguages: availableLanguages,
+  defaultLanguage: defaultLanguage,
+  languageVmMixin: {
+    computed: {
+      currentKebabCase: function () {
+        return this.current.toLowerCase().replace('_', '-')
+      }
+    }
+  },
+  translations: translations,
+  silent: true
+})
 
-Vue.use(VueI18Next)
 Vue.use(VueMasonryPlugin)
 Vue.use(VueLazyload)
 Vue.config.productionTip = false
@@ -96,35 +120,17 @@ axios.interceptors.response.use(function (response) {
     }
   }
   if (error.backendErrors.length === 0) {
-    error.backendErrors.push(i18next.t('An unknown error occured, ensure your are connected to the internet and your funkwhale instance is up and running'))
+    error.backendErrors.push('An unknown error occured, ensure your are connected to the internet and your funkwhale instance is up and running')
   }
   // Do something with response error
   return Promise.reject(error)
 })
 
-// i18n
-i18next
-  .use(i18nextFetch)
-  .init({
-    lng: navigator.language,
-    fallbackLng: ['en'],
-    preload: [navigator.language, 'en'],
-    backend: {
-      loadPath: '/static/translations/{%lng%}.json'
-    },
-    interpolation: {
-      prefix: '{%',
-      suffix: '%}'
-    }
-  })
-const i18n = new VueI18Next(i18next)
-
 /* eslint-disable no-new */
 new Vue({
   el: '#app',
   router,
   store,
-  i18n,
   template: '<App/>',
   components: { App }
 })
diff --git a/front/src/router/index.js b/front/src/router/index.js
index bb59b5348b5cdbc36178c91b81249d5f7f7e19ec..1747c88581f9ef45254a07fc79a0a27d41e68d4f 100644
--- a/front/src/router/index.js
+++ b/front/src/router/index.js
@@ -35,6 +35,7 @@ import AdminUsersBase from '@/views/admin/users/Base'
 import AdminUsersDetail from '@/views/admin/users/UsersDetail'
 import AdminUsersList from '@/views/admin/users/UsersList'
 import AdminInvitationsList from '@/views/admin/users/InvitationsList'
+import MusicRequest from '@/views/library/MusicRequest'
 import FederationBase from '@/views/federation/Base'
 import FederationScan from '@/views/federation/Scan'
 import FederationLibraryDetail from '@/views/federation/LibraryDetail'
@@ -218,7 +219,12 @@ export default new Router({
       path: '/library',
       component: Library,
       children: [
-        { path: '', component: LibraryHome },
+        { path: '', component: LibraryHome, name: 'library.index' },
+        {
+          path: 'requests/',
+          name: 'library.request',
+          component: MusicRequest
+        },
         {
           path: 'artists/',
           name: 'library.artists.browse',
diff --git a/front/src/store/auth.js b/front/src/store/auth.js
index d36366996c5ea49b546e1c7394d00f00bd28858e..098dab708797cc19cc464488698f99fc9d49e9a4 100644
--- a/front/src/store/auth.js
+++ b/front/src/store/auth.js
@@ -47,6 +47,11 @@ export default {
     username: (state, value) => {
       state.username = value
     },
+    avatar: (state, value) => {
+      if (state.profile) {
+        state.profile.avatar = value
+      }
+    },
     token: (state, value) => {
       state.token = value
       if (value) {
diff --git a/front/src/store/favorites.js b/front/src/store/favorites.js
index b7e789511217726e74412591d18233e6d25ed762..5983d18051fe2f519ca3b0ac7454a148af0aea2c 100644
--- a/front/src/store/favorites.js
+++ b/front/src/store/favorites.js
@@ -53,10 +53,13 @@ export default {
     toggle ({getters, dispatch}, id) {
       dispatch('set', {id, value: !getters['isFavorite'](id)})
     },
-    fetch ({dispatch, state, commit}, url) {
+    fetch ({dispatch, state, commit, rootState}, url) {
       // will fetch favorites by batches from API to have them locally
+      let params = {
+        user: rootState.auth.profile.id
+      }
       url = url || 'favorites/tracks/'
-      return axios.get(url).then((response) => {
+      return axios.get(url, {params: params}).then((response) => {
         logger.default.info('Fetched a batch of ' + response.data.results.length + ' favorites')
         response.data.results.forEach(result => {
           commit('track', {id: result.track, value: true})
diff --git a/front/src/store/index.js b/front/src/store/index.js
index 0c2908d83d5cceee72997111f099aeda555d2337..46075d84756137bc5bb5be7c4b2cf8be2708d33a 100644
--- a/front/src/store/index.js
+++ b/front/src/store/index.js
@@ -36,6 +36,10 @@ export default new Vuex.Store({
       key: 'instance',
       paths: ['instance.events', 'instance.instanceUrl']
     }),
+    createPersistedState({
+      key: 'ui',
+      paths: ['ui.currentLanguage']
+    }),
     createPersistedState({
       key: 'radios',
       paths: ['radios'],
diff --git a/front/src/store/ui.js b/front/src/store/ui.js
index c336803475c5c6c79776e501dd94a8884a9198c6..6641f4c0dec891c0d7f75fa26e3e974c135b38e7 100644
--- a/front/src/store/ui.js
+++ b/front/src/store/ui.js
@@ -3,6 +3,7 @@ import axios from 'axios'
 export default {
   namespaced: true,
   state: {
+    currentLanguage: 'en_US',
     lastDate: new Date(),
     maxMessages: 100,
     messageDisplayDuration: 10000,
@@ -13,6 +14,9 @@ export default {
     }
   },
   mutations: {
+    currentLanguage: (state, value) => {
+      state.currentLanguage = value
+    },
     computeLastDate: (state) => {
       state.lastDate = new Date()
     },
diff --git a/front/src/translations.json b/front/src/translations.json
new file mode 100644
index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93
--- /dev/null
+++ b/front/src/translations.json
@@ -0,0 +1 @@
+{}
diff --git a/front/src/utils/color.js b/front/src/utils/color.js
new file mode 100644
index 0000000000000000000000000000000000000000..8066abd3c2d4a2c86fd5d51608626a96849556a1
--- /dev/null
+++ b/front/src/utils/color.js
@@ -0,0 +1,12 @@
+export function hashCode (str) { // java String#hashCode
+  var hash = 0
+  for (var i = 0; i < str.length; i++) {
+    hash = str.charCodeAt(i) + ((hash << 5) - hash)
+  }
+  return hash
+}
+
+export function intToRGB (i) {
+  var c = (i & 0x00FFFFFF).toString(16).toUpperCase()
+  return '00000'.substring(0, 6 - c.length) + c
+}
diff --git a/front/src/views/admin/Settings.vue b/front/src/views/admin/Settings.vue
index 10e32968d7dd46fd164002b020c46437d6391c14..d21b4e277c307f911245a0a29937cb929f4f46f3 100644
--- a/front/src/views/admin/Settings.vue
+++ b/front/src/views/admin/Settings.vue
@@ -1,5 +1,5 @@
 <template>
-  <div class="main pusher"  v-title="$t('Instance settings')">
+  <div class="main pusher"  v-title="labels.settings">
     <div class="ui vertical stripe segment">
       <div class="ui text container">
         <div :class="['ui', {'loading': isLoading}, 'form']"></div>
@@ -13,7 +13,7 @@
           </div>
           <div class="four wide column">
             <div class="ui sticky vertical secondary menu">
-              <div class="header item">{{ $t('Sections') }}</div>
+              <div class="header item"><translate>Sections</translate></div>
               <a :class="['menu', {active: group.id === current}, 'item']"
                 @click.prevent="scrollTo(group.id)"
                 :href="'#' + group.id"
@@ -70,10 +70,24 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        settings: this.$gettext('Instance settings')
+      }
+    },
     groups () {
+      // somehow, extraction fails if in the return block directly
+      let instanceLabel = this.$gettext('Instance information')
+      let usersLabel = this.$gettext('Users')
+      let importsLabel = this.$gettext('Imports')
+      let playlistsLabel = this.$gettext('Playlists')
+      let federationLabel = this.$gettext('Federation')
+      let subsonicLabel = this.$gettext('Subsonic')
+      let statisticsLabel = this.$gettext('Statistics')
+      let errorLabel = this.$gettext('Error reporting')
       return [
         {
-          label: this.$t('Instance information'),
+          label: instanceLabel,
           id: 'instance',
           settings: [
             'instance__name',
@@ -82,7 +96,7 @@ export default {
           ]
         },
         {
-          label: this.$t('Users'),
+          label: usersLabel,
           id: 'users',
           settings: [
             'users__registration_enabled',
@@ -91,21 +105,21 @@ export default {
           ]
         },
         {
-          label: this.$t('Imports'),
+          label: importsLabel,
           id: 'imports',
           settings: [
             'providers_youtube__api_key'
           ]
         },
         {
-          label: this.$t('Playlists'),
+          label: playlistsLabel,
           id: 'playlists',
           settings: [
             'playlists__max_tracks'
           ]
         },
         {
-          label: this.$t('Federation'),
+          label: federationLabel,
           id: 'federation',
           settings: [
             'federation__enabled',
@@ -116,14 +130,14 @@ export default {
           ]
         },
         {
-          label: this.$t('Subsonic'),
+          label: subsonicLabel,
           id: 'subsonic',
           settings: [
             'subsonic__enabled'
           ]
         },
         {
-          label: this.$t('Statistics'),
+          label: statisticsLabel,
           id: 'statistics',
           settings: [
             'instance__nodeinfo_enabled',
@@ -132,7 +146,7 @@ export default {
           ]
         },
         {
-          label: this.$t('Error reporting'),
+          label: errorLabel,
           id: 'reporting',
           settings: [
             'raven__front_enabled',
diff --git a/front/src/views/admin/library/Base.vue b/front/src/views/admin/library/Base.vue
index cc26c8d6be42f0fe30643ea13bb78bccc1e13838..65cd1a667ed026196e23b3651acdec04db5d0e95 100644
--- a/front/src/views/admin/library/Base.vue
+++ b/front/src/views/admin/library/Base.vue
@@ -1,16 +1,16 @@
 <template>
-  <div class="main pusher"  v-title="'Manage library'">
+  <div class="main pusher"  v-title="labels.title">
     <div class="ui secondary pointing menu">
       <router-link
         class="ui item"
-        :to="{name: 'manage.library.files'}">{{ $t('Files') }}</router-link>
+        :to="{name: 'manage.library.files'}"><translate>Files</translate></router-link>
       <router-link
         class="ui item"
         :to="{name: 'manage.library.requests'}">
-          {{ $t('Import requests') }}
+          <translate>Import requests</translate>
           <div
             :class="['ui', {'teal': $store.state.ui.notifications.importRequests > 0}, 'label']"
-            :title="$t('Pending import requests')">
+            :title="labels.pendingRequests">
             {{ $store.state.ui.notifications.importRequests }}</div>
           </router-link>
     </div>
@@ -19,19 +19,16 @@
 </template>
 
 <script>
-export default {}
-</script>
-
-<style lang="scss">
-@import '../../../style/vendor/media';
-
-.main.pusher > .ui.secondary.menu {
-  @include media(">tablet") {
-    margin: 0 2.5rem;
-  }
-  .item {
-    padding-top: 1.5em;
-    padding-bottom: 1.5em;
+export default {
+  computed: {
+    labels () {
+      let title = this.$gettext('Manage library')
+      let pendingRequests = this.$gettext('Pending import requests')
+      return {
+        title,
+        pendingRequests
+      }
+    }
   }
 }
-</style>
+</script>
diff --git a/front/src/views/admin/library/FilesList.vue b/front/src/views/admin/library/FilesList.vue
index 9c52de5767042d9a2ddfe805965ef316d3dc5933..1c5216c8facf0c1c902f7b6bab0b8eb0ad19a16c 100644
--- a/front/src/views/admin/library/FilesList.vue
+++ b/front/src/views/admin/library/FilesList.vue
@@ -1,7 +1,7 @@
 <template>
-  <div v-title="'Files'">
+  <div v-title="labels.title">
     <div class="ui vertical stripe segment">
-      <h2 class="ui header">{{ $t('Library files') }}</h2>
+      <h2 class="ui header"><translate>Library files</translate></h2>
       <div class="ui hidden divider"></div>
       <library-files-table :show-library="true"></library-files-table>
     </div>
@@ -14,6 +14,13 @@ import LibraryFilesTable from '@/components/manage/library/FilesTable'
 export default {
   components: {
     LibraryFilesTable
+  },
+  computed: {
+    labels () {
+      return {
+        title: this.$gettext('Files')
+      }
+    }
   }
 }
 </script>
diff --git a/front/src/views/admin/library/RequestsList.vue b/front/src/views/admin/library/RequestsList.vue
index 160bf890b99dc42f0cdd07493e06e70f0e3fe93d..d945fb865ec448f287c8b56a9f39bd6d1905d56d 100644
--- a/front/src/views/admin/library/RequestsList.vue
+++ b/front/src/views/admin/library/RequestsList.vue
@@ -1,7 +1,7 @@
 <template>
-  <div v-title="$t('Import requests')">
+  <div v-title="labels.importRequests">
     <div class="ui vertical stripe segment">
-      <h2 class="ui header">{{ $t('Import requests') }}</h2>
+      <h2 class="ui header"><translate>Import requests</translate></h2>
       <div class="ui hidden divider"></div>
       <library-requests-table></library-requests-table>
     </div>
@@ -14,6 +14,13 @@ import LibraryRequestsTable from '@/components/manage/library/RequestsTable'
 export default {
   components: {
     LibraryRequestsTable
+  },
+  computed: {
+    labels () {
+      return {
+        importRequests: this.$gettext('Import requests')
+      }
+    }
   }
 }
 </script>
diff --git a/front/src/views/admin/users/Base.vue b/front/src/views/admin/users/Base.vue
index 505ca587fe2bf2726b2a3c30bfbf4b6c540a858f..7486d02d742254cc7d2fcb214435ffdaafd1c44f 100644
--- a/front/src/views/admin/users/Base.vue
+++ b/front/src/views/admin/users/Base.vue
@@ -1,31 +1,25 @@
 <template>
-  <div class="main pusher"  v-title="$t('Manage users')">
+  <div class="main pusher"  v-title="labels.manageUsers">
     <div class="ui secondary pointing menu">
       <router-link
         class="ui item"
-        :to="{name: 'manage.users.users.list'}">{{ $t('Users') }}</router-link>
+        :to="{name: 'manage.users.users.list'}"><translate>Users</translate></router-link>
       <router-link
         class="ui item"
-        :to="{name: 'manage.users.invitations.list'}">{{ $t('Invitations') }}</router-link>
+        :to="{name: 'manage.users.invitations.list'}"><translate>Invitations</translate></router-link>
     </div>
     <router-view :key="$route.fullPath"></router-view>
   </div>
 </template>
 
 <script>
-export default {}
-</script>
-
-<style lang="scss">
-@import '../../../style/vendor/media';
-
-.main.pusher > .ui.secondary.menu {
-  @include media(">tablet") {
-    margin: 0 2.5rem;
-  }
-  .item {
-    padding-top: 1.5em;
-    padding-bottom: 1.5em;
+export default {
+  computed: {
+    labels () {
+      return {
+        manageUsers: this.$gettext('Manage users')
+      }
+    }
   }
 }
-</style>
+</script>
diff --git a/front/src/views/admin/users/InvitationsList.vue b/front/src/views/admin/users/InvitationsList.vue
index 230dad6c1971a9c86c08570c404530ecf405c7d4..b2dd8f0374aa21bf3eea2eba1c3cf52e86e457ad 100644
--- a/front/src/views/admin/users/InvitationsList.vue
+++ b/front/src/views/admin/users/InvitationsList.vue
@@ -1,7 +1,7 @@
 <template>
-  <div v-title="$t('Invitations')">
+  <div v-title="labels.invitations">
     <div class="ui vertical stripe segment">
-      <h2 class="ui header">{{ $t('Invitations') }}</h2>
+      <h2 class="ui header"><translate>Invitations</translate></h2>
       <invitation-form></invitation-form>
       <div class="ui hidden divider"></div>
       <invitations-table></invitations-table>
@@ -17,6 +17,13 @@ export default {
   components: {
     InvitationForm,
     InvitationsTable
+  },
+  computed: {
+    labels () {
+      return {
+        invitations: this.$gettext('Invitations')
+      }
+    }
   }
 }
 </script>
diff --git a/front/src/views/admin/users/UsersDetail.vue b/front/src/views/admin/users/UsersDetail.vue
index ea92716ca943570d77e1cd4cd91cb1d9eaa97133..4e750cafa188218d48049c288ffa654118189087 100644
--- a/front/src/views/admin/users/UsersDetail.vue
+++ b/front/src/views/admin/users/UsersDetail.vue
@@ -19,7 +19,7 @@
             <tbody>
               <tr>
                 <td>
-                  {{ $t('Name') }}
+                  <translate>Name</translate>
                 </td>
                 <td>
                   {{ object.name }}
@@ -27,7 +27,7 @@
               </tr>
               <tr>
                 <td>
-                  {{ $t('Email address') }}
+                  <translate>Email address</translate>
                 </td>
                 <td>
                   {{ object.email }}
@@ -35,7 +35,7 @@
               </tr>
               <tr>
                 <td>
-                  {{ $t('Sign-up') }}
+                  <translate>Sign-up</translate>
                 </td>
                 <td>
                   <human-date :date="object.date_joined"></human-date>
@@ -43,17 +43,17 @@
               </tr>
               <tr>
                 <td>
-                  {{ $t('Last activity') }}
+                  <translate>Last activity</translate>
                 </td>
                 <td>
                   <human-date v-if="object.last_activity" :date="object.last_activity"></human-date>
-                  <template v-else>{{ $t('N/A') }}</template>
+                  <template v-else><translate>N/A</translate></template>
                 </td>
               </tr>
               <tr>
                 <td>
-                  {{ $t('Account active') }}
-                  <span :data-tooltip="$t('Determine if the user account is active or not. Inactive users cannot login or user the service.')"><i class="question circle icon"></i></span>
+                  <translate>Account active</translate>
+                  <span :data-tooltip="labels.inactive"><i class="question circle icon"></i></span>
                 </td>
                 <td>
                   <div class="ui toggle checkbox">
@@ -66,7 +66,7 @@
               </tr>
               <tr>
                 <td>
-                  {{ $t('Permissions') }}
+                  <translate>Permissions</translate>
                 </td>
                 <td>
                   <select
@@ -82,7 +82,7 @@
           </table>
         </div>
         <div class="ui hidden divider"></div>
-        <button @click="fetchData" class="ui basic button">{{ $t('Refresh') }}</button>
+        <button @click="fetchData" class="ui basic button"><translate>Refresh</translate></button>
       </div>
     </template>
   </div>
@@ -141,23 +141,28 @@ export default {
     }
   },
   computed: {
+    labels () {
+      return {
+        inactive: this.$gettext('Determine if the user account is active or not. Inactive users cannot login or use the service.')
+      }
+    },
     allPermissions () {
       return [
         {
           'code': 'upload',
-          'label': this.$t('Upload')
+          'label': this.$gettext('Upload')
         },
         {
           'code': 'library',
-          'label': this.$t('Library')
+          'label': this.$gettext('Library')
         },
         {
           'code': 'federation',
-          'label': this.$t('Federation')
+          'label': this.$gettext('Federation')
         },
         {
           'code': 'settings',
-          'label': this.$t('Settings')
+          'label': this.$gettext('Settings')
         }
       ]
     }
diff --git a/front/src/views/admin/users/UsersList.vue b/front/src/views/admin/users/UsersList.vue
index b22d4aaf836f0b45be74d2a894c59963eac8a145..ef4d60961e89ba2566d484bdd42ae800796beded 100644
--- a/front/src/views/admin/users/UsersList.vue
+++ b/front/src/views/admin/users/UsersList.vue
@@ -1,7 +1,7 @@
 <template>
-  <div v-title="$t('Users')">
+  <div v-title="labels.users">
     <div class="ui vertical stripe segment">
-      <h2 class="ui header">{{ $t('Users') }}</h2>
+      <h2 class="ui header"><translate>Users</translate></h2>
       <div class="ui hidden divider"></div>
       <users-table></users-table>
     </div>
@@ -14,6 +14,13 @@ import UsersTable from '@/components/manage/users/UsersTable'
 export default {
   components: {
     UsersTable
+  },
+  computed: {
+    labels () {
+      return {
+        users: this.$gettext('Users')
+      }
+    }
   }
 }
 </script>
diff --git a/front/src/views/auth/EmailConfirm.vue b/front/src/views/auth/EmailConfirm.vue
index 7ffa3c8d1bb96073f34985000bd624a22fe0523e..7b982504506781119fc27efbffd53ff9c61b3854 100644
--- a/front/src/views/auth/EmailConfirm.vue
+++ b/front/src/views/auth/EmailConfirm.vue
@@ -1,30 +1,30 @@
 <template>
-  <div class="main pusher" v-title="$t('Confirm your email')">
+  <div class="main pusher" v-title="labels.confirm">
     <div class="ui vertical stripe segment">
       <div class="ui small text container">
-        <h2>{{ $t('Confirm your email') }}</h2>
+        <h2><translate>Confirm your email</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">{{ $t('Error while confirming your email') }}</div>
+            <div class="header"><translate>Error while confirming your email</translate></div>
             <ul class="list">
               <li v-for="error in errors">{{ error }}</li>
             </ul>
           </div>
           <div class="field">
-            <label>{{ $t('Confirmation code') }}</label>
+            <label><translate>Confirmation code</translate></label>
             <input type="text" required v-model="key" />
           </div>
           <router-link :to="{path: '/login'}">
-            {{ $t('Back to login') }}
+            <translate>Back to login</translate>
           </router-link>
           <button :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit">
-            {{ $t('Confirm your email') }}</button>
+            <translate>Confirm your email</translate></button>
         </form>
         <div v-else class="ui positive message">
-          <div class="header">{{ $t('Email confirmed') }}</div>
-          <p>{{ $t('Your email address was confirmed, you can now use the service without limitations.') }}</p>
+          <div class="header"><translate>Email confirmed</translate></div>
+          <p><translate>Your email address was confirmed, you can now use the service without limitations.</translate></p>
           <router-link :to="{name: 'login'}">
-            {{ $t('Proceed to login') }}
+            <translate>Proceed to login</translate>
           </router-link>
         </div>
       </div>
@@ -45,6 +45,13 @@ export default {
       success: false
     }
   },
+  computed: {
+    labels () {
+      return {
+        confirm: this.$gettext('Confirm your email')
+      }
+    }
+  },
   methods: {
     submit () {
       let self = this
diff --git a/front/src/views/auth/PasswordReset.vue b/front/src/views/auth/PasswordReset.vue
index f6b445e00fa4e5f38e852b0f5c9c50c407ffd820..52787a516ff52e22813f83579973bf6de8170387 100644
--- a/front/src/views/auth/PasswordReset.vue
+++ b/front/src/views/auth/PasswordReset.vue
@@ -1,31 +1,31 @@
 <template>
-  <div class="main pusher" v-title="$t('Reset your password')">
+  <div class="main pusher" v-title="labels.reset">
     <div class="ui vertical stripe segment">
       <div class="ui small text container">
-        <h2>{{ $t('Reset your password') }}</h2>
+        <h2><translate>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">{{ $t('Error while asking for a password reset') }}</div>
+            <div class="header"><translate>Error while asking for a password reset</translate></div>
             <ul class="list">
               <li v-for="error in errors">{{ error }}</li>
             </ul>
           </div>
-          <p>{{ $t('Use this form to request a password reset. We will send an email to the given address with instructions to reset your password.') }}</p>
+          <p><translate>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>{{ $t('Account\'s email') }}</label>
+            <label><translate>Account's email</translate></label>
             <input
               required
               ref="email"
               type="email"
               autofocus
-              :placeholder="$t('Input the email address binded to your account')"
+              :placeholder="labels.placeholder"
               v-model="email">
           </div>
           <router-link :to="{path: '/login'}">
-            {{ $t('Back to login') }}
+            <translate>Back to login</translate>
           </router-link>
           <button :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit">
-            {{ $t('Ask for a password reset') }}</button>
+            <translate>Ask for a password reset</translate></button>
         </form>
       </div>
     </div>
@@ -47,6 +47,16 @@ export default {
   mounted () {
     this.$refs.email.focus()
   },
+  computed: {
+    labels () {
+      let reset = this.$gettext('Reset your password')
+      let placeholder = this.$gettext('Input the email address binded to your account')
+      return {
+        reset,
+        placeholder
+      }
+    }
+  },
   methods: {
     submit () {
       let self = this
diff --git a/front/src/views/auth/PasswordResetConfirm.vue b/front/src/views/auth/PasswordResetConfirm.vue
index 102ed6126d1275cc4cbfd9789dff54a0ba40784c..b6e4f23224242d160b0c2121b176ed5fb07a8287 100644
--- a/front/src/views/auth/PasswordResetConfirm.vue
+++ b/front/src/views/auth/PasswordResetConfirm.vue
@@ -1,35 +1,35 @@
 <template>
-  <div class="main pusher" v-title="$t('Change your password')">
+  <div class="main pusher" v-title="labels.changePassword">
     <div class="ui vertical stripe segment">
       <div class="ui small text container">
-        <h2>{{ $t('Change your password') }}</h2>
+        <h2><translate>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">{{ $t('Error while changing your password') }}</div>
+            <div class="header"><translate>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>{{ $t('New password') }}</label>
+              <label><translate>New password</translate></label>
               <password-input v-model="newPassword" />
             </div>
             <router-link :to="{path: '/login'}">
-              {{ $t('Back to login') }}
+              <translate>Back to login</translate>
             </router-link>
             <button :class="['ui', {'loading': isLoading}, 'right', 'floated', 'green', 'button']" type="submit">
-              {{ $t('Update your password') }}</button>
+              <translate>Update your password</translate></button>
           </template>
           <template v-else>
-            <p>{{ $t('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.') }}</p>
+            <p><translate>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">{{ $t('Password updated successfully') }}</div>
-          <p>{{ $t('Your password has been updated successfully.') }}</p>
+          <div class="header"><translate>Password updated successfully</translate></div>
+          <p><translate>Your password has been updated successfully.</translate></p>
           <router-link :to="{name: 'login'}">
-            {{ $t('Proceed to login') }}
+            <translate>Proceed to login</translate>
           </router-link>
         </div>
       </div>
@@ -56,6 +56,13 @@ export default {
       success: false
     }
   },
+  computed: {
+    labels () {
+      return {
+        changePassword: this.$gettext('Change your password')
+      }
+    }
+  },
   methods: {
     submit () {
       let self = this
diff --git a/front/src/views/federation/Base.vue b/front/src/views/federation/Base.vue
index 951fe9f0f1c49abe2d43274151008f9d97113439..417b3f3f7bf3d731dce93cbdd207c10ee9776467 100644
--- a/front/src/views/federation/Base.vue
+++ b/front/src/views/federation/Base.vue
@@ -1,18 +1,18 @@
 <template>
-  <div class="main pusher"  v-title="'Federation'">
+  <div class="main pusher"  v-title="labels.title">
     <div class="ui secondary pointing menu">
       <router-link
         class="ui item"
-        :to="{name: 'federation.libraries.list'}">{{ $t('Libraries') }}</router-link>
+        :to="{name: 'federation.libraries.list'}"><translate>Libraries</translate></router-link>
       <router-link
         class="ui item"
-        :to="{name: 'federation.tracks.list'}">{{ $t('Tracks') }}</router-link>
+        :to="{name: 'federation.tracks.list'}"><translate>Tracks</translate></router-link>
         <div class="ui secondary right menu">
           <router-link
             class="ui item"
             :to="{name: 'federation.followers.list'}">
-            {{ $t('Followers') }}
-            <div class="ui teal label" :title="$t('Pending requests')">{{ requestsCount }}</div>
+            <translate>Followers</translate>
+            <div class="ui teal label" :title="labels.pendingRequests">{{ requestsCount }}</div>
           </router-link>
         </div>
     </div>
@@ -30,6 +30,16 @@ export default {
   created () {
     this.fetchRequestsCount()
   },
+  computed: {
+    labels () {
+      let title = this.$gettext('Federation')
+      let pendingRequests = this.$gettext('Pending requests')
+      return {
+        title,
+        pendingRequests
+      }
+    }
+  },
   methods: {
     fetchRequestsCount () {
       let self = this
@@ -40,16 +50,3 @@ export default {
   }
 }
 </script>
-<style lang="scss">
-@import '../../style/vendor/media';
-
-.main.pusher > .ui.secondary.menu {
-  @include media(">tablet") {
-    margin: 0 2.5rem;
-  }
-  .item {
-    padding-top: 1.5em;
-    padding-bottom: 1.5em;
-  }
-}
-</style>
diff --git a/front/src/views/federation/LibraryDetail.vue b/front/src/views/federation/LibraryDetail.vue
index 7a842b679a967ed288f9805d1dbf684f2256d859..708156c1984857f601320c7cf8577371c562cf29 100644
--- a/front/src/views/federation/LibraryDetail.vue
+++ b/front/src/views/federation/LibraryDetail.vue
@@ -1,6 +1,6 @@
 <template>
   <div>
-    <div v-if="isLoading" class="ui vertical segment" v-title="'Library'">
+    <div v-if="isLoading" class="ui vertical segment" v-title="labels.title">
       <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
     </div>
     <template v-if="object">
@@ -19,18 +19,18 @@
             <tbody>
               <tr>
                 <td >
-                  {{ $t('Follow status') }}
-                  <span :data-tooltip="$t('This indicate if the remote library granted you access')"><i class="question circle icon"></i></span>
+                  <translate>Follow status</translate>
+                  <span :data-tooltip="labels.statusTooltip"><i class="question circle icon"></i></span>
                 </td>
                 <td>
                   <template v-if="object.follow.approved === null">
-                    <i class="loading icon"></i> {{ $t('Pending approval') }}
+                    <i class="loading icon"></i> <translate>Pending approval</translate>
                   </template>
                   <template v-else-if="object.follow.approved === true">
-                    <i class="check icon"></i> {{ $t('Following') }}
+                    <i class="check icon"></i> <translate>Following</translate>
                   </template>
                   <template v-else-if="object.follow.approved === false">
-                    <i class="x icon"></i> {{ $t('Not following') }}
+                    <i class="x icon"></i> <translate>Not following</translate>
                   </template>
                 </td>
                 <td>
@@ -38,8 +38,8 @@
               </tr>
               <tr>
                 <td>
-                  {{ $t('Federation') }}
-                  <span :data-tooltip="$t('Use this flag to enable/disable federation with this library')"><i class="question circle icon"></i></span>
+                  <translate>Federation</translate>
+                  <span :data-tooltip="labels.federationTooltip"><i class="question circle icon"></i></span>
                 </td>
                 <td>
                   <div class="ui toggle checkbox">
@@ -54,8 +54,8 @@
               </tr>
               <tr>
                 <td>
-                  {{ $t('Auto importing') }}
-                  <span :data-tooltip="$t('When enabled, auto importing will automatically import new tracks published in this library')"><i class="question circle icon"></i></span>
+                  <translate>Auto importing</translate>
+                  <span :data-tooltip="labels.autoImportTooltip"><i class="question circle icon"></i></span>
                 </td>
                 <td>
                   <div class="ui toggle checkbox">
@@ -69,7 +69,7 @@
               </tr>
               <!-- Disabled until properly implemented on the backend
               <tr>
-                <td>File mirroring</td>
+                <td><translate>File mirroring</translate></td>
                 <td>
                   <div class="ui toggle checkbox">
                     <input
@@ -82,19 +82,24 @@
               </tr>
               -->
               <tr>
-                <td>{{ $t('Library size') }}</td>
+                <td><translate>Library size</translate></td>
                 <td>
                   <template v-if="object.tracks_count">
-                    {{ $t('{%count%} tracks', { count: object.tracks_count }) }}
+                    <translate
+                      translate-plural="%{ count } tracks"
+                      :translate-n="object.tracks_count"
+                      :translate-params="{count: object.tracks_count}">
+                      %{ count } track
+                    </translate>
                   </template>
                   <template v-else>
-                    {{ $t('Unkwnown') }}
+                    <translate>Unknown</translate>
                   </template>
                 </td>
                 <td></td>
               </tr>
               <tr>
-                <td>{{ $t('Last fetched') }}</td>
+                <td><translate>Last fetched</translate></td>
                 <td>
                   <human-date v-if="object.fetched_date" :date="object.fetched_date"></human-date>
                   <template v-else>Never</template>
@@ -102,10 +107,10 @@
                     @click="scan"
                     v-if="!scanTrigerred"
                     :class="['ui', 'basic', {loading: isScanLoading}, 'button']">
-                    <i class="sync icon"></i> {{ $t('Trigger scan') }}
+                    <i class="sync icon"></i> <translate>Trigger scan</translate>
                   </button>
                   <button v-else class="ui success button">
-                    <i class="check icon"></i> {{ $t('Scan triggered!') }}
+                    <i class="check icon"></i> <translate>Scan triggered!</translate>
                   </button>
 
                 </td>
@@ -115,10 +120,10 @@
           </table>
         </div>
         <div class="ui hidden divider"></div>
-        <button @click="fetchData" class="ui basic button">{{ $t('Refresh') }}</button>
+        <button @click="fetchData" class="ui basic button"><translate>Refresh</translate></button>
       </div>
       <div class="ui vertical stripe segment">
-        <h2>{{ $t('Tracks available in this library') }}</h2>
+        <h2><translate>Tracks available in this library</translate></h2>
         <library-track-table v-if="!isLoading" :filters="{library: id}"></library-track-table>
       </div>
     </template>
@@ -185,6 +190,18 @@ export default {
     }
   },
   computed: {
+    labels () {
+      let title = this.$gettext('Library')
+      let statusTooltip = this.$gettext('This indicate if the remote library granted you access')
+      let federationTooltip = this.$gettext('Use this flag to enable/disable federation with this library')
+      let autoImportTooltip = this.$gettext('When enabled, auto importing will automatically import new tracks published in this library')
+      return {
+        title,
+        statusTooltip,
+        federationTooltip,
+        autoImportTooltip
+      }
+    },
     libraryUsername () {
       let actor = this.object.actor
       return `${actor.preferred_username}@${actor.domain}`
diff --git a/front/src/views/federation/LibraryFollowersList.vue b/front/src/views/federation/LibraryFollowersList.vue
index ce79e478747267637a418cb31f979a0421d1f98a..0a9267a85acdfa8b1e4d14d3b128fa6752118bfc 100644
--- a/front/src/views/federation/LibraryFollowersList.vue
+++ b/front/src/views/federation/LibraryFollowersList.vue
@@ -1,9 +1,9 @@
 <template>
-  <div v-title="'Followers'">
+  <div v-title="labels.title">
     <div class="ui vertical stripe segment">
-      <h2 class="ui header">{{ $t('Browsing followers') }}</h2>
+      <h2 class="ui header"><translate>Browsing followers</translate></h2>
       <p>
-        {{ $t('Be careful when accepting follow requests, as it means the follower will have access to your entire library.') }}
+        <translate>Be careful when accepting follow requests, as it means the follower will have access to your entire library.</translate>
       </p>
       <div class="ui hidden divider"></div>
       <library-follow-table></library-follow-table>
@@ -17,6 +17,13 @@ import LibraryFollowTable from '@/components/federation/LibraryFollowTable'
 export default {
   components: {
     LibraryFollowTable
+  },
+  computed: {
+    labels () {
+      return {
+        title: this.$gettext('Followers')
+      }
+    }
   }
 }
 </script>
diff --git a/front/src/views/federation/LibraryList.vue b/front/src/views/federation/LibraryList.vue
index d067705fa7d52a399a9f71cc59df9c8071aaa6ad..d627d65f4f99de273cabc24bca80c89b205b1a82 100644
--- a/front/src/views/federation/LibraryList.vue
+++ b/front/src/views/federation/LibraryList.vue
@@ -1,22 +1,22 @@
 <template>
-  <div v-title="'Libraries'">
+  <div v-title="labels.title">
     <div class="ui vertical stripe segment">
-      <h2 class="ui header">{{ $t('Browsing libraries') }}</h2>
+      <h2 class="ui header"><translate>Browsing libraries</translate></h2>
       <router-link
         class="ui basic green button"
         :to="{name: 'federation.libraries.scan'}">
         <i class="plus icon"></i>
-        {{ $t('Add a new library') }}
+        <translate>Add a new library</translate>
       </router-link>
       <div class="ui hidden divider"></div>
       <div :class="['ui', {'loading': isLoading}, 'form']">
         <div class="fields">
           <div class="field">
-            <label>{{ $t('Search') }}</label>
-            <input class="search" type="text" v-model="query" placeholder="Enter an library domain name..."/>
+            <label><translate>Search</translate></label>
+            <input class="search" type="text" v-model="query" :placeholder="labels.searchPlaceholder"/>
           </div>
           <div class="field">
-            <label>{{ $t('Ordering') }}</label>
+            <label><translate>Ordering</translate></label>
             <select class="ui dropdown" v-model="ordering">
               <option v-for="option in orderingOptions" :value="option[0]">
                 {{ option[1] }}
@@ -24,14 +24,14 @@
             </select>
           </div>
           <div class="field">
-            <label>{{ $t('Ordering direction') }}</label>
+            <label><translate>Ordering direction</translate></label>
             <select class="ui dropdown" v-model="orderingDirection">
-              <option value="+">{{ $t('Ascending') }}</option>
-              <option value="-">{{ $t('Descending') }}</option>
+              <option value="+"><translate>Ascending</translate></option>
+              <option value="-"><translate>Descending</translate></option>
             </select>
           </div>
           <div class="field">
-            <label>{{ $t('Results per page') }}</label>
+            <label><translate>Results per page</translate></label>
             <select class="ui dropdown" v-model="paginateBy">
               <option :value="parseInt(12)">12</option>
               <option :value="parseInt(25)">25</option>
@@ -117,6 +117,16 @@ export default {
     $('.ui.dropdown').dropdown()
     $(this.$el).find('.field .search').focus()
   },
+  computed: {
+    labels () {
+      let searchPlaceholder = this.$gettext('Enter a library domain name...')
+      let title = this.$gettext('Libraries')
+      return {
+        searchPlaceholder,
+        title
+      }
+    }
+  },
   methods: {
     updateQueryString: _.debounce(function () {
       this.$router.replace({
diff --git a/front/src/views/federation/LibraryTrackList.vue b/front/src/views/federation/LibraryTrackList.vue
index b9a78527f16eac6eae0fb6365ede85cd35f0248f..55f9e46af49444c62b2733242ae5e44edad59055 100644
--- a/front/src/views/federation/LibraryTrackList.vue
+++ b/front/src/views/federation/LibraryTrackList.vue
@@ -1,7 +1,7 @@
 <template>
-  <div v-title="'Federated tracks'">
+  <div v-title="labels.title">
     <div class="ui vertical stripe segment">
-      <h2 class="ui header">{{ $t('Browsing federated tracks') }}</h2>
+      <h2 class="ui header"><translate>Browsing federated tracks</translate></h2>
       <div class="ui hidden divider"></div>
       <library-track-table :show-library="true"></library-track-table>
     </div>
@@ -14,6 +14,13 @@ import LibraryTrackTable from '@/components/federation/LibraryTrackTable'
 export default {
   components: {
     LibraryTrackTable
+  },
+  computed: {
+    labels () {
+      return {
+        title: this.$gettext('Federated tracks')
+      }
+    }
   }
 }
 </script>
diff --git a/front/src/views/instance/Timeline.vue b/front/src/views/instance/Timeline.vue
index a5647b7bf919759dc443d4f95d0def829ffb20d5..a70bd404966cc96972efadaa3f8146ee7b9bb599 100644
--- a/front/src/views/instance/Timeline.vue
+++ b/front/src/views/instance/Timeline.vue
@@ -1,11 +1,11 @@
 <template>
-  <div class="main pusher" v-title="'Instance Timeline'">
+  <div class="main pusher" v-title="labels.title">
     <div class="ui vertical center aligned stripe segment">
       <div v-if="isLoading" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']">
-        <div class="ui text loader">{{ $t('Loading timeline...') }}</div>
+        <div class="ui text loader"><translate>Loading timeline...</translate></div>
       </div>
       <div v-else class="ui text container">
-        <h1 class="ui header">{{ $t('Recent activity on this instance') }}</h1>
+        <h1 class="ui header"><translate>Recent activity on this instance</translate></h1>
         <div class="ui feed">
           <component
             class="event"
@@ -51,7 +51,12 @@ export default {
   computed: {
     ...mapState({
       events: state => state.instance.events
-    })
+    }),
+    labels () {
+      return {
+        title: this.$gettext('Instance Timeline')
+      }
+    }
   },
   methods: {
     fetchEvents () {
diff --git a/front/src/views/library/MusicRequest.vue b/front/src/views/library/MusicRequest.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ac2aeafb2c6cb4732c29cdaad275a1bbf69a3363
--- /dev/null
+++ b/front/src/views/library/MusicRequest.vue
@@ -0,0 +1,32 @@
+<template>
+  <div class="ui vertical stripe segment" v-title="labels.title">
+    <div class="ui small text container">
+      <h2 class="ui header">
+        <translate>Request some music</translate>
+      </h2>
+      <request-form v-if="$store.state.auth.authenticated"></request-form>
+    </div>
+  </div>
+</template>
+
+<script>
+import RequestForm from '@/components/requests/Form'
+
+export default {
+  components: {
+    RequestForm
+  },
+  computed: {
+    labels () {
+      let title = this.$gettext('Request some music')
+      return {
+        title
+      }
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+</style>
diff --git a/front/src/views/playlists/Detail.vue b/front/src/views/playlists/Detail.vue
index 7a378fa67c5bd6ed40417113b188bcc2c4d45ab9..f9d2327759f814ff582769534cf9edcabffc5b04 100644
--- a/front/src/views/playlists/Detail.vue
+++ b/front/src/views/playlists/Detail.vue
@@ -1,6 +1,6 @@
 <template>
   <div>
-    <div v-if="isLoading" class="ui vertical segment" v-title="$t('Playlist')">
+    <div v-if="isLoading" class="ui vertical segment" v-title="labels.playlist">
       <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
     </div>
     <div v-if="!isLoading && playlist" class="ui head vertical center aligned stripe segment" v-title="playlist.name">
@@ -9,28 +9,34 @@
           <i class="circular inverted list yellow icon"></i>
           <div class="content">
             {{ playlist.name }}
-            <i18next tag="div" class="sub header" path="Playlist containing {%0%} tracks, by {%1%}">
-              {{ playlistTracks.length }}
-              <username :username="playlist.user.username"></username>
-            </i18next>
+            <div class="sub header">
+              <translate
+                translate-plural="Playlist containing %{ count } tracks, by %{ username }"
+                :translate-n="playlistTracks.length"
+                :translate-params="{count: playlistTracks.length, username: playlist.user.username}">
+                Playlist containing %{ count } track, by %{ username }
+              </translate><br>
+              <duration :seconds="playlist.duration" />
+            </div>
           </div>
         </h2>
         <div class="ui hidden divider"></div>
-        </button>
-        <play-button class="orange" :tracks="tracks">{{ $t('Play all') }}</play-button>
+        <play-button class="orange" :tracks="tracks"><translate>Play all</translate></play-button>
         <button
           class="ui icon button"
           v-if="playlist.user.id === $store.state.auth.profile.id"
           @click="edit = !edit">
           <i class="pencil icon"></i>
-          <template v-if="edit">{{ $t('End edition') }}</template>
-          <template v-else>{{ $t('Edit...') }}</template>
+          <template v-if="edit"><translate>End edition</translate></template>
+          <template v-else><translate>Edit...</translate></template>
         </button>
-        <dangerous-button class="labeled icon" :action="deletePlaylist">
-          <i class="trash icon"></i> {{ $t('Delete') }}
-          <p slot="modal-header">{{ $t('Do you want to delete the playlist "{% playlist %}"?', {playlist: playlist.name}) }}</p>
-          <p slot="modal-content">{{ $t('This will completely delete this playlist and cannot be undone.') }}</p>
-          <p slot="modal-confirm">{{ $t('Delete playlist') }}</p>
+        <dangerous-button v-if="playlist.user.id === $store.state.auth.profile.id" class="labeled icon" :action="deletePlaylist">
+          <i class="trash icon"></i> <translate>Delete</translate>
+          <p slot="modal-header">
+            <translate :translate-params="{playlist: playlist.name}">Do you want to delete the playlist "%{ playlist }"?</translate>
+          </p>
+          <p slot="modal-content"><translate>This will completely delete this playlist and cannot be undone.</translate></p>
+          <p slot="modal-confirm"><translate>Delete playlist</translate></p>
         </dangerous-button>
       </div>
     </div>
@@ -42,7 +48,7 @@
           :playlist="playlist" :playlist-tracks="playlistTracks"></playlist-editor>
       </template>
       <template v-else>
-        <h2>Tracks</h2>
+        <h2><translate>Tracks</translate></h2>
         <track-table :display-position="true" :tracks="tracks"></track-table>
       </template>
     </div>
@@ -78,6 +84,13 @@ export default {
   created: function () {
     this.fetch()
   },
+  computed: {
+    labels () {
+      return {
+        playlist: this.$gettext('Playlist')
+      }
+    }
+  },
   methods: {
     updatePlts (v) {
       this.playlistTracks = v
diff --git a/front/src/views/playlists/List.vue b/front/src/views/playlists/List.vue
index cc6ad49bb84d8b98edbf00d4d6df009613570c03..a831dfe7035ca033fd24a20e807ab289d011c5dd 100644
--- a/front/src/views/playlists/List.vue
+++ b/front/src/views/playlists/List.vue
@@ -1,21 +1,21 @@
 <template>
-  <div v-title="$t('Playlists')">
+  <div v-title="labels.playlists">
     <div class="ui vertical stripe segment">
-      <h2 class="ui header">{{ $t('Browsing playlists') }}</h2>
+      <h2 class="ui header"><translate>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">{{ $t('Manage your playlists') }}</button>
+            class="ui basic green button"><translate>Manage your playlists</translate></button>
           <div class="ui hidden divider"></div>
         </template>
         <div class="fields">
           <div class="field">
-            <label>{{ $t('Search') }}</label>
-            <input type="text" v-model="query" :placeholder="$t('Enter an playlist name...')"/>
+            <label><translate>Search</translate></label>
+            <input type="text" v-model="query" :placeholder="labels.searchPlaceholder"/>
           </div>
           <div class="field">
-            <label>{{ $t('Ordering') }}</label>
+            <label><translate>Ordering</translate></label>
             <select class="ui dropdown" v-model="ordering">
               <option v-for="option in orderingOptions" :value="option[0]">
                 {{ option[1] }}
@@ -23,14 +23,14 @@
             </select>
           </div>
           <div class="field">
-            <label>{{ $t('Ordering direction') }}</label>
+            <label><translate>Ordering direction</translate></label>
             <select class="ui dropdown" v-model="orderingDirection">
-              <option value="+">{{ $t('Ascending') }}</option>
-              <option value="-">{{ $t('Descending') }}</option>
+              <option value="+"><translate>Ascending</translate></option>
+              <option value="-"><translate>Descending</translate></option>
             </select>
           </div>
           <div class="field">
-            <label>{{ $t('Results per page') }}</label>
+            <label><translate>Results per page</translate></label>
             <select class="ui dropdown" v-model="paginateBy">
               <option :value="parseInt(12)">12</option>
               <option :value="parseInt(25)">25</option>
@@ -98,6 +98,16 @@ export default {
   mounted () {
     $('.ui.dropdown').dropdown()
   },
+  computed: {
+    labels () {
+      let playlists = this.$gettext('Playlists')
+      let searchPlaceholder = this.$gettext('Enter an playlist name...')
+      return {
+        playlists,
+        searchPlaceholder
+      }
+    }
+  },
   methods: {
     updateQueryString: _.debounce(function () {
       this.$router.replace({
@@ -108,7 +118,7 @@ export default {
           ordering: this.getOrderingAsString()
         }
       })
-    }, 500),
+    }, 250),
     fetchData: _.debounce(function () {
       var self = this
       this.isLoading = true
diff --git a/front/src/views/radios/Detail.vue b/front/src/views/radios/Detail.vue
index 0975398b54237577332a672d3c3f80e1a5c9b169..e269bf284e9c08fbd52e00061070d4f3fac02bb3 100644
--- a/front/src/views/radios/Detail.vue
+++ b/front/src/views/radios/Detail.vue
@@ -1,6 +1,6 @@
 <template>
   <div>
-    <div v-if="isLoading" class="ui vertical segment" v-title="'Radio'">
+    <div v-if="isLoading" class="ui vertical segment" v-title="labels.title">
       <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
     </div>
     <div v-if="!isLoading && radio" class="ui head vertical center aligned stripe segment" v-title="radio.name">
@@ -24,15 +24,15 @@
           </router-link>
           <dangerous-button class="labeled icon" :action="deleteRadio">
             <i class="trash icon"></i> Delete
-            <p slot="modal-header">Do you want to delete the radio "{{ radio.name }}"?</p>
-            <p slot="modal-content">This will completely delete this radio and cannot be undone.</p>
-            <p slot="modal-confirm">Delete radio</p>
+            <p slot="modal-header"><translate :translate-params="{radio: radio.name}">Do you want to delete the radio "%{ radio }"?</translate></p>
+            <p slot="modal-content"><translate>This will completely delete this radio and cannot be undone.</translate></p>
+            <p slot="modal-confirm"><translate>Delete radio</translate></p>
           </dangerous-button>
         </template>
       </div>
     </div>
     <div class="ui vertical stripe segment">
-      <h2>Tracks</h2>
+      <h2><translate>Tracks</translate></h2>
       <track-table :tracks="tracks"></track-table>
       <div class="ui center aligned basic segment">
         <pagination
@@ -74,6 +74,13 @@ export default {
   created: function () {
     this.fetch()
   },
+  computed: {
+    labels () {
+      return {
+        title: this.$gettext('Radio')
+      }
+    }
+  },
   methods: {
     selectPage: function (page) {
       this.page = page
diff --git a/front/vendor/vue-i18n-xgettext/extractor.js b/front/vendor/vue-i18n-xgettext/extractor.js
deleted file mode 100644
index e8f2bde4faaa838cc692ef5ff7883f780776b607..0000000000000000000000000000000000000000
--- a/front/vendor/vue-i18n-xgettext/extractor.js
+++ /dev/null
@@ -1,203 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-var _cheerio = require('cheerio');
-
-var _cheerio2 = _interopRequireDefault(_cheerio);
-
-var _pofile = require('pofile');
-
-var _pofile2 = _interopRequireDefault(_pofile);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-var tRegexp = new RegExp('.*\\$t\\([\'\"\`](.*)[\'\"\`]\\).*', 'g');
-
-var Translation = function () {
-  function Translation(filename, lineNumber, msg) {
-    _classCallCheck(this, Translation);
-
-    this.filename = filename;
-    this.lineNumber = lineNumber;
-    this.msg = msg;
-  }
-
-  _createClass(Translation, [{
-    key: 'toPofileItem',
-    value: function toPofileItem() {
-      var item = new _pofile2.default.Item();
-      item.msgid = this.msg;
-      item.msgctxt = null;
-      item.references = [this.filename + ':' + this.lineNumber];
-      item.msgid_plural = null;
-      item.msgstr = [];
-      item.extractedComments = [];
-      return item;
-    }
-  }]);
-
-  return Translation;
-}();
-
-var Extractor = function () {
-  function Extractor(options) {
-    _classCallCheck(this, Extractor);
-
-    this.options = _extends({
-      startDelim: '{{',
-      endDelim: '}}',
-      attributes: ['path']
-    }, options);
-    this.translations = [];
-  }
-
-  _createClass(Extractor, [{
-    key: 'parse',
-    value: function parse(filename, content) {
-      var $ = _cheerio2.default.load(content, {
-        decodeEntities: false,
-        withStartIndices: true
-      });
-
-      var translations = $('template *').map(function (i, el) {
-        var node = $(el);
-        var msg = null;
-        if (node['0'].name === 'i18next') {
-          // here, we extract the translations from <i18next path="string">
-          msg = this.extractTranslationMessageFromI18Next(node);
-        }
-        if (msg) {
-          var truncatedText = content.substr(0, el.startIndex);
-          var lineNumber = truncatedText.split(/\r\n|\r|\n/).length;
-          return new Translation(filename, lineNumber, msg);
-        }
-      }.bind(this)).get();
-      var scriptTranslations = $('script,template').map(function (i, el) {
-        // here, we extract the translations from $t('string')
-        // within scripts and templates
-        var script = $(el).text();
-        var lines = script.split('\n');
-        var _translations = [];
-        lines.forEach(function (line) {
-          var truncatedText = content.substr(0, el.startIndex);
-          var matches;
-          while ((matches = tRegexp.exec(line)) !== null) {
-            var lineNumber = truncatedText.split(/\r\n|\r|\n/).length;
-            _translations.push(new Translation(filename, lineNumber, matches[1]));
-          }
-        })
-        return _translations
-      }.bind(this)).get();
-      this.translations = this.translations.concat(translations);
-      this.translations = this.translations.concat(scriptTranslations);
-    }
-  }, {
-    key: 'extractTranslationMessageFromI18Next',
-    value: function extractTranslationMessageFromI18Next(node) {
-      // extract from attributes
-      var _iteratorNormalCompletion = true;
-      var _didIteratorError = false;
-      var _iteratorError = undefined;
-
-      try {
-        for (var _iterator = this.options.attributes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-          var attr = _step.value;
-
-          if (node.attr('path')) {
-            return node.attr('path');
-          }
-        }
-      } catch (err) {
-        _didIteratorError = true;
-        _iteratorError = err;
-      } finally {
-        try {
-          if (!_iteratorNormalCompletion && _iterator.return) {
-            _iterator.return();
-          }
-        } finally {
-          if (_didIteratorError) {
-            throw _iteratorError;
-          }
-        }
-      }
-    }
-  }, {
-    key: 'toPofile',
-    value: function toPofile() {
-      var pofile = new _pofile2.default();
-      pofile.headers = {
-        'Last-Translator': 'vue-i18n-xgettext',
-        'Content-Type': 'text/plain; charset=UTF-8',
-        'Content-Transfer-Encoding': '8bit',
-        'MIME-Version': '1.1'
-      };
-
-      var itemMapping = {};
-      var _iteratorNormalCompletion2 = true;
-      var _didIteratorError2 = false;
-      var _iteratorError2 = undefined;
-
-      try {
-        for (var _iterator2 = this.translations[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
-          var translation = _step2.value;
-
-          var _item = translation.toPofileItem();
-          if (!itemMapping[_item.msgid]) {
-            itemMapping[_item.msgid] = _item;
-          } else {
-            var oldItem = itemMapping[_item.msgid];
-            // TODO: deal with plurals/context
-            if (_item.references.length && oldItem.references.indexOf(_item.references[0]) === -1) {
-              oldItem.references.push(_item.references[0]);
-            }
-            if (_item.extractedComments.length && soldItem.extractedComments.indexOf(_item.extractedComments[0]) === -1) {
-              oldItem.extractedComments.push(_item.extractedComments[0]);
-            }
-          }
-        }
-      } catch (err) {
-        _didIteratorError2 = true;
-        _iteratorError2 = err;
-      } finally {
-        try {
-          if (!_iteratorNormalCompletion2 && _iterator2.return) {
-            _iterator2.return();
-          }
-        } finally {
-          if (_didIteratorError2) {
-            throw _iteratorError2;
-          }
-        }
-      }
-
-      for (var msgid in itemMapping) {
-        var item = itemMapping[msgid];
-        pofile.items.push(item);
-      }
-
-      pofile.items.sort(function (a, b) {
-        return a.msgid.localeCompare(b.msgid);
-      });
-      return pofile;
-    }
-  }, {
-    key: 'toString',
-    value: function toString() {
-      return this.toPofile().toString();
-    }
-  }]);
-
-  return Extractor;
-}();
-
-exports.default = Extractor;
-//# sourceMappingURL=extractor.js.map
diff --git a/front/vendor/vue-i18n-xgettext/index.js b/front/vendor/vue-i18n-xgettext/index.js
deleted file mode 100755
index 2b8886e478253edf4461dc44570bd860a131738c..0000000000000000000000000000000000000000
--- a/front/vendor/vue-i18n-xgettext/index.js
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/env node
-'use strict';
-
-var _fs = require('fs');
-
-var _fs2 = _interopRequireDefault(_fs);
-
-var _minimist = require('minimist');
-
-var _minimist2 = _interopRequireDefault(_minimist);
-
-var _extractor = require('./extractor.js');
-
-var _extractor2 = _interopRequireDefault(_extractor);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var argv = (0, _minimist2.default)(process.argv.slice(2));
-var files = argv._.sort() || [];
-var attributes = argv.attribute || [];
-var outputFile = argv.output || null;
-
-if (!files || files.length === 0) {
-  console.log('Usage: vue-i18n-xgettext [--attribute ATTRIBUTE] [--output OUTPUT_FILE] FILES');
-  process.exit(1);
-}
-
-var defaultAttributes = ['v-text'];
-var finalAttributes = defaultAttributes;
-if (typeof attributes === 'string') {
-  finalAttributes.push(attributes);
-} else {
-  finalAttributes = finalAttributes.concat(attributes);
-}
-
-var extractor = new _extractor2.default({
-  attributes: finalAttributes
-});
-
-files.forEach(function (filename) {
-  var extension = filename.split('.').pop();
-  if (extension !== 'vue') {
-    console.log('file ' + filename + ' with extension ' + extension + ' will not be processed (skipped)');
-    return;
-  }
-
-  var data = _fs2.default.readFileSync(filename, { encoding: 'utf-8' }).toString();
-
-  try {
-    extractor.parse(filename, data);
-  } catch (e) {
-    console.trace(e);
-    process.exit(1);
-  }
-});
-
-var output = extractor.toString();
-if (outputFile) {
-  _fs2.default.writeFileSync(outputFile, output);
-} else {
-  console.log(output);
-}
-//# sourceMappingURL=index.js.map
diff --git a/front/yarn.lock b/front/yarn.lock
index 7cf3cb116a011e36dab7d92df31341c2da9eee1c..5c69d78893cdf414feba6c5412acbba6edb4f380 100644
--- a/front/yarn.lock
+++ b/front/yarn.lock
@@ -8,6 +8,34 @@
   dependencies:
     deepmerge "^2.0.0"
 
+"@types/babel-types@*", "@types/babel-types@^7.0.0":
+  version "7.0.4"
+  resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.4.tgz#bfd5b0d0d1ba13e351dff65b6e52783b816826c8"
+
+"@types/babylon@^6.16.2":
+  version "6.16.3"
+  resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.3.tgz#c2937813a89fcb5e79a00062fc4a8b143e7237bb"
+  dependencies:
+    "@types/babel-types" "*"
+
+"@types/node@*":
+  version "10.5.1"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.1.tgz#d578446f4abff5c0b49ade9b4e5274f6badaadfc"
+
+"@vue/component-compiler-utils@^1.2.1":
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-1.3.1.tgz#686f0b913d59590ae327b2a1cb4b6d9b931bbe0e"
+  dependencies:
+    consolidate "^0.15.1"
+    hash-sum "^1.0.2"
+    lru-cache "^4.1.2"
+    merge-source-map "^1.1.0"
+    postcss "^6.0.20"
+    postcss-selector-parser "^3.1.1"
+    prettier "^1.13.0"
+    source-map "^0.5.6"
+    vue-template-es2015-compiler "^1.6.0"
+
 abbrev@1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
@@ -36,17 +64,23 @@ acorn-dynamic-import@^2.0.0:
   dependencies:
     acorn "^4.0.3"
 
+acorn-globals@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
+  dependencies:
+    acorn "^4.0.4"
+
 acorn-jsx@^3.0.0:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
   dependencies:
     acorn "^3.0.4"
 
-acorn@^3.0.4:
+acorn@^3.0.4, acorn@^3.1.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
 
-acorn@^4.0.3:
+acorn@^4.0.3, acorn@^4.0.4, acorn@~4.0.2:
   version "4.0.13"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
 
@@ -54,6 +88,10 @@ acorn@^5.0.0, acorn@^5.3.0, acorn@^5.5.0:
   version "5.5.3"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9"
 
+acorn@^5.5.3:
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+
 after@0.8.2:
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
@@ -227,6 +265,10 @@ arrify@^1.0.0, arrify@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
 
+asap@~2.0.3:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+
 asn1.js@^4.0.0:
   version "4.10.1"
   resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
@@ -1307,30 +1349,34 @@ chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2:
     escape-string-regexp "^1.0.5"
     supports-color "^5.3.0"
 
+chalk@^2.4.1:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+character-parser@^2.1.1:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0"
+  dependencies:
+    is-regex "^1.0.3"
+
 check-types@^7.3.0:
   version "7.3.0"
   resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.3.0.tgz#468f571a4435c24248f5fd0cb0e8d87c3c341e7d"
 
-cheerio@^0.22.0:
-  version "0.22.0"
-  resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e"
+cheerio@^1.0.0-rc.2:
+  version "1.0.0-rc.2"
+  resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db"
   dependencies:
     css-select "~1.2.0"
     dom-serializer "~0.1.0"
     entities "~1.1.1"
     htmlparser2 "^3.9.1"
-    lodash.assignin "^4.0.9"
-    lodash.bind "^4.1.4"
-    lodash.defaults "^4.0.1"
-    lodash.filter "^4.4.0"
-    lodash.flatten "^4.2.0"
-    lodash.foreach "^4.3.0"
-    lodash.map "^4.4.0"
-    lodash.merge "^4.4.0"
-    lodash.pick "^4.2.1"
-    lodash.reduce "^4.4.0"
-    lodash.reject "^4.4.0"
-    lodash.some "^4.4.0"
+    lodash "^4.15.0"
+    parse5 "^3.0.1"
 
 chokidar@^1.4.1:
   version "1.7.0"
@@ -1405,7 +1451,7 @@ class-utils@^0.3.5:
     isobject "^3.0.0"
     static-extend "^0.1.1"
 
-clean-css@4.1.x:
+clean-css@4.1.x, clean-css@^4.1.11:
   version "4.1.11"
   resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a"
   dependencies:
@@ -1545,7 +1591,7 @@ combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
   dependencies:
     delayed-stream "~1.0.0"
 
-commander@2.15.x, commander@^2.11.0, commander@^2.13.0, commander@^2.9.0, commander@~2.15.0:
+commander@2.15.x, commander@^2.13.0, commander@^2.9.0, commander@~2.15.0:
   version "2.15.1"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
 
@@ -1632,6 +1678,21 @@ consolidate@^0.14.0:
   dependencies:
     bluebird "^3.1.1"
 
+consolidate@^0.15.1:
+  version "0.15.1"
+  resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7"
+  dependencies:
+    bluebird "^3.1.1"
+
+constantinople@^3.0.1:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647"
+  dependencies:
+    "@types/babel-types" "^7.0.0"
+    "@types/babylon" "^6.16.2"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+
 constants-browserify@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
@@ -2116,6 +2177,10 @@ doctrine@^2.0.0:
   dependencies:
     esutils "^2.0.2"
 
+doctypes@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9"
+
 dom-converter@~0.1:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b"
@@ -2182,6 +2247,12 @@ domutils@^1.5.1:
     dom-serializer "0"
     domelementtype "1"
 
+dot-prop@^4.1.1:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
+  dependencies:
+    is-obj "^1.0.0"
+
 duplexer@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
@@ -2195,6 +2266,18 @@ duplexify@^3.4.2, duplexify@^3.5.3:
     readable-stream "^2.0.0"
     stream-shift "^1.0.0"
 
+easygettext@^2.5.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/easygettext/-/easygettext-2.5.0.tgz#56c695816482cb6ab29a3c3454998274d8845972"
+  dependencies:
+    "@vue/component-compiler-utils" "^1.2.1"
+    acorn "^5.5.3"
+    cheerio "^1.0.0-rc.2"
+    minimist "^1.2.0"
+    pofile "^1.0.10"
+    pug "^2.0.3"
+    vue-template-compiler "^2.5.16"
+
 ecc-jsbn@~0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
@@ -2251,12 +2334,6 @@ encodeurl@~1.0.1, encodeurl@~1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
 
-encoding@^0.1.12:
-  version "0.1.12"
-  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
-  dependencies:
-    iconv-lite "~0.4.13"
-
 end-of-stream@^1.0.0, end-of-stream@^1.1.0:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
@@ -2993,10 +3070,6 @@ fs.realpath@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
 
-fs@0.0.1-security:
-  version "0.0.1-security"
-  resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4"
-
 fsevents@^1.0.0, fsevents@^1.1.2:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
@@ -3098,13 +3171,6 @@ getpass@^0.1.1:
   dependencies:
     assert-plus "^1.0.0"
 
-gettext-parser@^1.3.0:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/gettext-parser/-/gettext-parser-1.3.1.tgz#74b7a99e4b5fa8daab11fa515e8a582480448a12"
-  dependencies:
-    encoding "^0.1.12"
-    safe-buffer "^5.1.1"
-
 glob-base@^0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
@@ -3548,41 +3614,10 @@ https-proxy-agent@1:
     debug "2"
     extend "3"
 
-i18next-conv@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/i18next-conv/-/i18next-conv-6.0.0.tgz#875a27bfb069db894f7b0a1484e0052100bc9383"
-  dependencies:
-    bluebird "^3.5.1"
-    chalk "^2.1.0"
-    commander "^2.11.0"
-    gettext-parser "^1.3.0"
-    mkdirp "^0.5.1"
-    node-gettext "^2.0.0"
-
-i18next-fetch-backend@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/i18next-fetch-backend/-/i18next-fetch-backend-0.1.0.tgz#18b67920d0e605e616f93bbdf897e59adf9c9c05"
-  dependencies:
-    i18next-xhr-backend "^1.4.3"
-
-i18next-xhr-backend@^1.4.3:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/i18next-xhr-backend/-/i18next-xhr-backend-1.5.1.tgz#50282610780c6a696d880dfa7f4ac1d01e8c3ad5"
-
-i18next@^11.1.1:
-  version "11.1.1"
-  resolved "https://registry.yarnpkg.com/i18next/-/i18next-11.1.1.tgz#df3a683542d7756a8aa8d6b884b61141239c394a"
-
 iconv-lite@0.4.19:
   version "0.4.19"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
 
-iconv-lite@~0.4.13:
-  version "0.4.21"
-  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798"
-  dependencies:
-    safer-buffer "^2.1.0"
-
 icss-replace-symbols@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
@@ -3780,6 +3815,13 @@ is-equal-shallow@^0.1.3:
   dependencies:
     is-primitive "^2.0.0"
 
+is-expression@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f"
+  dependencies:
+    acorn "~4.0.2"
+    object-assign "^4.0.1"
+
 is-extendable@^0.1.0, is-extendable@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
@@ -3866,6 +3908,10 @@ is-number@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
 
+is-obj@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
 is-odd@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24"
@@ -3906,10 +3952,20 @@ is-primitive@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
 
+is-promise@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
 is-property@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
 
+is-regex@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+  dependencies:
+    has "^1.0.1"
+
 is-resolvable@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
@@ -4022,6 +4078,10 @@ js-logger@^1.3.0:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/js-logger/-/js-logger-1.4.1.tgz#f0230dc5e84e120f213d6e5a6b767a913d290335"
 
+js-stringify@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
+
 js-tokens@^3.0.0, js-tokens@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
@@ -4105,6 +4165,13 @@ jsprim@^1.2.2:
     json-schema "0.2.3"
     verror "1.10.0"
 
+jstransformer@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3"
+  dependencies:
+    is-promise "^2.0.0"
+    promise "^7.0.1"
+
 jwt-decode@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-2.2.0.tgz#7d86bd56679f58ce6a84704a657dd392bba81a79"
@@ -4364,14 +4431,6 @@ lodash.assign@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
 
-lodash.assignin@^4.0.9:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2"
-
-lodash.bind@^4.1.4:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
-
 lodash.camelcase@^4.3.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
@@ -4396,10 +4455,6 @@ lodash.create@3.1.1:
     lodash._basecreate "^3.0.0"
     lodash._isiterateecall "^3.0.0"
 
-lodash.defaults@^4.0.1:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
-
 lodash.defaultsdeep@4.3.2:
   version "4.3.2"
   resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.3.2.tgz#6c1a586e6c5647b0e64e2d798141b8836158be8a"
@@ -4411,22 +4466,6 @@ lodash.defaultsdeep@4.3.2:
     lodash.mergewith "^4.0.0"
     lodash.rest "^4.0.0"
 
-lodash.filter@^4.4.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace"
-
-lodash.flatten@^4.2.0:
-  version "4.4.0"
-  resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
-
-lodash.foreach@^4.3.0:
-  version "4.5.0"
-  resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
-
-lodash.get@^4.4.2:
-  version "4.4.2"
-  resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
-
 lodash.isarguments@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
@@ -4451,42 +4490,18 @@ lodash.keysin@^4.0.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/lodash.keysin/-/lodash.keysin-4.2.0.tgz#8cc3fb35c2d94acc443a1863e02fa40799ea6f28"
 
-lodash.map@^4.4.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
-
 lodash.memoize@^4.1.2:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
 
-lodash.merge@^4.4.0:
-  version "4.6.1"
-  resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54"
-
 lodash.mergewith@^4.0.0, lodash.mergewith@^4.6.0:
   version "4.6.1"
   resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927"
 
-lodash.pick@^4.2.1:
-  version "4.4.0"
-  resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
-
-lodash.reduce@^4.4.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
-
-lodash.reject@^4.4.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415"
-
 lodash.rest@^4.0.0:
   version "4.0.5"
   resolved "https://registry.yarnpkg.com/lodash.rest/-/lodash.rest-4.0.5.tgz#954ef75049262038c96d1fc98b28fdaf9f0772aa"
 
-lodash.some@^4.4.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
-
 lodash.tail@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
@@ -4503,6 +4518,10 @@ lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lo
   version "4.17.5"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
 
+lodash@^4.15.0:
+  version "4.17.10"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
 log-symbols@^2.1.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
@@ -4554,6 +4573,13 @@ lru-cache@^3.2.0:
   dependencies:
     pseudomap "^1.0.1"
 
+lru-cache@^4.1.2:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
 lru-cache@~2.6.5:
   version "2.6.5"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.6.5.tgz#e56d6354148ede8d7707b58d143220fd08df0fd5"
@@ -4649,6 +4675,12 @@ merge-descriptors@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
 
+merge-source-map@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646"
+  dependencies:
+    source-map "^0.6.1"
+
 methods@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
@@ -4933,12 +4965,6 @@ no-case@^2.2.0:
   dependencies:
     lower-case "^1.1.1"
 
-node-gettext@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/node-gettext/-/node-gettext-2.0.0.tgz#f1dc1237cdc546f51593da340304b8beba5b8525"
-  dependencies:
-    lodash.get "^4.4.2"
-
 node-gyp@^3.3.1:
   version "3.6.2"
   resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60"
@@ -5346,6 +5372,12 @@ parse-json@^2.2.0:
   dependencies:
     error-ex "^1.2.0"
 
+parse5@^3.0.1:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c"
+  dependencies:
+    "@types/node" "*"
+
 parsejson@0.0.3:
   version "0.0.3"
   resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab"
@@ -5506,9 +5538,9 @@ pluralize@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
 
-pofile@^1.0.2:
-  version "1.0.10"
-  resolved "https://registry.yarnpkg.com/pofile/-/pofile-1.0.10.tgz#503dda9499403984e83ff4489ba2d80af276172a"
+pofile@^1.0.10:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/pofile/-/pofile-1.0.11.tgz#35aff58c17491d127a07336d5522ebc9df57c954"
 
 posix-character-classes@^0.1.0:
   version "0.1.1"
@@ -5737,6 +5769,14 @@ postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2:
     indexes-of "^1.0.1"
     uniq "^1.0.1"
 
+postcss-selector-parser@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865"
+  dependencies:
+    dot-prop "^4.1.1"
+    indexes-of "^1.0.1"
+    uniq "^1.0.1"
+
 postcss-svgo@^2.1.1:
   version "2.1.6"
   resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d"
@@ -5783,6 +5823,14 @@ postcss@^6.0.1:
     source-map "^0.6.1"
     supports-color "^5.3.0"
 
+postcss@^6.0.20:
+  version "6.0.23"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+  dependencies:
+    chalk "^2.4.1"
+    source-map "^0.6.1"
+    supports-color "^5.4.0"
+
 prelude-ls@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
@@ -5795,6 +5843,10 @@ preserve@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
 
+prettier@^1.13.0:
+  version "1.13.7"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.7.tgz#850f3b8af784a49a6ea2d2eaa7ed1428a34b7281"
+
 pretty-error@^2.0.2:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"
@@ -5822,6 +5874,12 @@ promise-inflight@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
 
+promise@^7.0.1:
+  version "7.3.1"
+  resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+  dependencies:
+    asap "~2.0.3"
+
 proto-list@~1.2.1:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
@@ -5864,6 +5922,99 @@ public-encrypt@^4.0.0:
     parse-asn1 "^5.0.0"
     randombytes "^2.0.1"
 
+pug-attrs@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.3.tgz#a3095f970e64151f7bdad957eef55fb5d7905d15"
+  dependencies:
+    constantinople "^3.0.1"
+    js-stringify "^1.0.1"
+    pug-runtime "^2.0.4"
+
+pug-code-gen@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.1.tgz#0951ec83225d74d8cfc476a7f99a259b5f7d050c"
+  dependencies:
+    constantinople "^3.0.1"
+    doctypes "^1.1.0"
+    js-stringify "^1.0.1"
+    pug-attrs "^2.0.3"
+    pug-error "^1.3.2"
+    pug-runtime "^2.0.4"
+    void-elements "^2.0.1"
+    with "^5.0.0"
+
+pug-error@^1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.2.tgz#53ae7d9d29bb03cf564493a026109f54c47f5f26"
+
+pug-filters@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.0.tgz#27165555bc04c236e4aa2b0366246dfa021b626e"
+  dependencies:
+    clean-css "^4.1.11"
+    constantinople "^3.0.1"
+    jstransformer "1.0.0"
+    pug-error "^1.3.2"
+    pug-walk "^1.1.7"
+    resolve "^1.1.6"
+    uglify-js "^2.6.1"
+
+pug-lexer@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.0.0.tgz#210c18457ef2e1760242740c5e647bd794cec278"
+  dependencies:
+    character-parser "^2.1.1"
+    is-expression "^3.0.0"
+    pug-error "^1.3.2"
+
+pug-linker@^3.0.5:
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.5.tgz#9e9a7ae4005682d027deeb96b000f88eeb83a02f"
+  dependencies:
+    pug-error "^1.3.2"
+    pug-walk "^1.1.7"
+
+pug-load@^2.0.11:
+  version "2.0.11"
+  resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.11.tgz#e648e57ed113fe2c1f45d57858ea2bad6bc01527"
+  dependencies:
+    object-assign "^4.1.0"
+    pug-walk "^1.1.7"
+
+pug-parser@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.0.tgz#e394ad9b3fca93123940aff885c06e44ab7e68e4"
+  dependencies:
+    pug-error "^1.3.2"
+    token-stream "0.0.1"
+
+pug-runtime@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.4.tgz#e178e1bda68ab2e8c0acfc9bced2c54fd88ceb58"
+
+pug-strip-comments@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz#f1559592206edc6f85310dacf4afb48a025af59f"
+  dependencies:
+    pug-error "^1.3.2"
+
+pug-walk@^1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.7.tgz#c00d5c5128bac5806bec15d2b7e7cdabe42531f3"
+
+pug@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.3.tgz#71cba82537c95a5eab7ed04696e4221f53aa878e"
+  dependencies:
+    pug-code-gen "^2.0.1"
+    pug-filters "^3.1.0"
+    pug-lexer "^4.0.0"
+    pug-linker "^3.0.5"
+    pug-load "^2.0.11"
+    pug-parser "^5.0.0"
+    pug-runtime "^2.0.4"
+    pug-strip-comments "^1.0.3"
+
 pump@^2.0.0, pump@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
@@ -6364,10 +6515,6 @@ safe-regex@^1.1.0:
   dependencies:
     ret "~0.1.10"
 
-safer-buffer@^2.1.0:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
-
 samsam@1.x, samsam@^1.1.3:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50"
@@ -6949,6 +7096,12 @@ supports-color@^5.3.0:
   dependencies:
     has-flag "^3.0.0"
 
+supports-color@^5.4.0:
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+  dependencies:
+    has-flag "^3.0.0"
+
 svgo@^0.7.0:
   version "0.7.2"
   resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
@@ -7090,6 +7243,10 @@ to-regex@^3.0.1, to-regex@^3.0.2:
     regex-not "^1.0.2"
     safe-regex "^1.1.0"
 
+token-stream@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a"
+
 toposort@^1.0.0:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.6.tgz#c31748e55d210effc00fdcdc7d6e68d7d7bb9cec"
@@ -7172,7 +7329,7 @@ uglify-js@3.3.x:
     commander "~2.15.0"
     source-map "~0.6.1"
 
-uglify-js@^2.6, uglify-js@^2.8.29:
+uglify-js@^2.6, uglify-js@^2.6.1, uglify-js@^2.8.29:
   version "2.8.29"
   resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
   dependencies:
@@ -7357,23 +7514,18 @@ vm-browserify@0.0.4:
   dependencies:
     indexof "0.0.1"
 
-void-elements@^2.0.0:
+void-elements@^2.0.0, void-elements@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
 
+vue-gettext@^2.0.31:
+  version "2.0.31"
+  resolved "https://registry.yarnpkg.com/vue-gettext/-/vue-gettext-2.0.31.tgz#0f113bea6aed747e2a809ae4a0db83eaac0b07fc"
+
 vue-hot-reload-api@^2.1.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926"
 
-vue-i18n-xgettext@^0.0.4:
-  version "0.0.4"
-  resolved "https://registry.yarnpkg.com/vue-i18n-xgettext/-/vue-i18n-xgettext-0.0.4.tgz#80ad654e65fb33bb5fcbd96f338f55605ab1a06f"
-  dependencies:
-    cheerio "^0.22.0"
-    fs "0.0.1-security"
-    minimist "^1.2.0"
-    pofile "^1.0.2"
-
 vue-lazyload@^1.1.4:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/vue-lazyload/-/vue-lazyload-1.2.2.tgz#73335ed32db25264f5957df1a21d277823423743"
@@ -7416,14 +7568,14 @@ vue-style-loader@^3.0.0, vue-style-loader@^3.0.1:
     hash-sum "^1.0.2"
     loader-utils "^1.0.2"
 
-vue-template-compiler@^2.3.3:
+vue-template-compiler@^2.3.3, vue-template-compiler@^2.5.16:
   version "2.5.16"
   resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.16.tgz#93b48570e56c720cdf3f051cc15287c26fbd04cb"
   dependencies:
     de-indent "^1.0.2"
     he "^1.1.0"
 
-vue-template-es2015-compiler@^1.2.2:
+vue-template-es2015-compiler@^1.2.2, vue-template-es2015-compiler@^1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18"
 
@@ -7431,7 +7583,7 @@ vue-upload-component@^2.7.4:
   version "2.8.5"
   resolved "https://registry.yarnpkg.com/vue-upload-component/-/vue-upload-component-2.8.5.tgz#680de2934f55c6a38da7b382d0f37fd79995dd42"
 
-vue@^2.0.0, vue@^2.3.3:
+vue@^2.0.0, vue@^2.5.16:
   version "2.5.16"
   resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.16.tgz#07edb75e8412aaeed871ebafa99f4672584a0085"
 
@@ -7575,6 +7727,13 @@ window-size@0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
 
+with@^5.0.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe"
+  dependencies:
+    acorn "^3.1.0"
+    acorn-globals "^3.0.0"
+
 wordwrap@0.0.2:
   version "0.0.2"
   resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
diff --git a/po/.gitkeep b/po/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/po/funkwhale.pot b/po/funkwhale.pot
deleted file mode 100644
index 9a9dd948f7e18af7ba52984ace95f696d75e17d0..0000000000000000000000000000000000000000
--- a/po/funkwhale.pot
+++ /dev/null
@@ -1,613 +0,0 @@
-msgid ""
-msgstr ""
-"Project-Id-Version: Funkwhale 0.8\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-03-23 15:49-0700\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-
-msgid "An unknown error occured, ensure your are connected to the internet and your funkwhale instance is up and running"
-msgstr "An unknown error occured, ensure your are connected to the internet and your funkwhale instance is up and running"
-
-msgid "Links"
-msgstr "Links"
-
-msgid "About this instance"
-msgstr "About this instance"
-
-msgid "Official website"
-msgstr "Official website"
-
-msgid "Source code"
-msgstr "Source code"
-
-msgid "Issue tracker"
-msgstr "Issue tracker"
-
-msgid "About funkwhale"
-msgstr "About funkwhale"
-
-msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!"
-msgstr "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!"
-
-msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
-msgstr "The funkwhale logo was kindly designed and provided by Francis Gading."
-
-msgid "{%0%} favorited a track {%1%}"
-msgstr "{%0%} favorited a track {%1%}"
-
-msgid "from album {%0%}, by {%1%}"
-msgstr "from album {%0%}, by {%1%}"
-
-msgid ", by {%0%}"
-msgstr ", by {%0%}"
-
-msgid "{%0%} listened to a track {%1%}"
-msgstr "{%0%} listened to a track {%1%}"
-
-msgid "Show {%0%} more tracks"
-msgstr "Show {%0%} more tracks"
-
-msgid "Collapse"
-msgstr "Collapse"
-
-msgid "Play all"
-msgstr "Play all"
-
-msgid "{%0%} tracks"
-msgstr "{%0%} tracks"
-
-msgid "Show {%0%} more albums"
-msgstr "Show {%0%} more albums"
-
-msgid "Title"
-msgstr "Title"
-
-msgid "Artist"
-msgstr "Artist"
-
-msgid "Album"
-msgstr "Album"
-
-msgid "Download..."
-msgstr "Download..."
-
-msgid "Download tracks"
-msgstr "Download tracks"
-
-msgid "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as {%0%} to easily download a list of tracks."
-msgstr "There is currently no way to download directly multiple tracks from funkwhale as a ZIP archive. However, you can use a command line tools such as {%0%} to easily download a list of tracks."
-
-msgid "Simply copy paste the snippet below into a terminal to launch the download."
-msgstr "Simply copy paste the snippet below into a terminal to launch the download."
-
-msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account."
-msgstr "Keep your PRIVATE_TOKEN secret as it gives access to your account."
-
-msgid "Cancel"
-msgstr "Cancel"
-
-msgid "Add to current queue"
-msgstr "Add to current queue"
-
-msgid "Play"
-msgstr "Play"
-
-msgid "Add to queue"
-msgstr "Add to queue"
-
-msgid "Play next"
-msgstr "Play next"
-
-msgid "Play now"
-msgstr "Play now"
-
-msgid "Previous track"
-msgstr "Previous track"
-
-msgid "Play track"
-msgstr "Play track"
-
-msgid "Pause track"
-msgstr "Pause track"
-
-msgid "Next track"
-msgstr "Next track"
-
-msgid "Unmute"
-msgstr "Unmute"
-
-msgid "Mute"
-msgstr "Mute"
-
-msgid "Looping disabled. Click to switch to single-track looping."
-msgstr "Looping disabled. Click to switch to single-track looping."
-
-msgid "Looping on a single track. Click to switch to whole queue looping."
-msgstr "Looping on a single track. Click to switch to whole queue looping."
-
-msgid "Looping on whole queue. Click to disable looping."
-msgstr "Looping on whole queue. Click to disable looping."
-
-msgid "Shuffle your queue"
-msgstr "Shuffle your queue"
-
-msgid "Clear your queue"
-msgstr "Clear your queue"
-
-msgid "Search for some music"
-msgstr "Search for some music"
-
-msgid "Artists"
-msgstr "Artists"
-
-msgid "Sorry, we did not found any artist matching your query"
-msgstr "Sorry, we did not found any artist matching your query"
-
-msgid "Albums"
-msgstr "Albums"
-
-msgid "Sorry, we did not found any album matching your query"
-msgstr "Sorry, we did not found any album matching your query"
-
-msgid "Log in to your Funkwhale account"
-msgstr "Log in to your Funkwhale account"
-
-msgid "We cannot log you in"
-msgstr "We cannot log you in"
-
-msgid "Please double-check your username/password couple is correct"
-msgstr "Please double-check your username/password couple is correct"
-
-msgid "An unknown error happend, this can mean the server is down or cannot be reached"
-msgstr "An unknown error happend, this can mean the server is down or cannot be reached"
-
-msgid "Username or email"
-msgstr "Username or email"
-
-msgid "Password"
-msgstr "Password"
-
-msgid "Login"
-msgstr "Login"
-
-msgid "Create an account"
-msgstr "Create an account"
-
-msgid "Are you sure you want to log out?"
-msgstr "Are you sure you want to log out?"
-
-msgid "You are currently logged in as {%0%}"
-msgstr "You are currently logged in as {%0%}"
-
-msgid "Yes, log me out!"
-msgstr "Yes, log me out!"
-
-msgid "Registered since {%0%}"
-msgstr "Registered since {%0%}"
-
-msgid "This is you!"
-msgstr "This is you!"
-
-msgid "Staff member"
-msgstr "Staff member"
-
-msgid "Settings..."
-msgstr "Settings..."
-
-msgid "Account settings"
-msgstr "Account settings"
-
-msgid "Settings updated"
-msgstr "Settings updated"
-
-msgid "We cannot save your settings"
-msgstr "We cannot save your settings"
-
-msgid "Update settings"
-msgstr "Update settings"
-
-msgid "Change my password"
-msgstr "Change my password"
-
-msgid "Cannot change your password"
-msgstr "Cannot change your password"
-
-msgid "Please double-check your password is correct"
-msgstr "Please double-check your password is correct"
-
-msgid "Old password"
-msgstr "Old password"
-
-msgid "New password"
-msgid "New password"
-
-msgid "Change password"
-msgstr "Change password"
-
-msgid "Activity visibility"
-msgstr "Activity visibility"
-
-msgid "Determine the visibility level of your activity"
-msgstr "Determine the visibility level of your activity"
-
-msgid "Nobody except me"
-msgstr "Nobody except me"
-
-msgid "Everyone on this instance"
-msgstr "Everyone on this instance"
-
-msgid "Create a funkwhale account"
-msgstr "Create a funkwhale account"
-
-msgid "We cannot create your account"
-msgstr "We cannot create your account"
-
-msgid "Username"
-msgstr "Username"
-
-msgid "Email"
-msgstr "Email"
-
-msgid "Create my account"
-msgstr "Create my account"
-
-msgid "Registration is currently disabled on this instance, please try again later."
-msgstr "Registration is currently disabled on this instance, please try again later."
-
-msgid "Do you want to confirm this action?"
-msgstr "Do you want to confirm this action?"
-
-msgid "Confirm"
-msgstr "Confirm"
-
-msgid "Expand"
-msgstr "Expand"
-
-msgid "Loading your favorites..."
-msgstr "Loading your favorites..."
-
-msgid "{%0%} favorites"
-msgstr "{%0%} favorites"
-
-msgid "Ordering"
-msgstr "Ordering"
-
-msgid "Ordering direction"
-msgstr "Ordering direction"
-
-msgid "Ascending"
-msgstr "Ascending"
-
-msgid "Descending"
-msgstr "Descending"
-
-msgid "Results per page"
-msgstr "Results per page"
-
-msgid "Track name"
-msgstr "Track name"
-
-msgid "Album name"
-msgstr "Album name"
-
-msgid "Artist name"
-msgstr "Artist name"
-
-msgid "In favorites"
-msgstr "In favorites"
-
-msgid "Add to favorites"
-msgstr "Add to favorites"
-
-msgid "Remove from favorites"
-msgstr "Remove from favorites"
-
-msgid "User activity"
-msgstr "User activity"
-
-msgid "users"
-msgstr "users"
-
-msgid "tracks listened"
-msgstr "tracks listened"
-
-msgid "Tracks favorited"
-msgstr "Tracks favorited"
-
-msgid "hours of music"
-msgstr "hours of music"
-
-msgid "Artists"
-msgstr "Artists"
-
-msgid "Albums"
-msgstr "Albums"
-
-msgid "tracks"
-msgstr "tracks"
-
-msgid "Filter album types"
-msgstr "Filter album types"
-
-msgid "Query template"
-msgstr "Query template"
-
-msgid "Live"
-msgstr "Live"
-
-msgid "Compilation"
-msgstr "Compilation"
-
-msgid "EP"
-msgstr "EP"
-
-msgid "Single"
-msgstr "Single"
-
-msgid "Other"
-msgstr "Other"
-
-msgid "Job ID"
-msgstr "Job ID"
-
-msgid "Recording MusicBrainz ID"
-msgstr "Recording MusicBrainz ID"
-
-msgid "Source"
-msgstr "Source"
-
-msgid "Track"
-msgstr "Track"
-
-msgid "Previous"
-msgstr "Previous"
-
-msgid "Next"
-msgstr "Next"
-
-msgid "ID"
-msgstr "ID"
-
-msgid "Launch date"
-msgstr "Launch date"
-
-msgid "Jobs"
-msgstr "Jobs"
-
-msgid "Status"
-msgstr "Status"
-
-msgid "Select files to upload..."
-msgstr "Select files to upload..."
-
-msgid "Start Upload"
-msgstr "Start Upload"
-
-msgid "Stop Upload"
-msgstr "Stop Upload"
-
-msgid "Once all your files are uploaded, simply head over {%0%} to check the import status."
-msgstr "Once all your files are uploaded, simply head over {%0%} to check the import status."
-
-msgid "import detail page"
-msgstr "import detail page"
-
-msgid "File name"
-msgstr "File name"
-
-msgid "Size"
-msgstr "Size"
-
-msgid "Success"
-msgstr "Success"
-
-msgid "Uploading..."
-msgstr "Uploading..."
-
-msgid "Pending"
-msgstr "Pending"
-
-msgid "Import source"
-msgstr "Import source"
-
-msgid "Uploaded files or external source"
-msgstr "Uploaded files or external source"
-
-msgid "Metadata"
-msgstr "Metadata"
-
-msgid "Grab corresponding metadata"
-msgstr "Grab corresponding metadata"
-
-msgid "Music"
-msgstr "Music"
-
-msgid "Select relevant sources or files for import"
-msgstr "Select relevant sources or files for import"
-
-msgid "Previous step"
-msgstr "Previous step"
-
-msgid "Next step"
-msgstr "Next step"
-
-msgid "Import {%0%} tracks"
-msgstr "Import {%0%} tracks"
-
-msgid "First, choose where you want to import the music from:"
-msgstr "First, choose where you want to import the music from:"
-
-msgid "External source. Supported backends:"
-msgstr "External source. Supported backends:"
-
-msgid "File upload"
-msgstr "File upload"
-
-msgid "Search an entity you want to import:"
-msgstr "Search an entity you want to import:"
-
-msgid "Input a MusicBrainz ID manually:"
-msgstr "Input a MusicBrainz ID manually:"
-
-msgid "Or"
-msgstr "Or"
-
-msgid "You will import:"
-msgstr "You will import:"
-
-msgid "You can also skip this step and enter metadata manually."
-msgstr "You can also skip this step and enter metadata manually."
-
-msgid "Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the {%0%} project, which you can think about as the Wikipedia of music."
-msgstr "Metadata is the data related to the music you want to import. This includes all the information about the artists, albums and tracks. In order to have a high quality library, it is recommended to grab data from the {%0%} project, which you can think about as the Wikipedia of music."
-
-msgid "Music request"
-msgstr "Music request"
-
-msgid "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled."
-msgstr "This import will be associated with the music request below. After the import is finished, the request will be marked as fulfilled."
-
-msgid "Album {%0%} ({%1%} tracks) by {%2%}"
-msgstr "Album {%0%} ({%1%} tracks) by {%2%}"
-
-msgid "Import this release"
-msgstr "Import this release"
-
-msgid "Import this track"
-msgstr "Import this track"
-
-msgid "Source"
-msgstr "Source"
-
-msgid "Result {%0%}/{%1%}"
-msgstr "Result {%0%}/{%1%}"
-
-msgid "Search query"
-msgstr "Search query"
-
-msgid "Imported URL"
-msgstr "Imported URL"
-
-msgid "Album containing {%0%} tracks, by {%1%}"
-msgstr "Album containing {%0%} tracks, by {%1%}"
-
-msgid "Search on Wikipedia"
-msgstr "Search on Wikipedia"
-
-msgid "View on MusicBrainz"
-msgstr "View on MusicBrainz"
-
-msgid "{%0%} tracks in {%1%} albums"
-msgstr "{%0%} tracks in {%1%} albums"
-
-msgid "Play all albums"
-msgstr "Play all albums"
-
-msgid "Albums by this artist"
-msgstr "Albums by this artist"
-
-msgid "Browsing artists"
-msgstr "Browsing artists"
-
-msgid "Search"
-msgstr "Search"
-
-msgid "Latest artists"
-msgstr "Latest artists"
-
-msgid "Radios"
-msgstr "Radios"
-
-msgid "Music requests"
-msgstr "Music requests"
-
-msgid "Browse"
-msgstr "Browse"
-
-msgid "Playlists"
-msgstr "Playlists"
-
-msgid "Requests"
-msgstr "Requests"
-
-msgid "Import"
-msgstr "Import"
-
-msgid "Import batches"
-msgstr "Import batches"
-
-msgid "Browsing radios"
-msgstr "Browsing radios"
-
-msgid "Create your own radio"
-msgstr "Create your own radio"
-
-msgid "From album {%0%} by {%1%}"
-msgstr "From album {%0%} by {%1%}"
-
-msgid "Download"
-msgstr "Download"
-
-msgid "Lyrics"
-msgstr "Lyrics"
-
-msgid "No lyrics available for this track."
-msgstr "No lyrics available for this track."
-
-msgid "Search on lyrics.wikia.com"
-msgstr "Search on lyrics.wikia.com"
-
-msgid "Builder"
-msgstr "Builder"
-
-msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria"
-msgstr "You can use this interface to build your own custom radio, which will play tracks according to your criteria"
-
-msgid "Radio name"
-msgstr "Radio name"
-
-msgid "Display publicly"
-msgstr "Display publicly"
-
-msgid "Save"
-msgstr "Save"
-
-msgid "Add filters to customize your radio"
-msgstr "Add filters to customize your radio"
-
-msgid "Select a filter"
-msgstr "Select a filter"
-
-msgid "Add filter"
-msgstr "Add filter"
-
-msgid "Filter name"
-msgstr "Filter name"
-
-msgid "Exclude"
-msgstr "Exclude"
-
-msgid "Config"
-msgstr "Config"
-
-msgid "Candidates"
-msgstr "Candidates"
-
-msgid "Actions"
-msgstr "Actions"
-
-msgid "{%0%} tracks matching combined filters"
-msgstr "{%0%} tracks matching combined filters"
-
-msgid "Track matching filter"
-msgstr "Track matching filter"
-
-msgid "Remove"
-msgstr "Remove"
diff --git a/pyproject.toml b/pyproject.toml
index 421f98c0261cb940ed3e5f5ce0e094977ee52aff..68682d243c231a3fed2f52e5948b9507df9bd42f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -32,6 +32,11 @@
         name = "Documentation"
         showcontent = true
 
+    [[tool.towncrier.type]]
+        directory = "i18n"
+        name = "i18n"
+        showcontent = true
+
     [[tool.towncrier.type]]
         directory = "misc"
         name = "Other"
diff --git a/scripts/clean-unused-artifacts.py b/scripts/clean-unused-artifacts.py
new file mode 100644
index 0000000000000000000000000000000000000000..d38373b30710fc757534f5e3313cf29525369652
--- /dev/null
+++ b/scripts/clean-unused-artifacts.py
@@ -0,0 +1,30 @@
+import gitlab
+
+TOKEN = "CHANGEME"
+CLEAN_BEFORE = "2018-07"
+gl = gitlab.Gitlab("https://code.eliotberriot.com", private_token=TOKEN, per_page=100)
+project = gl.projects.get("funkwhale/funkwhale")
+
+jobs = project.jobs.list(as_list=False)
+total = jobs.total
+
+for job in jobs:
+    if job.attributes["ref"] != "develop":
+        continue
+    if job.attributes["status"] != "success":
+        continue
+    if job.attributes["tag"] is True:
+        continue
+    if job.attributes["name"] not in ["build_api", "build_front", "pages"]:
+        continue
+    if job.attributes["created_at"].startswith(CLEAN_BEFORE):
+        continue
+    relevant = {
+        "ref": job.attributes["ref"],
+        "status": job.attributes["status"],
+        "tag": job.attributes["tag"],
+        "name": job.attributes["name"],
+        "created_at": job.attributes["created_at"],
+    }
+    print("Deleting job {}!".format(job.id), relevant)
+    job.erase()