diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index 432896d1f246a8380e807e258c8345a0c5734270..79f4893dff29bb2d6eb3efbf24d2a5ea286574f9 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -649,11 +649,11 @@ useful when testing components that depend on each other:
 
     def notify(email, message):
         """
-        A function that sends an email to the given recipient
+        A function that sends an e-mail to the given recipient
         with the given message
         """
 
-        # our email sending logic here
+        # our e-mail sending logic here
         # ...
 
     # funkwhale_api/myapp/users.py
@@ -675,9 +675,9 @@ useful when testing components that depend on each other:
     def test_downgrade_superuser_sends_email(factories, mocker):
         """
         Your downgrade logic is already tested, however, we want to ensure
-        an email is sent when user is downgraded, but we don't have any email
+        an e-mail is sent when user is downgraded, but we don't have any e-mail
         server available in our testing environment. Thus, we need to mock
-        the email sending process.
+        the e-mail sending process.
         """
         mocked_notify = mocker.patch('funkwhale_api.myapp.notifications.notify')
         user = factories['users.User'](is_superuser=True)
@@ -692,7 +692,7 @@ useful when testing components that depend on each other:
         user = factories['users.User'](is_superuser=False)
         users.downgrade_user(user)
 
-        # here, we ensure no email was sent
+        # here, we ensure no e-mail was sent
         mocked_notify.assert_not_called()
 
 Views: you can find some readable views tests in file: ``api/tests/users/test_views.py``
diff --git a/api/config/settings/common.py b/api/config/settings/common.py
index d3389e6152da2d58a33d4d95001de0dfa8151fc9..fb42e6b75f919c03878ac1119af83adbee0f1dff 100644
--- a/api/config/settings/common.py
+++ b/api/config/settings/common.py
@@ -308,7 +308,7 @@ DEFAULT_FROM_EMAIL = env(
     "DEFAULT_FROM_EMAIL", default="Funkwhale <noreply@{}>".format(FUNKWHALE_HOSTNAME)
 )
 """
-Name and email address used to send system emails.
+Name and e-mail address used to send system e-mails.
 
 Default: ``Funkwhale <noreply@yourdomain>``
 
@@ -320,17 +320,17 @@ Default: ``Funkwhale <noreply@yourdomain>``
 """
 EMAIL_SUBJECT_PREFIX = env("EMAIL_SUBJECT_PREFIX", default="[Funkwhale] ")
 """
-Subject prefix for system emails.
+Subject prefix for system e-mails.
 """
 SERVER_EMAIL = env("SERVER_EMAIL", default=DEFAULT_FROM_EMAIL)
 
 
 EMAIL_CONFIG = env.email_url("EMAIL_CONFIG", default="consolemail://")
 """
-SMTP configuration for sending emails. Possible values:
+SMTP configuration for sending e-mails. Possible values:
 
-- ``EMAIL_CONFIG=consolemail://``: output emails to console (the default)
-- ``EMAIL_CONFIG=dummymail://``: disable email sending completely
+- ``EMAIL_CONFIG=consolemail://``: output e-mails to console (the default)
+- ``EMAIL_CONFIG=dummymail://``: disable e-mail sending completely
 
 On a production instance, you'll usually want to use an external SMTP server:
 
@@ -591,10 +591,11 @@ ACCOUNT_EMAIL_VERIFICATION_ENFORCE = env.bool(
     "ACCOUNT_EMAIL_VERIFICATION_ENFORCE", default=False
 )
 """
-Determine wether users need to verify their email address before using
-the service. Enabling this can be useful to reduce spam or bots accounts,
-however, you'll need to configure a mail server so that your users can receive
-the verification emails, using :attr:`EMAIL_CONFIG`.
+Determine wether users need to verify their e-mail address before using the service. Enabling this can be useful
+to reduce spam or bots accounts, however, you'll need to configure a mail server so that your users can receive the
+verification e-mails, using :attr:`EMAIL_CONFIG`.
+
+Note that regardless of the setting value, superusers created through the command line will never require verification.
 
 Note that regardless of the setting value, superusers created through the
 command line will never require verification.
@@ -1255,7 +1256,7 @@ MODERATION_EMAIL_NOTIFICATIONS_ENABLED = env.bool(
     "MODERATION_EMAIL_NOTIFICATIONS_ENABLED", default=True
 )
 """
-Whether to enable email notifications to moderators and pods admins.
+Whether to enable e-mail notifications to moderators and pods admins.
 """
 FEDERATION_AUTHENTIFY_FETCHES = True
 FEDERATION_SYNCHRONOUS_FETCH = env.bool("FEDERATION_SYNCHRONOUS_FETCH", default=True)
diff --git a/api/config/settings/local.py b/api/config/settings/local.py
index 2fc121612d47dd5a4da1abd747c65f0f8c175a8f..3f97bc1ab28bea238560830dcc62a79230aca0b6 100644
--- a/api/config/settings/local.py
+++ b/api/config/settings/local.py
@@ -3,7 +3,7 @@
 Local settings
 
 - Run in Debug mode
-- Use console backend for emails
+- Use console backend for e-mails
 - Add Django Debug Toolbar
 - Add django-extensions as app
 """
diff --git a/api/config/settings/production.py b/api/config/settings/production.py
index 1ee9b8f7e6ef0270096a295bf7bc23d137a75c86..aba347af501d88cf7dce59711162ad62646177fa 100644
--- a/api/config/settings/production.py
+++ b/api/config/settings/production.py
@@ -4,7 +4,7 @@ Production Configurations
 
 - Use djangosecure
 - Use Amazon's S3 for storing static files and uploaded media
-- Use mailgun to send emails
+- Use mailgun to send e-mails
 - Use Redis on Heroku
 
 
diff --git a/api/funkwhale_api/cli/users.py b/api/funkwhale_api/cli/users.py
index 678b19f8108043114c022e979930de1f49f8eb20..92d57d3e6f5898087c32fdb2e000b3e0a0785057 100644
--- a/api/funkwhale_api/cli/users.py
+++ b/api/funkwhale_api/cli/users.py
@@ -37,7 +37,7 @@ def handler_create_user(
     utils.logger.debug("Validating user data…")
     serializer.is_valid(raise_exception=True)
 
-    # Override email validation, we assume accounts created from CLI have a valid email
+    # Override e-mail validation, we assume accounts created from CLI have a valid e-mail
     request = FakeRequest(session={"account_verified_email": email})
     utils.logger.debug("Creating user…")
     user = serializer.save(request=request)
diff --git a/api/funkwhale_api/instance/dynamic_preferences_registry.py b/api/funkwhale_api/instance/dynamic_preferences_registry.py
index b61096e9c78a2ed1826c50c95fea5cc4c8b64b25..1b4dd10b4fa9e35ca42af53fd4e470eed7d90957 100644
--- a/api/funkwhale_api/instance/dynamic_preferences_registry.py
+++ b/api/funkwhale_api/instance/dynamic_preferences_registry.py
@@ -73,7 +73,7 @@ class InstanceContactEmail(types.StringPreference):
     name = "contact_email"
     verbose_name = "Contact email"
     default = ""
-    help_text = "A contact email for visitors who need to contact an admin or moderator"
+    help_text = "A contact e-mail address for visitors who need to contact an admin or moderator"
     field_kwargs = {"required": False}
 
 
diff --git a/api/funkwhale_api/moderation/serializers.py b/api/funkwhale_api/moderation/serializers.py
index 4b099a1b7590c69c1869fab851cf5b851c4c5408..b062744f4ac27cd96ec1e2eee6d1c8a6aeb85f73 100644
--- a/api/funkwhale_api/moderation/serializers.py
+++ b/api/funkwhale_api/moderation/serializers.py
@@ -304,7 +304,7 @@ class ReportSerializer(serializers.ModelSerializer):
 
         if not validated_data.get("submitter_email"):
             raise serializers.ValidationError(
-                "You need to provide an email address to submit this report"
+                "You need to provide an e-mail address to submit this report"
             )
 
         return validated_data
diff --git a/api/funkwhale_api/moderation/tasks.py b/api/funkwhale_api/moderation/tasks.py
index 6f908270fd3a483b1a48a69b188f743fd1743130..1e049540f1ff1256f14edc5ced14c3dc036d2afa 100644
--- a/api/funkwhale_api/moderation/tasks.py
+++ b/api/funkwhale_api/moderation/tasks.py
@@ -106,14 +106,16 @@ def send_new_report_email_to_moderators(report):
         "",
         "—",
         "",
-        "You are receiving this email because you are a moderator for {}.".format(
+        "You are receiving this e-mail because you are a moderator for {}.".format(
             settings.FUNKWHALE_HOSTNAME
         ),
     ]
 
     for moderator in moderators:
         if not moderator.email:
-            logger.warning("Moderator %s has no email configured", moderator.username)
+            logger.warning(
+                "Moderator %s has no e-mail address configured", moderator.username
+            )
             continue
         mail.send_mail(
             subject,
@@ -192,14 +194,16 @@ def notify_mods_signup_request_pending(obj):
         "",
         "—",
         "",
-        "You are receiving this email because you are a moderator for {}.".format(
+        "You are receiving this e-mail because you are a moderator for {}.".format(
             settings.FUNKWHALE_HOSTNAME
         ),
     ]
 
     for moderator in moderators:
         if not moderator.email:
-            logger.warning("Moderator %s has no email configured", moderator.username)
+            logger.warning(
+                "Moderator %s has no e-mail address configured", moderator.username
+            )
             continue
         mail.send_mail(
             subject,
@@ -213,7 +217,7 @@ def notify_submitter_signup_request_approved(user_request):
     submitter_repr = user_request.submitter.preferred_username
     submitter_email = user_request.submitter.user.email
     if not submitter_email:
-        logger.warning("User %s has no email configured", submitter_repr)
+        logger.warning("User %s has no e-mail address configured", submitter_repr)
         return
     subject = "Welcome to {}, {}!".format(settings.FUNKWHALE_HOSTNAME, submitter_repr)
     login_url = federation_utils.full_url("/login")
@@ -223,7 +227,7 @@ def notify_submitter_signup_request_approved(user_request):
         "Our moderation team has approved your account request and you can now start "
         "using the service. Please visit {} to get started.".format(login_url),
         "",
-        "Before your first login, you may need to verify your email address if you didn't already.",
+        "Before your first login, you may need to verify your e-mail address if you didn't already.",
     ]
 
     mail.send_mail(
@@ -238,7 +242,7 @@ def notify_submitter_signup_request_refused(user_request):
     submitter_repr = user_request.submitter.preferred_username
     submitter_email = user_request.submitter.user.email
     if not submitter_email:
-        logger.warning("User %s has no email configured", submitter_repr)
+        logger.warning("User %s has no e-mail address configured", submitter_repr)
         return
     subject = "Your account request at {} was refused".format(
         settings.FUNKWHALE_HOSTNAME
diff --git a/api/funkwhale_api/subsonic/authentication.py b/api/funkwhale_api/subsonic/authentication.py
index dd6a60f42f34461b14f59845269083ed8c7abd07..6289248e95990fb926fec9fcb2a95ce22956c59a 100644
--- a/api/funkwhale_api/subsonic/authentication.py
+++ b/api/funkwhale_api/subsonic/authentication.py
@@ -28,7 +28,7 @@ def authenticate(username, password):
         raise exceptions.AuthenticationFailed("Wrong username or password.")
 
     if common_authentication.should_verify_email(user):
-        raise exceptions.AuthenticationFailed("You need to verify your email.")
+        raise exceptions.AuthenticationFailed("You need to verify your e-mail address.")
 
     return (user, None)
 
@@ -47,7 +47,7 @@ def authenticate_salt(username, salt, token):
         raise exceptions.AuthenticationFailed("Wrong username or password.")
 
     if common_authentication.should_verify_email(user):
-        raise exceptions.AuthenticationFailed("You need to verify your email.")
+        raise exceptions.AuthenticationFailed("You need to verify your e-mail address.")
 
     return (user, None)
 
diff --git a/api/funkwhale_api/templates/registration/password_reset_email.html b/api/funkwhale_api/templates/registration/password_reset_email.html
index 0b6b1384d89036f8a3eb3f8b708559e721c8cca4..08f25472ddcf4e1ed39ab5e2a515898d478b7aab 100644
--- a/api/funkwhale_api/templates/registration/password_reset_email.html
+++ b/api/funkwhale_api/templates/registration/password_reset_email.html
@@ -1,5 +1,5 @@
 {% load i18n %}{% autoescape off %}
-{% blocktrans with site_name=funkwhale_site_name %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %}
+{% blocktrans with site_name=funkwhale_site_name %}You're receiving this e-mail because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %}
 
 {% trans "Please go to the following page and choose a new password:" %}
 {{ funkwhale_url }}/auth/password/reset/confirm?uid={{ uid }}&token={{ token }}
diff --git a/api/funkwhale_api/users/oauth/scopes.py b/api/funkwhale_api/users/oauth/scopes.py
index f5390eb0452bb594e466196a5c664a94deddcc07..29d5ddae00907cabf126f8dac7d2d2c80ac13a65 100644
--- a/api/funkwhale_api/users/oauth/scopes.py
+++ b/api/funkwhale_api/users/oauth/scopes.py
@@ -10,7 +10,7 @@ class Scope:
 
 BASE_SCOPES = [
     Scope(
-        "profile", "Access profile data (email, username, avatar, subsonic password…)"
+        "profile", "Access profile data (e-mail, username, avatar, subsonic password…)"
     ),
     Scope("libraries", "Access uploads, libraries, and audio metadata"),
     Scope("edits", "Browse and submit edits on audio metadata"),
diff --git a/api/funkwhale_api/users/rest_auth_urls.py b/api/funkwhale_api/users/rest_auth_urls.py
index 75ba608bb92fc1dd2b91d21661b2b6fd370c26f0..540ea82851856c4ff9f4f294bab1883ba6120a68 100644
--- a/api/funkwhale_api/users/rest_auth_urls.py
+++ b/api/funkwhale_api/users/rest_auth_urls.py
@@ -38,8 +38,8 @@ urlpatterns = [
         name="change_password",
     ),
     # This url is used by django-allauth and empty TemplateView is
-    # defined just to allow reverse() call inside app, for example when email
-    # with verification link is being sent, then it's required to render email
+    # defined just to allow reverse() call inside app, for example when e-mail
+    # with verification link is being sent, then it's required to render e-mail
     # content.
     # account_confirm_email - You should override this view to handle it in
     # your API client somehow and then, send post to /verify-email/ endpoint
diff --git a/api/funkwhale_api/users/serializers.py b/api/funkwhale_api/users/serializers.py
index 72bc5833fb00a804147f35ca2db367918459db88..3173274590f269d27a62dc82c40ea6a8cb7e7010 100644
--- a/api/funkwhale_api/users/serializers.py
+++ b/api/funkwhale_api/users/serializers.py
@@ -294,7 +294,7 @@ class UserChangeEmailSerializer(serializers.Serializer):
             .exclude(user=self.context["user"])
             .exists()
         ):
-            raise serializers.ValidationError("This email address is already in use")
+            raise serializers.ValidationError("This e-mail address is already in use")
         return value
 
     def save(self, request):
diff --git a/api/funkwhale_api/users/views.py b/api/funkwhale_api/users/views.py
index f177bb1e409b1d7a44e8efa12cb437e2554054ea..b9891e594e9c38a326414e33c30535f047c64647 100644
--- a/api/funkwhale_api/users/views.py
+++ b/api/funkwhale_api/users/views.py
@@ -38,7 +38,7 @@ class RegisterView(registration_views.RegisterView):
     def perform_create(self, serializer):
         user = super().perform_create(serializer)
         if not user.is_active:
-            # manual approval, we need to send the confirmation email by hand
+            # manual approval, we need to send the confirmation e-mail by hand
             authentication.send_email_confirmation(self.request, user)
         return user
 
diff --git a/api/tests/moderation/test_serializers.py b/api/tests/moderation/test_serializers.py
index 9089dc371547a60cfd3b46e3ac04fdd8939c9cb6..2763fc8b1ff8ed30786f462ea79c083608469115 100644
--- a/api/tests/moderation/test_serializers.py
+++ b/api/tests/moderation/test_serializers.py
@@ -203,9 +203,9 @@ def test_report_serializer_repr(factories, to_api_date):
             {"type": "other", "submitter_email": "hello@example.test"},
             False,
         ),
-        # anonymous reports enabled for the category, but invalid email
+        # anonymous reports enabled for the category, but invalid e-mail
         (["other"], {}, {"type": "other", "submitter_email": "hello@"}, False),
-        # anonymous reports enabled for the category, no email
+        # anonymous reports enabled for the category, no e-mail
         (["other"], {}, {"type": "other"}, False),
         # anonymous reports enabled for the category, actor object is empty
         (["other"], {"submitter": None}, {"type": "other"}, False),
diff --git a/api/tests/moderation/test_tasks.py b/api/tests/moderation/test_tasks.py
index f51d8ff3bc665bd2a36c4a04820357be45fce163..54f0438dc33ffa3cd85685c875d9392deb7ef0b8 100644
--- a/api/tests/moderation/test_tasks.py
+++ b/api/tests/moderation/test_tasks.py
@@ -15,9 +15,9 @@ def test_report_created_signal_calls_send_new_report_mail(factories, mocker):
 def test_report_created_signal_sends_email_to_mods(factories, mailoutbox, settings):
     mod1 = factories["users.User"](permission_moderation=True)
     mod2 = factories["users.User"](permission_moderation=True)
-    # inactive, so no email
+    # inactive, so no e-mail
     factories["users.User"](permission_moderation=True, is_active=False)
-    # no moderation permission, so no email
+    # no moderation permission, so no e-mail
     factories["users.User"]()
 
     report = factories["moderation.Report"]()
diff --git a/api/tests/users/oauth/test_views.py b/api/tests/users/oauth/test_views.py
index 96f594ec2038fc38696e01dbd0eb96ff6fa6a448..95f5aec77550fee91c42eab09dbdb00351998f46 100644
--- a/api/tests/users/oauth/test_views.py
+++ b/api/tests/users/oauth/test_views.py
@@ -427,5 +427,5 @@ def test_token_auth(
     assert response.status_code == expected_status_code
 
     if expected_status_code != 200:
-        # confirmation email should have been sent again
+        # confirmation e-mail should have been sent again
         assert len(mailoutbox) == sent_emails + 1
diff --git a/deploy/apache.conf b/deploy/apache.conf
index 996e5488c35efe5770d5ba8022ea98a06f34282b..0c072059e85df8d396daaa067b0e18fe4d12a900 100644
--- a/deploy/apache.conf
+++ b/deploy/apache.conf
@@ -57,7 +57,7 @@ Define MEDIA_DIRECTORY_PATH ${FUNKWHALE_ROOT_PATH}/data/media
    </IfModule>
 
    # Turning ProxyRequests on and allowing proxying from all may allow
-   # spammers to use your proxy to send email.
+   # spammers to use your proxy to send e-mail.
    ProxyRequests Off
 
    <Proxy *>
diff --git a/deploy/env.prod.sample b/deploy/env.prod.sample
index f52f819e1892ba8688c60558fe9c48cd06214bbc..69b3e466e2fa24fdd31f848995a3dbef54bd37ce 100644
--- a/deploy/env.prod.sample
+++ b/deploy/env.prod.sample
@@ -5,7 +5,7 @@
 # following variables:
 # - DJANGO_SECRET_KEY
 # - FUNKWHALE_HOSTNAME
-# - EMAIL_CONFIG and DEFAULT_FROM_EMAIL if you plan to send emails)
+# - EMAIL_CONFIG and DEFAULT_FROM_EMAIL if you plan to send e-mails)
 # On non-docker setup **only**, you'll also have to tweak/uncomment those variables:
 # - DATABASE_URL
 # - CACHE_URL
@@ -43,21 +43,21 @@ FUNKWHALE_WEB_WORKERS=4
 FUNKWHALE_HOSTNAME=yourdomain.funkwhale
 FUNKWHALE_PROTOCOL=https
 
-# Configure email sending using this variale
-# By default, funkwhale will output emails sent to stdout
+# Configure e-mail sending using this variale
+# By default, funkwhale will output e-mails sent to stdout
 # here are a few examples for this setting
-# EMAIL_CONFIG=consolemail://         # output emails to console (the default)
-# EMAIL_CONFIG=dummymail://          # disable email sending completely
+# EMAIL_CONFIG=consolemail://         # output e-mails to console (the default)
+# EMAIL_CONFIG=dummymail://          # disable e-mail sending completely
 # On a production instance, you'll usually want to use an external SMTP server:
 # EMAIL_CONFIG=smtp://user@:password@youremail.host:25
 # EMAIL_CONFIG=smtp+ssl://user@:password@youremail.host:465
 # EMAIL_CONFIG=smtp+tls://user@:password@youremail.host:587
 
-# Make email verification mandatory before using the service
+# Make e-mail verification mandatory before using the service
 # Doesn't apply to admins.
 # ACCOUNT_EMAIL_VERIFICATION_ENFORCE=false
 
-# The email address to use to send system emails.
+# The e-mail address to use to send system e-mails.
 # DEFAULT_FROM_EMAIL=noreply@yourdomain
 
 # Depending on the reverse proxy used in front of your funkwhale instance,
diff --git a/docs/api/definitions.yml b/docs/api/definitions.yml
index b9e1eeb4236a6195bd1ab1405270097fcc0ccdb0..aec879c8893d67911bac9e86d75326189207812f 100644
--- a/docs/api/definitions.yml
+++ b/docs/api/definitions.yml
@@ -738,7 +738,7 @@ Me:
         email:
           type: "string"
           format: "email"
-          description: Email address associated with the account
+          description: E-mail address associated with the account
           example: "alice@email.provider"
         is_staff:
           type: "boolean"
diff --git a/docs/developers/authentication.rst b/docs/developers/authentication.rst
index 0d32139c0ed3eb80b99a7c2ec5a81aee700d1cbb..409e25124eaf733b2cb1fdce062f1dbf3ae40e1a 100644
--- a/docs/developers/authentication.rst
+++ b/docs/developers/authentication.rst
@@ -65,33 +65,33 @@ Having the generic ``read`` or ``write`` scope give you the corresponding access
 This is the list of OAuth scopes that third-party applications can request:
 
 
-+-------------------------------------------+---------------------------------------------------+
-| Scope                                     | Description                                       |
-+===========================================+===================================================+
-| ``read``                                  | Read-only access to all data                      |
-|                                           | (equivalent to all ``read:*`` scopes)             |
-+-------------------------------------------+---------------------------------------------------+
-| ``write``                                 | Write-only access to all data                     |
-|                                           | (equivalent to all ``write:*`` scopes)            |
-+-------------------------------------------+---------------------------------------------------+
-| ``<read/write>:profile``                  | Access to profile data (email, username, etc.)    |
-+-------------------------------------------+---------------------------------------------------+
-| ``<read/write>:libraries``                | Access to library data (uploads, libraries        |
-|                                           | tracks, albums, artists...)                       |
-+-------------------------------------------+---------------------------------------------------+
-| ``<read/write>:favorites``                | Access to favorites                               |
-+-------------------------------------------+---------------------------------------------------+
-| ``<read/write>:listenings``               | Access to history                                 |
-+-------------------------------------------+---------------------------------------------------+
-| ``<read/write>:follows``                  | Access to followers                               |
-+-------------------------------------------+---------------------------------------------------+
-| ``<read/write>:playlists``                | Access to playlists                               |
-+-------------------------------------------+---------------------------------------------------+
-| ``<read/write>:radios``                   | Access to radios                                  |
-+-------------------------------------------+---------------------------------------------------+
-| ``<read/write>:filters``                  | Access to content filters                         |
-+-------------------------------------------+---------------------------------------------------+
-| ``<read/write>:notifications``            | Access to notifications                           |
-+-------------------------------------------+---------------------------------------------------+
-| ``<read/write>:edits``                    | Access to metadata edits                          |
-+-------------------------------------------+---------------------------------------------------+
++-------------------------------------------+------------------------------------------------------------+
+| Scope                                     | Description                                                |
++===========================================+============================================================+
+| ``read``                                  | Read-only access to all data                               |
+|                                           | (equivalent to all ``read:*`` scopes)                      |
++-------------------------------------------+------------------------------------------------------------+
+| ``write``                                 | Write-only access to all data                              |
+|                                           | (equivalent to all ``write:*`` scopes)                     |
++-------------------------------------------+------------------------------------------------------------+
+| ``<read/write>:profile``                  | Access to profile data (e-mail address, username, etc.)    |
++-------------------------------------------+------------------------------------------------------------+
+| ``<read/write>:libraries``                | Access to library data (uploads, libraries                 |
+|                                           | tracks, albums, artists...)                                |
++-------------------------------------------+------------------------------------------------------------+
+| ``<read/write>:favorites``                | Access to favorites                                        |
++-------------------------------------------+------------------------------------------------------------+
+| ``<read/write>:listenings``               | Access to history                                          |
++-------------------------------------------+------------------------------------------------------------+
+| ``<read/write>:follows``                  | Access to followers                                        |
++-------------------------------------------+------------------------------------------------------------+
+| ``<read/write>:playlists``                | Access to playlists                                        |
++-------------------------------------------+------------------------------------------------------------+
+| ``<read/write>:radios``                   | Access to radios                                           |
++-------------------------------------------+------------------------------------------------------------+
+| ``<read/write>:filters``                  | Access to content filters                                  |
++-------------------------------------------+------------------------------------------------------------+
+| ``<read/write>:notifications``            | Access to notifications                                    |
++-------------------------------------------+------------------------------------------------------------+
+| ``<read/write>:edits``                    | Access to metadata edits                                   |
++-------------------------------------------+------------------------------------------------------------+
diff --git a/docs/moderator/reports.rst b/docs/moderator/reports.rst
index 746f42c1611be8eb561d8ebd42a1e063bb9ae3b0..e9a0f4f473ac5b2bbb4d3768e95f9682a36085c9 100644
--- a/docs/moderator/reports.rst
+++ b/docs/moderator/reports.rst
@@ -13,11 +13,11 @@ Clicking on this link will bring you to the list of unresolved reports. For conv
 the number of unresolved reports (if any) is also displayed directly next to this link, and updated in real time
 when new reports are submitted.
 
-Email notifications
+E-mail notifications
 -------------------
 
-In addition to the web UI, all moderators will receive a notification email whenever a report is 
-submitted or resolved providing your pod has a valid email sending configuration. 
+In addition to the web UI, all moderators will receive a notification e-mail whenever a report is 
+submitted or resolved providing your pod has a valid e-mail sending configuration. 
 This notification will include a link to review and handle the report, as well as additional 
 information about the report itself.
 
@@ -28,7 +28,7 @@ When viewing the moderation queue, you will be presented with the list of unreso
 
 Each report in the queue should include all the information you need to handle it, in particular:
 
-- Who submitted the report (or the email adress of the submitter if it's an accountless report)
+- Who submitted the report (or the e-mail adress of the submitter if it's an accountless report)
 - The report content
 - A link to the reported object, and a copy of this object data at the time the report was submitted
 
diff --git a/docs/swagger.yml b/docs/swagger.yml
index 904bd799eba6113597cd8d6d1bfeb65380d0af23..e52978bb75417e813b3fd3690bb381ce6d31dfed 100644
--- a/docs/swagger.yml
+++ b/docs/swagger.yml
@@ -285,7 +285,7 @@ paths:
     post:
       summary: Request a password reset
       description: |
-        Request a password reset. An email with reset instructions will be sent to the provided email,
+        Request a password reset. An e-mail with reset instructions will be sent to the provided e-mail address,
         if it's associated with a user account.
       tags:
         - "Auth and security"
@@ -341,7 +341,7 @@ paths:
                 $ref: "./api/definitions.yml#/Me"
   /api/v1/users/users/change-email/:
     post:
-      summary: Update the email address associated with a user account
+      summary: Update the e-mail address associated with a user account
       tags:
         - "Auth and security"
       requestBody:
diff --git a/docs/users/account.rst b/docs/users/account.rst
index 6d98919873165765c8c714e171fa7a4c3eb8182c..54dbfab3b4c3ccf2541dde3d11a4a9aea43ffd71 100644
--- a/docs/users/account.rst
+++ b/docs/users/account.rst
@@ -6,7 +6,7 @@ Delete your account
 
 You can delete your Funkwhale account by visiting your settings. The deletion form is found at the bottom of the page. You will need to input your password to confirm the deletion.
 
-Once the deletion request is submitted, your account and associated data will be removed from the server within a few minutes. This includes, but isn't limited to your avatar, email address, music, favorites, radios, followers and playlists.
+Once the deletion request is submitted, your account and associated data will be removed from the server within a few minutes. This includes, but isn't limited to your avatar, e-mail address, music, favorites, radios, followers and playlists.
 
 Your server will also broadcast a message to other server on the federation to inform them about the deletion.
 
diff --git a/docs/users/create.rst b/docs/users/create.rst
index 0da1387986b265c243f09d198e25583ad7c97958..8c734f78cb6791a9eeda436707acaa4030290188 100644
--- a/docs/users/create.rst
+++ b/docs/users/create.rst
@@ -15,7 +15,7 @@ Signing up to an Instance
 Once you have chosen the instance you would like to sign up to, creating an account is easy.
 
 1. Click on the "Create an account" option on the left-hand side
-2. Enter your preferred username, email address, and password
+2. Enter your preferred username, e-mail address, and password
 3. [Optional] enter an Invitation code if you received an invite from an existing user
 4. Click on "Create my Account"
 5. Once you have created your account, you will be required to log in.
diff --git a/docs/users/reports.rst b/docs/users/reports.rst
index bf870e5c3a623d7165c51ac535ab7f4507caac21..802405171502d4b9b6f1e3d09798070d8596461b 100644
--- a/docs/users/reports.rst
+++ b/docs/users/reports.rst
@@ -29,7 +29,7 @@ Accountless reports
 If this feature is enabled on the pod you are browsing, you'll be able to submit reports without an account.
 
 This works exactly the same, but the report form will have an extra "email" field where you should include a working
-email address, in the event moderators need to contact you.
+e-mail address, in the event moderators need to contact you.
 
 Reporting an account
 --------------------
diff --git a/front/src/components/About.vue b/front/src/components/About.vue
index d155caa59ae8dda41f2453bfa0b7f2bcabcb40f1..a9ef8811144c90a8354410a07204244a7bda015d 100644
--- a/front/src/components/About.vue
+++ b/front/src/components/About.vue
@@ -7,7 +7,7 @@
             v-translate="{podName: podName}"
             translate-context="Content/Home/Header"
             :translate-params="{podName: podName}">
-            About %{ podName }!
+            About %{ podName }
           </span>
           <div v-if="shortDescription" class="sub header">
             {{ shortDescription }}
@@ -179,16 +179,16 @@
                   <i class="music really discrete icon"></i><translate translate-context="Content/Home/Stat" :translate-params="{count: parseInt(stats.hours).toLocaleString($store.state.ui.momentLocale)}" :translate-n="parseInt(stats.hours)" translate-plural="%{ count } hours of music">%{ count } hour of music</translate>
                 </p>
                 <p v-if="stats.artists">
-                  <i class="users really discrete icon"></i><translate translate-context="Content/Home/Stat" :translate-params="{count: stats.artists.toLocaleString($store.state.ui.momentLocale) }" :translate-n="stats.artists" translate-plural="%{ count } artists">%{ count } artists</translate>
+                  <i class="users really discrete icon"></i><translate translate-context="Content/Home/Stat" :translate-params="{count: stats.artists.toLocaleString($store.state.ui.momentLocale) }" :translate-n="stats.artists" translate-plural="%{ count } artists">%{ count } artist</translate>
                 </p>
                 <p v-if="stats.albums">
-                  <i class="headphones really discrete icon"></i><translate translate-context="Content/Home/Stat" :translate-params="{count: stats.albums.toLocaleString($store.state.ui.momentLocale) }" :translate-n="stats.albums" translate-plural="%{ count } albums">%{ count } albums</translate>
+                  <i class="headphones really discrete icon"></i><translate translate-context="Content/Home/Stat" :translate-params="{count: stats.albums.toLocaleString($store.state.ui.momentLocale) }" :translate-n="stats.albums" translate-plural="%{ count } albums">%{ count } album</translate>
                 </p>
                 <p v-if="stats.tracks">
-                  <i class="file really discrete icon"></i><translate translate-context="Content/Home/Stat" :translate-params="{count: stats.tracks.toLocaleString($store.state.ui.momentLocale) }" :translate-n="stats.tracks" translate-plural="%{ count } tracks">%{ count } tracks</translate>
+                  <i class="file really discrete icon"></i><translate translate-context="Content/Home/Stat" :translate-params="{count: stats.tracks.toLocaleString($store.state.ui.momentLocale) }" :translate-n="stats.tracks" translate-plural="%{ count } tracks">%{ count } track</translate>
                 </p>
                 <p v-if="stats.listenings">
-                  <i class="play really discrete icon"></i><translate translate-context="Content/Home/Stat" :translate-params="{count: stats.listenings.toLocaleString($store.state.ui.momentLocale) }" :translate-n="stats.listenings" translate-plural="%{ count } listenings">%{ count } listenings</translate>
+                  <i class="play really discrete icon"></i><translate translate-context="Content/Home/Stat" :translate-params="{count: stats.listenings.toLocaleString($store.state.ui.momentLocale) }" :translate-n="stats.listenings" translate-plural="%{ count } listenings">%{ count } listening</translate>
                 </p>
               </template>
             </div>
diff --git a/front/src/components/Footer.vue b/front/src/components/Footer.vue
index 794ffaa48699f85aed2ebc168f2ddcdd0b85c6b5..c5a7d4a5fc96744a7b65ee427ba2f64bc2815dc4 100644
--- a/front/src/components/Footer.vue
+++ b/front/src/components/Footer.vue
@@ -14,7 +14,7 @@
           </h4>
           <div class="ui list">
             <router-link v-if="this.$route.path != '/about'" class="link item" to="/about">
-              <translate translate-context="Footer/About/List item.Link">About page</translate>
+              <translate translate-context="Footer/About/List item.Link">About</translate>
             </router-link>
             <router-link v-else-if="this.$route.path == '/about' && $store.state.auth.authenticated" class="link item" to="/library">
               <translate translate-context="Footer/*/List item.Link">Go to Library</translate>
@@ -71,7 +71,7 @@
           </div>
           <div class="ui hidden divider"></div>
           <p>
-            <translate translate-context="Footer/*/List item.Link">The funkwhale logo was kindly designed and provided by Francis Gading.</translate>
+            <translate translate-context="Footer/*/List item.Link">The Funkwhale logo was kindly designed and provided by Francis Gading.</translate>
           </p>
         </section>
       </div>
diff --git a/front/src/components/Home.vue b/front/src/components/Home.vue
index 5a59ed0f7c304daf142601519c50220afdc6621c..92615c985b6fdeab5d1284c9681406a902f46de5 100644
--- a/front/src/components/Home.vue
+++ b/front/src/components/Home.vue
@@ -107,7 +107,7 @@
           </h3>
           <template v-if="openRegistrations">
             <p>
-              <translate translate-context="Content/Home/Paragraph">Sign up now to keep a track of your favorites, create playlists, discover new content and much more!</translate>
+              <translate translate-context="Content/Home/Paragraph">Sign up now to keep track of your favorites, create playlists, discover new content and much more!</translate>
             </p>
             <p v-if="defaultUploadQuota">
               <translate translate-context="Content/Home/Paragraph" :translate-params="{quota: humanSize(defaultUploadQuota * 1000 * 1000)}">Users on this pod also get %{ quota } of free storage to upload their own content!</translate>
diff --git a/front/src/components/audio/ChannelForm.vue b/front/src/components/audio/ChannelForm.vue
index 5e58c885a0a1a4dd1127b334ba057ca32f457aac..fbdb8280a87d1ddd18afd7a07a6eb3daeda8e9ff 100644
--- a/front/src/components/audio/ChannelForm.vue
+++ b/front/src/components/audio/ChannelForm.vue
@@ -9,7 +9,7 @@
     <template v-if="metadataChoices">
       <fieldset v-if="creating && step === 1" class="ui grouped channel-type required field">
         <legend>
-          <translate translate-context="Content/Channel/Paragraph">What this channel will be used for?</translate>
+          <translate translate-context="Content/Channel/Paragraph">What will this channel be used for?</translate>
         </legend>
         <div class="ui hidden divider"></div>
         <div class="field">
@@ -33,7 +33,7 @@
         </div>
         <div class="ui required field">
           <label for="channel-username">
-            <translate translate-context="Content/Channel/*">Social Network Name</translate>
+            <translate translate-context="Content/Channel/*">Fediverse handle</translate>
           </label>
           <div class="ui left labeled input">
             <div class="ui basic label">@</div>
@@ -42,7 +42,7 @@
           <template v-if="creating">
             <div class="ui small hidden divider"></div>
             <p>
-              <translate translate-context="Content/Channels/Paragraph">Used in URLs and to follow this channel on the federation. You cannot change it afterwards.</translate>
+              <translate translate-context="Content/Channels/Paragraph">Used in URLs and to follow this channel in the Fediverse. It cannot be changed later.</translate>
             </p>
           </template>
         </div>
@@ -123,7 +123,7 @@
         <div class="ui two fields" v-if="newValues.content_category === 'podcast'">
           <div class="ui field">
             <label for="channel-itunes-email">
-              <translate translate-context="*/*/*">Owner email</translate>
+              <translate translate-context="*/*/*">Owner e-mail address</translate>
             </label>
             <input
               name="channel-itunes-email"
diff --git a/front/src/components/audio/Player.vue b/front/src/components/audio/Player.vue
index bb91533f48f18cc2ea3d5838af1e9a5519787687..6e1a61173b31ded0d7ccb9b0767968f2d26c4e51 100644
--- a/front/src/components/audio/Player.vue
+++ b/front/src/components/audio/Player.vue
@@ -697,8 +697,8 @@ export default {
     labels() {
       let audioPlayer = this.$pgettext('Sidebar/Player/Hidden text', "Media player")
       let previous = this.$pgettext('Sidebar/Player/Icon.Tooltip', "Previous track")
-      let play = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', "Play track")
-      let pause = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', "Pause track")
+      let play = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', "Play")
+      let pause = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', "Pause")
       let next = this.$pgettext('Sidebar/Player/Icon.Tooltip', "Next track")
       let unmute = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', "Unmute")
       let mute = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', "Mute")
diff --git a/front/src/components/auth/LoginForm.vue b/front/src/components/auth/LoginForm.vue
index 6d19b81cf5b0a0953ee4393bed46c5db59f5ffa9..b7515c4277fbd2f752b65e7bfeeb9a41c1e8c532 100644
--- a/front/src/components/auth/LoginForm.vue
+++ b/front/src/components/auth/LoginForm.vue
@@ -4,10 +4,10 @@
       <h4 class="header"><translate translate-context="Content/Login/Error message.Title">We cannot log you in</translate></h4>
       <ul class="list">
         <li v-if="error == 'invalid_credentials' && $store.state.instance.settings.moderation.signup_approval_enabled.value">
-          <translate translate-context="Content/Login/Error message.List item/Call to action">If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email.</translate>
+          <translate translate-context="Content/Login/Error message.List item/Call to action">If you signed-up recently, you may need to wait before our moderation team review your account, or verify your e-mail address.</translate>
         </li>
         <li v-else-if="error == 'invalid_credentials'">
-          <translate translate-context="Content/Login/Error message.List item/Call to action">Please double-check your username/password couple is correct and ensure you verified your email.</translate>
+          <translate translate-context="Content/Login/Error message.List item/Call to action">Please double-check that your username and password combination is correct and make sure you verified your e-mail address.</translate>
         </li>
         <li v-else>{{ error }}</li>
       </ul>
@@ -15,7 +15,7 @@
     <template v-if="$store.getters['instance/appDomain'] === $store.getters['instance/domain']" >
       <div class="field">
         <label for="username-field">
-          <translate translate-context="Content/Login/Input.Label/Noun">Username or email</translate>
+          <translate translate-context="Content/Login/Input.Label/Noun">Username or e-mail address</translate>
           <template v-if="showSignup">
             |
             <router-link :to="{path: '/signup'}">
@@ -92,7 +92,7 @@ export default {
   },
   computed: {
     labels() {
-      let usernamePlaceholder = this.$pgettext('Content/Login/Input.Placeholder', "Enter your username or email")
+      let usernamePlaceholder = this.$pgettext('Content/Login/Input.Placeholder', "Enter your username or e-mail address")
       return {
         usernamePlaceholder,
       }
diff --git a/front/src/components/auth/Settings.vue b/front/src/components/auth/Settings.vue
index 94f033dfe20c301d7bda035694a72e7a5452f582..0bda5b2ab3b8c70d2e7144b6d0834f372cb542e9 100644
--- a/front/src/components/auth/Settings.vue
+++ b/front/src/components/auth/Settings.vue
@@ -72,7 +72,7 @@
             </ul>
           </div>
           <div class="field">
-            <label for="old-password-field"><translate translate-context="Content/Settings/Input.Label">Old password</translate></label>
+            <label for="old-password-field"><translate translate-context="Content/Settings/Input.Label">Current password</translate></label>
             <password-input field-id="old-password-field" required v-model="old_password" />
           </div>
           <div class="field">
@@ -205,9 +205,9 @@
             <translate translate-context="Content/Settings/Title/Noun">Your applications</translate>
           </div>
         </h2>
-        <p><translate translate-context="Content/Settings/Paragraph">This is the list of applications that you have created.</translate></p>
+        <p><translate translate-context="Content/Settings/Paragraph">This is the list of applications that you have registered.</translate></p>
         <router-link class="ui success button" :to="{name: 'settings.applications.new'}">
-          <translate translate-context="Content/Settings/Button.Label">Create a new application</translate>
+          <translate translate-context="Content/Settings/Button.Label">Register a new application</translate>
         </router-link>
         <table v-if="ownedApps.length > 0" class="ui compact very basic unstackable table">
           <thead>
@@ -238,10 +238,10 @@
                 <dangerous-button
                   class="ui tiny danger button"
                   @confirm="deleteApp(app.client_id)">
-                  <translate translate-context="*/*/*/Verb">Delete</translate>
-                  <p slot="modal-header" v-translate="{application: app.name}" translate-context="Popup/Settings/Title">Delete application "%{ application }"?</p>
-                  <p slot="modal-content"><translate translate-context="Popup/Settings/Paragraph">This will permanently delete the application and all the associated tokens.</translate></p>
-                  <div slot="modal-confirm"><translate translate-context="*/Settings/Button.Label/Verb">Delete application</translate></div>
+                  <translate translate-context="*/*/*/Verb">Remove</translate>
+                  <p slot="modal-header" v-translate="{application: app.name}" translate-context="Popup/Settings/Title">Remove application "%{ application }"?</p>
+                  <p slot="modal-content"><translate translate-context="Popup/Settings/Paragraph">This will permanently remove the application and all the associated tokens.</translate></p>
+                  <div slot="modal-confirm"><translate translate-context="*/Settings/Button.Label/Verb">Remove application</translate></div>
                 </dangerous-button>
               </td>
             </tr>
@@ -249,10 +249,10 @@
         </table>
         <empty-state v-else>
           <translate slot="title" translate-context="Content/Applications/Paragraph">
-            You don't have any configured application yet.
+            You don't have registered any application yet.
           </translate>
           <translate translate-context="Content/Applications/Paragraph">
-            Create one to integrate Funkwhale with third-party applications.
+            Register one to integrate Funkwhale with third-party applications.
           </translate>
         </empty-state>
       </section>
@@ -275,24 +275,24 @@
         <h2 class="ui header">
           <i class="comment icon"></i>
           <div class="content">
-            <translate translate-context="*/*/Button.Label">Change my email address</translate>
+            <translate translate-context="*/*/Button.Label">Change my e-mail address</translate>
           </div>
         </h2>
         <p>
-          <translate translate-context="Content/Settings/Paragraph'">Change the email address associated with your account. We will send a confirmation to the new address.</translate>
+          <translate translate-context="Content/Settings/Paragraph'">Change the e-mail address associated with your account. We will send a confirmation to the new address.</translate>
         </p>
         <p>
-          <translate :translate-params="{email: $store.state.auth.profile.email}" translate-context="Content/Settings/Paragraph'">Your current email address is %{ email }.</translate>
+          <translate :translate-params="{email: $store.state.auth.profile.email}" translate-context="Content/Settings/Paragraph'">Your current e-mail address is %{ email }.</translate>
         </p>
         <form class="ui form" @submit.prevent="changeEmail">
           <div v-if="changeEmailErrors.length > 0" role="alert" class="ui negative message">
-            <h4 class="header"><translate translate-context="Content/Settings/Error message.Title">We cannot change your email address</translate></h4>
+            <h4 class="header"><translate translate-context="Content/Settings/Error message.Title">We cannot change your e-mail address</translate></h4>
             <ul class="list">
               <li v-for="error in changeEmailErrors">{{ error }}</li>
             </ul>
           </div>
           <div class="field">
-            <label for="new-email"><translate translate-context="*/*/*">New email</translate></label>
+            <label for="new-email"><translate translate-context="*/*/*">New e-mail address</translate></label>
             <input id="new-email" required v-model="newEmail" type="email" />
           </div>
           <div class="field">
@@ -570,7 +570,7 @@ export default {
             self.isChangingEmail = false
             self.newEmail = null
             self.emailPassword = null
-            let msg = self.$pgettext('*/Auth/Message', 'Your email has been changed, please check your inbox for our confirmation message.')
+            let msg = self.$pgettext('*/Auth/Message', 'Your e-mail address has been changed, please check your inbox for our confirmation message.')
             self.$store.commit('ui/addMessage', {
               content: msg,
               date: new Date()
diff --git a/front/src/components/auth/SignupForm.vue b/front/src/components/auth/SignupForm.vue
index d037da3c343fdce882a01aa07bcda203a75822ed..35bb8df7b172457a857eee57d69b3558250917b4 100644
--- a/front/src/components/auth/SignupForm.vue
+++ b/front/src/components/auth/SignupForm.vue
@@ -2,10 +2,10 @@
   <div v-if="submitted">
     <div class="ui success message">
       <p v-if="signupRequiresApproval">
-        <translate translate-context="Content/Signup/Form/Paragraph">Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request.</translate>
+        <translate translate-context="Content/Signup/Form/Paragraph">Your account request was successfully submitted. You will be notified by e-mail when our moderation team has reviewed your request.</translate>
       </p>
       <p v-else>
-        <translate translate-context="Content/Signup/Form/Paragraph">Your account was successfully created. Please verify your email before trying to login.</translate>
+        <translate translate-context="Content/Signup/Form/Paragraph">Your account was successfully created. Please verify your e-mail address before trying to login.</translate>
       </p>
     </div>
     <h2><translate translate-context="Content/Login/Title/Verb">Log in to your Funkwhale account</translate></h2>
@@ -44,7 +44,7 @@
       v-model="username">
     </div>
     <div class="required field">
-      <label for="email-field"><translate translate-context="Content/*/*/Noun">Email</translate></label>
+      <label for="email-field"><translate translate-context="Content/*/*/Noun">E-mail address</translate></label>
       <input
       id="email-field"
       ref="email"
@@ -135,7 +135,7 @@ export default {
         "Enter your invitation code (case insensitive)"
       )
       let usernamePlaceholder = this.$pgettext("Content/Signup/Form/Placeholder", "Enter your username")
-      let emailPlaceholder = this.$pgettext("Content/Signup/Form/Placeholder", "Enter your email")
+      let emailPlaceholder = this.$pgettext("Content/Signup/Form/Placeholder", "Enter your e-mail address")
       return {
         usernamePlaceholder,
         emailPlaceholder,
diff --git a/front/src/components/auth/SubsonicTokenForm.vue b/front/src/components/auth/SubsonicTokenForm.vue
index fa11dd911f9dc8c395d809bc92e7e1d17b89b3de..4659bfac770842a5a1a0fa0e7641b8faec04b4bc 100644
--- a/front/src/components/auth/SubsonicTokenForm.vue
+++ b/front/src/components/auth/SubsonicTokenForm.vue
@@ -8,7 +8,7 @@
       <translate translate-context="Content/Settings/Paragraph'">Funkwhale is compatible with other music players that support the Subsonic API.</translate>&nbsp;<translate translate-context="Content/Settings/Paragraph">You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance.</translate>
     </p>
     <p>
-      <translate translate-context="Content/Settings/Paragraph">However, accessing Funkwhale from those clients require a separate password you can set below.</translate>
+      <translate translate-context="Content/Settings/Paragraph">However, accessing Funkwhale from those clients requires a separate password you can set below.</translate>
     </p>
     <p><a href="https://docs.funkwhale.audio/users/apps.html#subsonic-compatible-clients" target="_blank">
       <translate translate-context="Content/Settings/Link">Discover how to use Funkwhale from other apps</translate>
diff --git a/front/src/components/channels/AlbumModal.vue b/front/src/components/channels/AlbumModal.vue
index 2346c14cbe5bce9df65ea35e8434c3a3c29aacc9..5dae29156c673b8acbc02a123902d3e5213db8fb 100644
--- a/front/src/components/channels/AlbumModal.vue
+++ b/front/src/components/channels/AlbumModal.vue
@@ -1,7 +1,7 @@
 <template>
   <modal class="small" :show.sync="show">
     <h4 class="header">
-      <translate key="1" v-if="channel.content_category === 'podcasts'" translate-context="Popup/Channels/Title/Verb">New serie</translate>
+      <translate key="1" v-if="channel.content_category === 'podcasts'" translate-context="Popup/Channels/Title/Verb">New series</translate>
       <translate key="2" v-else translate-context="Popup/Channels/Title">New album</translate>
     </h4>
     <div class="scrolling content">
diff --git a/front/src/components/channels/AlbumSelect.vue b/front/src/components/channels/AlbumSelect.vue
index 0beafbbc721427130c5a499ba2be909d0ba6ff75..7b37704693f0e26fac21d54b09ac9edaad3c59c7 100644
--- a/front/src/components/channels/AlbumSelect.vue
+++ b/front/src/components/channels/AlbumSelect.vue
@@ -1,7 +1,7 @@
 <template>
   <div>
     <label for="album-dropdown">
-      <translate v-if="channel && channel.artist.content_category === 'podcast'" key="1" translate-context="*/*/*">Serie</translate>
+      <translate v-if="channel && channel.artist.content_category === 'podcast'" key="1" translate-context="*/*/*">Series</translate>
       <translate v-else key="2" translate-context="*/*/*">Album</translate>
     </label>
     <select id="album-dropdown" :value="value" @input="$emit('input', $event.target.value)" class="ui search normal dropdown">
diff --git a/front/src/components/common/ActionTable.vue b/front/src/components/common/ActionTable.vue
index 38a6d23d02b39b0e023f25d5be8f265b2dd3164d..0fe89a2005233b98cedd510060813c9fcc817b5e 100644
--- a/front/src/components/common/ActionTable.vue
+++ b/front/src/components/common/ActionTable.vue
@@ -82,7 +82,7 @@
                         :translate-n="objectsData.count"
                         :translate-params="{total: objectsData.count}"
                         translate-plural="Select all %{ total } elements">
-                        Select all %{ total } elements
+                        Select one element
                       </translate>
                     </a>
                     <a @click.prevent="selectAll = false" v-else href="">
diff --git a/front/src/components/federation/FetchButton.vue b/front/src/components/federation/FetchButton.vue
index c19756fb7094467d1e2405c882e0c245d14141bb..65ff28a09c3a192f66e2948635eb26978d53b43a 100644
--- a/front/src/components/federation/FetchButton.vue
+++ b/front/src/components/federation/FetchButton.vue
@@ -5,7 +5,7 @@
     </div>
     <modal class="small" :show.sync="showModal">
       <h3 class="header">
-        <translate translate-context="Popup/*/Title">Refreshing object from remote…</translate>
+        <translate translate-context="Popup/*/Title">Refreshing object from remote server…</translate>
       </h3>
       <div class="scrolling content">
         <template v-if="fetch && fetch.status != 'pending'">
@@ -78,7 +78,7 @@
         </div>
         <div v-else-if="fetch && fetch.status === 'pending' && pollsCount >= maxPolls" role="alert" class="ui warning message">
           <h4 class="header"><translate translate-context="Popup/*/Message.Title">Refresh pending</translate></h4>
-          <p><translate translate-context="Popup/*/Message.Content">Refresh request wasn't proceed in time by our server. It will be processed later.</translate></p>
+          <p><translate translate-context="Popup/*/Message.Content">The refresh request hasn't been processed in time by our server. It will be processed later.</translate></p>
         </div>
       </div>
       <div class="actions">
diff --git a/front/src/components/library/Podcasts.vue b/front/src/components/library/Podcasts.vue
index e4683407a83d87faf51acf273e55321f02daa499..75607ab08bfae2c5b37fbee702918056df26c858 100644
--- a/front/src/components/library/Podcasts.vue
+++ b/front/src/components/library/Podcasts.vue
@@ -2,13 +2,13 @@
   <main v-title="labels.title">
     <section class="ui vertical stripe segment">
       <h2 class="ui header">
-        <translate translate-context="Content/Podcasts/Title">Browsing Podcasts</translate>
+        <translate translate-context="Content/Podcasts/Title">Browsing podcasts</translate>
       </h2>
       <form :class="['ui', {'loading': isLoading}, 'form']" @submit.prevent="updatePage();updateQueryString();fetchData()">
         <div class="fields">
           <div class="field">
             <label for="artist-search">
-              <translate translate-context="Content/Search/Input.Label/Noun">Podcast Title</translate>
+              <translate translate-context="Content/Search/Input.Label/Noun">Podcast title</translate>
             </label>
             <div class="ui action input">
               <input id="artist-search" type="text" name="search" v-model="query" :placeholder="labels.searchPlaceholder"/>
diff --git a/front/src/components/manage/moderation/InstancePolicyForm.vue b/front/src/components/manage/moderation/InstancePolicyForm.vue
index 2d633176c62739c2935ef3d1b74bfdbfc8ce5085..5fc072165cd6c9352cf0af7755c4593d34a83d52 100644
--- a/front/src/components/manage/moderation/InstancePolicyForm.vue
+++ b/front/src/components/manage/moderation/InstancePolicyForm.vue
@@ -107,7 +107,7 @@ export default {
   computed: {
     labels () {
       return {
-        summaryHelp: this.$pgettext('Content/Moderation/Help text', "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."),
+        summaryHelp: this.$pgettext('Content/Moderation/Help text', "Explain why you're applying this policy: this will help you remember why you added this rule. Depending on your pod configuration, this may be displayed publicly to help users understand the moderation rules in place."),
         isActiveHelp: this.$pgettext('Content/Moderation/Help text', "Use this setting to temporarily enable/disable the policy without completely removing it."),
         blockAllHelp: this.$pgettext('Content/Moderation/Help text', "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"),
         silenceActivity: {
diff --git a/front/src/components/manage/users/InvitationsTable.vue b/front/src/components/manage/users/InvitationsTable.vue
index ca72e4a5c321efe92141d1bf297854a63ed9a314..62e5a4f05c6f7770c02a0f369f740868eea3a75b 100644
--- a/front/src/components/manage/users/InvitationsTable.vue
+++ b/front/src/components/manage/users/InvitationsTable.vue
@@ -75,8 +75,10 @@
 
       <span v-if="result && result.results.length > 0">
         <translate translate-context="Content/*/Paragraph"
-          :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
-          Showing results %{ start }-%{ end } on %{ total }
+          translate-plural="Showing results %{ start } to %{ end } from %{ total }"
+          :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}"
+          :translate-n="result.count">
+          Showing one result
         </translate>
       </span>
     </div>
diff --git a/front/src/components/manage/users/UsersTable.vue b/front/src/components/manage/users/UsersTable.vue
index 910cff0eaec17d65ce46046938b13b58ac1c77ee..3ad6210ca7a6c6c2f1ad6307094c4ffed112639e 100644
--- a/front/src/components/manage/users/UsersTable.vue
+++ b/front/src/components/manage/users/UsersTable.vue
@@ -87,8 +87,10 @@
 
       <span v-if="result && result.results.length > 0">
         <translate translate-context="Content/*/Paragraph"
-          :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
-          Showing results %{ start }-%{ end } on %{ total }
+          translate-plural="Showing results %{ start } to %{ end } from %{ total }"
+          :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}"
+          :translate-n="result.count">
+          Showing one result
         </translate>
       </span>
     </div>
diff --git a/front/src/components/mixins/Translations.vue b/front/src/components/mixins/Translations.vue
index 138922f077390a870e0eead57d5b7d97283786b4..2d2631e8748d2bab5f40c9faad8164b4f693c18b 100644
--- a/front/src/components/mixins/Translations.vue
+++ b/front/src/components/mixins/Translations.vue
@@ -77,7 +77,7 @@ export default {
           album_title: this.$pgettext('Content/*/Dropdown/Noun', 'Album name'),
           artist_name: this.$pgettext('Content/*/Dropdown/Noun', 'Artist name'),
           name: this.$pgettext('*/*/*/Noun', 'Name'),
-          length: this.$pgettext('*/*/*/Noun', 'Length'),
+          length: this.$pgettext('*/*/*/Noun', 'Duration'),
           items_count: this.$pgettext('*/*/*/Noun', 'Items'),
           size: this.$pgettext('Content/*/*/Noun', 'Size'),
           bitrate: this.$pgettext('Content/Track/*/Noun', 'Bitrate'),
@@ -94,7 +94,7 @@ export default {
         scopes: {
           profile: {
             label: this.$pgettext('Content/OAuth Scopes/Label', 'Profile'),
-            description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to email, username, and profile information'),
+            description: this.$pgettext('Content/OAuth Scopes/Paragraph', 'Access to e-mail, username, and profile information'),
           },
           libraries: {
             label: this.$pgettext('Content/OAuth Scopes/Label', 'Libraries and uploads'),
diff --git a/front/src/components/moderation/ReportModal.vue b/front/src/components/moderation/ReportModal.vue
index f32f7b6f6f0aa52c3e7527372524be1654d9a5de..bc308f5e251065776e0b31d8604d0304a2108080 100644
--- a/front/src/components/moderation/ReportModal.vue
+++ b/front/src/components/moderation/ReportModal.vue
@@ -33,7 +33,7 @@
             </label>
             <input type="email" v-model="submitterEmail" name="report-submitter-email" id="report-submitter-email" required>
             <p>
-              <translate translate-context="*/*/Field,Help">We'll use this email if we need to contact you regarding this report.</translate>
+              <translate translate-context="*/*/Field,Help">We'll use this e-mail address if we need to contact you regarding this report.</translate>
             </p>
           </div>
         </div>
diff --git a/front/src/components/playlists/Editor.vue b/front/src/components/playlists/Editor.vue
index 43d080dfa8a28b9ce29ddbee5017f44001682615..a088e17372fe1178f6fdf83e1db778ed994d9daf 100644
--- a/front/src/components/playlists/Editor.vue
+++ b/front/src/components/playlists/Editor.vue
@@ -192,7 +192,7 @@ export default {
     }),
     labels () {
       return {
-        copyTitle: this.$pgettext('Content/Playlist/Button.Tooltip/Verb', 'Copy queued tracks to playlist')
+        copyTitle: this.$pgettext('Content/Playlist/Button.Tooltip/Verb', 'Copy the current queue to this playlist')
       }
     },
     status () {
diff --git a/front/src/views/auth/PasswordReset.vue b/front/src/views/auth/PasswordReset.vue
index 583ff2e2a45042a0b98755be23a7b104496fc5ec..380e95a8f7c30dcd5abbb7515275ac7eca91b6c6 100644
--- a/front/src/views/auth/PasswordReset.vue
+++ b/front/src/views/auth/PasswordReset.vue
@@ -10,9 +10,9 @@
               <li v-for="error in errors">{{ error }}</li>
             </ul>
           </div>
-          <p><translate translate-context="Content/Signup/Paragraph">Use this form to request a password reset. We will send an email to the given address with instructions to reset your password.</translate></p>
+          <p><translate translate-context="Content/Signup/Paragraph">Use this form to request a password reset. We will send an e-mail to the given address with instructions to reset your password.</translate></p>
           <div class="field">
-            <label for="account-email"><translate translate-context="Content/Signup/Input.Label">Account's email</translate></label>
+            <label for="account-email"><translate translate-context="Content/Signup/Input.Label">Account's e-mail address</translate></label>
             <input
               id="account-email"
               required
@@ -52,7 +52,7 @@ export default {
   computed: {
     labels() {
       let reset = this.$pgettext('*/Login/*/Verb', "Reset your password")
-      let placeholder = this.$pgettext('Content/Signup/Input.Placeholder', "Enter the email address linked to your account"
+      let placeholder = this.$pgettext('Content/Signup/Input.Placeholder', "Enter the e-mail address linked to your account"
       )
       return {
         reset,
diff --git a/front/src/views/auth/PasswordResetConfirm.vue b/front/src/views/auth/PasswordResetConfirm.vue
index a10d664f801291c2aca1b54c7ff374978c3b9572..7d0f4b84fdd7c4288eeb421a2d2942b0599229cd 100644
--- a/front/src/views/auth/PasswordResetConfirm.vue
+++ b/front/src/views/auth/PasswordResetConfirm.vue
@@ -22,7 +22,7 @@
               <translate translate-context="Content/Signup/Button.Label">Update your password</translate></button>
           </template>
           <template v-else>
-            <p><translate translate-context="Content/Signup/Paragraph">If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes.</translate></p>
+            <p><translate translate-context="Content/Signup/Paragraph">If the e-mail address provided in the previous step is valid and linked to a user account, you should receive an e-mail with reset instructions in the next couple of minutes.</translate></p>
           </template>
         </form>
         <div v-else class="ui positive message">
diff --git a/front/src/views/auth/ProfileOverview.vue b/front/src/views/auth/ProfileOverview.vue
index 3ed7dde817ea8440b748c42ec3b70baea8dd3a4d..3c0f89eca6f1418ba1b82292d1b6476e0a0537aa 100644
--- a/front/src/views/auth/ProfileOverview.vue
+++ b/front/src/views/auth/ProfileOverview.vue
@@ -30,7 +30,7 @@
         </div>
       </h2>
       <library-widget :url="`federation/actors/${object.full_username}/libraries/`">
-        <translate translate-context="Content/Profile/Paragraph" slot="title">This user shared the following libraries...</translate>
+        <translate translate-context="Content/Profile/Paragraph" slot="title">This user shared the following libraries</translate>
       </library-widget>
     </div>
 
diff --git a/front/src/views/auth/Signup.vue b/front/src/views/auth/Signup.vue
index 9b56d87a774912707b4938b1e5242c3cfffaa66a..0c77f4dafb074f315c18aaaeb5940ab9d45136a7 100644
--- a/front/src/views/auth/Signup.vue
+++ b/front/src/views/auth/Signup.vue
@@ -2,7 +2,7 @@
   <main class="main pusher" v-title="labels.title">
     <section class="ui vertical stripe segment">
       <div class="ui small text container">
-        <h2><translate translate-context="Content/Signup/Title">Create a funkwhale account</translate></h2>
+        <h2><translate translate-context="Content/Signup/Title">Create a Funkwhale account</translate></h2>
         <signup-form :default-invitation="defaultInvitation" :next="next"></signup-form>
       </div>
     </section>
diff --git a/front/src/views/channels/DetailBase.vue b/front/src/views/channels/DetailBase.vue
index 3a00dbea03c99faa1f614e37fd16b7892b95ba37..76506cacf46c0f3b13cbfd110467e80b0cc662f2 100644
--- a/front/src/views/channels/DetailBase.vue
+++ b/front/src/views/channels/DetailBase.vue
@@ -54,7 +54,7 @@
                           <i class="feed icon"></i>
                           <translate translate-context="Content/Channels/Header">Subscribe via RSS</translate>
                         </h3>
-                        <p><translate translate-context="Content/Channels/Label">Copy-paste the following URL in your favorite podcasting app:</translate></p>
+                        <p><translate translate-context="Content/Channels/Label">Copy-paste the following URL in your favorite podcatcher:</translate></p>
                         <copy-input :value="object.rss_url" />
                       </template>
                       <template v-if="object.actor">