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..d6e24c523
--- /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 de recherche leur nom d’utilisateur et le 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": "Fil 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": "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é⋅e"
+};
+
+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..b64601e7b
--- /dev/null
+++ b/config/locales/devise.fr.yml
@@ -0,0 +1,60 @@
+---
+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
+ password_change:
+ subject: Votre mot de passe a été modifié avec succés.
+ reset_password_instructions:
+ subject: Instructions pour changer le mot de passe
+ unlock_instructions:
+ subject: Instructions pour déverrouiller le compte
+ 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:
+ already_signed_out: Déconnecté.
+ signed_in: Connecté.
+ 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) :'
diff --git a/config/locales/doorkeeper.fr.yml b/config/locales/doorkeeper.fr.yml
new file mode 100644
index 000000000..c04e378b6
--- /dev/null
+++ b/config/locales/doorkeeper.fr.yml
@@ -0,0 +1,112 @@
+---
+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:
+ buttons:
+ authorize: Autoriser
+ cancel: Annuler
+ destroy: Détruire
+ edit: Modifier
+ submit: Envoyer
+ confirmations:
+ destroy: Êtes-vous certain?
+ edit:
+ title: Modifier l'application
+ form:
+ error: Oups! Vérifier votre formulaire pour des erreurs possibles
+ help:
+ native_redirect_uri: Utiliser %{native_redirect_uri} pour les tests locaux
+ redirect_uri: Utiliser une ligne par URL
+ scopes:
+ index:
+ callback_url: URL de retour d'appel
+ name: Nom
+ new: Nouvelle application
+ title: Vos applications
+ new:
+ title: Nouvelle application
+ show:
+ actions: Actions
+ application_id: ID de l'application
+ callback_urls: URL du retour d'appel
+ scopes:
+ secret: Secret
+ title: 'Application : %{name}'
+ authorizations:
+ buttons:
+ authorize: Autoriser
+ deny: Refuser
+ error:
+ title: Une erreur est survenue
+ new:
+ able_to: Cette application pourra
+ prompt: Autorisez %{client_name} à utiliser votre compte?
+ title: Autorisation requise
+ show:
+ title: Code d'autorisation
+ authorized_applications:
+ buttons:
+ revoke: Annuler
+ confirmations:
+ revoke: Êtes-vous certain?
+ index:
+ application: Application
+ created_at: Créé le
+ date_format: "%Y-%m-%d %H:%M:%S"
+ title: Vos applications autorisées
+ errors:
+ messages:
+ access_denied: Le propriétaire de la ressource ou le serveur d'autorisation a refusé la demande.
+ 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é.
+ 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.
+ invalid_redirect_uri: L'URL de redirection n'est pas valide.
+ 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_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_scope: Le scope demandé n'est pas valide, est inconnu, ou est mal formé.
+ invalid_token:
+ expired: Le jeton d'accès a expiré
+ revoked: Le jeton d'accès a été annulé
+ unknown: Le jeton d'accès n'est pas valide
+ 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é.
+ 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.
+ unauthorized_client: Le client n'est pas autorisé à effectuer cette demande à l'aide de cette méthode.
+ unsupported_grant_type: Le type de consentement d'autorisation n'est pas pris en charge par le serveur d'autorisation.
+ unsupported_response_type: Le serveur d'autorisation ne prend pas en charge ce type de réponse.
+ 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:
+ applications: Applications
+ oauth2_provider: Fournisseur OAuth2
+ application:
+ title: Autorisation OAuth requise
+ scopes:
+ follow:
+ read:
+ write:
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
new file mode 100644
index 000000000..c9258381c
--- /dev/null
+++ b/config/locales/fr.yml
@@ -0,0 +1,59 @@
+---
+fr:
+ about:
+ about_instance: "%{instance} est une instance de Mastodon."
+ about_mastodon: "Mastodon est un serveur libre de réseautage social. Alternative décentralisée 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 réseau social 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 !"
+ people_followed_by: "Personnes auxquelles %{name} est abonné⋅e"
+ people_who_follow: "Personnes abonnées à %{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 ?"
+ forgot_password: "Mode passe oublié ?"
+ 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 ont été enregistrées avec succès !"
+ powered_by: "propulsé par %{link}"
+ save_changes: "Enregistrer les modifications"
+ validation_errors:
+ one: "Quelque chose ne va pas ! Vérifiez l’erreur ci-dessous."
+ other: "Quelques choses ne vont pas ! Vérifiez les erreurs ci-dessous."
+ notification_mailer:
+ favourite:
+ body: "%{name} a ajouté votre statut à ses favoris :"
+ subject: "%{name} a ajouté votre statut à ses favoris"
+ follow:
+ body: "%{name} s’est abonné⋅e à vos statuts !"
+ subject: "%{name} s’est abonné⋅e à vos statuts"
+ mention:
+ body: "%{name} vous a mentionné⋅e dans :"
+ subject: "%{name} vous a mentionné⋅e"
+ reblog:
+ body: "%{name} a partagé votre statut :"
+ 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: "…"
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index 65714dbd5..36c5141a2 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -14,15 +14,15 @@ de:
new_password: Neues Passwort
note: Über mich
password: Passwort
- username: Nutzername
silenced: Öffentliche Beiträge nicht auflisten
+ username: Nutzername
notification_emails:
favourite: E-mail senden, wenn jemand meinen Beitrag favorisiert
follow: E-mail senden, wenn mir jemand folgt
mention: E-mail senden, wenn mich jemand erwähnt
reblog: E-mail senden, wenn jemand meinen Beitrag teilt
- 'no': 'Nein'
+ 'no': Nein
required:
mark: "*"
text: Pflichtfeld
- 'yes': 'Ja'
+ 'yes': Ja
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 5b66fccd5..a7d958c06 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -14,8 +14,8 @@ en:
new_password: New password
note: Bio
password: Password
- username: Username
silenced: Unlisted mode
+ username: Username
notification_emails:
favourite: Send e-mail when someone favourites your status
follow: Send e-mail when someone follows you
diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml
index 1909474a1..bfe000b33 100644
--- a/config/locales/simple_form.es.yml
+++ b/config/locales/simple_form.es.yml
@@ -14,8 +14,8 @@ es:
new_password: Nueva contraseña
note: Biografía
password: Contraseña
- username: Nombre de usuario
silenced: No listado
+ username: Nombre de usuario
notification_emails:
favourite: Enviar correo electrónico cuando alguien de a favorito en su publicación
follow: Enviar correo electrónico cuando alguien le siga
@@ -25,4 +25,4 @@ es:
required:
mark: "*"
text: necesario
- 'yes': 'Sí'
+ 'yes': Sí
diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml
new file mode 100644
index 000000000..7333c9e11
--- /dev/null
+++ b/config/locales/simple_form.fr.yml
@@ -0,0 +1,28 @@
+---
+fr:
+ simple_form:
+ labels:
+ defaults:
+ avatar: Image de profil
+ confirm_new_password: Confirmation du nouveau mot de passe
+ confirm_password: Confirmation du 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
+ silenced: Ne pas apparaître dans le fil public
+ username: Nom d’utilisateur
+ notification_emails:
+ favourite: Envoyer un courriel lorsque quelqu’un ajoute un de mes statuts à ses favoris
+ follow: Envoyer un courriel lorsque quelqu’un s’abonne à mes statuts
+ mention: Envoyer un courriel lorsque quelqu’un me mentionne
+ reblog: Envoyer un courriel lorsque quelqu’un partage un de mes statuts
+ 'no': Non
+ required:
+ mark: "*"
+ text: Champs requis
+ 'yes': Oui