Ticket #70: forms-i18n.patch
| File forms-i18n.patch, 17.5 kB (added by Matt Goodall <matt@pollenation.net>, 3 years ago) |
|---|
-
forms/converters.py
old new 6 6 from nevow.compy import Adapter 7 7 from forms import iforms, validation 8 8 from zope.interface import implements 9 from forms.i18n import i_ 9 10 10 11 11 class NullConverter(Adapter): 12 12 implements( iforms.IStringConvertible ) 13 13 … … 39 39 try: 40 40 value = self.cast(value) 41 41 except ValueError: 42 raise validation.FieldValidationError( "Not a valid number")42 raise validation.FieldValidationError(i_("Not a valid number")) 43 43 return value 44 44 45 45 … … 67 67 if not value: 68 68 return None 69 69 if value not in ('True', 'False'): 70 raise validation.FieldValidationError( '%r should be either True or False')70 raise validation.FieldValidationError(i_"(%r should be either True or False")) 71 71 return value == 'True' 72 72 73 73 … … 90 90 try: 91 91 y, m, d = [int(p) for p in value.split('-')] 92 92 except ValueError: 93 raise validation.FieldValidationError( 'Invalid date')93 raise validation.FieldValidationError(i_("Invalid date")) 94 94 try: 95 95 value = date(y, m, d) 96 96 except ValueError, e: 97 raise validation.FieldValidationError( 'Invalid date: '+str(e))97 raise validation.FieldValidationError(i_("Invalid date")+': '+str(e)) 98 98 return value 99 99 100 100 … … 131 131 h, m, s = parts 132 132 h, m, s, ms = int(h), int(m), int(s), int(ms) 133 133 except: 134 raise validation.FieldValidationError( 'Invalid time')134 raise validation.FieldValidationError(i_("Invalid time")) 135 135 136 136 try: 137 137 value = time(h, m, s, ms) 138 138 except ValueError, e: 139 raise validation.FieldValidationError( 'Invalid time: '+str(e))139 raise validation.FieldValidationError(i_("Invalid time")+': '+str(e)) 140 140 141 141 return value 142 142 … … 155 155 try: 156 156 value = date(*value) 157 157 except (TypeError, ValueError), e: 158 raise validation.FieldValidationError( 'Invalid date: '+str(e))158 raise validation.FieldValidationError(i_("Invalid date")+': '+str(e)) 159 159 return value 160 160 -
forms/validation.py
old new 1 1 import re 2 2 from zope.interface import implements 3 3 from forms import iforms 4 #for internationalisation 5 from forms.i18n import i_ 4 6 5 6 7 class FormsError(Exception): 7 8 """ 8 9 Base class for all Forms errors. A single string, message, is accepted and … … 54 55 55 56 def validate(self, field, value): 56 57 if value is None: 57 raise FieldRequiredError, 'Required'58 raise FieldRequiredError, i_("Required") 58 59 59 60 60 61 class LengthValidator(object): … … 69 70 70 71 def validationErrorMessage(self, field): 71 72 if self.min is not None and self.max is None: 72 return 'Must be longer than %r characters'%(self.min,)73 return i_("Must be longer than %r characters")%self.min 73 74 if self.min is None and self.max is not None: 74 return 'Must be shorter than %r characters'%(self.max,)75 return 'Must be between %r and %r characters'%(self.min, self.max)75 return i_("Must be shorter than %r characters")%self.max 76 return i_("Must be between %r and %r characters")%(self.min, self.max) 76 77 77 78 def validate(self, field, value): 78 79 if value is None: … … 96 97 97 98 def validationErrorMessage(self, field): 98 99 if self.min is not None and self.max is None: 99 return 'Must be greater than %r'%(self.min,)100 return i_("Must be greater than %r")%(self.min,) 100 101 if self.min is None and self.max is not None: 101 return 'Must be less than %r'%(self.max,)102 return 'Must be between %r and %r'%(self.min, self.max)102 return i_("Must be less than %r")%(self.max,) 103 return i_("Must be between %r and %r")%(self.min, self.max) 103 104 104 105 def validate(self, field, value): 105 106 if value is None: … … 128 129 if not hasattr(self.regex, 'match'): 129 130 self.regex = re.compile(self.regex) 130 131 if self.regex.match(value) is None: 131 raise FieldValidationError, 'Invalid format'132 raise FieldValidationError, i_("Invalid format") 132 133 133 134 134 135 __all__ = [ -
forms/iforms.py
old new 1 1 from nevow.compy import Interface 2 2 3 4 3 class IType(Interface): 5 4 def validate(self, value): 6 5 pass -
forms/form.py
old new 9 9 from forms import iforms, util, validation 10 10 from resourcemanager import ResourceManager 11 11 from zope.interface import implements 12 #for internationalisation 13 from forms.i18n import i_ 12 14 13 14 15 SEPARATOR = '!!' 15 16 FORMS_KEY = '__nevow_form__' 16 17 WIDGET_RESOURCE_KEY = 'widget_resource' … … 80 81 81 82 def addField(self, name, type, widgetFactory=None, label=None, description=None, cssClass=None): 82 83 if not util.validIdentifier(name): 83 raise ValueError( '%r is an invalid field name'%name)84 raise ValueError(i_(" %r is an invalid field name")%name) 84 85 if self.items is None: 85 86 self.items = [] 86 87 type.name = name … … 96 97 if self.actions is None: 97 98 self.actions = [] 98 99 if name in [action.name for action in self.actions]: 99 raise ValueError( 'Action with name %r already exists.' %name)100 raise ValueError(i_("Action with name %r already exists.")%name) 100 101 self.actions.append( Action(callback, name, validate, label) ) 101 102 102 103 def getField(self,fieldName): … … 156 157 break 157 158 158 159 if callback is None: 159 raise Exception( 'The form has no callback and no action was found.')160 raise Exception(i_("The form has no callback and no action was found.")) 160 161 161 162 # Store an errors object in the context 162 163 errors = FormErrors(self.name) … … 381 382 382 383 def cacheForm( form, name ): 383 384 if form is None: 384 raise Exception( 'Form %r not found'%name)385 raise Exception(i_("Form %r not found")%name) 385 386 form.name = name 386 387 # Make it a known 387 388 knownForms[name] = form … … 459 460 if isinstance(error, validation.FieldError): 460 461 name, type, label, description, cssClass = self.original.getField(error.fieldName) 461 462 errorList[ T.li[ T.strong[ label, ' : ' ], error.message ] ] 462 return T.div(class_='errors')[ T.p[ 'Please correct the following errors:'], errorList ]463 return T.div(class_='errors')[ T.p[i_("Please correct the following errors:")], errorList ] 463 464 464 465 def _renderItems(self, ctx, data): 465 466 if self.original.items is None: -
forms/types.py
old new 5 5 from forms import iforms, validation 6 6 from zope.interface import implements 7 7 8 9 8 class Type(object): 10 9 11 10 implements( iforms.IType ) -
forms/util.py
old new 3 3 from nevow import inevow 4 4 from forms import iforms 5 5 6 7 6 _IDENTIFIER_REGEX = re.compile('^[a-zA-Z_][a-zA-Z0-9_]*$') 8 7 9 8 -
forms/i18n.py
old new 1 # -*- coding: iso-8859-1 -*- 2 """ 3 i18n for forms 4 """ 5 6 import gettext 7 import os 8 import pkg_resources 9 10 #the directory where is located forms' message dir (in absolute path) 11 I18N_DIR = os.path.abspath(pkg_resources.resource_filename('forms', 'messages')) 12 APP_NAME = 'forms' 13 14 gettext.bindtextdomain (APP_NAME, I18N_DIR) 15 gettext.textdomain(APP_NAME) 16 def i_(msg): 17 return gettext.dgettext(APP_NAME,msg) 18 19 -
forms/messages/fr/fr.po
old new 1 # French translations for forms package 2 # Traduction anglaise du package forms. 3 # Copyright (C) 2003 THE PACKAGE'S COPYRIGHT HOLDER 4 # This file is distributed under the same license as the forms package. 5 msgid "" 6 msgstr "" 7 "Project-Id-Version: forms 0.6.1\n" 8 "POT-Creation-Date: 2006-01-25 15:41+0200\n" 9 "PO-Revision-Date: 2006-01-25 17:04+0200\n" 10 "Last-Translator: mathieu gaspard <mathieu.gaspard@ac-dijon.fr>\n" 11 "Language-Team: French <traduc@traduc.org>\n" 12 "MIME-Version: 1.0\n" 13 "Content-Type: text/plain; charset=ISO-8859-15\n" 14 "Content-Transfer-Encoding: 8bit\n" 15 "Plural-Forms: nplurals=2; plural=(n > 1);\n" 16 17 ################################" 18 # form.py 19 ################################ 20 #, python-format 21 msgid "%r is an invalid field name" 22 msgstr "%r est un nom de champ non valide" 23 24 #, python-format 25 msgid "Action with name %r already exists." 26 msgstr "L'action %r existe déjà" 27 28 29 msgid "The form has no callback and no action was found." 30 msgstr "Le formulaire n'a aucun callback et aucune action n'a été trouvée" 31 32 #, python-format 33 msgid "Form %r not found" 34 msgstr "Formulaire %r non trouvé" 35 36 msgid "Please correct the following errors:" 37 msgstr "Veuillez corriger les erreurs suivantes:" 38 39 ################################" 40 # validation.py 41 ################################ 42 43 msgid "Required" 44 msgstr "Requis" 45 46 #, python-format 47 msgid "Must be longer than %r characters" 48 msgstr "Doit avoir plus de %r caractères" 49 50 #, python-format 51 msgid "Must be shorter than %r characters" 52 msgstr "Doit avoir moins de %r caractères" 53 54 #, python-format 55 msgid "Must be between %r and %r characters" 56 msgstr "Doit avoir entre %r et %r caractères" 57 58 #, python-format 59 msgid "Must be greater than %r" 60 msgstr "Doit être plus grand que %r" 61 62 #, python-format 63 msgid "Must be less than %r" 64 msgstr "Doit être plus petit que %r" 65 66 #, python-format 67 msgid "Must be between %r and %r" 68 msgstr "Doit être compris entre %r et %r" 69 70 msgid "Invalid format" 71 msgstr "Format non valide" 72 73 ################################" 74 # widgets.py 75 ################################ 76 77 msgid "Please enter the password twice for confirmation." 78 msgstr "Veuillez re-saisir le mot de passe pour confirmation" 79 80 msgid "Passwords do not match." 81 msgstr "Les mots de passe sont différents" 82 83 msgid "Invalid date" 84 msgstr "Date non valide" 85 86 msgid "Please enter a 2 or 4 digit year" 87 msgstr "Veuillez entrer une date à 2 ou 4 chiffres" 88 89 msgid "Please enter a 4 digit year" 90 msgstr "Veuillez entrer une date à 4 chiffres" 91 92 msgid "Invalid year. Please enter a two-digit year." 93 msgstr "Année non valide. Veuillez entrer une date à 2 chiffres" 94 95 msgid "nothing uploaded" 96 msgstr "rien envoyé" 97 98 msgid "Nothing uploaded" 99 msgstr "Rien envoyé" 100 101 ################################" 102 # converters.py 103 ################################ 104 105 msgid "Not a valid number" 106 msgstr "Nombre non valide" 107 108 msgid "%r should be either True or False" 109 msgstr "%r doit être Vrai ou Faux" 110 111 msgid "Invalid time" 112 msgstr "Heure non valide" -
forms/messages/fr/message_format.sh
old new -
forms/resourcemanager.py
old new 5 5 from shutil import copyfileobj 6 6 from exceptions import IOError, OSError 7 7 8 9 8 class ResourceManagerException( Exception ): 10 9 def __init__( self, *args, **kwds ): 11 10 super( ResourceManagerException, self ).__init__( *args, **kwds ) -
forms/widget.py
old new 11 11 from forms.form import widgetResourceURL, widgetResourceURLFromContext 12 12 from zope.interface import implements 13 13 from twisted.internet import defer 14 from forms.i18n import i_ 14 15 15 16 16 # Marker object for args that are not supplied 17 17 _UNSET = object() 18 18 19 20 19 class TextInput(object): 21 20 """ 22 21 A text input field. … … 180 179 if len(pwds) == 0: 181 180 pwd = '' 182 181 elif len(pwds) == 1: 183 raise validation.FieldValidationError( 'Please enter the password twice for confirmation.')182 raise validation.FieldValidationError(i_("Please enter the password twice for confirmation.")) 184 183 else: 185 184 if pwds[0] != pwds[1]: 186 raise validation.FieldValidationError( 'Passwords do not match.')185 raise validation.FieldValidationError(i_("Passwords do not match.")) 187 186 return self.original.validate(pwds[0]) 188 187 189 188 … … 504 503 if not ymd: 505 504 ymd = None 506 505 elif len(ymd) != 3: 507 raise validation.FieldValidationError( "Invalid date")506 raise validation.FieldValidationError(i_("Invalid date")) 508 507 # So, we have what looks like a good attempt to enter a date. 509 508 if ymd is not None: 510 509 # If a 2-char year is allowed then prepend the century. … … 520 519 # By now, we should have a year of at least 4 characters. 521 520 if len(ymd[0]) < 4: 522 521 if self.twoCharCutoffYear is not None: 523 msg = "Please enter a 2 or 4 digit year"522 msg = i_("Please enter a 2 or 4 digit year") 524 523 else: 525 msg = "Please enter a 4 digit year"524 msg = i_("Please enter a 4 digit year") 526 525 raise validation.FieldValidationError(msg) 527 526 # Map to integers 528 527 try: 529 528 ymd = [int(p) for p in ymd] 530 529 except ValueError, e: 531 raise validation.FieldValidationError( "Invalid date")530 raise validation.FieldValidationError(i_("Invalid date")) 532 531 ymd = iforms.IDateTupleConvertible(self.original).toType(ymd) 533 532 return self.original.validate(ymd) 534 533 … … 592 591 if not value: 593 592 value = None 594 593 elif len(value) != 2: 595 raise validation.FieldValidationError( "Invalid date")594 raise validation.FieldValidationError(i_("Invalid date")) 596 595 if value is not None: 597 596 try: 598 597 value = [int(p) for p in value] 599 598 except ValueError, e: 600 raise validation.FieldValidationError( "Invalid date")599 raise validation.FieldValidationError(i_("Invalid date")) 601 600 if value[1] < 0 or value[1] > 99: 602 raise validation.FieldValidationError( "Invalid year. Please enter a two-digit year.")601 raise validation.FieldValidationError(i_("Invalid year. Please enter a two-digit year.")) 603 602 if value[0] > self.cutoffYear: 604 603 value[0] = 1900 + value[0] 605 604 else: … … 725 724 else: 726 725 yield T.p[value] 727 726 else: 728 yield T.p[T.strong[ 'nothing uploaded']]727 yield T.p[T.strong[i_("nothing uploaded")]] 729 728 730 729 yield T.input(name=namer('value'),value=value,type='hidden') 731 730 tag=T.input(name=key, id=keytocssid(ctx.key),type='file') … … 856 855 yield T.p[T.img(src=tmpURL)] 857 856 else: 858 857 # No uploaded file, no original 859 yield T.p[T.strong[ 'Nothing uploaded']]858 yield T.p[T.strong[i_("Nothing uploaded")]] 860 859 861 860 yield T.input(name=key, id=keytocssid(ctx.key),type='file') 862 861 … … 889 888 yield T.p[T.img(src=tmpURL)] 890 889 else: 891 890 # No uploaded file, no original 892 yield T.p[T.strong[ 'Nothing uploaded']]891 yield T.p[T.strong[i_("Nothing uploaded")]] 893 892 894 893 if originalKey: 895 894 # key of the original that can be used to get a file later -
setup.py
old new 10 10 author_email='matt@pollenation.net', 11 11 packages=find_packages(), 12 12 package_data={ 13 'forms': ['forms.css', 'html/*', 'js/*'], 13 'forms': ['forms.css', 'html/*', 'js/*', 'messages/fr/*.po','messages/fr/*.sh','messages/fr/LC_MESSAGES/*'], 14 #'forms': ['forms.css', 'html/*', 'js/*'], 14 15 }, 15 16 zip_safe = True, 16 17 )
