Created
May 8, 2018 18:21
-
-
Save glenfant/3bf7501a77ebb8bf9aec054f2fa5cf3a to your computer and use it in GitHub Desktop.
How I translated marshmallow fields error messages into French
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
============== | |
marshmallow_fr | |
============== | |
Les fields de marshmallow dont les messages d'erreur sont traduits en Français. | |
Ces messages d'erreur sont basés sur marshmallow 2.15.1 et il sera peut-être nécessaire de le mettre à jour | |
au fil des évolutions de marshmallow. | |
Parametrized marshmallow fields with error messages translated into French. | |
These messages are based on 2.15.1. And there's a test that checks compatibility with upcoming versions that may | |
involve an update here. | |
""" | |
import functools | |
import marshmallow as ma | |
_default_error_messages = { | |
'required': 'Donnée manquante pour un champ obligatoire.', | |
'type': 'Type fourni invalide.', | |
'null': 'Le champ ne doit pas être vide.', | |
'validator_failed': 'Valeur invalide.' | |
} | |
def _translated_field(field_class, translated_error_messages): | |
factory = functools.partial(field_class, error_messages={**_default_error_messages, **translated_error_messages}) | |
factory.__name__ = field_class.__name__ | |
return factory | |
Field = _translated_field(ma.fields.Field, {}) | |
Raw = _translated_field(ma.fields.Raw, {}) | |
Nested = _translated_field(ma.fields.Nested, {'type': "Type invalide."}) | |
List = _translated_field(ma.fields.List, {'invalid': "Liste non valide."}) | |
String = _translated_field(ma.fields.String, | |
{'invalid': 'Chaine non valide.', | |
'invalid_utf8': 'Chaine utf-8 non valide.'}) | |
UUID = _translated_field(ma.fields.UUID, | |
{'invalid': 'Chaine non valide.', | |
'invalid_utf8': 'Chaine utf-8 non valide.', | |
'invalid_uuid': 'UUID non valide.', | |
'invalid_guid': 'UUID non valide.'}) | |
Number = _translated_field(ma.fields.Number, {'invalid': 'Nombre non valide.'}) | |
Integer = _translated_field(ma.fields.Integer, {'invalid': 'Nombre non valide.'}) | |
Decimal = _translated_field(ma.fields.Decimal, | |
{'invalid': 'Nombre non valide.', | |
'special': 'Les valeurs numériques spéciales ne sont pas autorisées.'}) | |
Boolean = _translated_field(ma.fields.Boolean, {'invalid': 'Booléen non valide.'}) | |
FormattedString = _translated_field(ma.fields.FormattedString, | |
{'format': 'La chaine ne peut être formattée avec les données fournies.'}) | |
Float = _translated_field(ma.fields.Float, {'invalid': 'Nombre non valide.'}) | |
DateTime = _translated_field(ma.fields.DateTime, | |
{'invalid': 'Date et heure invalides.', | |
'format': '"{input}" ne peut être formatté sous forme de date et heure.'}) | |
LocalDateTime = _translated_field(ma.fields.LocalDateTime, | |
{'invalid': 'Date et heure invalides.', | |
'format': '"{input}" ne peut être formatté sous forme de date et heure.'}) | |
Time = _translated_field(ma.fields.Time, | |
{'invalid': 'Heure non valide.', | |
'format': '"{input}" ne peut être formatté sous forme d\'heure.'}) | |
Date = _translated_field(ma.fields.Date, | |
{'invalid': 'Date non valide.', | |
'format': '"{input}" ne peut être formatté sous forme de date.'}) | |
TimeDelta = _translated_field(ma.fields.TimeDelta, | |
{'invalid': 'Intervalle de temps non valide.', | |
'format': '{input!r} ne peut être formatté sous forme d\'intervalle de temps.'}) | |
Dict = _translated_field(ma.fields.Dict, {'invalid': 'Type de mapping non valide.'}) | |
ValidatedField = _translated_field(ma.fields.ValidatedField, {}) | |
Url = _translated_field(ma.fields.Url, | |
{'invalid': 'URL non valide.', | |
'invalid_utf8': 'Chaine utf-8 non valide.'}) | |
Email = _translated_field(ma.fields.Email, | |
{'invalid': 'Adresse mèl non valide.', | |
'invalid_utf8': 'Chaine utf-8 non valide.'}) | |
Method = _translated_field(ma.fields.Method, {}) | |
Function = _translated_field(ma.fields.Function, {}) | |
Constant = _translated_field(ma.fields.Constant, {}) | |
# Aliases | |
URL = Url | |
Str = String | |
Bool = Boolean | |
Int = Integer | |
__all__ = ('Field', 'Raw', 'Nested', 'List', 'String', 'UUID', 'Number', 'Integer', 'Decimal', 'Boolean', | |
'FormattedString', 'Float', 'DateTime', 'LocalDateTime', 'Time', 'Date', 'TimeDelta', 'Dict', | |
'ValidatedField', 'Url', 'Email', 'Method', 'Function', 'Constant', 'URL', 'Str', 'Bool', 'Int') | |
if __name__ == '__main__': | |
# Test rapide de compatibilité avec la version marshmallow | |
# Quick compat test with actual Marshmallow version | |
for name in __all__: | |
field_class = globals()[name] | |
print(name) | |
# Paramètres minimum pour instatiation | |
# Minimal params for field instanciation | |
name_params_map = { | |
'Nested': (None,), | |
'List': (Integer(),), | |
'FormattedString': ('xyz',), | |
'Constant': (None,) | |
} | |
params = name_params_map.get(name, ()) | |
fr_field = field_class(*params) | |
ma_class = getattr(ma.fields, field_class.__name__) | |
field = ma_class(*params) | |
assert fr_field.error_messages.keys() == field.error_messages.keys() | |
for key in fr_field.error_messages.keys(): | |
assert fr_field.error_messages[key] != field.error_messages[key], name + "-" + key |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment