about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--app/assets/javascripts/components/containers/mastodon.jsx3
-rw-r--r--app/assets/javascripts/components/locales/fr.jsx54
-rw-r--r--app/helpers/settings_helper.rb1
-rw-r--r--config/application.rb2
-rw-r--r--config/locales/devise.fr.yml62
-rw-r--r--config/locales/doorkeeper.fr.yml126
-rw-r--r--config/locales/fr.yml59
-rw-r--r--config/locales/simple_form.fr.yml27
8 files changed, 332 insertions, 2 deletions
diff --git a/app/assets/javascripts/components/containers/mastodon.jsx b/app/assets/javascripts/components/containers/mastodon.jsx
index 3528ef81c..87c7c65f3 100644
--- a/app/assets/javascripts/components/containers/mastodon.jsx
+++ b/app/assets/javascripts/components/containers/mastodon.jsx
@@ -38,6 +38,7 @@ import { IntlProvider, addLocaleData } from 'react-intl';
 import en from 'react-intl/locale-data/en';
 import de from 'react-intl/locale-data/de';
 import es from 'react-intl/locale-data/es';
+import fr from 'react-intl/locale-data/fr';
 import getMessagesForLocale from '../locales';
 
 const store = configureStore();
@@ -46,7 +47,7 @@ const browserHistory = useRouterHistory(createBrowserHistory)({
   basename: '/web'
 });
 
