# HG changeset patch # User aronacher # Date 1213734602 0 # Node ID 9acf6b5baa220e4a3d296c2d8bd3eb8f7bf6daf1 # Parent ed20c467d2232e03b04e89c7419c8adeee38b0d8 Refactored the checker system. It's now possible to partially validate translations on a per-message level. diff --git a/babel/messages/catalog.py b/babel/messages/catalog.py --- a/babel/messages/catalog.py +++ b/babel/messages/catalog.py @@ -108,6 +108,25 @@ self.auto_comments, self.user_comments, self.previous_id, self.lineno, self.context) + def check(self, catalog=None): + """Run various validation checks on the message. Some validations + are only performed if the catalog is provided. This method returns + a sequence of `TranslationError` objects. + + :rtype: ``iterator`` + :param catalog: A catalog instance that is passed to the checkers + :see: `Catalog.check` for a way to perform checks for all messages + in a catalog. + """ + from babel.messages.checkers import checkers + errors = [] + for checker in checkers: + try: + checker(catalog, self) + except TranslationError, e: + errors.append(e) + return errors + def fuzzy(self): return 'fuzzy' in self.flags fuzzy = property(fuzzy, doc="""\ @@ -581,22 +600,8 @@ :rtype: ``iterator`` """ - checkers = [] - try: - from pkg_resources import working_set - except ImportError: - from babel.messages.checkers import builtin_checkers - checkers.extend(builtin_checkers) - else: - for entry_point in working_set.iter_entry_points('babel.checkers'): - checkers.append(entry_point.load()) for message in self._messages.values(): - errors = [] - for checker in checkers: - try: - checker(self, message) - except TranslationError, e: - errors.append(e) + errors = message.check(catalog=self) if errors: yield message, errors diff --git a/babel/messages/checkers.py b/babel/messages/checkers.py --- a/babel/messages/checkers.py +++ b/babel/messages/checkers.py @@ -35,6 +35,10 @@ "message") return + # skip further tests if no catalog is provided. + elif catalog is None: + return + msgstrs = message.string if not isinstance(msgstrs, (list, tuple)): msgstrs = (msgstrs,) @@ -161,7 +165,15 @@ (name, typechar, type_map[name])) -#: list of builtin checkers for babel installations without setuptools. -#: Keep this in sync with the mapping in the setup.py -#: :see: babel.messages.catalog.Catalog.check -builtin_checkers = [num_plurals, python_format] +def _find_checkers(): + try: + from pkg_resources import working_set + except ImportError: + return [num_plurals, python_format] + checkers = [] + for entry_point in working_set.iter_entry_points('babel.checkers'): + checkers.append(entry_point.load()) + return checkers + + +checkers = _find_checkers()