diff --git a/framework/messages/config.php b/framework/messages/config.php
index 3d5f4a5ade..ac598ab1e4 100644
--- a/framework/messages/config.php
+++ b/framework/messages/config.php
@@ -7,7 +7,7 @@ return [
'messagePath' => __DIR__,
// array, required, list of language codes that the extracted messages
// should be translated to. For example, ['zh-CN', 'de'].
- 'languages' => ['ar', 'da', 'de', 'es', 'fa-IR', 'it', 'ja', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru', 'sk', 'sr', 'sr-Latn', 'uk', 'zh-CN'],
+ 'languages' => ['ar', 'da', 'de', 'es', 'fa-IR', 'fr', 'it', 'ja', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru', 'sk', 'sr', 'sr-Latn', 'uk', 'zh-CN'],
// string, the name of the function for translating messages.
// Defaults to 'Yii::t'. This is used as a mark to find the messages to be
// translated. You may use a string for single function name or an array for
diff --git a/framework/messages/fr/yii.php b/framework/messages/fr/yii.php
new file mode 100644
index 0000000000..03f55b7e45
--- /dev/null
+++ b/framework/messages/fr/yii.php
@@ -0,0 +1,81 @@
+ '(non défini)',
+ 'An internal server error occurred.' => 'Une erreur de serveur interne s\'est produite.',
+ 'Are you sure to delete this item?' => 'Voulez-vous vraiment supprimer cet élément ?',
+ 'Delete' => 'Supprimer',
+ 'Error' => 'Erreur',
+ 'File upload failed.' => 'Le téléchargement du fichier a échoué.',
+ 'Home' => 'Accueil',
+ 'Invalid data received for parameter "{param}".' => 'Des données non valides reçues pour le paramètre « {param} ».',
+ 'Login Required' => 'Identifiant requis',
+ 'Missing required arguments: {params}' => 'Manquant arguments requis : {params}',
+ 'Missing required parameters: {params}' => 'Manquant paramètres requis : {params}',
+ 'No' => 'Non',
+ 'No help for unknown command "{command}".' => 'Aucune aide pour la commande inconnue « {command} ».',
+ 'No help for unknown sub-command "{command}".' => 'Aucune aide pour la sous-commande inconnue « {command} ».',
+ 'No results found.' => 'Aucun résultat trouvé.',
+ 'Only files with these extensions are allowed: {extensions}.' => 'Les extensions de fichier autorisées sont : {extensions}.',
+ 'Only files with these mimeTypes are allowed: {mimeTypes}.' => 'Les types MIME de fichier autorisés sont : {mimeTypes}.',
+ 'Page not found.' => 'Page non trouvée.',
+ 'Please fix the following errors:' => 'Veuillez vérifier les erreurs suivantes :',
+ 'Please upload a file.' => 'Veuillez télécharger un fichier.',
+ 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Affichage de {begin, number}-{end, number} sur {totalCount, number} {totalCount, plural, one{élément} other{éléments}}.',
+ 'The file "{file}" is not an image.' => 'Le fichier « {file} » n\'est pas une image.',
+ 'The file "{file}" is too big. Its size cannot exceed {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Le fichier « {file} » est trop gros. Sa taille ne peut pas dépasser {limit, number} {limit, plural, one{octet} other{octets}}.',
+ 'The file "{file}" is too small. Its size cannot be smaller than {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Le fichier « {file} » est trop petit. Sa taille ne peut pas être inférieure à {limit, number} {limit, plural, one{octet} other{octets}}.',
+ 'The format of {attribute} is invalid.' => 'Le format de {attribute} est invalide',
+ 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'L\'image « {file} » est trop grande. L\'hauteur ne peut pas être plus grand que {limit, number} {limit, plural, one{pixel} other{pixels}}.',
+ 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'L\'image « {file} » est trop large. La largeur ne peut pas être plus large que {limit, number} {limit, plural, one{pixel} other{pixels}}.',
+ 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'L\'image « {file} » est trop petite. L\'hauteur ne peut être inférieure à {limit, number} {limit, plural, one{pixel} other{pixels}}.',
+ 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'L\'image « {file} » est trop petite. La largeur ne peut être inférieure à {limit, number} {limit, plural, one{pixel} other{pixels}}.',
+ 'The verification code is incorrect.' => 'Le code de vérfication est incorrect.',
+ 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{élément} other{éléments}}.',
+ 'Unable to verify your data submission.' => 'Impossible de vérifier votre envoi de données.',
+ 'Unknown command "{command}".' => 'Commande inconnue : « {command} ».',
+ 'Unknown option: --{name}' => 'Option inconnu : --{name}',
+ 'Update' => 'Modifier',
+ 'View' => 'Voir',
+ 'Yes' => 'Oui',
+ 'You are not allowed to perform this action.' => 'Vous n\'êtes pas autorisé à effectuer cette action.',
+ 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Vous pouvez télécharger au maximum {limit, number} {limit, plural, one{fichier} other{fichiers}}.',
+ 'the input value' => 'la valeur d\'entrée',
+ '{attribute} "{value}" has already been taken.' => '{attribute} « {value} » a déjà été pris.',
+ '{attribute} cannot be blank.' => '{attribute} ne peut être vide.',
+ '{attribute} is invalid.' => '{attribute} est invalide.',
+ '{attribute} is not a valid URL.' => '{attribute} n\'est pas une URL valide.',
+ '{attribute} is not a valid email address.' => '{attribute} n\'est pas une adresse email valide.',
+ '{attribute} must be "{requiredValue}".' => '{attribute} doit êre « {requiredValue} ».',
+ '{attribute} must be a number.' => '{attribute} doit être un nombre.',
+ '{attribute} must be a string.' => '{attribute} doit être une chaîne.',
+ '{attribute} must be an integer.' => '{attribute} doit être un entier.',
+ '{attribute} must be either "{true}" or "{false}".' => '{attribute} doit être soit {true} soit {false}.',
+ '{attribute} must be greater than "{compareValue}".' => '{attribute} doit être supérieur à « {compareValue} ».',
+ '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} doit être supérieur ou égal à « {compareValue} ».',
+ '{attribute} must be less than "{compareValue}".' => '{attribute} doit être inférieur à « {compareValue} ».',
+ '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} doit être inférieur ou égal à « {compareValue} ».',
+ '{attribute} must be no greater than {max}.' => '{attribute} ne doit pas être supérieur à {max}.',
+ '{attribute} must be no less than {min}.' => '{attribute} ne doit pas être inférieur à {min}.',
+ '{attribute} must be repeated exactly.' => '{attribute} doit être répété à l\'identique.',
+ '{attribute} must not be equal to "{compareValue}".' => '{attribute} ne doit pas être égal à « {compareValue} ».',
+ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} doit comporter au moins {min, number} {min, plural, one{caractère} other{caractères}}.',
+ '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} doit comporter au plus {max, number} {max, plural, one{caractère} other{caractères}}.',
+ '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} doit comporter {length, number} {length, plural, one{caractère} other{caractères}}.',
+);