Skip to content

Instantly share code, notes, and snippets.

@glenfant
Created May 8, 2018 18:21
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save glenfant/3bf7501a77ebb8bf9aec054f2fa5cf3a to your computer and use it in GitHub Desktop.
Save glenfant/3bf7501a77ebb8bf9aec054f2fa5cf3a to your computer and use it in GitHub Desktop.
How I translated marshmallow fields error messages into French
"""
==============
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