-addLocaleData([...en, ...de, ...es]);
+addLocaleData([...en, ...de, ...es, ...fr]);
 
 const Mastodon = React.createClass({
 
diff --git a/app/assets/javascripts/components/locales/fr.jsx b/app/assets/javascripts/components/locales/fr.jsx
new file mode 100644
index 000000000..6da4d6f8c
--- /dev/null
+++ b/app/assets/javascripts/components/locales/fr.jsx
@@ -0,0 +1,54 @@
+const fr = {
+  "column_back_button.label": "Retour",
+  "lightbox.close": "Fermer",
+  "loading_indicator.label": "Chargement…",
+  "status.mention": "Mentionner",
+  "status.delete": "Effacer",
+  "status.reply": "Répondre",
+  "status.reblog": "Partager",
+  "status.favourite": "Ajouter aux favoris",
+  "status.reblogged_by": "{name} a partagé",
+  "video_player.toggle_sound": "Mettre/Couper le son",
+  "account.mention": "Mentionner",
+  "account.edit_profile": "Modifier le profil",
+  "account.unblock": "Débloquer",
+  "account.unfollow": "Se désabonner",
+  "account.block": "Bloquer",
+  "account.follow": "S’abonner",
+  "account.posts": "Statuts",
+  "account.follows": "Abonnements",
+  "account.followers": "Abonnés",
+  "account.follows_you": "Vous suit",
+  "getting_started.heading": "Pour commencer",
+  "getting_started.about_addressing": "Vous pouvez vous abonner aux statuts de quelqu’un en entrant dans le champs en haut de la colonne de gauche leur nom d’utilisateur et le nom de domaine de leur instance, séparés par un @ à la manière d’une adresse courriel.",
+  "getting_started.about_shortcuts": "Si cette personne utilise la même instance que vous, le nom d’utilisateur suffit. C’est le même principe pour mentionner quelqu’un dans vos statuts.",
+  "getting_started.about_developer": "Pour s’abonner au développeur de ce projet, c’est Gargron@mastodon.social",
+  "column.home": "Accueil",
+  "column.mentions": "Mentions",
+  "column.public": "Public",
+  "column.notifications": "Notifications",
+  "tabs_bar.compose": "Composer",
+  "tabs_bar.home": "Accueil",
+  "tabs_bar.mentions": "Mentions",
+  "tabs_bar.public": "Public",
+  "tabs_bar.notifications": "Notifications",
+  "compose_form.placeholder": "Qu’avez vous en tête ?",
+  "compose_form.publish": "Publier",
+  "navigation_bar.settings": "Paramètres",
+  "navigation_bar.public_timeline": "Fil public",
+  "navigation_bar.logout": "Se déconnecter",
+  "reply_indicator.cancel": "Annuler",
+  "search.placeholder": "Chercher",
+  "search.account": "Compte",
+  "search.hashtag": "Mot-clé",
+  "suggestions_box.who_to_follow": "Suggestions",
+  "suggestions_box.refresh": "Rafraîchir",
+  "upload_button.label": "Joindre un média",
+  "upload_form.undo": "Annuler",
+  "notification.follow": "{name} s’est abonné⋅e à vos statuts",
+  "notification.favourite": "{name} a ajouté votre statut à ses favoris",
+  "notification.reblog": "{name} a partagé votre statut",
+  "notification.mention": "{name} vous a mentionné"
+};
+
+export default fr;
diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb
index 66ecc56c6..75ee2f8d9 100644
--- a/app/helpers/settings_helper.rb
+++ b/app/helpers/settings_helper.rb
@@ -5,6 +5,7 @@ module SettingsHelper
     en: 'English',
     de: 'Deutsch',
     es: 'Español',
+    fr: 'Français',
   }.freeze
 
   def human_locale(locale)
diff --git a/config/application.rb b/config/application.rb
index c53d78a4c..7ba13bfbe 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -20,7 +20,7 @@ module Mastodon
 
     # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
     # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
-    config.i18n.available_locales = [:en, :de, :es]
+    config.i18n.available_locales = [:en, :de, :es, :fr]
     config.i18n.default_locale    = :en
 
     # config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml
new file mode 100644
index 000000000..314876498
--- /dev/null
+++ b/config/locales/devise.fr.yml
@@ -0,0 +1,62 @@
+# Translation from https://gist.github.com/qsypoq/4cf3b858ff8242ffb013
+---
+fr:
+  devise:
+    confirmations:
+      confirmed: "Votre compte a été validé."
+      send_instructions: "Vous allez recevoir les instructions nécessaires à la confirmation de votre compte dans quelques minutes."
+      send_paranoid_instructions: "Si votre e-mail existe dans notre base de données, vous allez bientôt recevoir un e-mail contenant les instructions de confirmation de votre compte."
+    failure:
+      already_authenticated: "Vous êtes déjà connecté"
+      inactive: "Votre compte n'est pas encore activé."
+      invalid: "Email ou mot de passe incorrect."
+      last_attempt: "Vous avez droit à une tentative avant que votre compte ne soit verrouillé."
+      locked: "Votre compte est verrouillé."
+      not_found_in_database: "Email ou mot de passe invalide."
+      timeout: "Votre session est expirée. Veuillez vous reconnecter pour continuer."
+      unauthenticated: "Vous devez vous connecter ou vous inscrire pour continuer."
+      unconfirmed: "Vous devez valider votre compte pour continuer."
+    mailer:
+      confirmation_instructions:
+        subject: "Instructions de confirmation"
+      reset_password_instructions:
+        subject: "Instructions pour changer le mot de passe"
+      unlock_instructions:
+        subject: "Instructions pour déverrouiller le compte"
+      password_change:
+        subject: "Votre mot de passe a été modifié avec succés."
+    omniauth_callbacks:
+      failure: "Nous n'avons pas pu vous authentifier via %{kind} : '%{reason}'."
+      success: "Authentifié avec succès via %{kind}."
+    passwords:
+      no_token: "Vous ne pouvez accéder à cette page sans passer par un e-mail de réinitialisation de mot de passe. Si vous êtes passé par un e-mail de ce type, assurez-vous d'utiliser l'URL complète."
+      send_instructions: "Vous allez recevoir les instructions de réinitialisation du mot de passe dans quelques instants"
+      send_paranoid_instructions: "Si votre e-mail existe dans notre base de données, vous allez recevoir un lien de réinitialisation par e-mail"
+      updated: "Votre mot de passe a été édité avec succès, vous êtes maintenant connecté"
+      updated_not_active: "Votre mot de passe a été changé avec succès."
+    registrations:
+      destroyed: "Votre compte a été supprimé avec succès. Nous espérons vous revoir bientôt."
+      signed_up: "Bienvenue, vous êtes connecté."
+      signed_up_but_inactive: "Vous êtes bien enregistré. Vous ne pouvez cependant pas vous connecter car votre compte n'est pas encore activé."
+      signed_up_but_locked: "Vous êtes bien enregistré. Vous ne pouvez cependant pas vous connecter car votre compte est verrouillé."
+      signed_up_but_unconfirmed: "Un message contenant un lien de confirmation a été envoyé à votre adresse email. Ouvrez ce lien pour activer votre compte."
+      update_needs_confirmation: "Votre compte a bien été mis à jour mais nous devons vérifier votre nouvelle adresse email. Merci de vérifier vos emails et de cliquer sur le lien de confirmation pour finaliser la validation de votre nouvelle adresse."
+      updated: "Votre compte a été modifié avec succès."
+    sessions:
+      signed_in: "Connecté."
+      signed_out: "Déconnecté."
+      already_signed_out: "Déconnecté."
+    unlocks:
+      send_instructions: "Vous allez recevoir les instructions nécessaires au déverrouillage de votre compte dans quelques instants"
+      send_paranoid_instructions: "Si votre compte existe, vous allez bientôt recevoir un email contenant les instructions pour le déverrouiller."
+      unlocked: "Votre compte a été déverrouillé avec succès, vous êtes maintenant connecté."
+  errors:
+    messages:
+      already_confirmed: "a déjà été validé(e), veuillez essayer de vous connecter"
+      confirmation_period_expired: "à confirmer dans les %{period}, merci de faire une nouvelle demande"
+      expired: "a expiré, merci d'en faire une nouvelle demande"
+      not_found: "n'a pas été trouvé(e)"
+      not_locked: "n'était pas verrouillé(e)"
+      not_saved:
+        one: "1 erreur a empêché ce(tte) %{resource} d'être sauvegardé(e) :"
+other: "%{count} erreurs ont empêché ce(tte) %{resource} d'être sauvegardé(e) :"
diff --git a/config/locales/doorkeeper.fr.yml b/config/locales/doorkeeper.fr.yml
new file mode 100644
index 000000000..d65f9aad4
--- /dev/null
+++ b/config/locales/doorkeeper.fr.yml
@@ -0,0 +1,126 @@
+# Translation from https://github.com/doorkeeper-gem/doorkeeper-i18n/blob/master/rails/locales/fr.yml
+---
+fr:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: "Nom"
+        redirect_uri: "L'URL de redirection"
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: "ne peut contenir un fragment."
+              invalid_uri: "doit être une URL valide."
+              relative_uri: "doit être une URL absolue."
+              secured_uri: "doit être une URL HTTP/SSL."
+
+  doorkeeper:
+    applications:
+      confirmations:
+        destroy: "Êtes-vous certain?"
+      buttons:
+        edit: "Modifier"
+        destroy: "Détruire"
+        submit: "Envoyer"
+        cancel: "Annuler"
+        authorize: "Autoriser"
+      form:
+        error: "Oups! Vérifier votre formulaire pour des erreurs possibles"
+      help:
+        redirect_uri: "Utiliser une ligne par URL"
+        native_redirect_uri: "Utiliser %{native_redirect_uri} pour les tests locaux"
+        scopes: ~
+      edit:
+        title: "Modifier l'application"
+      index:
+        title: "Vos applications"
+        new: "Nouvelle application"
+        name: "Nom"
+        callback_url: "URL de retour d'appel"
+      new:
+        title: "Nouvelle application"
+      show:
+        title: "Application : %{name}"
+        application_id: "ID de l'application"
+        secret: "Secret"
+        scopes: ~
+        callback_urls: "URL du retour d'appel"
+        actions: "Actions"
+
+    authorizations:
+      buttons:
+        authorize: "Autoriser"
+        deny: "Refuser"
+      error:
+        title: "Une erreur est survenue"
+      new:
+        title: "Autorisation requise"
+        prompt: "Autorisez %{client_name} à utiliser votre compte?"
+        able_to: "Cette application pourra"
+      show:
+        title: "Code d'autorisation"
+
+    authorized_applications:
+      confirmations:
+        revoke: "Êtes-vous certain?"
+      buttons:
+        revoke: "Annuler"
+      index:
+        title: "Vos applications autorisées"
+        application: "Application"
+        created_at: "Créé le"
+        date_format: "%Y-%m-%d %H:%M:%S"
+
+    errors:
+      messages:
+        # Common error messages
+        invalid_request: "La demande manque un paramètre requis, inclut une valeur de paramètre non prise en charge, ou est autrement mal formée."
+        invalid_redirect_uri: "L'URL de redirection n'est pas valide."
+        unauthorized_client: "Le client n'est pas autorisé à effectuer cette demande à l'aide de cette méthode."
+        access_denied: "Le propriétaire de la ressource ou le serveur d'autorisation a refusé la demande."
+        invalid_scope: "Le scope demandé n'est pas valide, est inconnu, ou est mal formé."
+        server_error: "Le serveur d'autorisation a rencontré une condition inattendue qui l'a empêché de remplir la demande."
+        temporarily_unavailable: "Le serveur d'autorisation est actuellement incapable de traiter la demande à cause d'une surcharge ou d'un entretien temporaire du serveur."
+
+        #configuration error messages
+        credential_flow_not_configured: "Le flux des identifiants du mot de passe du propriétaire de la ressource a échoué en raison de Doorkeeper.configure.resource_owner_from_credentials n'est pas configuré."
+        resource_owner_authenticator_not_configured: "La recherche du propriétaire de la ressource a échoué en raison de Doorkeeper.configure.resource_owner_authenticator n'est pas configuré."
+
+        # Access grant errors
+        unsupported_response_type: "Le serveur d'autorisation ne prend pas en charge ce type de réponse."
+
+        # Access token errors
+        invalid_client: "L'authentification du client a échoué à cause d'un client inconnu, d'aucune authentification de client incluse, ou d'une méthode d'authentification non prise en charge."
+        invalid_grant: "Le consentement d'autorisation accordé n'est pas valide, a expiré, est annulé, ne concorde pas avec l'URL de redirection utilisée dans la demande d'autorisation, ou a été émis à un autre client."
+        unsupported_grant_type: "Le type de consentement d'autorisation n'est pas pris en charge par le serveur d'autorisation."
+
+        # Password Access token errors
+        invalid_resource_owner: "Les identifiants fournis du propriétaire de la ressource ne sont pas valides, ou le propriétaire de la ressource ne peut être trouvé"
+
+        invalid_token:
+          revoked: "Le jeton d'accès a été annulé"
+          expired: "Le jeton d'accès a expiré"
+          unknown: "Le jeton d'accès n'est pas valide"
+
+    flash:
+      applications:
+        create:
+          notice: "Application créée."
+        destroy:
+          notice: "Application supprimée."
+        update:
+          notice: "Application mise à jour."
+      authorized_applications:
+        destroy:
+          notice: "Application annulée."
+
+    layouts:
+      admin:
+        nav:
+          oauth2_provider: "Fournisseur OAuth2"
+          applications: "Applications"
+          home: 'Home'
+      application:
+        title: "Autorisation OAuth requise"
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
new file mode 100644
index 000000000..bd7f741d6
--- /dev/null
+++ b/config/locales/fr.yml
@@ -0,0 +1,59 @@
+---
+fr:
+  about:
+    about_instance: "<em>%{instance}</em> est une instance de Mastodon."
+    about_mastodon: "Mastodon est un serveur <em>libre</em> de réseautage social. Alternative <em>décentralisée</em> aux plateformes commerciales, la monopolisation de vos communications par une entreprise unique est évitée. Tout un chacun peut faire tourner Mastodon et participer au <em>réseau social</em> de manière transparente."
+    get_started: "Rejoindre le réseau"
+    source_code: "Code source"
+    terms: "Conditions d’utilisation"
+  accounts:
+    follow: "S’abonner"
+    followers: "Abonnés"
+    following: "Abonnements"
+    nothing_here: "Rien à voir ici&nbsp;!"
+    people_followed_by: "Personnes suivies par %{name}"
+    people_who_follow: "Personnes qui suivent %{name}"
+    posts: "Statuts"
+    unfollow: "Se désabonner"
+  application_mailer:
+    signature: "Notifications de Mastodon depuis %{instance}"
+  auth:
+    change_password: "Changer de mot de passe"
+    didnt_get_confirmation: "Vous n’avez pas reçu les consignes de confirmation&nbsp;?"
+    forgot_password: "Mode passe oublié&nbsp;?"
+    login: "Se connecter"
+    register: "S’inscrire"
+    resend_confirmation: "Envoyer à nouveau les consignes de confirmation"
+    reset_password: "Réinitialiser le mot de passe"
+    set_new_password: "Établir le nouveau mot de passe"
+  generic:
+    changes_saved_msg: "Les modifications sont enregistrées avec succès&nbsp;!"
+    powered_by: "propulsée par %{link}"
+    save_changes: "Enregistrer les modifications"
+    validation_errors:
+      one: "Il y a quelque chose qui ne va pas&nbsp;! Vérifiez l’erreur ci-dessous"
+      other: "Il y a quelques choses qui ne vont pas&nbsp;! Vérifiez les erreurs ci-dessous"
+  notification_mailer:
+    favourite:
+      body: "%{name} a ajouté votre statut à ses favoris&nbsp;:"
+      subject: "%{name} a ajouté votre statut à ses favoris"
+    follow:
+      body: "%{name} s’est abonné⋅e à vos statuts&nbsp;!"
+      subject: "%{name} s’est abonné⋅e à vos statuts"
+    mention:
+      body: "%{name} vous a mentionné⋅e dans&nbsp;:"
+      subject: "%{name} vous a mentionné⋅e"
+    reblog:
+      body: "%{name} a partagé votre statut&nbsp;:"
+      subject: "%{name} a partagé votre statut"
+  pagination:
+    next: "Suivant"
+    prev: "Précédent"
+  settings:
+    edit_profile: "Modifier le profil"
+    preferences: "Préférences"
+  stream_entries:
+    favourited: "a ajouté à ses favoris un statut de"
+    is_now_following: "s’est abonné⋅e à"
+  will_paginate:
+    page_gap: "&hellip;"
diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml
new file mode 100644
index 000000000..11fdaa76e
--- /dev/null
+++ b/config/locales/simple_form.fr.yml
@@ -0,0 +1,27 @@
+---
+fr:
+  simple_form:
+    labels:
+      defaults:
+        avatar: "Image de profil"
+        confirm_new_password: "Confirmez le nouveau mot de passe"
+        confirm_password: "Confirmez le mot de passe"
+        current_password: "Mot de passe actuel"
+        display_name: "Nom public"
+        email: "Adresse courriel"
+        header: "Image d’en-tête"
+        locale: "Langue"
+        new_password: "Nouveau mot de passe"
+        note: "Présentation"
+        password: "Mot de passe"
+        username: "Nom d’utilisateur"
+      notification_emails:
+        favourite: "M’envoyer un courriel lorsque quelqu’un ajoute un de mes statuts à ses favoris"
+        follow: "M’envoyer un courriel lorsque quelqu’un s’abonne à mes statuts"
+        mention: "M’envoyer un courriel lorsque quelqu’un me mentionne"
+        reblog: "M’envoyer un courriel lorsque quelqu’un partage un de mes statuts"
+    'no': "Non"
+    required:
+      mark: "*"
+      text: "Champs requis"
+    'yes': "Oui"