diff --git a/.github/workflows/test-xmlschema.yml b/.github/workflows/test-xmlschema.yml
index 049d024..50b360c 100644
--- a/.github/workflows/test-xmlschema.yml
+++ b/.github/workflows/test-xmlschema.yml
@@ -46,8 +46,13 @@ jobs:
         run: |
           pip install flake8
           flake8 xmlschema --max-line-length=100 --statistics
-      - name: Lint with mypy
-        if: ${{ matrix.python-version != 'pypy-3.8' }}
+      - name: Lint with mypy if Python version != 3.7
+        if: ${{ matrix.python-version != '3.7' }}
         run: |
-          pip install mypy==0.931 elementpath==2.5.0 lxml-stubs
-          mypy --show-error-codes xmlschema
+          pip install mypy==0.950 elementpath==2.5.1 lxml-stubs
+          mypy --show-error-codes --strict xmlschema
+      - name: Lint with mypy if Python version == 3.7
+        if: ${{ matrix.python-version == '3.7' }}
+        run: |
+          pip install mypy==0.950 elementpath==2.5.1 lxml-stubs
+          mypy --show-error-codes --no-warn-redundant-casts --no-warn-unused-ignores --strict xmlschema
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 12a52ba..2c3bc22 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -2,8 +2,14 @@
 CHANGELOG
 *********
 
+`v1.11.0`_ (2022-05-14)
+=======================
+* Add localization for validation related error messages
+* Add Italian translation
+* Add Russian partial translation (from PR #293)
+
 `v1.10.0`_ (2022-03-07)
-======================
+=======================
 * Add 'nonlocal' option to *defuse* argument of `XMLResource` (also for schema classes)
 * Add 'none' option to *allow* argument of `XMLResource`
 * Fix too strict parsing on XSD annotations (issue #287)
@@ -518,3 +524,4 @@ v0.9.6 (2017-05-05)
 .. _v1.9.1: https://github.com/brunato/xmlschema/compare/v1.9.0...v1.9.1
 .. _v1.9.2: https://github.com/brunato/xmlschema/compare/v1.9.1...v1.9.2
 .. _v1.10.0: https://github.com/brunato/xmlschema/compare/v1.9.2...v1.10.0
+.. _v1.11.0: https://github.com/brunato/xmlschema/compare/v1.10.0...v1.11.0
diff --git a/MANIFEST.in b/MANIFEST.in
index 603d61d..47ff7ff 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -11,4 +11,5 @@ include doc/*
 recursive-include xmlschema *
 recursive-include tests *
 
+exclude xmlschema/locale/xmlschema.pot
 global-exclude *.py[cod]
diff --git a/debian/changelog b/debian/changelog
index 74b4f5f..1e635ac 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+python-xmlschema (1.11.0-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Mon, 16 May 2022 00:49:29 -0000
+
 python-xmlschema (1.10.0-1) unstable; urgency=medium
 
   * New upstream release. (Closes: #1007820)
diff --git a/debian/patches/Skip-failing-packaging-test.patch b/debian/patches/Skip-failing-packaging-test.patch
index cf0817c..c95fc97 100644
--- a/debian/patches/Skip-failing-packaging-test.patch
+++ b/debian/patches/Skip-failing-packaging-test.patch
@@ -9,10 +9,10 @@ Forwarded: not-needed
  tests/test_package.py | 1 +
  1 file changed, 1 insertion(+)
 
-diff --git a/tests/test_package.py b/tests/test_package.py
-index 5d2cc23..7107d57 100644
---- a/tests/test_package.py
-+++ b/tests/test_package.py
+Index: python-xmlschema/tests/test_package.py
+===================================================================
+--- python-xmlschema.orig/tests/test_package.py
++++ python-xmlschema/tests/test_package.py
 @@ -81,6 +81,7 @@ class TestPackaging(unittest.TestCase):
                          message % (lineno, filename, match.group(1).strip('\'\"'), version)
                      )
diff --git a/doc/api.rst b/doc/api.rst
index a9bd3e3..feda744 100644
--- a/doc/api.rst
+++ b/doc/api.rst
@@ -215,6 +215,15 @@ XML resources API
 .. autoclass:: xmlschema.XmlDocument
 
 
+.. _translation-api:
+
+Translation API
+===============
+
+.. autofunction:: xmlschema.translation.activate
+.. autofunction:: xmlschema.translation.deactivate
+
+
 .. _xpath-api:
 
 XPath API
diff --git a/doc/conf.py b/doc/conf.py
index edb1840..3d93de8 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -55,7 +55,7 @@ master_doc = 'index'
 
 # General information about the project.
 project = 'xmlschema'
-copyright = '2016-2021, SISSA - Scuola Internazionale Superiore di Studi Avanzati'
+copyright = '2016-2022, SISSA - Scuola Internazionale Superiore di Studi Avanzati'
 author = 'Davide Brunato'
 
 # The version info for the project you're documenting, acts as replacement for
@@ -63,9 +63,9 @@ author = 'Davide Brunato'
 # built documents.
 #
 # The short X.Y version.
-version = '1.10'
+version = '1.11'
 # The full version, including alpha/beta/rc tags.
-release = '1.10.0'
+release = '1.11.0'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/doc/features.rst b/doc/features.rst
index 51623eb..5bfed1f 100644
--- a/doc/features.rst
+++ b/doc/features.rst
@@ -170,3 +170,29 @@ value of ``MAX_XML_DEPTH`` in the module *limits* after the import of the packag
     >>> import xmlschema
     >>> xmlschema.limits.MAX_XML_DEPTH = 1000
 
+
+Translations of parsing/validation error messages
+=================================================
+
+From release v1.11.0 translation of parsing/validation error messages can
+be activated:
+
+.. doctest::
+
+    >>> import xmlschema
+    >>> xmlschema.translation.activate()
+
+.. note::
+    Activation depends by the default language in your environment and if it matches
+    translations provided with the library. You can build your custom translation from
+    the template included in the repository (`xmlschema/locale/xmlschema.pot`) and then
+    use it in your runs providing *localedir* and *languages* arguments to activation call.
+    See :ref:`translation-api` for information.
+
+Translations for default do not interfere with other translations installed
+at runtime and can be deactivated after:
+
+.. doctest::
+
+    >>> xmlschema.translation.deactivate()
+
diff --git a/publiccode.yml b/publiccode.yml
index a294d62..ba6501c 100644
--- a/publiccode.yml
+++ b/publiccode.yml
@@ -6,8 +6,8 @@ publiccodeYmlVersion: '0.2'
 name: xmlschema
 url: 'https://github.com/sissaschool/xmlschema'
 landingURL: 'https://github.com/sissaschool/xmlschema'
-releaseDate: '2022-03-07'
-softwareVersion: v1.10.0
+releaseDate: '2022-05-14'
+softwareVersion: v1.11.0
 developmentStatus: stable
 platforms:
   - linux
@@ -29,7 +29,7 @@ maintenance:
   contacts:
     - name: Davide Brunato
       email: davide.brunato@sissa.it
-      affiliation: ' Scuola Internazionale Superiore di Studi Avanzati'
+      affiliation: 'Scuola Internazionale Superiore di Studi Avanzati'
 legal:
   license: MIT
   mainCopyrightOwner: Scuola Internazionale Superiore di Studi Avanzati
@@ -50,7 +50,7 @@ description:
     shortDescription: XML Schema validator and data conversion library for Python
     longDescription: >
       The _xmlschema_ library is an implementation of [XML
-      Schema](http://www.w3.org/2001/XMLSchema) for Python (supports Python 3.5+).
+      Schema](http://www.w3.org/2001/XMLSchema) for Python (supports Python 3.7+).
 
 
       This library arises from the needs of a solid Python layer for processing
diff --git a/scripts/make_translation.py b/scripts/make_translation.py
new file mode 100644
index 0000000..cb4c535
--- /dev/null
+++ b/scripts/make_translation.py
@@ -0,0 +1,149 @@
+#
+# Copyright (c), 2016-2022, SISSA (International School for Advanced Studies).
+# All rights reserved.
+# This file is distributed under the terms of the MIT License.
+# See the file 'LICENSE' in the root directory of the present
+# distribution, or http://opensource.org/licenses/MIT.
+#
+# @author Davide Brunato <brunato@sissa.it>
+#
+# type: ignore
+#
+"""Translation files generator utility."""
+
+if __name__ == '__main__':
+    import argparse
+    import os
+    import sys
+    import subprocess
+    from pathlib import Path
+
+    COPYRIGHT_HOLDER = r", 2016, SISSA (International School for Advanced Studies)."
+
+    parser = argparse.ArgumentParser(description="Translation files generator utility for xmlschema")
+    parser.add_argument(
+        '-L', '--directory', metavar='LOCALE-DIR', type=str, default=None,
+        help="use a custom locale directory (for extra local translations)"
+    )
+    parser.add_argument(
+        '-t', '--template', action='store_true', default=False,
+        help="generate xmlschema.pot template file"
+    )
+    parser.add_argument(
+        '-u', '--update', action='store_true', default=False,
+        help="update locale xmlschema.po file from xmlschema.pot template"
+    )
+    parser.add_argument(
+        '-c', '--compile', action='store_true', default=False,
+        help="generate xmlschema.mo file from locale xmlschema.po"
+    )
+    parser.add_argument('languages', type=str, nargs='*',
+                        help="process locale files for languages")
+    args = parser.parse_args()
+
+    if args.directory is not None:
+        locale_dir = Path(args.directory).resolve()
+        os.chdir(Path(__file__).parent.parent)
+        try:
+            locale_dir = locale_dir.relative_to(os.getcwd())
+        except ValueError:
+            pass  # Not a subdir, use the absolute path.
+    else:
+        os.chdir(Path(__file__).parent.parent)
+        locale_dir = Path('xmlschema/locale')
+    assert locale_dir.is_dir(), 'locale directory not found!'
+
+    package_dir = Path('xmlschema')
+    assert package_dir.is_dir(), 'xmlschema/ package directory not found!'
+
+    template_file = locale_dir.joinpath('xmlschema.pot')
+    if args.template:
+        print(f"+++ Generate the template file ...")
+
+        status, xgettext_cmd = subprocess.getstatusoutput('which xgettext')
+        assert status == 0, "xgettext command is not available!"
+
+        cmd = [xgettext_cmd,
+               f'--copyright-holder={COPYRIGHT_HOLDER}',
+               '--package-name=xmlschema',
+               '--from-code=UTF-8',
+               '-o', str(template_file)]
+        cmd.extend(str(path) for path in package_dir.glob('**/*.py'))
+        process = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+        stderr = process.stderr.decode('utf-8').strip()
+        if stderr:
+            print(stderr)
+            sys.exit(1)
+
+        # .POT template file fixes
+        with template_file.open() as fp:
+            text = fp.read().replace('charset=CHARSET', 'charset=UTF-8', 1)
+        with template_file.open(mode='w') as fp:
+            fp.write(text)
+
+        print(f'  ... file {str(template_file)} written\n')
+
+    if not args.languages:
+        print("No language code provided, exit ...")
+        sys.exit()
+
+    if args.update:
+        status, msgmerge_cmd = subprocess.getstatusoutput('which msgmerge')
+        assert status == 0, "msgmerge command is not available!"
+
+        for lang in args.languages:
+            print(f"+++ Update the .po file for language {lang!r}")
+
+            po_file = locale_dir.joinpath(f'{lang}/LC_MESSAGES/xmlschema.po')
+            if not po_file.exists():
+                po_file.parent.mkdir(parents=True, exist_ok=True)
+
+                status, msginit_cmd = subprocess.getstatusoutput('which msginit')
+                assert status == 0, "msginit command is not available!"
+
+                cmd = [msginit_cmd,
+                       '-l', f'{lang}',
+                       '-o', str(po_file),
+                       '-i', str(template_file)]
+                process = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+                stderr = process.stderr.decode('utf-8').strip()
+                if stderr:
+                    print(stderr)
+
+                print(f'  ... file {str(po_file)} initialized\n')
+
+            cmd = [msgmerge_cmd, '-o', str(po_file), str(po_file), str(template_file)]
+            process = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+            stderr = process.stderr.decode('utf-8').strip()
+            if 'done' not in stderr:
+                print(stderr)
+                sys.exit(1)
+
+            print(f'  ... file {str(po_file)} updated\n')
+
+    if args.compile:
+        status, msgfmt_cmd = subprocess.getstatusoutput('which msgfmt')
+        assert status == 0, "msgfmt command is not available!"
+
+        for lang in args.languages:
+            print(f"+++ Generate the .mo file for language {lang!r}")
+
+            po_file = locale_dir.joinpath(f'{lang}/LC_MESSAGES/xmlschema.po')
+            mo_file = locale_dir.joinpath(f'{lang}/LC_MESSAGES/xmlschema.mo')
+            if not po_file.exists():
+                print(f"  ... file {str(po_file)} doesn't exist!")
+                sys.exit(1)
+
+            cmd = [msgfmt_cmd, '-o', str(mo_file), str(po_file)]
+            process = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+            stderr = process.stderr.decode('utf-8').strip()
+            if stderr:
+                print(stderr)
+                sys.exit(1)
+
+            print(f'  ... file {str(mo_file)} written\n')
+
diff --git a/setup.py b/setup.py
index 3f0b50a..9f9a06a 100755
--- a/setup.py
+++ b/setup.py
@@ -18,7 +18,7 @@ with Path(__file__).parent.joinpath('README.rst').open() as readme:
 
 setup(
     name='xmlschema',
-    version='1.10.0',
+    version='1.11.0',
     packages=find_packages(include=['xmlschema', 'xmlschema.*']),
     include_package_data=True,
     entry_points={
diff --git a/tests/test_all.py b/tests/test_all.py
index 6a4c0ea..8483cb0 100644
--- a/tests/test_all.py
+++ b/tests/test_all.py
@@ -36,6 +36,7 @@ if __name__ == '__main__':
         tests.addTests(loader.discover(start_dir=tests_dir, pattern="test_documents.py"))
         tests.addTests(loader.discover(start_dir=tests_dir, pattern="test_dataobjects.py"))
         tests.addTests(loader.discover(start_dir=tests_dir, pattern="test_codegen.py"))
+        tests.addTests(loader.discover(start_dir=tests_dir, pattern="test_translations.py"))
         tests.addTests(loader.discover(start_dir=tests_dir, pattern="test_wsdl.py"))
 
         validation_dir = os.path.join(os.path.dirname(__file__), 'validation')
diff --git a/tests/test_cases/features/decoder/data.xml b/tests/test_cases/features/decoder/data.xml
index 0f93e41..84a8801 100644
--- a/tests/test_cases/features/decoder/data.xml
+++ b/tests/test_cases/features/decoder/data.xml
@@ -13,4 +13,5 @@
     <simple_boolean>false</simple_boolean>
     <date_and_time>2020-03-05T23:04:10.047</date_and_time>
     <hexbin>AABBCCDD</hexbin>
+    <list_of_floats>INF -INF</list_of_floats>
 </ns:data>
diff --git a/tests/test_cases/features/decoder/simple-types.xsd b/tests/test_cases/features/decoder/simple-types.xsd
index 0cb9645..3b0d8b3 100644
--- a/tests/test_cases/features/decoder/simple-types.xsd
+++ b/tests/test_cases/features/decoder/simple-types.xsd
@@ -16,6 +16,7 @@
                 <xs:element name="duration" type="xs:duration" minOccurs="0"/>
                 <xs:element name="hexbin" type="hexCode" minOccurs="0" />
                 <xs:element name="base64bin" type="base64Code" minOccurs="0" />
+                <xs:element name="list_of_floats" type="list_of_floats" minOccurs="0" />
             </xs:sequence>
         </xs:complexType>
     </xs:element>
diff --git a/tests/test_cases/mypy/extra_validator.py b/tests/test_cases/mypy/extra_validator.py
new file mode 100644
index 0000000..5a8a92a
--- /dev/null
+++ b/tests/test_cases/mypy/extra_validator.py
@@ -0,0 +1,33 @@
+from typing import Iterator, Optional
+from xml.etree import ElementTree
+import xmlschema
+
+document = ElementTree.fromstring("<id>http://example.org</id>")
+schema = xmlschema.XMLSchema11("""\
+<?xml version="1.0" encoding="utf-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <xsd:element name="id" type="xsd:anyURI" />
+</xsd:schema>
+""")
+
+
+def extra_validator1(
+    element: ElementTree.Element,
+    xsd_element: xmlschema.XsdElement,
+) -> Optional[Iterator[xmlschema.XMLSchemaValidationError]]:
+    _ = element.tag, xsd_element.type.name
+    return None
+
+
+schema.validate(document, extra_validator=extra_validator1)
+
+
+def extra_validator2(
+    element: ElementTree.Element,
+    xsd_element: xmlschema.XsdElement,
+) -> Optional[Iterator[xmlschema.XMLSchemaValidationError]]:
+    _ = element.tag, xsd_element.type.name
+    return None
+
+
+schema.validate(document, extra_validator=extra_validator2)
diff --git a/tests/test_documents.py b/tests/test_documents.py
index d4bc054..1457176 100644
--- a/tests/test_documents.py
+++ b/tests/test_documents.py
@@ -216,7 +216,7 @@ class TestXmlDocuments(unittest.TestCase):
 
         with self.assertRaises(ValueError) as ctx:
             XmlDocument(xml_file, validation='foo')
-        self.assertEqual(str(ctx.exception), "'foo': not a validation mode")
+        self.assertEqual(str(ctx.exception), "'foo' is not a validation mode")
 
     def test_xml_document_init_without_schema(self):
         with self.assertRaises(ValueError) as ctx:
diff --git a/tests/test_namespaces.py b/tests/test_namespaces.py
index e37d77e..553b7c1 100644
--- a/tests/test_namespaces.py
+++ b/tests/test_namespaces.py
@@ -126,11 +126,11 @@ class TestNamespaceMapper(unittest.TestCase):
 
         with self.assertRaises(ValueError) as ctx:
             mapper.map_qname('{%selement' % XSD_NAMESPACE)
-        self.assertIn("wrong format", str(ctx.exception))
+        self.assertIn("invalid value", str(ctx.exception))
 
         with self.assertRaises(ValueError) as ctx:
             mapper.map_qname('{%s}element}' % XSD_NAMESPACE)
-        self.assertIn("wrong format", str(ctx.exception))
+        self.assertIn("invalid value", str(ctx.exception))
 
         with self.assertRaises(TypeError) as ctx:
             mapper.map_qname(None)
@@ -151,7 +151,7 @@ class TestNamespaceMapper(unittest.TestCase):
 
         with self.assertRaises(ValueError) as ctx:
             mapper.unmap_qname('xs::element')
-        self.assertIn("wrong format", str(ctx.exception))
+        self.assertIn("invalid value", str(ctx.exception))
 
         with self.assertRaises(TypeError) as ctx:
             mapper.unmap_qname(None)
diff --git a/tests/test_resources.py b/tests/test_resources.py
index 4e797c8..a7884c2 100644
--- a/tests/test_resources.py
+++ b/tests/test_resources.py
@@ -399,7 +399,7 @@ class TestResources(unittest.TestCase):
     def test_fetch_resource_function(self):
         with self.assertRaises(ValueError) as ctx:
             fetch_resource('')
-        self.assertIn('argument must contain a not empty string', str(ctx.exception))
+        self.assertIn('argument should contain a not empty string', str(ctx.exception))
 
         wrong_path = casepath('resources/dummy_file.txt')
         self.assertRaises(XMLResourceError, fetch_resource, wrong_path)
diff --git a/tests/test_translations.py b/tests/test_translations.py
new file mode 100644
index 0000000..76563e9
--- /dev/null
+++ b/tests/test_translations.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python
+#
+# Copyright (c), 2016-2020, SISSA (International School for Advanced Studies).
+# All rights reserved.
+# This file is distributed under the terms of the MIT License.
+# See the file 'LICENSE' in the root directory of the present
+# distribution, or http://opensource.org/licenses/MIT.
+#
+# @author Davide Brunato <brunato@sissa.it>
+#
+"""Tests on internal helper functions"""
+import unittest
+import gettext
+
+from xmlschema import XMLSchema, translation
+
+
+class TestTranslations(unittest.TestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        XMLSchema.meta_schema.build()
+        cls.translation_classes = (gettext.NullTranslations,  # in case of fallback
+                                   gettext.GNUTranslations)
+
+    @classmethod
+    def tearDownClass(cls):
+        XMLSchema.meta_schema.clear()
+
+    def test_activation(self):
+        self.assertIsNone(translation._translation)
+        try:
+            translation.activate()
+            self.assertIsInstance(translation._translation, self.translation_classes)
+        finally:
+            translation._translation = None
+
+    def test_deactivation(self):
+        self.assertIsNone(translation._translation)
+        try:
+            translation.activate()
+            self.assertIsInstance(translation._translation, self.translation_classes)
+            translation.deactivate()
+            self.assertIsNone(translation._translation)
+        finally:
+            translation._translation = None
+
+    def test_install(self):
+        import builtins
+
+        self.assertIsNone(translation._translation)
+        self.assertFalse(translation._installed)
+
+        try:
+            translation.activate(install=True)
+            self.assertIsInstance(translation._translation, self.translation_classes)
+            self.assertTrue(translation._installed)
+            self.assertEqual(builtins.__dict__['_'], translation._translation.gettext)
+
+            translation.deactivate()
+            self.assertIsNone(translation._translation)
+            self.assertFalse(translation._installed)
+            self.assertNotIn('_', builtins.__dict__)
+        finally:
+            translation._translation = None
+            translation._installed = False
+            builtins.__dict__.pop('_', None)
+
+    def test_it_translation(self):
+        self.assertIsNone(translation._translation)
+        try:
+            translation.activate(languages=['it'])
+            self.assertIsInstance(translation._translation, gettext.GNUTranslations)
+            result = translation.gettext("not a redefinition!")
+            self.assertEqual(result, "non è una ridefinizione!")
+        finally:
+            translation._translation = None
+
+        try:
+            translation.activate(languages=['it', 'en'])
+            self.assertIsInstance(translation._translation, gettext.GNUTranslations)
+            result = translation.gettext("not a redefinition!")
+            self.assertEqual(result, "non è una ridefinizione!")
+
+            translation.activate(languages=['en', 'it'])
+            self.assertIsInstance(translation._translation, gettext.GNUTranslations)
+            result = translation.gettext("not a redefinition!")
+            self.assertEqual(result, "not a redefinition!")
+        finally:
+            translation._translation = None
+
+
+if __name__ == '__main__':
+    import platform
+
+    header_template = "Test xmlschema translations with Python {} on {}"
+    header = header_template.format(platform.python_version(), platform.platform())
+    print('{0}\n{1}\n{0}'.format("*" * len(header), header))
+
+    unittest.main()
diff --git a/tests/test_typing.py b/tests/test_typing.py
index 6304248..adebecf 100644
--- a/tests/test_typing.py
+++ b/tests/test_typing.py
@@ -44,11 +44,21 @@ class TestTyping(unittest.TestCase):
         self.assertNotRegex(output_lines[-1], self.error_pattern, msg=output)
         return output_lines
 
+    def test_schema_source(self):
+        case_path = self.cases_dir.joinpath('schema_source.py')
+        output_lines = self.check_mypy_output(case_path, '--strict', '--no-warn-unused-ignores')
+        self.assertTrue(output_lines[0].startswith('Success:'), msg='\n'.join(output_lines))
+
     def test_simple_types(self):
         case_path = self.cases_dir.joinpath('simple_types.py')
         output_lines = self.check_mypy_output(case_path, '--strict', '--no-warn-unused-ignores')
         self.assertTrue(output_lines[0].startswith('Success:'), msg='\n'.join(output_lines))
 
+    def test_extra_validator__issue_291(self):
+        case_path = self.cases_dir.joinpath('extra_validator.py')
+        output_lines = self.check_mypy_output(case_path, '--strict')
+        self.assertTrue(output_lines[0].startswith('Success:'), msg='\n'.join(output_lines))
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/test_wsdl.py b/tests/test_wsdl.py
index 4ddd0ba..96c7b59 100644
--- a/tests/test_wsdl.py
+++ b/tests/test_wsdl.py
@@ -210,7 +210,7 @@ class TestWsdlDocuments(unittest.TestCase):
 
         with self.assertRaises(ValueError) as ctx:
             Wsdl11Document(WSDL_DOCUMENT_EXAMPLE, validation='invalid')
-        self.assertEqual("'invalid': not a validation mode", str(ctx.exception))
+        self.assertEqual("'invalid' is not a validation mode", str(ctx.exception))
 
     def test_example3(self):
         original_example3_file = casepath('features/wsdl/wsdl11_example3.wsdl')
diff --git a/tests/validation/test_decoding.py b/tests/validation/test_decoding.py
index d176d2d..7432eb8 100644
--- a/tests/validation/test_decoding.py
+++ b/tests/validation/test_decoding.py
@@ -11,10 +11,11 @@
 #
 import unittest
 import os
+import base64
 import json
+import math
 from decimal import Decimal
 from collections.abc import MutableMapping, MutableSequence, Set
-import base64
 
 try:
     import lxml.etree as lxml_etree
@@ -327,6 +328,7 @@ DATA_DICT = {
     ],
     'simple_boolean': [True, False],
     'date_and_time': '2020-03-05T23:04:10.047',  # xs:dateTime is not decoded for default
+    'list_of_floats': [float('inf'), float('-inf')],
 }
 
 
@@ -476,7 +478,7 @@ class TestDecoding(XsdValidatorTestCase):
         with self.assertRaises(XMLSchemaValidationError) as ctx:
             schema.decode('<root>ns0:foo</root>')
         self.assertIn("failed validating 'ns0:foo'", str(ctx.exception))
-        self.assertIn("Reason: unmapped prefix 'ns0' on QName", str(ctx.exception))
+        self.assertIn("Reason: unmapped prefix 'ns0' in a QName", str(ctx.exception))
         self.assertIn("Path: /root", str(ctx.exception))
 
         xml_data = '<root name="ns0:bar" xmlns:ns0="http://xmlschema.test/0">ns0:foo</root>'
@@ -490,7 +492,7 @@ class TestDecoding(XsdValidatorTestCase):
         with self.assertRaises(XMLSchemaValidationError) as ctx:
             schema.decode('<root name="ns0:bar">foo</root>')
         self.assertIn("failed validating 'ns0:bar'", str(ctx.exception))
-        self.assertIn("unmapped prefix 'ns0' on QName", str(ctx.exception))
+        self.assertIn("unmapped prefix 'ns0' in a QName", str(ctx.exception))
         self.assertIn("Path: /root", str(ctx.exception))
 
     def test_json_dump_and_load(self):
@@ -757,7 +759,7 @@ class TestDecoding(XsdValidatorTestCase):
                 self.col_xml_file, converter=ColumnarConverter, attr_prefix='-',
             )
         self.assertEqual(str(ctx.exception),
-                         "attr_prefix can be the empty string or a single/double underscore")
+                         "'attr_prefix' can be the empty string or a single/double underscore")
 
     def test_dict_granularity(self):
         """Based on Issue #22, test to make sure an xsd indicating list with
@@ -1202,6 +1204,16 @@ class TestDecoding(XsdValidatorTestCase):
         self.assertIsInstance(obj, str)
         self.assertEqual(json_data.encode("utf-8"), b'"\\u00f8\\u00e6\\u00e5"')
 
+    def test_float_decoding(self):
+        for float_type in [self.schema_class.meta_schema.types['float'],
+                           self.schema_class.meta_schema.types['double']]:
+            self.assertAlmostEqual(float_type.decode('-1'), -1.0)
+            self.assertAlmostEqual(float_type.decode('19.7'), 19.7)
+            self.assertAlmostEqual(float_type.decode('INF'), float('inf'))
+            self.assertAlmostEqual(float_type.decode('-INF'), float('-inf'))
+            self.assertNotAlmostEqual(float_type.decode('INF'), float('-inf'))
+            self.assertTrue(math.isnan(float_type.decode('NaN')))
+
 
 class TestDecoding11(TestDecoding):
     schema_class = XMLSchema11
diff --git a/tests/validation/test_encoding.py b/tests/validation/test_encoding.py
index 009ab59..cf96b47 100644
--- a/tests/validation/test_encoding.py
+++ b/tests/validation/test_encoding.py
@@ -660,6 +660,15 @@ class TestEncoding(XsdValidatorTestCase):
             )
         )
 
+    def test_float_encoding(self):
+        for float_type in [self.schema_class.meta_schema.types['float'],
+                           self.schema_class.meta_schema.types['double']]:
+            self.assertEqual(float_type.encode(-1.0), '-1.0')
+            self.assertEqual(float_type.encode(19.7), '19.7')
+            self.assertEqual(float_type.encode(float('inf')), 'INF')
+            self.assertEqual(float_type.encode(float('-inf')), '-INF')
+            self.assertEqual(float_type.encode(float('nan')), 'NaN')
+
 
 class TestEncoding11(TestEncoding):
     schema_class = XMLSchema11
diff --git a/tests/validators/test_attributes.py b/tests/validators/test_attributes.py
index d40813a..8d578fd 100644
--- a/tests/validators/test_attributes.py
+++ b/tests/validators/test_attributes.py
@@ -314,7 +314,7 @@ class TestXsdAttributes(XsdValidatorTestCase):
 
         with self.assertRaises(ValueError) as ec:
             attribute_group['a3'] = attribute_group['a2']
-        self.assertEqual("'a2' name and key 'a3' mismatch", str(ec.exception))
+        self.assertIn("mismatch", str(ec.exception))
 
         xsd_attribute = attribute_group['a2']
         del attribute_group['a2']
diff --git a/tests/validators/test_exceptions.py b/tests/validators/test_exceptions.py
index 10bd41a..7e8f07e 100644
--- a/tests/validators/test_exceptions.py
+++ b/tests/validators/test_exceptions.py
@@ -81,12 +81,12 @@ class TestValidatorExceptions(unittest.TestCase):
 
         lines = str(ctx.exception).split('\n')
         self.assertEqual(lines[0], "failed validating {'a': '10'} with XsdAttributeGroup():")
-        self.assertEqual(lines[2], "Reason: 'a' attribute not allowed for element.")
+        self.assertEqual(lines[2], "Reason: 'a' attribute not allowed for element")
         self.assertEqual(lines[8], "Instance (line 1):")
         self.assertEqual(lines[12], "Path: /root")
 
         self.assertEqual(repr(ctx.exception), "XMLSchemaValidationError(reason=\"'a' "
-                                              "attribute not allowed for element.\")")
+                                              "attribute not allowed for element\")")
 
         error = XMLSchemaValidationError(schema.elements['root'], root)
         self.assertIsNone(error.reason)
diff --git a/tests/validators/test_facets.py b/tests/validators/test_facets.py
index 87099d2..0b4b436 100644
--- a/tests/validators/test_facets.py
+++ b/tests/validators/test_facets.py
@@ -536,7 +536,7 @@ class TestXsdFacets(unittest.TestCase):
 
         with self.assertRaises(XMLSchemaValidationError) as ec:
             facet(1)
-        self.assertIn('value has to be lesser or equal than 0', str(ec.exception))
+        self.assertIn('value has to be less than or equal than 0', str(ec.exception))
 
         with self.assertRaises(XMLSchemaValidationError):
             facet('')
@@ -823,7 +823,7 @@ class TestXsdFacets(unittest.TestCase):
                     </xs:simpleType>
                 </xs:schema>"""))
 
-        self.assertIn("value has to be 0 for types derived from xs:integer", str(ec.exception))
+        self.assertIn("value must be 0 for types derived from xs:integer", str(ec.exception))
 
         with self.assertRaises(XMLSchemaParseError) as ec:
             self.schema_class(dedent("""\
diff --git a/tests/validators/test_models.py b/tests/validators/test_models.py
index f04b634..3193ddb 100644
--- a/tests/validators/test_models.py
+++ b/tests/validators/test_models.py
@@ -212,7 +212,7 @@ class TestModelValidation(XsdValidatorTestCase):
           </xs:choice>
         </xs:group>
         """
-        group = XMLSchema10.meta_schema.groups['simpleDerivation']
+        group = self.schema_class.meta_schema.groups['simpleDerivation']
 
         model = ModelVisitor(group)
         self.check_advance_true(model)     # <restriction> matches
diff --git a/tests/validators/test_schemas.py b/tests/validators/test_schemas.py
index 56e4236..b411897 100644
--- a/tests/validators/test_schemas.py
+++ b/tests/validators/test_schemas.py
@@ -867,7 +867,7 @@ class TestXMLSchema11(TestXMLSchema10):
                         defaultAttributes="attrs">
                     <xs:element name="root"/>
                 </xs:schema>"""))
-        self.assertIn("'attrs' doesn't match an attribute group", ctx.exception.message)
+        self.assertIn("'attrs' doesn't match any attribute group", ctx.exception.message)
 
         with self.assertRaises(XMLSchemaParseError) as ctx:
             self.schema_class(dedent("""\
diff --git a/tox.ini b/tox.ini
index 174d925..fb68c74 100644
--- a/tox.ini
+++ b/tox.ini
@@ -44,7 +44,7 @@ commands =
 
 [testenv:mypy-py37]
 deps =
-    mypy==0.931
+    mypy==0.950
     elementpath==2.5.0
     lxml-stubs
     jinja2
@@ -53,7 +53,7 @@ commands =
 
 [testenv:mypy-py{38,39,310}]
 deps =
-    mypy==0.931
+    mypy==0.950
     elementpath==2.5.0
     lxml-stubs
     jinja2
@@ -77,7 +77,7 @@ deps =
     elementpath>=2.5.0, <3.0.0
     lxml
     jinja2
-    mypy==0.931
+    mypy==0.950
     lxml-stubs
 commands =
     pytest tests -ra
diff --git a/xmlschema/__init__.py b/xmlschema/__init__.py
index b82e353..d317b39 100644
--- a/xmlschema/__init__.py
+++ b/xmlschema/__init__.py
@@ -1,6 +1,5 @@
-# -*- coding: utf-8 -*-
 #
-# Copyright (c), 2016-2021, SISSA (International School for Advanced Studies).
+# Copyright (c), 2016-2022, SISSA (International School for Advanced Studies).
 # All rights reserved.
 # This file is distributed under the terms of the MIT License.
 # See the file 'LICENSE' in the root directory of the present
@@ -9,6 +8,7 @@
 # @author Davide Brunato <brunato@sissa.it>
 #
 from . import limits
+from . import translation
 from .exceptions import XMLSchemaException, XMLResourceError, XMLSchemaNamespaceError
 from .etree import ElementData, etree_tostring
 from .resources import normalize_url, normalize_locations, fetch_resource, \
@@ -30,27 +30,26 @@ from .validators import (
     XsdComponent, XsdType, XsdElement, XsdAttribute
 )
 
-__version__ = '1.10.0'
+__version__ = '1.11.0'
 __author__ = "Davide Brunato"
 __contact__ = "brunato@sissa.it"
 __copyright__ = "Copyright 2016-2022, SISSA"
 __license__ = "MIT"
 __status__ = "Production/Stable"
 
-
 __all__ = [
-    'limits', 'XMLSchemaException', 'XMLResourceError', 'XMLSchemaNamespaceError',
-    'etree_tostring', 'normalize_url', 'normalize_locations', 'fetch_resource',
-    'fetch_namespaces', 'fetch_schema_locations', 'fetch_schema', 'XMLResource',
-    'ElementPathMixin', 'ElementData', 'XMLSchemaConverter', 'UnorderedConverter',
-    'ParkerConverter', 'BadgerFishConverter', 'AbderaConverter', 'JsonMLConverter',
-    'ColumnarConverter', 'DataElement', 'DataElementConverter', 'DataBindingConverter',
-    'validate', 'is_valid', 'iter_errors', 'iter_decode', 'to_dict', 'to_json',
-    'from_json', 'XmlDocument', 'XMLSchemaValidatorError', 'XMLSchemaParseError',
-    'XMLSchemaNotBuiltError', 'XMLSchemaModelError', 'XMLSchemaModelDepthError',
-    'XMLSchemaValidationError', 'XMLSchemaDecodeError', 'XMLSchemaEncodeError',
-    'XMLSchemaChildrenValidationError', 'XMLSchemaIncludeWarning',
-    'XMLSchemaImportWarning', 'XMLSchemaTypeTableWarning',
-    'XsdGlobals', 'XMLSchemaBase', 'XMLSchema', 'XMLSchema10', 'XMLSchema11',
-    'XsdComponent', 'XsdType', 'XsdElement', 'XsdAttribute',
+    'limits', 'translation', 'XMLSchemaException', 'XMLResourceError',
+    'XMLSchemaNamespaceError', 'etree_tostring', 'normalize_url', 'normalize_locations',
+    'fetch_resource', 'fetch_namespaces', 'fetch_schema_locations', 'fetch_schema',
+    'XMLResource', 'ElementPathMixin', 'ElementData', 'XMLSchemaConverter',
+    'UnorderedConverter', 'ParkerConverter', 'BadgerFishConverter', 'AbderaConverter',
+    'JsonMLConverter', 'ColumnarConverter', 'DataElement', 'DataElementConverter',
+    'DataBindingConverter', 'validate', 'is_valid', 'iter_errors', 'iter_decode',
+    'to_dict', 'to_json', 'from_json', 'XmlDocument', 'XMLSchemaValidatorError',
+    'XMLSchemaParseError', 'XMLSchemaNotBuiltError', 'XMLSchemaModelError',
+    'XMLSchemaModelDepthError', 'XMLSchemaValidationError', 'XMLSchemaDecodeError',
+    'XMLSchemaEncodeError', 'XMLSchemaChildrenValidationError', 'XMLSchemaIncludeWarning',
+    'XMLSchemaImportWarning', 'XMLSchemaTypeTableWarning', 'XsdGlobals', 'XMLSchemaBase',
+    'XMLSchema', 'XMLSchema10', 'XMLSchema11', 'XsdComponent', 'XsdType', 'XsdElement',
+    'XsdAttribute',
 ]
diff --git a/xmlschema/aliases.py b/xmlschema/aliases.py
index 2c98daf..7087de3 100644
--- a/xmlschema/aliases.py
+++ b/xmlschema/aliases.py
@@ -84,7 +84,7 @@ if TYPE_CHECKING:
     ##
     # Type aliases for validation/decoding/encoding
     ConverterType = Union[Type[XMLSchemaConverter], XMLSchemaConverter]
-    ExtraValidatorType = Callable[[ElementType, SchemaType],
+    ExtraValidatorType = Callable[[ElementType, XsdElement],
                                   Optional[Iterator[XMLSchemaValidationError]]]
 
     D = TypeVar('D')
diff --git a/xmlschema/converters/abdera.py b/xmlschema/converters/abdera.py
index e9d9cf6..ab4e8c0 100644
--- a/xmlschema/converters/abdera.py
+++ b/xmlschema/converters/abdera.py
@@ -107,7 +107,7 @@ class AbderaConverter(XMLSchemaConverter):
                 children = [children]
             elif children and not isinstance(children[0], MutableMapping):
                 if len(children) > 1:
-                    raise XMLSchemaValueError("Wrong format")
+                    raise XMLSchemaValueError("Element %r should have only one child" % tag)
                 else:
                     return ElementData(tag, children[0], None, attributes)
 
diff --git a/xmlschema/converters/columnar.py b/xmlschema/converters/columnar.py
index 450d2d2..ed8b426 100644
--- a/xmlschema/converters/columnar.py
+++ b/xmlschema/converters/columnar.py
@@ -48,11 +48,11 @@ class ColumnarConverter(XMLSchemaConverter):
         if name != 'attr_prefix':
             super(ColumnarConverter, self).__setattr__(name, value)
         elif not isinstance(value, str):
-            msg = '{} must be a str, not {}'
-            raise XMLSchemaTypeError(msg.format(name, type(value).__name__))
+            msg = "%(name)r must be a <class 'str'> instance, not %(type)r"
+            raise XMLSchemaTypeError(msg % {'name': name, 'type': type(value)})
         elif value not in {'', '_', '__'}:
-            msg = '{} can be the empty string or a single/double underscore'
-            raise XMLSchemaValueError(msg.format(name))
+            msg = '%r can be the empty string or a single/double underscore'
+            raise XMLSchemaValueError(msg % name)
         else:
             super(XMLSchemaConverter, self).__setattr__(name, value)
 
diff --git a/xmlschema/converters/default.py b/xmlschema/converters/default.py
index 3fc6d92..2ebd829 100644
--- a/xmlschema/converters/default.py
+++ b/xmlschema/converters/default.py
@@ -113,28 +113,28 @@ class XMLSchemaConverter(NamespaceMapper):
     def __setattr__(self, name: str, value: Any) -> None:
         if name in {'attr_prefix', 'text_key', 'cdata_prefix'}:
             if value is not None and not isinstance(value, str):
-                msg = '{} must be a str or None, not {}'
-                raise XMLSchemaTypeError(msg.format(name, type(value).__name__))
+                msg = "%(name)r must be a <class 'str'> instance or None, not %(type)r"
+                raise XMLSchemaTypeError(msg % {'name': name, 'type': type(value)})
 
         elif name in {'strip_namespaces', 'preserve_root', 'force_dict', 'force_list'}:
             if not isinstance(value, bool):
-                msg = '{} must be a bool, not {}'
-                raise XMLSchemaTypeError(msg.format(name, type(value).__name__))
+                msg = "%(name)r must be a <class 'bool'> instance, not %(type)r"
+                raise XMLSchemaTypeError(msg % {'name': name, 'type': type(value)})
 
         elif name == 'indent':
             if isinstance(value, bool) or not isinstance(value, int):
-                msg = '{} must be an int, not {}'
-                raise XMLSchemaTypeError(msg.format(name, type(value).__name__))
+                msg = "%(name)r must be a <class 'int'> instance, not %(type)r"
+                raise XMLSchemaTypeError(msg % {'name': name, 'type': type(value)})
 
         elif name == 'dict':
             if not issubclass(value, MutableMapping):
-                msg = '{!r} must be a MutableMapping subclass, not {}'
-                raise XMLSchemaTypeError(msg.format(name, value))
+                msg = "%(name)r must be a MutableMapping object, not %(type)r"
+                raise XMLSchemaTypeError(msg % {'name': name, 'type': type(value)})
 
         elif name == 'list':
             if not issubclass(value, MutableSequence):
-                msg = '{!r} must be a MutableSequence subclass, not {}'
-                raise XMLSchemaTypeError(msg.format(name, value))
+                msg = "%(name)r must be a MutableSequence object, not %(type)r"
+                raise XMLSchemaTypeError(msg % {'name': name, 'type': type(value)})
 
         super(XMLSchemaConverter, self).__setattr__(name, value)
 
diff --git a/xmlschema/converters/jsonml.py b/xmlschema/converters/jsonml.py
index 4dd7dd9..c9871de 100644
--- a/xmlschema/converters/jsonml.py
+++ b/xmlschema/converters/jsonml.py
@@ -10,7 +10,7 @@
 from collections.abc import MutableSequence
 from typing import TYPE_CHECKING, Any, Optional, List, Dict, Type
 
-from ..exceptions import XMLSchemaValueError
+from ..exceptions import XMLSchemaTypeError, XMLSchemaValueError
 from ..etree import ElementData
 from ..aliases import NamespacesType, BaseXsdType
 from .default import XMLSchemaConverter
@@ -76,8 +76,11 @@ class JsonMLConverter(XMLSchemaConverter):
     def element_encode(self, obj: Any, xsd_element: 'XsdElement', level: int = 0) -> ElementData:
         attributes: Dict[str, Any] = {}
 
-        if not isinstance(obj, MutableSequence) or not obj:
-            raise XMLSchemaValueError("Wrong data format, a not empty list required: %r." % obj)
+        if not isinstance(obj, MutableSequence):
+            msg = "The first argument must be a sequence, {} provided"
+            raise XMLSchemaTypeError(msg.format(type(obj)))
+        elif not obj:
+            raise XMLSchemaValueError("The first argument is an empty sequence")
 
         data_len = len(obj)
         if data_len == 1:
diff --git a/xmlschema/dataobjects.py b/xmlschema/dataobjects.py
index c1637da..d47c8fd 100644
--- a/xmlschema/dataobjects.py
+++ b/xmlschema/dataobjects.py
@@ -7,12 +7,7 @@
 #
 # @author Davide Brunato <brunato@sissa.it>
 #
-import sys
-if sys.version_info < (3, 7):
-    from typing import GenericMeta as ABCMeta
-else:
-    from abc import ABCMeta
-
+from abc import ABCMeta
 from itertools import count
 from typing import TYPE_CHECKING, cast, overload, Any, Dict, List, Iterator, \
     Optional, Union, Tuple, Type, MutableMapping, MutableSequence
@@ -212,7 +207,7 @@ class DataElement(MutableSequence['DataElement']):
         Accepts the same arguments of :meth:`validate`.
         """
         if self._encoder is None:
-            raise XMLSchemaValueError("{!r} has no schema bindings".format(self))
+            raise XMLSchemaValueError("%r has no schema bindings" % self)
 
         kwargs: Dict[str, Any] = {
             'converter': DataElementConverter,
@@ -252,7 +247,7 @@ class DataElement(MutableSequence['DataElement']):
         elif validation == 'skip':
             encoder = validators.XMLSchema.builtin_types()['anyType']
         else:
-            raise XMLSchemaValueError("{!r} has no schema bindings".format(self))
+            raise XMLSchemaValueError("%r has no schema bindings" % self)
 
         return encoder.encode(self, validation=validation, **kwargs)
 
@@ -307,7 +302,7 @@ class DataElement(MutableSequence['DataElement']):
         parser = XPath2Parser(namespaces, strict=False)
         context = XPathContext(cast(Any, self))
         results = parser.parse(path).select_results(context)
-        yield from filter(lambda x: isinstance(x, DataElement), results)  # type: ignore[misc]
+        yield from filter(lambda x: isinstance(x, DataElement), results)
 
     def iter(self, tag: Optional[str] = None) -> Iterator['DataElement']:
         """
diff --git a/xmlschema/documents.py b/xmlschema/documents.py
index 2720d3a..ca55c14 100644
--- a/xmlschema/documents.py
+++ b/xmlschema/documents.py
@@ -43,7 +43,7 @@ def get_context(xml_document: Union[XMLSourceType, XMLResource],
     if cls is None:
         cls = XMLSchema10
     elif not issubclass(cls, XMLSchemaBase):
-        raise XMLSchemaTypeError(f"invalid schema class {cls}")
+        raise XMLSchemaTypeError("invalid schema class %r" % cls)
 
     if isinstance(xml_document, XMLResource):
         resource = xml_document
@@ -498,7 +498,7 @@ class XmlDocument(XMLResource):
         elif validation == 'lax':
             self.errors = [e for e in self.schema.iter_errors(self, namespaces=self.namespaces)]
         elif validation != 'skip':
-            raise XMLSchemaValueError("{!r}: not a validation mode".format(validation))
+            raise XMLSchemaValueError("%r is not a validation mode" % validation)
 
     def parse(self, source: XMLSourceType, lazy: LazyType = False) -> None:
         super(XmlDocument, self).parse(source, lazy)
@@ -522,8 +522,7 @@ class XmlDocument(XMLResource):
         if is_etree_document(self._source):
             return self._source
         elif self._lazy:
-            msg = "cannot create an ElementTree from a lazy resource"
-            raise XMLResourceError(msg)
+            raise XMLResourceError("cannot create an ElementTree from a lazy resource")
         elif hasattr(self._root, 'nsmap'):
             return self._root.getroottree()  # type: ignore[attr-defined]
         else:
@@ -663,4 +662,5 @@ class XmlDocument(XMLResource):
             else:
                 file.write(_string)
         else:
-            raise XMLSchemaTypeError(f"unexpected type {type(file)} for 'file' argument")
+            msg = "unexpected type %r for 'file' argument"
+            raise XMLSchemaTypeError(msg % type(file))
diff --git a/xmlschema/helpers.py b/xmlschema/helpers.py
index 649d515..9877894 100644
--- a/xmlschema/helpers.py
+++ b/xmlschema/helpers.py
@@ -67,15 +67,15 @@ def local_name(qname: str) -> str:
     """
     try:
         if qname[0] == '{':
-            _, qname = qname.split('}')
+            _namespace, qname = qname.split('}')
         elif ':' in qname:
-            _, qname = qname.split(':')
+            _prefix, qname = qname.split(':')
     except IndexError:
         return ''
     except ValueError:
-        raise XMLSchemaValueError("the argument 'qname' has a wrong format: %r" % qname)
+        raise XMLSchemaValueError("the argument 'qname' has an invalid value %r" % qname)
     except TypeError:
-        raise XMLSchemaTypeError("the argument 'qname' must be a string")
+        raise XMLSchemaTypeError("the argument 'qname' must be a string-like object")
     else:
         return qname
 
diff --git a/xmlschema/locale/en/LC_MESSAGES/xmlschema.mo b/xmlschema/locale/en/LC_MESSAGES/xmlschema.mo
new file mode 100644
index 0000000..98ddf79
Binary files /dev/null and b/xmlschema/locale/en/LC_MESSAGES/xmlschema.mo differ
diff --git a/xmlschema/locale/en/LC_MESSAGES/xmlschema.po b/xmlschema/locale/en/LC_MESSAGES/xmlschema.po
new file mode 100644
index 0000000..bfd6589
--- /dev/null
+++ b/xmlschema/locale/en/LC_MESSAGES/xmlschema.po
@@ -0,0 +1,1767 @@
+# English translations for xmlschema package.
+# Copyright (C) 2022 , 2016, SISSA (International School for Advanced Studies).
+# This file is distributed under the same license as the xmlschema package.
+# Davide Brunato <brunato@sissa.it>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xmlschema\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-05-12 17:25+0200\n"
+"PO-Revision-Date: 2022-05-12 17:30+0200\n"
+"Last-Translator: Davide Brunato <brunato@sissa.it>\n"
+"Language-Team: English\n"
+"Language: en\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: xmlschema/validators/complex_types.py:134
+msgid "missing attribute 'name' in a global complexType"
+msgstr "missing attribute 'name' in a global complexType"
+
+#: xmlschema/validators/complex_types.py:139
+msgid "attribute 'name' not allowed in a local complexType"
+msgstr "attribute 'name' not allowed in a local complexType"
+
+#: xmlschema/validators/complex_types.py:162
+msgid "'mixed' attribute not allowed with simpleContent"
+msgstr "'mixed' attribute not allowed with simpleContent"
+
+#: xmlschema/validators/complex_types.py:177
+#, python-format
+msgid "unexpected tag %r after simpleContent declaration:"
+msgstr "unexpected tag %r after simpleContent declaration:"
+
+#: xmlschema/validators/complex_types.py:188
+msgid ""
+"value of 'mixed' attribute in complexType and complexContent must be the same"
+msgstr ""
+"value of 'mixed' attribute in complexType and complexContent must be the same"
+
+#: xmlschema/validators/complex_types.py:208
+#, python-format
+msgid "unexpected tag %r after complexContent declaration"
+msgstr "unexpected tag %r after complexContent declaration"
+
+#: xmlschema/validators/complex_types.py:232
+#, python-format
+msgid "unexpected tag %r for complexType content"
+msgstr "unexpected tag %r for complexType content"
+
+#: xmlschema/validators/complex_types.py:240
+#: xmlschema/validators/simple_types.py:1227
+msgid "wrong definition with self-reference"
+msgstr "wrong definition with self-reference"
+
+#: xmlschema/validators/complex_types.py:243
+#: xmlschema/validators/simple_types.py:1234
+msgid "wrong redefinition without self-reference"
+msgstr "wrong redefinition without self-reference"
+
+#: xmlschema/validators/complex_types.py:254
+msgid "restriction or extension tag expected"
+msgstr "restriction or extension tag expected"
+
+#: xmlschema/validators/complex_types.py:261
+msgid "{!r} is expected to have a redefined/overridden component"
+msgstr "{!r} is expected to have a redefined/overridden component"
+
+#: xmlschema/validators/complex_types.py:266
+msgid "{0!r} derivation not allowed for {1!r}"
+msgstr "{0!r} derivation not allowed for {1!r}"
+
+#: xmlschema/validators/complex_types.py:276
+msgid "'base' attribute required"
+msgstr "'base' attribute required"
+
+#: xmlschema/validators/complex_types.py:285
+#, python-format
+msgid "missing base type %r"
+msgstr "missing base type %r"
+
+#: xmlschema/validators/complex_types.py:293
+#: xmlschema/validators/simple_types.py:1247
+msgid "circular definition found between {0!r} and {1!r}"
+msgstr "circular definition found between {0!r} and {1!r}"
+
+#: xmlschema/validators/complex_types.py:297
+#: xmlschema/validators/complex_types.py:311
+msgid "a complexType ancestor required: {!r}"
+msgstr "a complexType ancestor required: {!r}"
+
+#: xmlschema/validators/complex_types.py:302
+#, python-format
+msgid "derivation by %r blocked by attribute 'final' in base type"
+msgstr "derivation by %r blocked by attribute 'final' in base type"
+
+#: xmlschema/validators/complex_types.py:319
+msgid "a not empty simpleContent cannot restrict an empty content type"
+msgstr "a not empty simpleContent cannot restrict an empty content type"
+
+#: xmlschema/validators/complex_types.py:326
+msgid "content type is not a restriction of base content"
+msgstr "content type is not a restriction of base content"
+
+#: xmlschema/validators/complex_types.py:332
+msgid "with simpleContent cannot restrict an element-only content type"
+msgstr "with simpleContent cannot restrict an element-only content type"
+
+#: xmlschema/validators/complex_types.py:344 xmlschema/validators/groups.py:478
+#, python-format
+msgid "unexpected tag %r"
+msgstr "unexpected tag %r"
+
+#: xmlschema/validators/complex_types.py:354
+#, python-format
+msgid "base type %r has no simple content"
+msgstr "base type %r has no simple content"
+
+#: xmlschema/validators/complex_types.py:362
+msgid "the base type is not derivable by restriction"
+msgstr "the base type is not derivable by restriction"
+
+#: xmlschema/validators/complex_types.py:365
+#: xmlschema/validators/complex_types.py:458
+#: xmlschema/validators/complex_types.py:896
+#, python-format
+msgid "base %r is simple or has a simple content"
+msgstr "base %r is simple or has a simple content"
+
+#: xmlschema/validators/complex_types.py:377
+#, python-brace-format
+msgid ""
+"restriction of an xs:{0} with more than one particle with xs:{1} is forbidden"
+msgstr ""
+"restriction of an xs:{0} with more than one particle with xs:{1} is forbidden"
+
+#: xmlschema/validators/complex_types.py:389
+msgid "derived a mixed content from a base type that has element-only content"
+msgstr "derived a mixed content from a base type that has element-only content"
+
+#: xmlschema/validators/complex_types.py:392
+msgid "an empty content derivation from base type that has not empty content"
+msgstr "an empty content derivation from base type that has not empty content"
+
+#: xmlschema/validators/complex_types.py:403
+msgid "{0!r} is not a restriction of the base type {1!r}"
+msgstr "{0!r} is not a restriction of the base type {1!r}"
+
+#: xmlschema/validators/complex_types.py:412
+#: xmlschema/validators/complex_types.py:901
+msgid "the base type is not derivable by extension"
+msgstr "the base type is not derivable by extension"
+
+#: xmlschema/validators/complex_types.py:445
+#: xmlschema/validators/complex_types.py:952
+#: xmlschema/validators/complex_types.py:1002
+#, python-format
+msgid ""
+"base has a different content type (mixed=%r) and the extension group is not "
+"empty."
+msgstr ""
+"base has a different content type (mixed=%r) and the extension group is not "
+"empty."
+
+#: xmlschema/validators/complex_types.py:465
+msgid "cannot extend a complex content with xs:all"
+msgstr "cannot extend a complex content with xs:all"
+
+#: xmlschema/validators/complex_types.py:468
+msgid "xs:sequence cannot extend xs:all"
+msgstr "xs:sequence cannot extend xs:all"
+
+#: xmlschema/validators/complex_types.py:478
+msgid "XSD 1.0 does not allow extension of a not empty 'all' model group"
+msgstr "XSD 1.0 does not allow extension of a not empty 'all' model group"
+
+#: xmlschema/validators/complex_types.py:481
+#, python-format
+msgid ""
+"base has a different content type (mixed=%r) and the extension group is not "
+"empty"
+msgstr ""
+"base has a different content type (mixed=%r) and the extension group is not "
+"empty"
+
+#: xmlschema/validators/complex_types.py:495
+#: xmlschema/validators/complex_types.py:1017
+msgid "extended type has a mixed content but the base is element-only"
+msgstr "extended type has a mixed content but the base is element-only"
+
+#: xmlschema/validators/complex_types.py:655
+msgid "global type {!r} is not built"
+msgstr "global type {!r} is not built"
+
+#: xmlschema/validators/complex_types.py:721
+#: xmlschema/validators/complex_types.py:746
+#, python-format
+msgid "cannot decode %(obj)r data with %(decoder)r"
+msgstr "cannot decode %(obj)r data with %(decoder)r"
+
+#: xmlschema/validators/complex_types.py:847
+msgid "the simple content of {!r} is not a valid simple type in XSD 1.1"
+msgstr "the simple content of {!r} is not a valid simple type in XSD 1.1"
+
+#: xmlschema/validators/complex_types.py:854
+msgid "openContent mismatch between type and model group"
+msgstr "openContent mismatch between type and model group"
+
+#: xmlschema/validators/complex_types.py:869
+#, python-format
+msgid "attribute %r must be inheritable"
+msgstr "attribute %r must be inheritable"
+
+#: xmlschema/validators/complex_types.py:885
+msgid "default attribute {!r} is already declared in the complex type"
+msgstr "default attribute {!r} is already declared in the complex type"
+
+#: xmlschema/validators/complex_types.py:956
+msgid "cannot extend an empty mixed content with an xs:all"
+msgstr "cannot extend an empty mixed content with an xs:all"
+
+#: xmlschema/validators/complex_types.py:974
+#, python-format
+msgid "xs:all cannot extend a not empty xs:%s"
+msgstr "xs:all cannot extend a not empty xs:%s"
+
+#: xmlschema/validators/complex_types.py:989
+msgid "cannot extend a not empty 'all' model group with a different model"
+msgstr "cannot extend a not empty 'all' model group with a different model"
+
+#: xmlschema/validators/complex_types.py:992
+msgid "when extend an xs:all group minOccurs must be the same"
+msgstr "when extend an xs:all group minOccurs must be the same"
+
+#: xmlschema/validators/complex_types.py:995
+msgid "cannot extend an xs:all group with mixed empty content"
+msgstr "cannot extend an xs:all group with mixed empty content"
+
+#: xmlschema/validators/complex_types.py:1035
+msgid "{0!r} is not an extension of the base type {1!r}"
+msgstr "{0!r} is not an extension of the base type {1!r}"
+
+#: xmlschema/validators/notations.py:39
+msgid "a notation declaration must be global"
+msgstr "a notation declaration must be global"
+
+#: xmlschema/validators/notations.py:43
+msgid "a notation must have a 'name' attribute"
+msgstr "a notation must have a 'name' attribute"
+
+#: xmlschema/validators/notations.py:46
+msgid "a notation must have a 'public' or a 'system' attribute"
+msgstr "a notation must have a 'public' or a 'system' attribute"
+
+#: xmlschema/validators/particles.py:122
+msgid "minOccurs value is not an integer value"
+msgstr "minOccurs value is not an integer value"
+
+#: xmlschema/validators/particles.py:126
+msgid "minOccurs value must be a non negative integer"
+msgstr "minOccurs value must be a non negative integer"
+
+#: xmlschema/validators/particles.py:134
+msgid "minOccurs must be lesser or equal than maxOccurs"
+msgstr "minOccurs must be lesser or equal than maxOccurs"
+
+#: xmlschema/validators/particles.py:142
+msgid "maxOccurs value must be a non negative integer or 'unbounded'"
+msgstr "maxOccurs value must be a non negative integer or 'unbounded'"
+
+#: xmlschema/validators/particles.py:146
+msgid "maxOccurs must be 'unbounded' or greater than minOccurs"
+msgstr "maxOccurs must be 'unbounded' or greater than minOccurs"
+
+#: xmlschema/validators/assertions.py:76
+msgid "base_type={!r} is not a complexType definition"
+msgstr "base_type={!r} is not a complexType definition"
+
+#: xmlschema/validators/elements.py:162
+#, python-format
+msgid "unknown element %r"
+msgstr "unknown element %r"
+
+#: xmlschema/validators/elements.py:179
+msgid "attribute {!r} is not allowed when element reference is used"
+msgstr "attribute {!r} is not allowed when element reference is used"
+
+#: xmlschema/validators/elements.py:200
+msgid "local scope elements cannot have abstract attribute"
+msgstr "local scope elements cannot have abstract attribute"
+
+#: xmlschema/validators/elements.py:227
+msgid "attribute {!r} is not allowed in a global element declaration"
+msgstr "attribute {!r} is not allowed in a global element declaration"
+
+#: xmlschema/validators/elements.py:232
+msgid "attribute {!r} not allowed in a local element declaration"
+msgstr "attribute {!r} not allowed in a local element declaration"
+
+#: xmlschema/validators/elements.py:250 xmlschema/validators/elements.py:1460
+#: xmlschema/validators/simple_types.py:859
+#: xmlschema/validators/simple_types.py:1024
+#: xmlschema/validators/simple_types.py:1240
+msgid "unknown type {!r}"
+msgstr "unknown type {!r}"
+
+#: xmlschema/validators/elements.py:255
+msgid ""
+"the attribute 'type' and a xs:{} local declaration are mutually exclusive"
+msgstr ""
+"the attribute 'type' and a xs:{} local declaration are mutually exclusive"
+
+#: xmlschema/validators/elements.py:274 xmlschema/validators/attributes.py:165
+msgid "'default' and 'fixed' attributes are mutually exclusive"
+msgstr "'default' and 'fixed' attributes are mutually exclusive"
+
+#: xmlschema/validators/elements.py:278
+msgid "'default' value {!r} is not compatible with element's type"
+msgstr "'default' value {!r} is not compatible with element's type"
+
+#: xmlschema/validators/elements.py:282
+msgid "xs:ID or a type derived from xs:ID cannot have a default value"
+msgstr "xs:ID or a type derived from xs:ID cannot have a default value"
+
+#: xmlschema/validators/elements.py:288
+msgid "'fixed' value {!r} is not compatible with element's type"
+msgstr "'fixed' value {!r} is not compatible with element's type"
+
+#: xmlschema/validators/elements.py:292
+msgid "xs:ID or a type derived from xs:ID cannot have a fixed value"
+msgstr "xs:ID or a type derived from xs:ID cannot have a fixed value"
+
+#: xmlschema/validators/elements.py:311 xmlschema/validators/elements.py:319
+#, python-format
+msgid "duplicated identity constraint %r:"
+msgstr "duplicated identity constraint %r:"
+
+#: xmlschema/validators/elements.py:341
+#, python-format
+msgid "unknown substitutionGroup %r"
+msgstr "unknown substitutionGroup %r"
+
+#: xmlschema/validators/elements.py:346
+#, python-format
+msgid "circularity found for substitutionGroup %r"
+msgstr "circularity found for substitutionGroup %r"
+
+#: xmlschema/validators/elements.py:361
+msgid ""
+"{0!r} type is not of the same or a derivation of the head element {1!r} type"
+msgstr ""
+"{0!r} type is not of the same or a derivation of the head element {1!r} type"
+
+#: xmlschema/validators/elements.py:365
+#, python-format
+msgid ""
+"head element %r can't be substituted by an element that has a derivation of "
+"its type"
+msgstr ""
+"head element %r can't be substituted by an element that has a derivation of "
+"its type"
+
+#: xmlschema/validators/elements.py:369
+#, python-format
+msgid ""
+"head element %r can't be substituted by an element that has an extension of "
+"its type"
+msgstr ""
+"head element %r can't be substituted by an element that has an extension of "
+"its type"
+
+#: xmlschema/validators/elements.py:373
+#, python-format
+msgid ""
+"head element %r can't be substituted by an element that has a restriction of "
+"its type"
+msgstr ""
+"head element %r can't be substituted by an element that has a restriction of "
+"its type"
+
+#: xmlschema/validators/elements.py:547
+msgid "schemaLocation declaration after namespace start"
+msgstr "schemaLocation declaration after namespace start"
+
+#: xmlschema/validators/elements.py:556
+#, python-format
+msgid "missing dynamic loaded schema from %s"
+msgstr "missing dynamic loaded schema from %s"
+
+#: xmlschema/validators/elements.py:559
+msgid "dynamic loaded schema change the assessment"
+msgstr "dynamic loaded schema change the assessment"
+
+#: xmlschema/validators/elements.py:610
+msgid "cannot use an abstract element for validation"
+msgstr "cannot use an abstract element for validation"
+
+#: xmlschema/validators/elements.py:667 xmlschema/validators/identities.py:219
+msgid "selector xpath expression can only select elements"
+msgstr "selector xpath expression can only select elements"
+
+#: xmlschema/validators/elements.py:673
+#, python-format
+msgid "usage of %r is blocked"
+msgstr "usage of %r is blocked"
+
+#: xmlschema/validators/elements.py:677
+#, python-format
+msgid "%r is abstract"
+msgstr "%r is abstract"
+
+#: xmlschema/validators/elements.py:705
+msgid "element is not nillable"
+msgstr "element is not nillable"
+
+#: xmlschema/validators/elements.py:708
+msgid "xsi:nil attribute must have a boolean value"
+msgstr "xsi:nil attribute must have a boolean value"
+
+#: xmlschema/validators/elements.py:713
+msgid "xsi:nil='true' but the element has a fixed value"
+msgstr "xsi:nil='true' but the element has a fixed value"
+
+#: xmlschema/validators/elements.py:716
+msgid "xsi:nil='true' but the element is not empty"
+msgstr "xsi:nil='true' but the element is not empty"
+
+#: xmlschema/validators/elements.py:722
+msgid "character data is not allowed because content is empty"
+msgstr "character data is not allowed because content is empty"
+
+#: xmlschema/validators/elements.py:744 xmlschema/validators/elements.py:760
+#, python-format
+msgid "must have the fixed value %r"
+msgstr "must have the fixed value %r"
+
+#: xmlschema/validators/elements.py:749
+msgid "a simple content element can't have child elements"
+msgstr "a simple content element can't have child elements"
+
+#: xmlschema/validators/elements.py:778 xmlschema/validators/attributes.py:237
+msgid ""
+"cannot validate against xs:NOTATION directly, only against a subtype with an "
+"enumeration facet"
+msgstr ""
+"cannot validate against xs:NOTATION directly, only against a subtype with an "
+"enumeration facet"
+
+#: xmlschema/validators/elements.py:782 xmlschema/validators/attributes.py:241
+msgid "missing enumeration facet in xs:NOTATION subtype"
+msgstr "missing enumeration facet in xs:NOTATION subtype"
+
+#: xmlschema/validators/elements.py:1245
+msgid "test attribute missing in non-final alternative"
+msgstr "test attribute missing in non-final alternative"
+
+#: xmlschema/validators/elements.py:1370
+msgid "Maybe a not equivalent type table between elements {0!r} and {1!r}"
+msgstr "Maybe a not equivalent type table between elements {0!r} and {1!r}"
+
+#: xmlschema/validators/elements.py:1446
+msgid "missing 'type' attribute"
+msgstr "missing 'type' attribute"
+
+#: xmlschema/validators/elements.py:1454
+msgid "declared type is not derived from {!r}"
+msgstr "declared type is not derived from {!r}"
+
+#: xmlschema/validators/elements.py:1464
+msgid "type {0!r} is not derived from {1!r}"
+msgstr "type {0!r} is not derived from {1!r}"
+
+#: xmlschema/validators/elements.py:1469
+#, python-format
+msgid ""
+"the attribute 'type' and the xs:%s local declaration are mutually exclusive"
+msgstr ""
+"the attribute 'type' and the xs:%s local declaration are mutually exclusive"
+
+#: xmlschema/validators/global_maps.py:77
+msgid "global {0} with name={1!r} is already defined"
+msgstr "global {0} with name={1!r} is already defined"
+
+#: xmlschema/validators/global_maps.py:90
+msgid "multiple redefinition for {0} {1!r}"
+msgstr "multiple redefinition for {0} {1!r}"
+
+#: xmlschema/validators/global_maps.py:102
+msgid "circular redefinition for {0} {1!r}"
+msgstr "circular redefinition for {0} {1!r}"
+
+#: xmlschema/validators/global_maps.py:117
+msgid "not a redefinition!"
+msgstr "not a redefinition!"
+
+#: xmlschema/validators/global_maps.py:234
+msgid "wrong tag {!r} for an XSD global definition/declaration"
+msgstr "wrong tag {!r} for an XSD global definition/declaration"
+
+#: xmlschema/validators/global_maps.py:313
+#: xmlschema/validators/global_maps.py:330
+msgid "wrong element {0!r} for map {1!r}"
+msgstr "wrong element {0!r} for map {1!r}"
+
+#: xmlschema/validators/global_maps.py:339
+msgid "redefined schema {!r} has a different targetNamespace"
+msgstr "redefined schema {!r} has a different targetNamespace"
+
+#: xmlschema/validators/global_maps.py:350
+msgid "unexpected instance {!r} in global map"
+msgstr "unexpected instance {!r} in global map"
+
+#: xmlschema/validators/global_maps.py:382
+msgid "{0!r} cannot substitute {1!r}"
+msgstr "{0!r} cannot substitute {1!r}"
+
+#: xmlschema/validators/global_maps.py:578
+msgid "missing XSD namespace in meta-schema instance {!r}"
+msgstr "missing XSD namespace in meta-schema instance {!r}"
+
+#: xmlschema/validators/global_maps.py:587
+msgid "missing default meta-schema instance {!r}"
+msgstr "missing default meta-schema instance {!r}"
+
+#: xmlschema/validators/global_maps.py:639
+msgid "defaultAttributes={0!r} doesn't match any attribute group of {1!r}"
+msgstr "defaultAttributes={0!r} doesn't match any attribute group of {1!r}"
+
+#: xmlschema/validators/global_maps.py:682
+msgid "global element not built!"
+msgstr "global element not built!"
+
+#: xmlschema/validators/global_maps.py:684
+msgid "circularity found for substitution group with head element {}"
+msgstr "circularity found for substitution group with head element {}"
+
+#: xmlschema/validators/global_maps.py:689
+#, python-format
+msgid "global map has unbuilt components: %r"
+msgstr "global map has unbuilt components: %r"
+
+#: xmlschema/validators/global_maps.py:694
+msgid "global group not built!"
+msgstr "global group not built!"
+
+#: xmlschema/validators/global_maps.py:701
+msgid "the redefined group is an illegal restriction"
+msgstr "the redefined group is an illegal restriction"
+
+#: xmlschema/validators/global_maps.py:717
+msgid "the derived group is an illegal restriction"
+msgstr "the derived group is an illegal restriction"
+
+#: xmlschema/validators/global_maps.py:727
+msgid "restriction has an open content but base type has not"
+msgstr "restriction has an open content but base type has not"
+
+#: xmlschema/validators/global_maps.py:733
+msgid ""
+"can't verify the content model of {!r} due to exceeding of maximum recursion "
+"depth"
+msgstr ""
+"can't verify the content model of {!r} due to exceeding of maximum recursion "
+"depth"
+
+#: xmlschema/validators/facets.py:63
+msgid "invalid type {!r} provided"
+msgstr "invalid type {!r} provided"
+
+#: xmlschema/validators/facets.py:84
+msgid "{0!r} facet value is fixed to {1!r}"
+msgstr "{0!r} facet value is fixed to {1!r}"
+
+#: xmlschema/validators/facets.py:135 xmlschema/validators/facets.py:138
+msgid "facet value can be only 'collapse'"
+msgstr "facet value can be only 'collapse'"
+
+#: xmlschema/validators/facets.py:140
+msgid "facet value can be only 'replace' or 'collapse'"
+msgstr "facet value can be only 'replace' or 'collapse'"
+
+#: xmlschema/validators/facets.py:145
+msgid "value contains tabs or newlines"
+msgstr "value contains tabs or newlines"
+
+#: xmlschema/validators/facets.py:151
+msgid "value contains non collapsed white spaces"
+msgstr "value contains non collapsed white spaces"
+
+#: xmlschema/validators/facets.py:175
+msgid "base facet has a different length ({})"
+msgstr "base facet has a different length ({})"
+
+#: xmlschema/validators/facets.py:185
+msgid "length has to be {!r}"
+msgstr "length has to be {!r}"
+
+#: xmlschema/validators/facets.py:209
+msgid "base facet has a greater min length ({})"
+msgstr "base facet has a greater min length ({})"
+
+#: xmlschema/validators/facets.py:219
+msgid "value length cannot be lesser than {!r}"
+msgstr "value length cannot be lesser than {!r}"
+
+#: xmlschema/validators/facets.py:243
+msgid "base type has a lesser max length ({})"
+msgstr "base type has a lesser max length ({})"
+
+#: xmlschema/validators/facets.py:253
+msgid "value length cannot be greater than {!r}"
+msgstr "value length cannot be greater than {!r}"
+
+#: xmlschema/validators/facets.py:276 xmlschema/validators/facets.py:307
+#: xmlschema/validators/facets.py:342 xmlschema/validators/facets.py:373
+msgid "invalid restriction: {}"
+msgstr "invalid restriction: {}"
+
+#: xmlschema/validators/facets.py:281
+msgid "value has to be greater or equal than {!r}"
+msgstr "value has to be greater or equal than {!r}"
+
+#: xmlschema/validators/facets.py:311
+msgid "invalid restriction: {} is also the maximum"
+msgstr "invalid restriction: {} is also the maximum"
+
+#: xmlschema/validators/facets.py:317
+msgid "value has to be greater than {!r}"
+msgstr "value has to be greater than {!r}"
+
+#: xmlschema/validators/facets.py:347
+msgid "value has to be less than or equal than {!r}"
+msgstr "value has to be less than or equal than {!r}"
+
+#: xmlschema/validators/facets.py:377
+msgid "invalid restriction: {} is also the minimum"
+msgstr "invalid restriction: {} is also the minimum"
+
+#: xmlschema/validators/facets.py:383
+msgid "value has to be lesser than {!r}"
+msgstr "value has to be lesser than {!r}"
+
+#: xmlschema/validators/facets.py:418 xmlschema/validators/facets.py:475
+msgid "invalid restriction: base value is lower ({})"
+msgstr "invalid restriction: base value is lower ({})"
+
+#: xmlschema/validators/facets.py:428
+msgid "the number of digits has to be lesser or equal than {!r}"
+msgstr "the number of digits has to be lesser or equal than {!r}"
+
+#: xmlschema/validators/facets.py:456
+msgid ""
+"fractionDigits facet can be applied only to types derived from xs:decimal"
+msgstr ""
+"fractionDigits facet can be applied only to types derived from xs:decimal"
+
+#: xmlschema/validators/facets.py:470
+msgid "fractionDigits facet value must be 0 for types derived from xs:integer"
+msgstr "fractionDigits facet value must be 0 for types derived from xs:integer"
+
+#: xmlschema/validators/facets.py:485
+msgid "the number of fraction digits has to be lesser or equal than {!r}"
+msgstr "the number of fraction digits has to be lesser or equal than {!r}"
+
+#: xmlschema/validators/facets.py:517
+msgid "invalid restriction from {!r}"
+msgstr "invalid restriction from {!r}"
+
+#: xmlschema/validators/facets.py:522
+msgid "time zone required for value {!r}"
+msgstr "time zone required for value {!r}"
+
+#: xmlschema/validators/facets.py:527
+msgid "time zone prohibited for value {!r}"
+msgstr "time zone prohibited for value {!r}"
+
+#: xmlschema/validators/facets.py:571
+msgid "value {!r} must match a notation declaration"
+msgstr "value {!r} must match a notation declaration"
+
+#: xmlschema/validators/facets.py:629
+msgid "value must be one of {!r}"
+msgstr "value must be one of {!r}"
+
+#: xmlschema/validators/facets.py:725
+msgid "value doesn't match any pattern of {!r}"
+msgstr "value doesn't match any pattern of {!r}"
+
+#: xmlschema/validators/facets.py:789
+msgid "missing attribute 'test'"
+msgstr "missing attribute 'test'"
+
+#: xmlschema/validators/facets.py:819
+msgid "value is not true with test path {!r}"
+msgstr "value is not true with test path {!r}"
+
+#: xmlschema/validators/attributes.py:82
+msgid "unknown attribute {!r}"
+msgstr "unknown attribute {!r}"
+
+#: xmlschema/validators/attributes.py:97
+msgid "referenced attribute has a different fixed value {!r}"
+msgstr "referenced attribute has a different fixed value {!r}"
+
+#: xmlschema/validators/attributes.py:102
+msgid "attribute {!r} is not allowed when attribute reference is used"
+msgstr "attribute {!r} is not allowed when attribute reference is used"
+
+#: xmlschema/validators/attributes.py:118
+msgid "an attribute name must be different from 'xmlns'"
+msgstr "an attribute name must be different from 'xmlns'"
+
+#: xmlschema/validators/attributes.py:125
+#, python-format
+msgid "cannot add attributes in %r namespace"
+msgstr "cannot add attributes in %r namespace"
+
+#: xmlschema/validators/attributes.py:146
+msgid "ambiguous type definition for XSD attribute"
+msgstr "ambiguous type definition for XSD attribute"
+
+#: xmlschema/validators/attributes.py:158
+msgid "XSD attribute's type must be a simpleType"
+msgstr "XSD attribute's type must be a simpleType"
+
+#: xmlschema/validators/attributes.py:169
+msgid ""
+"the attribute 'use' must be 'optional' if the attribute 'default' is present"
+msgstr ""
+"the attribute 'use' must be 'optional' if the attribute 'default' is present"
+
+#: xmlschema/validators/attributes.py:174
+msgid "default value {!r} is not compatible with attribute's type"
+msgstr "default value {!r} is not compatible with attribute's type"
+
+#: xmlschema/validators/attributes.py:177
+msgid "xs:ID key attributes cannot have a default value"
+msgstr "xs:ID key attributes cannot have a default value"
+
+#: xmlschema/validators/attributes.py:183
+msgid "fixed value {!r} is not compatible with attribute's type"
+msgstr "fixed value {!r} is not compatible with attribute's type"
+
+#: xmlschema/validators/attributes.py:186
+msgid "xs:ID key attributes cannot have a fixed value"
+msgstr "xs:ID key attributes cannot have a fixed value"
+
+#: xmlschema/validators/attributes.py:249
+msgid "attribute {0!r} has a fixed value {1!r}"
+msgstr "attribute {0!r} has a fixed value {1!r}"
+
+#: xmlschema/validators/attributes.py:254
+msgid "attribute {0}={1!r}: {2}"
+msgstr "attribute {0}={1!r}: {2}"
+
+#: xmlschema/validators/attributes.py:319
+msgid "attribute 'fixed' with use=prohibited is not allowed in XSD 1.1"
+msgstr "attribute 'fixed' with use=prohibited is not allowed in XSD 1.1"
+
+#: xmlschema/validators/attributes.py:413
+msgid "more anyAttribute declarations in the same attribute group"
+msgstr "more anyAttribute declarations in the same attribute group"
+
+#: xmlschema/validators/attributes.py:416
+msgid "another declaration after anyAttribute"
+msgstr "another declaration after anyAttribute"
+
+#: xmlschema/validators/attributes.py:431
+msgid "multiple declaration for attribute {!r}"
+msgstr "multiple declaration for attribute {!r}"
+
+#: xmlschema/validators/attributes.py:440
+msgid "the attribute 'ref' is required in a local attributeGroup"
+msgstr "the attribute 'ref' is required in a local attributeGroup"
+
+#: xmlschema/validators/attributes.py:450
+msgid "duplicated attributeGroup {!r}"
+msgstr "duplicated attributeGroup {!r}"
+
+#: xmlschema/validators/attributes.py:456
+msgid "in a redefinition the reference to itself must be the first"
+msgstr "in a redefinition the reference to itself must be the first"
+
+#: xmlschema/validators/attributes.py:467
+msgid "attributeGroup ref={!r} is not in the redefined group"
+msgstr "attributeGroup ref={!r} is not in the redefined group"
+
+#: xmlschema/validators/attributes.py:471
+msgid "Circular attribute groups not allowed in XSD 1.0"
+msgstr "Circular attribute groups not allowed in XSD 1.0"
+
+#: xmlschema/validators/attributes.py:479
+msgid "unknown attribute group {!r}"
+msgstr "unknown attribute group {!r}"
+
+#: xmlschema/validators/attributes.py:488
+msgid "multiple declaration of attribute {!r}"
+msgstr "multiple declaration of attribute {!r}"
+
+#: xmlschema/validators/attributes.py:497
+msgid "Circular reference found between attribute groups {0!r} and {1!r}"
+msgstr "Circular reference found between attribute groups {0!r} and {1!r}"
+
+#: xmlschema/validators/attributes.py:502
+msgid "(attribute | attributeGroup) expected, found {!r}."
+msgstr "(attribute | attributeGroup) expected, found {!r}."
+
+#: xmlschema/validators/attributes.py:513
+msgid "Unexpected attribute {!r} in restriction"
+msgstr "Unexpected attribute {!r} in restriction"
+
+#: xmlschema/validators/attributes.py:529
+msgid "Attribute wildcard is not a restriction of the base wildcard"
+msgstr "Attribute wildcard is not a restriction of the base wildcard"
+
+#: xmlschema/validators/attributes.py:539
+msgid "Attribute type is not a restriction of the base attribute type"
+msgstr "Attribute type is not a restriction of the base attribute type"
+
+#: xmlschema/validators/attributes.py:544
+msgid "Attribute {!r}: unmatched attribute use in restriction"
+msgstr "Attribute {!r}: unmatched attribute use in restriction"
+
+#: xmlschema/validators/attributes.py:550
+msgid "Attribute {!r}: derived attribute has a different fixed value"
+msgstr "Attribute {!r}: derived attribute has a different fixed value"
+
+#: xmlschema/validators/attributes.py:554
+msgid "Attribute {!r}: 'inheritable' property change in restriction"
+msgstr "Attribute {!r}: 'inheritable' property change in restriction"
+
+#: xmlschema/validators/attributes.py:568
+msgid "Missing required attribute {!r} in redefinition restriction"
+msgstr "Missing required attribute {!r} in redefinition restriction"
+
+#: xmlschema/validators/attributes.py:573
+msgid "Attribute {!r}: unmatched attribute use in redefinition"
+msgstr "Attribute {!r}: unmatched attribute use in redefinition"
+
+#: xmlschema/validators/attributes.py:576
+msgid "Attribute {!r}: redefinition remove fixed constraint"
+msgstr "Attribute {!r}: redefinition remove fixed constraint"
+
+#: xmlschema/validators/attributes.py:585
+msgid "Redefinition restriction contains additional attribute {!r}"
+msgstr "Redefinition restriction contains additional attribute {!r}"
+
+#: xmlschema/validators/attributes.py:589
+msgid "Wrong attribute order in redefinition restriction"
+msgstr "Wrong attribute order in redefinition restriction"
+
+#: xmlschema/validators/attributes.py:607
+msgid "multiple ID attributes not allowed for XSD 1.0"
+msgstr "multiple ID attributes not allowed for XSD 1.0"
+
+#: xmlschema/validators/attributes.py:660
+#: xmlschema/validators/attributes.py:738
+msgid "missing required attribute {!r}"
+msgstr "missing required attribute {!r}"
+
+#: xmlschema/validators/attributes.py:695
+#: xmlschema/validators/attributes.py:760
+#, python-format
+msgid "%r is not an attribute of the XSI namespace"
+msgstr "%r is not an attribute of the XSI namespace"
+
+#: xmlschema/validators/attributes.py:703
+#: xmlschema/validators/attributes.py:768
+#, python-format
+msgid "%r attribute not allowed for element"
+msgstr "%r attribute not allowed for element"
+
+#: xmlschema/validators/attributes.py:709
+#, python-format
+msgid "use of attribute %r is prohibited"
+msgstr "use of attribute %r is prohibited"
+
+#: xmlschema/validators/exceptions.py:345
+#, python-format
+msgid "Unexpected child with tag %r at position %d."
+msgstr "Unexpected child with tag %r at position %d."
+
+#: xmlschema/validators/exceptions.py:372
+#, python-format
+msgid " Tag (%s) expected."
+msgstr " Tag (%s) expected."
+
+#: xmlschema/validators/exceptions.py:374
+#, python-format
+msgid " Tag %s expected."
+msgstr " Tag %s expected."
+
+#: xmlschema/validators/exceptions.py:376
+#, python-format
+msgid " Tag %r expected."
+msgstr " Tag %r expected."
+
+#: xmlschema/validators/groups.py:355
+msgid "{!r} is not a particle of the model group"
+msgstr "{!r} is not a particle of the model group"
+
+#: xmlschema/validators/groups.py:413 xmlschema/validators/groups.py:455
+msgid "attribute 'name' not allowed in a local group"
+msgstr "attribute 'name' not allowed in a local group"
+
+#: xmlschema/validators/groups.py:422
+#, python-format
+msgid "missing group %r"
+msgstr "missing group %r"
+
+#: xmlschema/validators/groups.py:429 xmlschema/validators/groups.py:485
+msgid "maxOccurs must be 1 for 'all' model groups"
+msgstr "maxOccurs must be 1 for 'all' model groups"
+
+#: xmlschema/validators/groups.py:432 xmlschema/validators/groups.py:488
+#: xmlschema/validators/groups.py:1285
+msgid "minOccurs must be (0 | 1) for 'all' model groups"
+msgstr "minOccurs must be (0 | 1) for 'all' model groups"
+
+#: xmlschema/validators/groups.py:435
+msgid "in XSD 1.0 an 'all' model group cannot be nested"
+msgstr "in XSD 1.0 an 'all' model group cannot be nested"
+
+#: xmlschema/validators/groups.py:441 xmlschema/validators/groups.py:523
+#: xmlschema/validators/groups.py:1317
+#, python-format
+msgid "Circular definition detected for group %r"
+msgstr "Circular definition detected for group %r"
+
+#: xmlschema/validators/groups.py:459 xmlschema/validators/groups.py:469
+msgid "attribute 'minOccurs' not allowed in a global group"
+msgstr "attribute 'minOccurs' not allowed in a global group"
+
+#: xmlschema/validators/groups.py:462 xmlschema/validators/groups.py:472
+msgid "attribute 'maxOccurs' not allowed in a global group"
+msgstr "attribute 'maxOccurs' not allowed in a global group"
+
+#: xmlschema/validators/groups.py:499
+msgid "'all' model can contain only elements"
+msgstr "'all' model can contain only elements"
+
+#: xmlschema/validators/groups.py:509 xmlschema/validators/groups.py:1301
+msgid "missing attribute 'ref' in local group"
+msgstr "missing attribute 'ref' in local group"
+
+#: xmlschema/validators/groups.py:518
+msgid "'all' model can appears only at 1st level of a model group"
+msgstr "'all' model can appears only at 1st level of a model group"
+
+#: xmlschema/validators/groups.py:527 xmlschema/validators/groups.py:1321
+msgid "Redefined group reference cannot have minOccurs/maxOccurs other than 1"
+msgstr "Redefined group reference cannot have minOccurs/maxOccurs other than 1"
+
+#: xmlschema/validators/groups.py:821
+msgid ""
+"Element Declarations Consistent violation between {0!r} and {1!r}: match the "
+"same name but with different types"
+msgstr ""
+"Element Declarations Consistent violation between {0!r} and {1!r}: match the "
+"same name but with different types"
+
+#: xmlschema/validators/groups.py:835
+msgid "{0!r} and {1!r} overlap and are in the same {2!r} group"
+msgstr "{0!r} and {1!r} overlap and are in the same {2!r} group"
+
+#: xmlschema/validators/groups.py:847
+msgid "Unique Particle Attribution violation between {0!r} and {1!r}"
+msgstr "Unique Particle Attribution violation between {0!r} and {1!r}"
+
+#: xmlschema/validators/groups.py:860
+#, python-format
+msgid "substitution of %r is blocked"
+msgstr "substitution of %r is blocked"
+
+#: xmlschema/validators/groups.py:909
+msgid "usage of {0!r} with type {1} is blocked by head element"
+msgstr "usage of {0!r} with type {1} is blocked by head element"
+
+#: xmlschema/validators/groups.py:934
+msgid "{0!r} that matches {1!r} is not consistent with local declaration {2!r}"
+msgstr ""
+"{0!r} that matches {1!r} is not consistent with local declaration {2!r}"
+
+#: xmlschema/validators/groups.py:940
+msgid "Maybe a not equivalent type table between elements {0!r} and {1!r}."
+msgstr "Maybe a not equivalent type table between elements {0!r} and {1!r}."
+
+#: xmlschema/validators/groups.py:970
+msgid "an empty 'choice' group with minOccurs > 0 cannot validate any content"
+msgstr "an empty 'choice' group with minOccurs > 0 cannot validate any content"
+
+#: xmlschema/validators/groups.py:982 xmlschema/validators/groups.py:1242
+msgid "character data between child elements not allowed"
+msgstr "character data between child elements not allowed"
+
+#: xmlschema/validators/groups.py:995
+#, python-format
+msgid "XML data depth exceeded (MAX_XML_DEPTH=%r)"
+msgstr "XML data depth exceeded (MAX_XML_DEPTH=%r)"
+
+#: xmlschema/validators/groups.py:1202
+msgid "{!r} does not match any declared element of the model group"
+msgstr "{!r} does not match any declared element of the model group"
+
+#: xmlschema/validators/groups.py:1205
+msgid "{0} has an unknown prefix {1!r}"
+msgstr "{0} has an unknown prefix {1!r}"
+
+#: xmlschema/validators/groups.py:1238
+msgid "wrong content type {!r}"
+msgstr "wrong content type {!r}"
+
+#: xmlschema/validators/groups.py:1282
+msgid "maxOccurs must be (0 | 1) for 'all' model groups"
+msgstr "maxOccurs must be (0 | 1) for 'all' model groups"
+
+#: xmlschema/validators/groups.py:1311
+#, python-brace-format
+msgid "an xs:{0} group cannot include a reference to an xs:{1} group"
+msgstr "an xs:{0} group cannot include a reference to an xs:{1} group"
+
+#: xmlschema/validators/wildcards.py:76
+#, python-format
+msgid "wrong value %r in 'namespace' attribute"
+msgstr "wrong value %r in 'namespace' attribute"
+
+#: xmlschema/validators/wildcards.py:85
+#, python-format
+msgid "wrong value %r for 'processContents' attribute"
+msgstr "wrong value %r for 'processContents' attribute"
+
+#: xmlschema/validators/wildcards.py:94
+msgid "'namespace' and 'notNamespace' attributes are mutually exclusive"
+msgstr "'namespace' and 'notNamespace' attributes are mutually exclusive"
+
+#: xmlschema/validators/wildcards.py:105
+#, python-format
+msgid "wrong value %r in 'notNamespace' attribute"
+msgstr "wrong value %r in 'notNamespace' attribute"
+
+#: xmlschema/validators/wildcards.py:121
+msgid "wrong value for 'notQName' attribute"
+msgstr "wrong value for 'notQName' attribute"
+
+#: xmlschema/validators/wildcards.py:128
+#, python-format
+msgid "unmapped QName in 'notQName' attribute: %s"
+msgstr "unmapped QName in 'notQName' attribute: %s"
+
+#: xmlschema/validators/wildcards.py:132
+#, python-format
+msgid "wrong QName format in 'notQName' attribute: %s"
+msgstr "wrong QName format in 'notQName' attribute: %s"
+
+#: xmlschema/validators/wildcards.py:140
+msgid "the namespace of each QName in notQName is allowed by notNamespace"
+msgstr "the namespace of each QName in notQName is allowed by notNamespace"
+
+#: xmlschema/validators/wildcards.py:144
+msgid "names in notQName must be in namespaces that are allowed"
+msgstr "names in notQName must be in namespaces that are allowed"
+
+#: xmlschema/validators/wildcards.py:319
+msgid "not expressible wildcard namespace union: {0!r} V {1!r}:"
+msgstr "not expressible wildcard namespace union: {0!r} V {1!r}:"
+
+#: xmlschema/validators/wildcards.py:473 xmlschema/validators/wildcards.py:515
+msgid "element {!r} is not allowed here"
+msgstr "element {!r} is not allowed here"
+
+#: xmlschema/validators/wildcards.py:651 xmlschema/validators/wildcards.py:681
+#, python-format
+msgid "attribute %r not allowed"
+msgstr "attribute %r not allowed"
+
+#: xmlschema/validators/wildcards.py:663 xmlschema/validators/wildcards.py:693
+#, python-format
+msgid "attribute %r not found"
+msgstr "attribute %r not found"
+
+#: xmlschema/validators/wildcards.py:670 xmlschema/validators/wildcards.py:700
+msgid "unavailable namespace {!r}"
+msgstr "unavailable namespace {!r}"
+
+#: xmlschema/validators/wildcards.py:857
+#, python-format
+msgid "wrong value %r for 'mode' attribute"
+msgstr "wrong value %r for 'mode' attribute"
+
+#: xmlschema/validators/wildcards.py:863
+msgid ""
+"an openContent with mode='none' cannot have an <xs:any> child declaration"
+msgstr ""
+"an openContent with mode='none' cannot have an <xs:any> child declaration"
+
+#: xmlschema/validators/wildcards.py:867
+msgid "an <xs:any> child declaration is required"
+msgstr "an <xs:any> child declaration is required"
+
+#: xmlschema/validators/wildcards.py:908
+msgid "defaultOpenContent must be a child of the schema"
+msgstr "defaultOpenContent must be a child of the schema"
+
+#: xmlschema/validators/wildcards.py:911
+msgid "the attribute 'mode' of a defaultOpenContent cannot be 'none'"
+msgstr "the attribute 'mode' of a defaultOpenContent cannot be 'none'"
+
+#: xmlschema/validators/wildcards.py:914
+msgid "a defaultOpenContent declaration cannot be empty"
+msgstr "a defaultOpenContent declaration cannot be empty"
+
+#: xmlschema/validators/schemas.py:156
+msgid "XSD_VERSION must be '1.0' or '1.1'"
+msgstr "XSD_VERSION must be '1.0' or '1.1'"
+
+#: xmlschema/validators/schemas.py:336
+msgid "{!r} is not a valid loglevel"
+msgstr "{!r} is not a valid loglevel"
+
+#: xmlschema/validators/schemas.py:352
+msgid "no XSD source provided!"
+msgstr "no XSD source provided!"
+
+#: xmlschema/validators/schemas.py:380
+msgid "the attribute 'targetNamespace' cannot be an empty string"
+msgstr "the attribute 'targetNamespace' cannot be an empty string"
+
+#: xmlschema/validators/schemas.py:383
+msgid "wrong namespace ({0!r} instead of {1!r}) for XSD resource {2}"
+msgstr "wrong namespace ({0!r} instead of {1!r}) for XSD resource {2}"
+
+#: xmlschema/validators/schemas.py:460
+#, python-format
+msgid "'global_maps' argument must be an %r instance"
+msgstr "'global_maps' argument must be an %r instance"
+
+#: xmlschema/validators/schemas.py:542
+msgid "cannot change the global maps instance of a meta-schema"
+msgstr "cannot change the global maps instance of a meta-schema"
+
+#: xmlschema/validators/schemas.py:675 xmlschema/validators/schemas.py:970
+#, python-format
+msgid "meta-schema unavailable for %r"
+msgstr "meta-schema unavailable for %r"
+
+#: xmlschema/validators/schemas.py:682
+msgid "missing XSD namespace in meta-schema"
+msgstr "missing XSD namespace in meta-schema"
+
+#: xmlschema/validators/schemas.py:754
+msgid "Missing meta-schema source URL"
+msgstr "Missing meta-schema source URL"
+
+#: xmlschema/validators/schemas.py:766
+msgid ""
+"The argument 'base_schemas' must be a dictionary or a sequence of couples"
+msgstr ""
+"The argument 'base_schemas' must be a dictionary or a sequence of couples"
+
+#: xmlschema/validators/schemas.py:803 xmlschema/validators/schemas.py:815
+msgid "(restriction | list | union) expected"
+msgstr "(restriction | list | union) expected"
+
+#: xmlschema/validators/schemas.py:826
+msgid "missing attribute 'name' in a global simpleType"
+msgstr "missing attribute 'name' in a global simpleType"
+
+#: xmlschema/validators/schemas.py:831
+msgid "attribute 'name' not allowed for a local simpleType"
+msgstr "attribute 'name' not allowed for a local simpleType"
+
+#: xmlschema/validators/schemas.py:875
+msgid "'model' argument must be (sequence | choice | all)"
+msgstr "'model' argument must be (sequence | choice | all)"
+
+#: xmlschema/validators/schemas.py:990
+#, python-format
+msgid "schema %r is not built"
+msgstr "schema %r is not built"
+
+#: xmlschema/validators/schemas.py:1095
+msgid "the namespace {!r} is not loaded"
+msgstr "the namespace {!r} is not loaded"
+
+#: xmlschema/validators/schemas.py:1117
+msgid "'converter' argument must be a {0!r} subclass or instance: {1!r}"
+msgstr "'converter' argument must be a {0!r} subclass or instance: {1!r}"
+
+#: xmlschema/validators/schemas.py:1172
+msgid "cannot include schema {0!r}: {1}"
+msgstr "cannot include schema {0!r}: {1}"
+
+#: xmlschema/validators/schemas.py:1186
+#, python-format
+msgid "Redefine schema failed: %s"
+msgstr "Redefine schema failed: %s"
+
+#: xmlschema/validators/schemas.py:1191
+msgid "cannot redefine schema {0!r}: {1}"
+msgstr "cannot redefine schema {0!r}: {1}"
+
+#: xmlschema/validators/schemas.py:1207
+#, python-format
+msgid "Override schema failed: %s"
+msgstr "Override schema failed: %s"
+
+#: xmlschema/validators/schemas.py:1269
+msgid ""
+"if the 'namespace' attribute is not present on the import statement then the "
+"imported schema must have a 'targetNamespace'"
+msgstr ""
+"if the 'namespace' attribute is not present on the import statement then the "
+"imported schema must have a 'targetNamespace'"
+
+#: xmlschema/validators/schemas.py:1275
+msgid ""
+"the attribute 'namespace' must be different from schema's 'targetNamespace'"
+msgstr ""
+"the attribute 'namespace' must be different from schema's 'targetNamespace'"
+
+#: xmlschema/validators/schemas.py:1322
+msgid "cannot import namespace {0!r}: {1}"
+msgstr "cannot import namespace {0!r}: {1}"
+
+#: xmlschema/validators/schemas.py:1324
+#, python-format
+msgid "cannot import chameleon schema: %s"
+msgstr "cannot import chameleon schema: %s"
+
+#: xmlschema/validators/schemas.py:1388
+msgid "imported schema {0!r} has an unmatched namespace {1!r}"
+msgstr "imported schema {0!r} has an unmatched namespace {1!r}"
+
+#: xmlschema/validators/schemas.py:1435
+msgid "target directory {} is not empty"
+msgstr "target directory {} is not empty"
+
+#: xmlschema/validators/schemas.py:1438
+msgid "target {} is not a directory"
+msgstr "target {} is not a directory"
+
+#: xmlschema/validators/schemas.py:1441
+msgid "target parent directory {} does not exist"
+msgstr "target parent directory {} does not exist"
+
+#: xmlschema/validators/schemas.py:1444
+msgid "target parent {} is not a directory"
+msgstr "target parent {} is not a directory"
+
+#: xmlschema/validators/schemas.py:1537
+msgid "invalid attribute vc:minVersion value"
+msgstr "invalid attribute vc:minVersion value"
+
+#: xmlschema/validators/schemas.py:1546
+msgid "invalid attribute vc:maxVersion value"
+msgstr "invalid attribute vc:maxVersion value"
+
+#: xmlschema/validators/schemas.py:1622 xmlschema/validators/schemas.py:1629
+#: xmlschema/validators/schemas.py:1635
+msgid "{!r} is not a valid value for xs:QName"
+msgstr "{!r} is not a valid value for xs:QName"
+
+#: xmlschema/validators/schemas.py:1641
+msgid "prefix {!r} not found in namespace map"
+msgstr "prefix {!r} not found in namespace map"
+
+#: xmlschema/validators/schemas.py:1648
+msgid ""
+"the QName {!r} is mapped to no namespace, but this requires that there is an "
+"xs:import statement in the schema without the 'namespace' attribute."
+msgstr ""
+"the QName {!r} is mapped to no namespace, but this requires that there is an "
+"xs:import statement in the schema without the 'namespace' attribute."
+
+#: xmlschema/validators/schemas.py:1657
+msgid ""
+"the QName {0!r} is mapped to the namespace {1!r}, but this namespace has not "
+"an xs:import statement in the schema."
+msgstr ""
+"the QName {0!r} is mapped to the namespace {1!r}, but this namespace has not "
+"an xs:import statement in the schema."
+
+#: xmlschema/validators/schemas.py:1798 xmlschema/validators/schemas.py:1852
+#: xmlschema/validators/schemas.py:1997
+msgid "{!r} is not an element of the schema"
+msgstr "{!r} is not an element of the schema"
+
+#: xmlschema/validators/schemas.py:1826
+#, python-format
+msgid "IDREF %r not found in XML document"
+msgstr "IDREF %r not found in XML document"
+
+#: xmlschema/validators/schemas.py:2076
+msgid "encoding needs at least one XSD element declaration"
+msgstr "encoding needs at least one XSD element declaration"
+
+#: xmlschema/validators/schemas.py:2110
+#, python-format
+msgid "the path %r doesn't match any element of the schema!"
+msgstr "the path %r doesn't match any element of the schema!"
+
+#: xmlschema/validators/schemas.py:2112
+msgid ""
+"unable to select an element for decoding data, provide a valid 'path' "
+"argument."
+msgstr ""
+"unable to select an element for decoding data, provide a valid 'path' "
+"argument."
+
+#: xmlschema/validators/simple_types.py:133
+msgid "facets not allowed for a direct derivation of xs:anySimpleType"
+msgstr "facets not allowed for a direct derivation of xs:anySimpleType"
+
+#: xmlschema/validators/simple_types.py:137
+msgid "facets not allowed for a direct content derivation of xs:anySimpleType"
+msgstr "facets not allowed for a direct content derivation of xs:anySimpleType"
+
+#: xmlschema/validators/simple_types.py:143
+msgid "one or more facets are not applicable, admitted set is {!r}"
+msgstr "one or more facets are not applicable, admitted set is {!r}"
+
+#: xmlschema/validators/simple_types.py:149
+#, python-format
+msgid "facet group must have the same base type: %r"
+msgstr "facet group must have the same base type: %r"
+
+#: xmlschema/validators/simple_types.py:159
+msgid "'length' value must be non a negative integer"
+msgstr "'length' value must be non a negative integer"
+
+#: xmlschema/validators/simple_types.py:163
+msgid "'minLength' value must be less than or equal to 'length'"
+msgstr "'minLength' value must be less than or equal to 'length'"
+
+#: xmlschema/validators/simple_types.py:170
+msgid "cannot specify both 'length' and 'minLength'"
+msgstr "cannot specify both 'length' and 'minLength'"
+
+#: xmlschema/validators/simple_types.py:175
+msgid "'maxLength' value must be greater or equal to 'length'"
+msgstr "'maxLength' value must be greater or equal to 'length'"
+
+#: xmlschema/validators/simple_types.py:183
+msgid "cannot specify both 'length' and 'maxLength'"
+msgstr "cannot specify both 'length' and 'maxLength'"
+
+#: xmlschema/validators/simple_types.py:192
+msgid "'minLength' value must be a non negative integer"
+msgstr "'minLength' value must be a non negative integer"
+
+#: xmlschema/validators/simple_types.py:195
+msgid "'maxLength' value is less than 'minLength'"
+msgstr "'maxLength' value is less than 'minLength'"
+
+#: xmlschema/validators/simple_types.py:198
+msgid "'minLength' has a lesser value than parent"
+msgstr "'minLength' has a lesser value than parent"
+
+#: xmlschema/validators/simple_types.py:201
+msgid "'minLength' has a greater value than parent 'maxLength'"
+msgstr "'minLength' has a greater value than parent 'maxLength'"
+
+#: xmlschema/validators/simple_types.py:206
+msgid "'maxLength' value must be a non negative integer"
+msgstr "'maxLength' value must be a non negative integer"
+
+#: xmlschema/validators/simple_types.py:209
+msgid "'maxLength' has a lesser value than parent 'minLength'"
+msgstr "'maxLength' has a lesser value than parent 'minLength'"
+
+#: xmlschema/validators/simple_types.py:212
+msgid "'maxLength' has a greater value than parent"
+msgstr "'maxLength' has a greater value than parent"
+
+#: xmlschema/validators/simple_types.py:223
+msgid "cannot specify both 'minInclusive' and 'minExclusive'"
+msgstr "cannot specify both 'minInclusive' and 'minExclusive'"
+
+#: xmlschema/validators/simple_types.py:226
+msgid "'minInclusive' must be less or equal to 'maxInclusive'"
+msgstr "'minInclusive' must be less or equal to 'maxInclusive'"
+
+#: xmlschema/validators/simple_types.py:229
+msgid "'minInclusive' must be lesser than 'maxExclusive'"
+msgstr "'minInclusive' must be lesser than 'maxExclusive'"
+
+#: xmlschema/validators/simple_types.py:234
+msgid "'minExclusive' must be lesser than 'maxInclusive'"
+msgstr "'minExclusive' must be lesser than 'maxInclusive'"
+
+#: xmlschema/validators/simple_types.py:237
+msgid "'minExclusive' must be less or equal to 'maxExclusive'"
+msgstr "'minExclusive' must be less or equal to 'maxExclusive'"
+
+#: xmlschema/validators/simple_types.py:241
+msgid "cannot specify both 'maxInclusive' and 'maxExclusive'"
+msgstr "cannot specify both 'maxInclusive' and 'maxExclusive'"
+
+#: xmlschema/validators/simple_types.py:247
+msgid ""
+"fractionDigits facet value cannot be lesser than the value of totalDigits "
+"facet"
+msgstr ""
+"fractionDigits facet value cannot be lesser than the value of totalDigits "
+"facet"
+
+#: xmlschema/validators/simple_types.py:253
+msgid ""
+"totalDigits facet value cannot be greater than the value of the same facet "
+"in the base type"
+msgstr ""
+"totalDigits facet value cannot be greater than the value of the same facet "
+"in the base type"
+
+#: xmlschema/validators/simple_types.py:262
+#, python-format
+msgid ""
+"the explicitTimezone facet value cannot be changed if the base type has the "
+"same facet with value %r"
+msgstr ""
+"the explicitTimezone facet value cannot be changed if the base type has the "
+"same facet with value %r"
+
+#: xmlschema/validators/simple_types.py:460
+msgid "a {0!r} or {1!r} object required"
+msgstr "a {0!r} or {1!r} object required"
+
+#: xmlschema/validators/simple_types.py:615
+msgid "value is not an instance of {!r}"
+msgstr "value is not an instance of {!r}"
+
+#: xmlschema/validators/simple_types.py:640
+#: xmlschema/validators/simple_types.py:753
+#: xmlschema/validators/simple_types.py:1107
+msgid "invalid value {!r}"
+msgstr "invalid value {!r}"
+
+#: xmlschema/validators/simple_types.py:665
+#, python-format
+msgid "unmapped prefix %r in a QName"
+msgstr "unmapped prefix %r in a QName"
+
+#: xmlschema/validators/simple_types.py:699
+#: xmlschema/validators/simple_types.py:711
+msgid "duplicated xs:ID value {!r}"
+msgstr "duplicated xs:ID value {!r}"
+
+#: xmlschema/validators/simple_types.py:706
+msgid "no more than one attribute of type ID should be present in an element"
+msgstr "no more than one attribute of type ID should be present in an element"
+
+#: xmlschema/validators/simple_types.py:731
+msgid "boolean value {0!r} requires a {1!r} decoder"
+msgstr "boolean value {0!r} requires a {1!r} decoder"
+
+#: xmlschema/validators/simple_types.py:736
+msgid "{0!r} is not an instance of {1!r}"
+msgstr "{0!r} is not an instance of {1!r}"
+
+#: xmlschema/validators/simple_types.py:824
+#, python-format
+msgid "%r: a list must be based on atomic data types"
+msgstr "%r: a list must be based on atomic data types"
+
+#: xmlschema/validators/simple_types.py:843
+msgid "ambiguous list type declaration"
+msgstr "ambiguous list type declaration"
+
+#: xmlschema/validators/simple_types.py:851
+msgid "missing list type declaration"
+msgstr "missing list type declaration"
+
+#: xmlschema/validators/simple_types.py:864
+msgid "circular definition found for type {!r}"
+msgstr "circular definition found for type {!r}"
+
+#: xmlschema/validators/simple_types.py:869
+#, python-format
+msgid "'final' value of the itemType %r forbids derivation by list"
+msgstr "'final' value of the itemType %r forbids derivation by list"
+
+#: xmlschema/validators/simple_types.py:873
+#: xmlschema/validators/simple_types.py:1048
+#: xmlschema/validators/simple_types.py:1335
+msgid "cannot use xs:anyAtomicType as base type of a user-defined type"
+msgstr "cannot use xs:anyAtomicType as base type of a user-defined type"
+
+#: xmlschema/validators/simple_types.py:996
+#, python-format
+msgid "wrong value %r for attribute 'white_space'"
+msgstr "wrong value %r for attribute 'white_space'"
+
+#: xmlschema/validators/simple_types.py:1031
+msgid "circular definition found on xs:union type {!r}"
+msgstr "circular definition found on xs:union type {!r}"
+
+#: xmlschema/validators/simple_types.py:1035
+msgid "a {0!r} required, not {1!r}"
+msgstr "a {0!r} required, not {1!r}"
+
+#: xmlschema/validators/simple_types.py:1039
+#, python-format
+msgid "'final' value of the memberTypes %r forbids derivation by union"
+msgstr "'final' value of the memberTypes %r forbids derivation by union"
+
+#: xmlschema/validators/simple_types.py:1045
+msgid "missing xs:union type declarations"
+msgstr "missing xs:union type declarations"
+
+#: xmlschema/validators/simple_types.py:1128
+#, python-format
+msgid "no type suitable for decoding the values %r"
+msgstr "no type suitable for decoding the values %r"
+
+#: xmlschema/validators/simple_types.py:1162
+msgid "no type suitable for encoding the object"
+msgstr "no type suitable for encoding the object"
+
+#: xmlschema/validators/simple_types.py:1210
+msgid "'name' attribute in a local simpleType definition"
+msgstr "'name' attribute in a local simpleType definition"
+
+#: xmlschema/validators/simple_types.py:1252
+#, python-format
+msgid "wrong base type %r, an atomic type required"
+msgstr "wrong base type %r, an atomic type required"
+
+#: xmlschema/validators/simple_types.py:1258
+msgid "an xs:simpleType definition expected"
+msgstr "an xs:simpleType definition expected"
+
+#: xmlschema/validators/simple_types.py:1263
+msgid ""
+"when a complexType with simpleContent restricts a complexType with mixed and "
+"with emptiable content then a simpleType child declaration is required"
+msgstr ""
+"when a complexType with simpleContent restricts a complexType with mixed and "
+"with emptiable content then a simpleType child declaration is required"
+
+#: xmlschema/validators/simple_types.py:1268
+#, python-format
+msgid "simpleType restriction of %r is not allowed"
+msgstr "simpleType restriction of %r is not allowed"
+
+#: xmlschema/validators/simple_types.py:1277
+msgid "unexpected tag after attribute declarations"
+msgstr "unexpected tag after attribute declarations"
+
+#: xmlschema/validators/simple_types.py:1282
+msgid "duplicated simpleType declaration"
+msgstr "duplicated simpleType declaration"
+
+#: xmlschema/validators/simple_types.py:1304
+msgid "restriction with 'base' attribute and simpleType declaration"
+msgstr "restriction with 'base' attribute and simpleType declaration"
+
+#: xmlschema/validators/simple_types.py:1312
+#, python-format
+msgid "unexpected tag %r in restriction"
+msgstr "unexpected tag %r in restriction"
+
+#: xmlschema/validators/simple_types.py:1318
+#, python-format
+msgid "multiple %r constraint facet"
+msgstr "multiple %r constraint facet"
+
+#: xmlschema/validators/simple_types.py:1330
+msgid "missing base type in restriction"
+msgstr "missing base type in restriction"
+
+#: xmlschema/validators/simple_types.py:1332
+#, python-format
+msgid "'final' value of the baseType %r forbids derivation by restriction"
+msgstr "'final' value of the baseType %r forbids derivation by restriction"
+
+#: xmlschema/validators/simple_types.py:1381
+#: xmlschema/validators/simple_types.py:1430
+#, python-format
+msgid ""
+"wrong base type %r: a simpleType or a complexType with simple or mixed "
+"content required"
+msgstr ""
+"wrong base type %r: a simpleType or a complexType with simple or mixed "
+"content required"
+
+#: xmlschema/validators/identities.py:86
+msgid "'xpath' attribute required"
+msgstr "'xpath' attribute required"
+
+#: xmlschema/validators/identities.py:98
+msgid "invalid XPath expression for an {}"
+msgstr "invalid XPath expression for an {}"
+
+#: xmlschema/validators/identities.py:182
+msgid "missing required attribute 'name'"
+msgstr "missing required attribute 'name'"
+
+#: xmlschema/validators/identities.py:190
+msgid "missing 'selector' declaration"
+msgstr "missing 'selector' declaration"
+
+#: xmlschema/validators/identities.py:202
+msgid "unknown identity constraint {!r}"
+msgstr "unknown identity constraint {!r}"
+
+#: xmlschema/validators/identities.py:207
+msgid "attribute 'ref' points to a different kind constraint"
+msgstr "attribute 'ref' points to a different kind constraint"
+
+#: xmlschema/validators/identities.py:296
+msgid "missing key field {0!r} for {1!r}"
+msgstr "missing key field {0!r} for {1!r}"
+
+#: xmlschema/validators/identities.py:304
+#, python-format
+msgid "%r field doesn't have a simple type!"
+msgstr "%r field doesn't have a simple type!"
+
+#: xmlschema/validators/identities.py:325
+#, python-format
+msgid "%r field selects multiple values!"
+msgstr "%r field selects multiple values!"
+
+#: xmlschema/validators/identities.py:359
+msgid "missing required attribute 'refer'"
+msgstr "missing required attribute 'refer'"
+
+#: xmlschema/validators/identities.py:381
+#, python-format
+msgid "key/unique identity constraint %r is missing"
+msgstr "key/unique identity constraint %r is missing"
+
+#: xmlschema/validators/identities.py:386
+#, python-format
+msgid "reference to a non key/unique identity constraint %r"
+msgstr "reference to a non key/unique identity constraint %r"
+
+#: xmlschema/validators/identities.py:389
+msgid "field cardinality mismatch between {0!r} and {1!r}"
+msgstr "field cardinality mismatch between {0!r} and {1!r}"
+
+#: xmlschema/validators/identities.py:459
+msgid "duplicated value {0!r} for {1!r}"
+msgstr "duplicated value {0!r} for {1!r}"
+
+#: xmlschema/validators/xsdbase.py:51
+#, python-format
+msgid "validation mode can be 'strict', 'lax' or 'skip': %r"
+msgstr "validation mode can be 'strict', 'lax' or 'skip': %r"
+
+#: xmlschema/validators/xsdbase.py:254
+msgid ""
+"wrong value {0!r} for 'xpathDefaultNamespace' attribute, can be (anyURI | "
+"{1})."
+msgstr ""
+"wrong value {0!r} for 'xpathDefaultNamespace' attribute, can be (anyURI | "
+"{1})."
+
+#: xmlschema/validators/xsdbase.py:405
+#, python-format
+msgid "missing attribute 'name' in a global %r"
+msgstr "missing attribute 'name' in a global %r"
+
+#: xmlschema/validators/xsdbase.py:408
+#, python-format
+msgid "missing both attributes 'name' and 'ref' in local %r"
+msgstr "missing both attributes 'name' and 'ref' in local %r"
+
+#: xmlschema/validators/xsdbase.py:411
+msgid "attributes 'name' and 'ref' are mutually exclusive"
+msgstr "attributes 'name' and 'ref' are mutually exclusive"
+
+#: xmlschema/validators/xsdbase.py:414
+#, python-format
+msgid "attribute 'ref' not allowed in a global %r"
+msgstr "attribute 'ref' not allowed in a global %r"
+
+#: xmlschema/validators/xsdbase.py:423
+msgid "a reference component cannot have child definitions/declarations"
+msgstr "a reference component cannot have child definitions/declarations"
+
+#: xmlschema/validators/xsdbase.py:438
+msgid "too many XSD components, unexpected {0!r} found at position {1}"
+msgstr "too many XSD components, unexpected {0!r} found at position {1}"
+
+#: xmlschema/validators/xsdbase.py:454
+msgid ""
+"attribute 'name' must be present when 'targetNamespace' attribute is provided"
+msgstr ""
+"attribute 'name' must be present when 'targetNamespace' attribute is provided"
+
+#: xmlschema/validators/xsdbase.py:458
+msgid ""
+"attribute 'form' must be absent when 'targetNamespace' attribute is provided"
+msgstr ""
+"attribute 'form' must be absent when 'targetNamespace' attribute is provided"
+
+#: xmlschema/validators/xsdbase.py:463
+#, python-format
+msgid "a global %s must have the same namespace as its parent schema"
+msgstr "a global %s must have the same namespace as its parent schema"
+
+#: xmlschema/validators/xsdbase.py:471
+msgid ""
+"a declaration contained in a global complexType must have the same namespace "
+"as its parent schema"
+msgstr ""
+"a declaration contained in a global complexType must have the same namespace "
+"as its parent schema"
+
+#: xmlschema/validators/xsdbase.py:591
+msgid "parent circularity from {}"
+msgstr "parent circularity from {}"
+
+#: xmlschema/validators/helpers.py:44
+#, python-format
+msgid "wrong value %r for attribute %r"
+msgstr "wrong value %r for attribute %r"
+
+#: xmlschema/validators/helpers.py:59
+msgid "value is not a valid xs:decimal"
+msgstr "value is not a valid xs:decimal"
+
+#: xmlschema/validators/helpers.py:65
+msgid "value is not an xs:QName"
+msgstr "value is not an xs:QName"
+
+#: xmlschema/validators/helpers.py:71 xmlschema/validators/helpers.py:77
+#: xmlschema/validators/helpers.py:83 xmlschema/validators/helpers.py:89
+#: xmlschema/validators/helpers.py:95 xmlschema/validators/helpers.py:101
+#: xmlschema/validators/helpers.py:107 xmlschema/validators/helpers.py:113
+msgid "value must be {:s}"
+msgstr "value must be {:s}"
+
+#: xmlschema/validators/helpers.py:119
+msgid "value must be negative"
+msgstr "value must be negative"
+
+#: xmlschema/validators/helpers.py:125
+msgid "value must be positive"
+msgstr "value must be positive"
+
+#: xmlschema/validators/helpers.py:131
+msgid "value must be non positive"
+msgstr "value must be non positive"
+
+#: xmlschema/validators/helpers.py:137
+msgid "value must be non negative"
+msgstr "value must be non negative"
+
+#: xmlschema/validators/helpers.py:144
+msgid "not an hexadecimal number"
+msgstr "not an hexadecimal number"
+
+#: xmlschema/validators/helpers.py:157
+msgid "not a base64 encoding"
+msgstr "not a base64 encoding"
+
+#: xmlschema/validators/helpers.py:162
+msgid "no value is allowed for xs:error type"
+msgstr "no value is allowed for xs:error type"
+
+#: xmlschema/validators/helpers.py:174
+msgid "{!r} is not a boolean value"
+msgstr "{!r} is not a boolean value"
diff --git a/xmlschema/locale/it/LC_MESSAGES/xmlschema.mo b/xmlschema/locale/it/LC_MESSAGES/xmlschema.mo
new file mode 100644
index 0000000..95f4b88
Binary files /dev/null and b/xmlschema/locale/it/LC_MESSAGES/xmlschema.mo differ
diff --git a/xmlschema/locale/it/LC_MESSAGES/xmlschema.po b/xmlschema/locale/it/LC_MESSAGES/xmlschema.po
new file mode 100644
index 0000000..b431ef9
--- /dev/null
+++ b/xmlschema/locale/it/LC_MESSAGES/xmlschema.po
@@ -0,0 +1,1819 @@
+# Italian translations for xmlschema package.
+# Copyright (C) 2022 , 2016, SISSA (International School for Advanced Studies).
+# This file is distributed under the same license as the xmlschema package.
+# Davide Brunato <brunato@sissa.it>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xmlschema\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-05-12 17:25+0200\n"
+"PO-Revision-Date: 2022-05-09 16:08+0200\n"
+"Last-Translator: Davide Brunato <brunato@sissa.it>\n"
+"Language-Team: Italian\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: xmlschema/validators/complex_types.py:134
+msgid "missing attribute 'name' in a global complexType"
+msgstr "attributo 'name' mancante in tipo complesso globale"
+
+#: xmlschema/validators/complex_types.py:139
+msgid "attribute 'name' not allowed in a local complexType"
+msgstr "attributo 'name' non ammesso in tipo complesso locale"
+
+#: xmlschema/validators/complex_types.py:162
+msgid "'mixed' attribute not allowed with simpleContent"
+msgstr "l'attributo 'mixed' non è ammesso se il contenuto è simpleContent"
+
+#: xmlschema/validators/complex_types.py:177
+#, python-format
+msgid "unexpected tag %r after simpleContent declaration:"
+msgstr "tag %r non previsto dopo dichiarazione simpleContent"
+
+#: xmlschema/validators/complex_types.py:188
+msgid ""
+"value of 'mixed' attribute in complexType and complexContent must be the same"
+msgstr ""
+"il valore dell'attributo 'mixed' di un complexType e del suo complexContent "
+"dev'essere uguale"
+
+#: xmlschema/validators/complex_types.py:208
+#, python-format
+msgid "unexpected tag %r after complexContent declaration"
+msgstr "tag %r non previsto dopo dichiarazione complexContent"
+
+#: xmlschema/validators/complex_types.py:232
+#, python-format
+msgid "unexpected tag %r for complexType content"
+msgstr "tag %r non previsto per un contenuto di complexType"
+
+#: xmlschema/validators/complex_types.py:240
+#: xmlschema/validators/simple_types.py:1227
+msgid "wrong definition with self-reference"
+msgstr "definizione errata con autoreferenzialità"
+
+#: xmlschema/validators/complex_types.py:243
+#: xmlschema/validators/simple_types.py:1234
+msgid "wrong redefinition without self-reference"
+msgstr "ridefinizione errata senza autoreferenzialità"
+
+#: xmlschema/validators/complex_types.py:254
+msgid "restriction or extension tag expected"
+msgstr "previsto tag di restrizione o estensione"
+
+#: xmlschema/validators/complex_types.py:261
+msgid "{!r} is expected to have a redefined/overridden component"
+msgstr "è previsto che {!r} abbia almeno un componente ridefinito/sostituito"
+
+#: xmlschema/validators/complex_types.py:266
+msgid "{0!r} derivation not allowed for {1!r}"
+msgstr "derivazione {0!r} non ammessa per {1!r}"
+
+#: xmlschema/validators/complex_types.py:276
+msgid "'base' attribute required"
+msgstr "attributo 'base' richiesto"
+
+#: xmlschema/validators/complex_types.py:285
+#, python-format
+msgid "missing base type %r"
+msgstr "tipo base %r mancante"
+
+#: xmlschema/validators/complex_types.py:293
+#: xmlschema/validators/simple_types.py:1247
+msgid "circular definition found between {0!r} and {1!r}"
+msgstr "definizione circolare trovata tra {0!r} e {1!r}"
+
+#: xmlschema/validators/complex_types.py:297
+#: xmlschema/validators/complex_types.py:311
+msgid "a complexType ancestor required: {!r}"
+msgstr "è richiesto un antenato complexType: {!r}"
+
+#: xmlschema/validators/complex_types.py:302
+#, python-format
+msgid "derivation by %r blocked by attribute 'final' in base type"
+msgstr "derivazione per %r bloccata de attributo 'final' nel tipo base"
+
+#: xmlschema/validators/complex_types.py:319
+msgid "a not empty simpleContent cannot restrict an empty content type"
+msgstr ""
+"un simpleContent non vuoto non può essere restrizione di un tipo di "
+"contenuto vuoto"
+
+#: xmlschema/validators/complex_types.py:326
+msgid "content type is not a restriction of base content"
+msgstr "il tipo di contenuto non è una restrizione di quello di base"
+
+#: xmlschema/validators/complex_types.py:332
+msgid "with simpleContent cannot restrict an element-only content type"
+msgstr ""
+"con un simpleContent non si può restringere un tipo di contenuto element-only"
+
+#: xmlschema/validators/complex_types.py:344 xmlschema/validators/groups.py:478
+#, python-format
+msgid "unexpected tag %r"
+msgstr "tag %r inatteso"
+
+#: xmlschema/validators/complex_types.py:354
+#, python-format
+msgid "base type %r has no simple content"
+msgstr "il tipo base %r non ha contenuto semplice"
+
+#: xmlschema/validators/complex_types.py:362
+msgid "the base type is not derivable by restriction"
+msgstr "il tipo base non è derivabile per restrizione"
+
+#: xmlschema/validators/complex_types.py:365
+#: xmlschema/validators/complex_types.py:458
+#: xmlschema/validators/complex_types.py:896
+#, python-format
+msgid "base %r is simple or has a simple content"
+msgstr "la base %r è semplice o ha contenuto semplice"
+
+#: xmlschema/validators/complex_types.py:377
+#, python-brace-format
+msgid ""
+"restriction of an xs:{0} with more than one particle with xs:{1} is forbidden"
+msgstr ""
+"la restrizione di un xs:{0} avente più di una particella con xs:{1} è "
+"proibita"
+
+#: xmlschema/validators/complex_types.py:389
+msgid "derived a mixed content from a base type that has element-only content"
+msgstr ""
+"derivazione di contenuto misto da un tipo base con contenuto element-only"
+
+#: xmlschema/validators/complex_types.py:392
+msgid "an empty content derivation from base type that has not empty content"
+msgstr ""
+"derivazione di un contenuto vuoto da un tipo base con contenuto non vuoto"
+
+#: xmlschema/validators/complex_types.py:403
+msgid "{0!r} is not a restriction of the base type {1!r}"
+msgstr "{0!r} non è una restrizione del tipo base {1!r}"
+
+#: xmlschema/validators/complex_types.py:412
+#: xmlschema/validators/complex_types.py:901
+msgid "the base type is not derivable by extension"
+msgstr "il tipo base non è derivabile per estensione"
+
+#: xmlschema/validators/complex_types.py:445
+#: xmlschema/validators/complex_types.py:952
+#: xmlschema/validators/complex_types.py:1002
+#, python-format
+msgid ""
+"base has a different content type (mixed=%r) and the extension group is not "
+"empty."
+msgstr ""
+"la base ha un diverso tipo di contenuto (mixed=%r) e il gruppo di estensione "
+"non è vuoto"
+
+#: xmlschema/validators/complex_types.py:465
+msgid "cannot extend a complex content with xs:all"
+msgstr "non si può estendere un contenuto complesso con xs:all"
+
+#: xmlschema/validators/complex_types.py:468
+msgid "xs:sequence cannot extend xs:all"
+msgstr "xs:sequence non può estendere xs:all"
+
+#: xmlschema/validators/complex_types.py:478
+msgid "XSD 1.0 does not allow extension of a not empty 'all' model group"
+msgstr "XSD 1.0 non permette l'estensione di un gruppo modello 'all' non vuoto"
+
+#: xmlschema/validators/complex_types.py:481
+#, python-format
+msgid ""
+"base has a different content type (mixed=%r) and the extension group is not "
+"empty"
+msgstr ""
+"la base ha un diverso tipo di contenuto (mixed=%r) e il gruppo di estensione "
+"non è vuoto"
+
+#: xmlschema/validators/complex_types.py:495
+#: xmlschema/validators/complex_types.py:1017
+msgid "extended type has a mixed content but the base is element-only"
+msgstr "il tipo esteso ha un contenuto misto ma la base è element-only"
+
+#: xmlschema/validators/complex_types.py:655
+msgid "global type {!r} is not built"
+msgstr "il tipo globale {!r} non è costruito"
+
+#: xmlschema/validators/complex_types.py:721
+#: xmlschema/validators/complex_types.py:746
+#, python-format
+msgid "cannot decode %(obj)r data with %(decoder)r"
+msgstr "non posso decodificare i dati di %(obj)r con %(decoder)r"
+
+#: xmlschema/validators/complex_types.py:847
+msgid "the simple content of {!r} is not a valid simple type in XSD 1.1"
+msgstr "il contenuto semplice di {!r} non è un tipo semplice valido in XSD 1.1"
+
+#: xmlschema/validators/complex_types.py:854
+msgid "openContent mismatch between type and model group"
+msgstr "openContent non corrispondente tra il tipo e il modello di gruppo"
+
+#: xmlschema/validators/complex_types.py:869
+#, python-format
+msgid "attribute %r must be inheritable"
+msgstr "l'attributo %r dev'essere ereditabile"
+
+#: xmlschema/validators/complex_types.py:885
+msgid "default attribute {!r} is already declared in the complex type"
+msgstr "l'attributo di default {!r} è già dichiarato nel tipo complesso"
+
+#: xmlschema/validators/complex_types.py:956
+msgid "cannot extend an empty mixed content with an xs:all"
+msgstr "non si può estendere un contenuto misto vuoto con xs:all"
+
+#: xmlschema/validators/complex_types.py:974
+#, python-format
+msgid "xs:all cannot extend a not empty xs:%s"
+msgstr "xs:all non può estendere un xs:%s non vuoto"
+
+#: xmlschema/validators/complex_types.py:989
+msgid "cannot extend a not empty 'all' model group with a different model"
+msgstr "non si può estendere un gruppo 'all' non vuoto con un modello diverso"
+
+#: xmlschema/validators/complex_types.py:992
+msgid "when extend an xs:all group minOccurs must be the same"
+msgstr ""
+"quando si estende un gruppo xs:all il valore di minOccurs dev'essere lo "
+"stesso"
+
+#: xmlschema/validators/complex_types.py:995
+msgid "cannot extend an xs:all group with mixed empty content"
+msgstr "non si può estendere un gruppo xs:all con un contenuto misto vuoto"
+
+#: xmlschema/validators/complex_types.py:1035
+msgid "{0!r} is not an extension of the base type {1!r}"
+msgstr "{0!r} non è un'estensione del tipo base {1!r}"
+
+#: xmlschema/validators/notations.py:39
+msgid "a notation declaration must be global"
+msgstr "una dichiarazione notation dev'essere globale"
+
+#: xmlschema/validators/notations.py:43
+msgid "a notation must have a 'name' attribute"
+msgstr "una notation deve avere l'attributo 'name'"
+
+#: xmlschema/validators/notations.py:46
+msgid "a notation must have a 'public' or a 'system' attribute"
+msgstr "una notation deve avere un attributo 'public' o 'system'"
+
+#: xmlschema/validators/particles.py:122
+msgid "minOccurs value is not an integer value"
+msgstr "il valore di minOccurs non è un valore intero"
+
+#: xmlschema/validators/particles.py:126
+msgid "minOccurs value must be a non negative integer"
+msgstr "il valore di minOccurs dev'essere un intero non negativo"
+
+#: xmlschema/validators/particles.py:134
+msgid "minOccurs must be lesser or equal than maxOccurs"
+msgstr "minOccurs dev'essere inferiore o uguale a maxOccurs"
+
+#: xmlschema/validators/particles.py:142
+msgid "maxOccurs value must be a non negative integer or 'unbounded'"
+msgstr "il valore di maxOccurs dev'essere un intero non negativo o 'unbounded'"
+
+#: xmlschema/validators/particles.py:146
+msgid "maxOccurs must be 'unbounded' or greater than minOccurs"
+msgstr "maxOccurs dev'essere 'unbounded' o maggiore di minOccurs"
+
+#: xmlschema/validators/assertions.py:76
+msgid "base_type={!r} is not a complexType definition"
+msgstr "base_type={!r} non è una definizione complexType"
+
+#: xmlschema/validators/elements.py:162
+#, python-format
+msgid "unknown element %r"
+msgstr "elemento %r sconosciuto"
+
+#: xmlschema/validators/elements.py:179
+msgid "attribute {!r} is not allowed when element reference is used"
+msgstr ""
+"l'attributo {!r} non è ammesso quando si una un riferimento ad elemento"
+
+#: xmlschema/validators/elements.py:200
+msgid "local scope elements cannot have abstract attribute"
+msgstr "gli elementi locali non possono avere l'attributo 'abstract'"
+
+#: xmlschema/validators/elements.py:227
+msgid "attribute {!r} is not allowed in a global element declaration"
+msgstr ""
+"l'attributo {!r} non è ammesso in una dichiarazione di elemento globale"
+
+#: xmlschema/validators/elements.py:232
+msgid "attribute {!r} not allowed in a local element declaration"
+msgstr "l'attributo {!r} non è ammesso in una dichiarazione di elemento locale"
+
+#: xmlschema/validators/elements.py:250 xmlschema/validators/elements.py:1460
+#: xmlschema/validators/simple_types.py:859
+#: xmlschema/validators/simple_types.py:1024
+#: xmlschema/validators/simple_types.py:1240
+msgid "unknown type {!r}"
+msgstr "tipo {!r} sconosciuto"
+
+#: xmlschema/validators/elements.py:255
+msgid ""
+"the attribute 'type' and a xs:{} local declaration are mutually exclusive"
+msgstr ""
+"l'attributo 'type' e una dichiarazione xs:{} locale sono mutuamente esclusivi"
+
+#: xmlschema/validators/elements.py:274 xmlschema/validators/attributes.py:165
+msgid "'default' and 'fixed' attributes are mutually exclusive"
+msgstr "gli attributi 'default' e 'fixed' sono mutuamente esclusivi"
+
+#: xmlschema/validators/elements.py:278
+msgid "'default' value {!r} is not compatible with element's type"
+msgstr "il valore di default {!r} non è compatibile con il tipo dell'elemento"
+
+#: xmlschema/validators/elements.py:282
+msgid "xs:ID or a type derived from xs:ID cannot have a default value"
+msgstr ""
+"xs:ID o un tipo derivato da xs:ID non possono avere un valore di default"
+
+#: xmlschema/validators/elements.py:288
+msgid "'fixed' value {!r} is not compatible with element's type"
+msgstr "il valore di fisso {!r} non è compatibile con il tipo dell'elemento"
+
+#: xmlschema/validators/elements.py:292
+msgid "xs:ID or a type derived from xs:ID cannot have a fixed value"
+msgstr "xs:ID o un tipo derivato da xs:ID non possono avere un valore fisso"
+
+#: xmlschema/validators/elements.py:311 xmlschema/validators/elements.py:319
+#, python-format
+msgid "duplicated identity constraint %r:"
+msgstr "vincolo di identità %r duplicato"
+
+#: xmlschema/validators/elements.py:341
+#, python-format
+msgid "unknown substitutionGroup %r"
+msgstr "gruppo di sostituzione %r sconosciuto"
+
+#: xmlschema/validators/elements.py:346
+#, python-format
+msgid "circularity found for substitutionGroup %r"
+msgstr "trovata circolarità per il gruppo di sostituzione %r"
+
+#: xmlschema/validators/elements.py:361
+msgid ""
+"{0!r} type is not of the same or a derivation of the head element {1!r} type"
+msgstr ""
+"il tipo {0!r} non è lo stesso o non è una derivazione del tipo dell'elemento "
+"di testa {1!r}"
+
+#: xmlschema/validators/elements.py:365
+#, python-format
+msgid ""
+"head element %r can't be substituted by an element that has a derivation of "
+"its type"
+msgstr ""
+"l'elemento di testa %r non può essere sostituito da un elemento che ha una "
+"derivazione del suo tipo"
+
+#: xmlschema/validators/elements.py:369
+#, python-format
+msgid ""
+"head element %r can't be substituted by an element that has an extension of "
+"its type"
+msgstr ""
+"l'elemento di testa %r non può essere sostituito da un elemento che ha una "
+"estensione del suo tipo"
+
+#: xmlschema/validators/elements.py:373
+#, python-format
+msgid ""
+"head element %r can't be substituted by an element that has a restriction of "
+"its type"
+msgstr ""
+"l'elemento di testa %r non può essere sostituito da un elemento che ha una "
+"restrizione del suo tipo"
+
+#: xmlschema/validators/elements.py:547
+msgid "schemaLocation declaration after namespace start"
+msgstr "dichiarazione schemaLocation dopo l'inizio dello spazio dei nomi"
+
+#: xmlschema/validators/elements.py:556
+#, python-format
+msgid "missing dynamic loaded schema from %s"
+msgstr "manca lo schema caricato dinamicamente da %s"
+
+#: xmlschema/validators/elements.py:559
+msgid "dynamic loaded schema change the assessment"
+msgstr "lo schema a caricamento dinamico cambia la valutazione"
+
+#: xmlschema/validators/elements.py:610
+msgid "cannot use an abstract element for validation"
+msgstr "non è possibile utilizzare un elemento astratto per la convalida"
+
+#: xmlschema/validators/elements.py:667 xmlschema/validators/identities.py:219
+msgid "selector xpath expression can only select elements"
+msgstr "l'espressione xpath di un selector può selezionare solo elementi"
+
+#: xmlschema/validators/elements.py:673
+#, python-format
+msgid "usage of %r is blocked"
+msgstr "l'utilizzo di %r è bloccato"
+
+#: xmlschema/validators/elements.py:677
+#, python-format
+msgid "%r is abstract"
+msgstr "%r è astratto"
+
+#: xmlschema/validators/elements.py:705
+msgid "element is not nillable"
+msgstr "l'elemento non è annullabile"
+
+#: xmlschema/validators/elements.py:708
+msgid "xsi:nil attribute must have a boolean value"
+msgstr "l'attributo xsi:nil deve avere un valore booleano"
+
+#: xmlschema/validators/elements.py:713
+msgid "xsi:nil='true' but the element has a fixed value"
+msgstr "xsi:nil='true' ma l'elemento ha un valore fisso"
+
+#: xmlschema/validators/elements.py:716
+msgid "xsi:nil='true' but the element is not empty"
+msgstr "xsi:nil='true' ma l'elemento non è vuoto"
+
+#: xmlschema/validators/elements.py:722
+msgid "character data is not allowed because content is empty"
+msgstr "i caratteri non sono consentiti perché il contenuto è vuoto"
+
+#: xmlschema/validators/elements.py:744 xmlschema/validators/elements.py:760
+#, python-format
+msgid "must have the fixed value %r"
+msgstr "deve avere il valore fisso %r"
+
+#: xmlschema/validators/elements.py:749
+msgid "a simple content element can't have child elements"
+msgstr "un elemento con contenuto semplice non può avere elementi figlio"
+
+#: xmlschema/validators/elements.py:778 xmlschema/validators/attributes.py:237
+msgid ""
+"cannot validate against xs:NOTATION directly, only against a subtype with an "
+"enumeration facet"
+msgstr ""
+"non si può convalidare direttamente con xs:NOTATION, solo con un sottotipo "
+"con facet di enumerazione"
+
+#: xmlschema/validators/elements.py:782 xmlschema/validators/attributes.py:241
+msgid "missing enumeration facet in xs:NOTATION subtype"
+msgstr "facet di enumerazione mancante nel sottotipo di xs:NOTATION"
+
+#: xmlschema/validators/elements.py:1245
+msgid "test attribute missing in non-final alternative"
+msgstr "attributo test mancante in alternativa non finale"
+
+#: xmlschema/validators/elements.py:1370
+msgid "Maybe a not equivalent type table between elements {0!r} and {1!r}"
+msgstr ""
+"Forse una tabella di tipo non equivalente tra gli elementi {0!r} e {1!r}"
+
+#: xmlschema/validators/elements.py:1446
+msgid "missing 'type' attribute"
+msgstr "attributo 'type' mancante"
+
+#: xmlschema/validators/elements.py:1454
+msgid "declared type is not derived from {!r}"
+msgstr "il tipo dichiarato non è derivato da {!r}"
+
+#: xmlschema/validators/elements.py:1464
+msgid "type {0!r} is not derived from {1!r}"
+msgstr "il tipo {0!r} non è derivato da {1!r}"
+
+#: xmlschema/validators/elements.py:1469
+#, python-format
+msgid ""
+"the attribute 'type' and the xs:%s local declaration are mutually exclusive"
+msgstr ""
+"l'attributo 'type' e la dichiarazione locale xs:%s si escludono a vicenda"
+
+#: xmlschema/validators/global_maps.py:77
+msgid "global {0} with name={1!r} is already defined"
+msgstr "{0} globale con nome={1!r} è già definito"
+
+#: xmlschema/validators/global_maps.py:90
+msgid "multiple redefinition for {0} {1!r}"
+msgstr "ridefinizione multipla per {0} {1!r}"
+
+#: xmlschema/validators/global_maps.py:102
+msgid "circular redefinition for {0} {1!r}"
+msgstr "ridefinizione circolare per {0} {1!r}"
+
+#: xmlschema/validators/global_maps.py:117
+msgid "not a redefinition!"
+msgstr "non è una ridefinizione!"
+
+#: xmlschema/validators/global_maps.py:234
+msgid "wrong tag {!r} for an XSD global definition/declaration"
+msgstr "tag errato {!r} per una dichiarazione/definizione globale XSD"
+
+#: xmlschema/validators/global_maps.py:313
+#: xmlschema/validators/global_maps.py:330
+msgid "wrong element {0!r} for map {1!r}"
+msgstr "elemento sbagliato {0!r} per la mappa {1!r}"
+
+#: xmlschema/validators/global_maps.py:339
+msgid "redefined schema {!r} has a different targetNamespace"
+msgstr "lo schema ridefinito {!r} ha un targetNamespace diverso"
+
+#: xmlschema/validators/global_maps.py:350
+msgid "unexpected instance {!r} in global map"
+msgstr "istanza imprevista {!r} nella mappa globale"
+
+#: xmlschema/validators/global_maps.py:382
+msgid "{0!r} cannot substitute {1!r}"
+msgstr "{0!r} non può sostituire {1!r}"
+
+#: xmlschema/validators/global_maps.py:578
+msgid "missing XSD namespace in meta-schema instance {!r}"
+msgstr "spazio dei nomi XSD mancante nell'istanza del meta-schema {!r}"
+
+#: xmlschema/validators/global_maps.py:587
+msgid "missing default meta-schema instance {!r}"
+msgstr "istanza {!r} del meta-schema predefinito mancante"
+
+#: xmlschema/validators/global_maps.py:639
+msgid "defaultAttributes={0!r} doesn't match any attribute group of {1!r}"
+msgstr ""
+"defaultAttributes={0!r} non corrisponde a nessun gruppo di attributi di {1!r}"
+
+#: xmlschema/validators/global_maps.py:682
+msgid "global element not built!"
+msgstr "elemento globale non costruito!"
+
+#: xmlschema/validators/global_maps.py:684
+msgid "circularity found for substitution group with head element {}"
+msgstr ""
+"circolarità trovata per il gruppo di sostituzione con elemento di testa {}"
+
+#: xmlschema/validators/global_maps.py:689
+#, python-format
+msgid "global map has unbuilt components: %r"
+msgstr "la mappa globale ha componenti non costruiti: %r"
+
+#: xmlschema/validators/global_maps.py:694
+msgid "global group not built!"
+msgstr "gruppo globale non costruito!"
+
+#: xmlschema/validators/global_maps.py:701
+msgid "the redefined group is an illegal restriction"
+msgstr "il gruppo ridefinito è una restrizione illegale"
+
+#: xmlschema/validators/global_maps.py:717
+msgid "the derived group is an illegal restriction"
+msgstr "il gruppo derivato è una restrizione illegale"
+
+#: xmlschema/validators/global_maps.py:727
+msgid "restriction has an open content but base type has not"
+msgstr "la restrizione ha un contenuto aperto ma il tipo di base no"
+
+#: xmlschema/validators/global_maps.py:733
+msgid ""
+"can't verify the content model of {!r} due to exceeding of maximum recursion "
+"depth"
+msgstr ""
+"impossibile verificare il modello di contenuto di {!r} a causa del "
+"superamento della profondità massima di ricorsione"
+
+#: xmlschema/validators/facets.py:63
+msgid "invalid type {!r} provided"
+msgstr "tipo non valido {!r} fornito"
+
+#: xmlschema/validators/facets.py:84
+msgid "{0!r} facet value is fixed to {1!r}"
+msgstr "il valore della facet {0!r} è fissato a {1!r}"
+
+#: xmlschema/validators/facets.py:135 xmlschema/validators/facets.py:138
+msgid "facet value can be only 'collapse'"
+msgstr "il valore della facet può essere solo 'collapse'"
+
+#: xmlschema/validators/facets.py:140
+msgid "facet value can be only 'replace' or 'collapse'"
+msgstr "il valore della facet può essere solo 'replace' o 'collapse'"
+
+#: xmlschema/validators/facets.py:145
+msgid "value contains tabs or newlines"
+msgstr "il valore contiene tabulazioni o nuove righe"
+
+#: xmlschema/validators/facets.py:151
+msgid "value contains non collapsed white spaces"
+msgstr "il valore contiene spazi bianchi non compressi"
+
+#: xmlschema/validators/facets.py:175
+msgid "base facet has a different length ({})"
+msgstr "la facet di base ha una lunghezza diversa ({})"
+
+#: xmlschema/validators/facets.py:185
+msgid "length has to be {!r}"
+msgstr "la lunghezza deve essere {!r}"
+
+#: xmlschema/validators/facets.py:209
+msgid "base facet has a greater min length ({})"
+msgstr "la facet di base ha una lunghezza minima maggiore ({})"
+
+#: xmlschema/validators/facets.py:219
+msgid "value length cannot be lesser than {!r}"
+msgstr "la lunghezza del valore non può essere inferiore a {!r}"
+
+#: xmlschema/validators/facets.py:243
+msgid "base type has a lesser max length ({})"
+msgstr "il tipo di base ha una lunghezza massima inferiore ({})"
+
+#: xmlschema/validators/facets.py:253
+msgid "value length cannot be greater than {!r}"
+msgstr "la lunghezza del valore non può essere maggiore di {!r}"
+
+#: xmlschema/validators/facets.py:276 xmlschema/validators/facets.py:307
+#: xmlschema/validators/facets.py:342 xmlschema/validators/facets.py:373
+msgid "invalid restriction: {}"
+msgstr "restrizione non valida: {}"
+
+#: xmlschema/validators/facets.py:281
+msgid "value has to be greater or equal than {!r}"
+msgstr "il valore deve essere maggiore o uguale a {!r}"
+
+#: xmlschema/validators/facets.py:311
+msgid "invalid restriction: {} is also the maximum"
+msgstr "restrizione non valida: {} è anche il massimo"
+
+#: xmlschema/validators/facets.py:317
+msgid "value has to be greater than {!r}"
+msgstr "il valore deve essere maggiore di {!r}"
+
+#: xmlschema/validators/facets.py:347
+msgid "value has to be less than or equal than {!r}"
+msgstr "il valore deve essere minore o uguale a {!r}"
+
+#: xmlschema/validators/facets.py:377
+msgid "invalid restriction: {} is also the minimum"
+msgstr "restrizione non valida: {} è anche il minimo"
+
+#: xmlschema/validators/facets.py:383
+msgid "value has to be lesser than {!r}"
+msgstr "il valore deve essere inferiore a {!r}"
+
+#: xmlschema/validators/facets.py:418 xmlschema/validators/facets.py:475
+msgid "invalid restriction: base value is lower ({})"
+msgstr "restrizione non valida: il valore di base è inferiore ({})"
+
+#: xmlschema/validators/facets.py:428
+msgid "the number of digits has to be lesser or equal than {!r}"
+msgstr "il numero di cifre deve essere minore o uguale a {!r}"
+
+#: xmlschema/validators/facets.py:456
+msgid ""
+"fractionDigits facet can be applied only to types derived from xs:decimal"
+msgstr ""
+"la facet fractionDigits può essere applicata solo ai tipi derivati da xs:"
+"decimal"
+
+#: xmlschema/validators/facets.py:470
+msgid "fractionDigits facet value must be 0 for types derived from xs:integer"
+msgstr ""
+"il valore della facet fractionDigits deve essere 0 per i tipi derivati da xs:"
+"integer"
+
+#: xmlschema/validators/facets.py:485
+msgid "the number of fraction digits has to be lesser or equal than {!r}"
+msgstr "il numero di cifre della frazione deve essere minore o uguale a {!r}"
+
+#: xmlschema/validators/facets.py:517
+msgid "invalid restriction from {!r}"
+msgstr "restrizione non valida da {!r}"
+
+#: xmlschema/validators/facets.py:522
+msgid "time zone required for value {!r}"
+msgstr "fuso orario richiesto per il valore {!r}"
+
+#: xmlschema/validators/facets.py:527
+msgid "time zone prohibited for value {!r}"
+msgstr "fuso orario vietato per il valore {!r}"
+
+#: xmlschema/validators/facets.py:571
+msgid "value {!r} must match a notation declaration"
+msgstr "il valore {!r} deve corrispondere a una dichiarazione di notazione"
+
+#: xmlschema/validators/facets.py:629
+msgid "value must be one of {!r}"
+msgstr "il valore deve essere uno di {!r}"
+
+#: xmlschema/validators/facets.py:725
+msgid "value doesn't match any pattern of {!r}"
+msgstr "il valore non corrisponde a nessun pattern di {!r}"
+
+#: xmlschema/validators/facets.py:789
+msgid "missing attribute 'test'"
+msgstr "attributo mancante 'test'"
+
+#: xmlschema/validators/facets.py:819
+msgid "value is not true with test path {!r}"
+msgstr "il valore non è vero con il test path {!r}"
+
+#: xmlschema/validators/attributes.py:82
+msgid "unknown attribute {!r}"
+msgstr "attributo sconosciuto {!r}"
+
+#: xmlschema/validators/attributes.py:97
+msgid "referenced attribute has a different fixed value {!r}"
+msgstr "l'attributo riferito ha un valore fisso diverso {!r}"
+
+#: xmlschema/validators/attributes.py:102
+msgid "attribute {!r} is not allowed when attribute reference is used"
+msgstr ""
+"l'attributo {!r} non è consentito quando si utilizza un riferimento ad "
+"attributo"
+
+#: xmlschema/validators/attributes.py:118
+msgid "an attribute name must be different from 'xmlns'"
+msgstr "un nome di attributo deve essere diverso da 'xmlns'"
+
+#: xmlschema/validators/attributes.py:125
+#, python-format
+msgid "cannot add attributes in %r namespace"
+msgstr "impossibile aggiungere attributi nello spazio dei nomi %r"
+
+#: xmlschema/validators/attributes.py:146
+msgid "ambiguous type definition for XSD attribute"
+msgstr "definizione di tipo ambigua per l'attributo XSD"
+
+#: xmlschema/validators/attributes.py:158
+msgid "XSD attribute's type must be a simpleType"
+msgstr "il tipo di un attributo XSD deve essere un simpleType"
+
+#: xmlschema/validators/attributes.py:169
+msgid ""
+"the attribute 'use' must be 'optional' if the attribute 'default' is present"
+msgstr ""
+"l'attributo 'use' deve essere 'optional' se è presente l'attributo 'default'"
+
+#: xmlschema/validators/attributes.py:174
+msgid "default value {!r} is not compatible with attribute's type"
+msgstr "il valore di default {!r} non è compatibile con il tipo dell'attributo"
+
+#: xmlschema/validators/attributes.py:177
+msgid "xs:ID key attributes cannot have a default value"
+msgstr "gli attributi chiave xs:ID non possono avere un valore predefinito"
+
+#: xmlschema/validators/attributes.py:183
+msgid "fixed value {!r} is not compatible with attribute's type"
+msgstr "il valore fisso {!r} non è compatibile con il tipo dell'attributo"
+
+#: xmlschema/validators/attributes.py:186
+msgid "xs:ID key attributes cannot have a fixed value"
+msgstr "gli attributi chiave xs:ID non possono avere un valore fisso"
+
+#: xmlschema/validators/attributes.py:249
+msgid "attribute {0!r} has a fixed value {1!r}"
+msgstr "l'attributo {0!r} ha un valore fisso {1!r}"
+
+#: xmlschema/validators/attributes.py:254
+msgid "attribute {0}={1!r}: {2}"
+msgstr "attributo {0}={1!r}: {2}"
+
+#: xmlschema/validators/attributes.py:319
+msgid "attribute 'fixed' with use=prohibited is not allowed in XSD 1.1"
+msgstr "l'attributo 'fixed' con use=prohibited non è consentito in XSD 1.1"
+
+#: xmlschema/validators/attributes.py:413
+msgid "more anyAttribute declarations in the same attribute group"
+msgstr "più dichiarazioni anyAttribute nello stesso gruppo di attributi"
+
+#: xmlschema/validators/attributes.py:416
+msgid "another declaration after anyAttribute"
+msgstr "un'altra dichiarazione dopo anyAttribute"
+
+#: xmlschema/validators/attributes.py:431
+msgid "multiple declaration for attribute {!r}"
+msgstr "dichiarazione multipla per l'attributo {!r}"
+
+#: xmlschema/validators/attributes.py:440
+msgid "the attribute 'ref' is required in a local attributeGroup"
+msgstr "l'attributo 'ref' è richiesto in un attributeGroup locale"
+
+#: xmlschema/validators/attributes.py:450
+msgid "duplicated attributeGroup {!r}"
+msgstr "attributeGroup {!r} duplicato"
+
+#: xmlschema/validators/attributes.py:456
+msgid "in a redefinition the reference to itself must be the first"
+msgstr "in una ridefinizione il riferimento a se stesso deve essere il primo"
+
+#: xmlschema/validators/attributes.py:467
+msgid "attributeGroup ref={!r} is not in the redefined group"
+msgstr "attributeGroup ref={!r} non è nel gruppo ridefinito"
+
+#: xmlschema/validators/attributes.py:471
+msgid "Circular attribute groups not allowed in XSD 1.0"
+msgstr "Gruppi di attributi circolari non consentiti in XSD 1.0"
+
+#: xmlschema/validators/attributes.py:479
+msgid "unknown attribute group {!r}"
+msgstr "gruppo di attributi sconosciuto {!r}"
+
+#: xmlschema/validators/attributes.py:488
+msgid "multiple declaration of attribute {!r}"
+msgstr "dichiarazione multipla dell'attributo {!r}"
+
+#: xmlschema/validators/attributes.py:497
+msgid "Circular reference found between attribute groups {0!r} and {1!r}"
+msgstr "Riferimento circolare trovato tra i gruppi di attributi {0!r} e {1!r}"
+
+#: xmlschema/validators/attributes.py:502
+msgid "(attribute | attributeGroup) expected, found {!r}."
+msgstr "(attribute | attributeGroup) previsto, trovato {!r}."
+
+#: xmlschema/validators/attributes.py:513
+msgid "Unexpected attribute {!r} in restriction"
+msgstr "Attributo imprevisto {!r} in restrizione"
+
+#: xmlschema/validators/attributes.py:529
+msgid "Attribute wildcard is not a restriction of the base wildcard"
+msgstr "La wildcard attributo non è una restrizione della wildcard di base"
+
+#: xmlschema/validators/attributes.py:539
+msgid "Attribute type is not a restriction of the base attribute type"
+msgstr ""
+"Il tipo dell'attributo non è una restrizione del tipo dell'attributo di base"
+
+#: xmlschema/validators/attributes.py:544
+msgid "Attribute {!r}: unmatched attribute use in restriction"
+msgstr "Attributo {!r}: attributo 'use' non corrispondente nella restrizione"
+
+#: xmlschema/validators/attributes.py:550
+msgid "Attribute {!r}: derived attribute has a different fixed value"
+msgstr "Attributo {!r}: l'attributo derivato ha un valore fisso diverso"
+
+#: xmlschema/validators/attributes.py:554
+msgid "Attribute {!r}: 'inheritable' property change in restriction"
+msgstr ""
+"Attributo {!r}: modifica della proprietà 'inheritable' nella restrizione"
+
+#: xmlschema/validators/attributes.py:568
+msgid "Missing required attribute {!r} in redefinition restriction"
+msgstr ""
+"Attributo obbligatorio {!r} mancante nella restrizione di ridefinizione"
+
+#: xmlschema/validators/attributes.py:573
+msgid "Attribute {!r}: unmatched attribute use in redefinition"
+msgstr ""
+"Attributo {!r}: utilizzo di attributi non corrispondenti nella ridefinizione"
+
+#: xmlschema/validators/attributes.py:576
+msgid "Attribute {!r}: redefinition remove fixed constraint"
+msgstr "Attributo {!r}: la ridefinizione rimuove il vincolo fixed"
+
+#: xmlschema/validators/attributes.py:585
+msgid "Redefinition restriction contains additional attribute {!r}"
+msgstr "La restrizione di ridefinizione contiene un attributo aggiuntivo {!r}"
+
+#: xmlschema/validators/attributes.py:589
+msgid "Wrong attribute order in redefinition restriction"
+msgstr "Ordine degli attributi errato nella restrizione di ridefinizione"
+
+#: xmlschema/validators/attributes.py:607
+msgid "multiple ID attributes not allowed for XSD 1.0"
+msgstr "attributi ID multipli non consentiti per XSD 1.0"
+
+#: xmlschema/validators/attributes.py:660
+#: xmlschema/validators/attributes.py:738
+msgid "missing required attribute {!r}"
+msgstr "attributo richiesto {!r} mancante"
+
+#: xmlschema/validators/attributes.py:695
+#: xmlschema/validators/attributes.py:760
+#, python-format
+msgid "%r is not an attribute of the XSI namespace"
+msgstr "%r non è un attributo dello spazio dei nomi XSI"
+
+#: xmlschema/validators/attributes.py:703
+#: xmlschema/validators/attributes.py:768
+#, python-format
+msgid "%r attribute not allowed for element"
+msgstr "l'attributo %r non è consentito per l'elemento"
+
+#: xmlschema/validators/attributes.py:709
+#, python-format
+msgid "use of attribute %r is prohibited"
+msgstr "l'uso dell'attributo %r è vietato"
+
+#: xmlschema/validators/exceptions.py:345
+#, python-format
+msgid "Unexpected child with tag %r at position %d."
+msgstr "Figlio imprevisto con tag %r alla posizione %d."
+
+#: xmlschema/validators/exceptions.py:372
+#, python-format
+msgid " Tag (%s) expected."
+msgstr " Previsto tag (%s)."
+
+#: xmlschema/validators/exceptions.py:374
+#, python-format
+msgid " Tag %s expected."
+msgstr " Previsto tag %s."
+
+#: xmlschema/validators/exceptions.py:376
+#, python-format
+msgid " Tag %r expected."
+msgstr " Previsto tag %r."
+
+#: xmlschema/validators/groups.py:355
+msgid "{!r} is not a particle of the model group"
+msgstr "{!r} non è una particella del gruppo di modelli"
+
+#: xmlschema/validators/groups.py:413 xmlschema/validators/groups.py:455
+msgid "attribute 'name' not allowed in a local group"
+msgstr "l'attributo 'nome' non è consentito in un gruppo locale"
+
+#: xmlschema/validators/groups.py:422
+#, python-format
+msgid "missing group %r"
+msgstr "gruppo mancante %r"
+
+#: xmlschema/validators/groups.py:429 xmlschema/validators/groups.py:485
+msgid "maxOccurs must be 1 for 'all' model groups"
+msgstr "maxOccurs deve essere 1 per i gruppi modello 'all'"
+
+#: xmlschema/validators/groups.py:432 xmlschema/validators/groups.py:488
+#: xmlschema/validators/groups.py:1285
+msgid "minOccurs must be (0 | 1) for 'all' model groups"
+msgstr "minOccurs deve essere (0 | 1) per i gruppi modello 'all'"
+
+#: xmlschema/validators/groups.py:435
+msgid "in XSD 1.0 an 'all' model group cannot be nested"
+msgstr "in XSD 1.0 un gruppo di modelli 'all' non può essere nidificato"
+
+#: xmlschema/validators/groups.py:441 xmlschema/validators/groups.py:523
+#: xmlschema/validators/groups.py:1317
+#, python-format
+msgid "Circular definition detected for group %r"
+msgstr "Rilevata definizione circolare per il gruppo %r"
+
+#: xmlschema/validators/groups.py:459 xmlschema/validators/groups.py:469
+msgid "attribute 'minOccurs' not allowed in a global group"
+msgstr "l'attributo 'minOccurs' non è consentito in un gruppo globale"
+
+#: xmlschema/validators/groups.py:462 xmlschema/validators/groups.py:472
+msgid "attribute 'maxOccurs' not allowed in a global group"
+msgstr "l'attributo 'maxOccurs' non è consentito in un gruppo globale"
+
+#: xmlschema/validators/groups.py:499
+msgid "'all' model can contain only elements"
+msgstr "un modello 'all' può contenere solo elementi"
+
+#: xmlschema/validators/groups.py:509 xmlschema/validators/groups.py:1301
+msgid "missing attribute 'ref' in local group"
+msgstr "attributo mancante 'ref' in gruppo locale"
+
+#: xmlschema/validators/groups.py:518
+msgid "'all' model can appears only at 1st level of a model group"
+msgstr ""
+"un modello 'all' può apparire solo al 1° livello di un gruppo di modelli"
+
+#: xmlschema/validators/groups.py:527 xmlschema/validators/groups.py:1321
+msgid "Redefined group reference cannot have minOccurs/maxOccurs other than 1"
+msgstr ""
+"il riferimento al gruppo ridefinito non può avere minOccurs/maxOccurs "
+"diverso da 1"
+
+#: xmlschema/validators/groups.py:821
+msgid ""
+"Element Declarations Consistent violation between {0!r} and {1!r}: match the "
+"same name but with different types"
+msgstr ""
+"violazione della consistenza della dichiarazione degli elementi tra {0!r} e "
+"{1!r}: corrispondenza del nome ma con tipi diversi"
+
+#: xmlschema/validators/groups.py:835
+msgid "{0!r} and {1!r} overlap and are in the same {2!r} group"
+msgstr "{0!r} e {1!r} si sovrappongono e sono nello stesso gruppo {2!r}"
+
+#: xmlschema/validators/groups.py:847
+msgid "Unique Particle Attribution violation between {0!r} and {1!r}"
+msgstr "violazione dell'attribuzione di particelle univoche tra {0!r} e {1!r}"
+
+#: xmlschema/validators/groups.py:860
+#, python-format
+msgid "substitution of %r is blocked"
+msgstr "la sostituzione di %r è bloccata"
+
+#: xmlschema/validators/groups.py:909
+msgid "usage of {0!r} with type {1} is blocked by head element"
+msgstr "l'utilizzo di {0!r} con tipo {1} è bloccato dall'elemento di testa"
+
+#: xmlschema/validators/groups.py:934
+msgid "{0!r} that matches {1!r} is not consistent with local declaration {2!r}"
+msgstr ""
+"{0!r} che corrisponde a {1!r} non è coerente con la dichiarazione locale {2!"
+"r}"
+
+#: xmlschema/validators/groups.py:940
+msgid "Maybe a not equivalent type table between elements {0!r} and {1!r}."
+msgstr ""
+"Forse una tabella di tipo non equivalente tra gli elementi {0!r} e {1!r}."
+
+#: xmlschema/validators/groups.py:970
+msgid "an empty 'choice' group with minOccurs > 0 cannot validate any content"
+msgstr ""
+"un gruppo 'choice' vuoto con minOccurs > 0 non può convalidare alcun "
+"contenuto"
+
+#: xmlschema/validators/groups.py:982 xmlschema/validators/groups.py:1242
+msgid "character data between child elements not allowed"
+msgstr "caratteri tra elementi figlio non consentiti"
+
+#: xmlschema/validators/groups.py:995
+#, python-format
+msgid "XML data depth exceeded (MAX_XML_DEPTH=%r)"
+msgstr "profondità dei dati XML superata (MAX_XML_DEPTH=%r)"
+
+#: xmlschema/validators/groups.py:1202
+msgid "{!r} does not match any declared element of the model group"
+msgstr ""
+"{!r} non corrisponde a nessun elemento dichiarato del gruppo di modelli"
+
+#: xmlschema/validators/groups.py:1205
+msgid "{0} has an unknown prefix {1!r}"
+msgstr "{0} ha un prefisso sconosciuto {1!r}"
+
+#: xmlschema/validators/groups.py:1238
+msgid "wrong content type {!r}"
+msgstr "tipo di contenuto sbagliato {!r}"
+
+#: xmlschema/validators/groups.py:1282
+msgid "maxOccurs must be (0 | 1) for 'all' model groups"
+msgstr "maxOccurs deve essere (0 | 1) per i gruppi con modello 'all'"
+
+#: xmlschema/validators/groups.py:1311
+#, python-brace-format
+msgid "an xs:{0} group cannot include a reference to an xs:{1} group"
+msgstr "un gruppo xs:{0} non può includere un riferimento a un gruppo xs:{1}"
+
+#: xmlschema/validators/wildcards.py:76
+#, python-format
+msgid "wrong value %r in 'namespace' attribute"
+msgstr "valore errato %r nell'attributo 'namespace'"
+
+#: xmlschema/validators/wildcards.py:85
+#, python-format
+msgid "wrong value %r for 'processContents' attribute"
+msgstr "valore errato %r per l'attributo 'processContents'"
+
+#: xmlschema/validators/wildcards.py:94
+msgid "'namespace' and 'notNamespace' attributes are mutually exclusive"
+msgstr "gli attributi 'namespace' e 'notNamespace' sono mutuamente esclusivi"
+
+#: xmlschema/validators/wildcards.py:105
+#, python-format
+msgid "wrong value %r in 'notNamespace' attribute"
+msgstr "valore errato %r nell'attributo 'notNamespace'"
+
+#: xmlschema/validators/wildcards.py:121
+msgid "wrong value for 'notQName' attribute"
+msgstr "valore errato per l'attributo 'notQName'"
+
+#: xmlschema/validators/wildcards.py:128
+#, python-format
+msgid "unmapped QName in 'notQName' attribute: %s"
+msgstr "QName non mappato nell'attributo 'notQName': %s"
+
+#: xmlschema/validators/wildcards.py:132
+#, python-format
+msgid "wrong QName format in 'notQName' attribute: %s"
+msgstr "formato QName errato nell'attributo 'notQName': %s"
+
+#: xmlschema/validators/wildcards.py:140
+msgid "the namespace of each QName in notQName is allowed by notNamespace"
+msgstr ""
+"lo spazio dei nomi di ogni QName in notQName è consentito da notNamespace"
+
+#: xmlschema/validators/wildcards.py:144
+msgid "names in notQName must be in namespaces that are allowed"
+msgstr "i nomi in notQName devono trovarsi negli spazi dei nomi consentiti"
+
+#: xmlschema/validators/wildcards.py:319
+msgid "not expressible wildcard namespace union: {0!r} V {1!r}:"
+msgstr "unione di spazi dei nomi di wildcard non esprimibile: {0!r} V {1!r}:"
+
+#: xmlschema/validators/wildcards.py:473 xmlschema/validators/wildcards.py:515
+msgid "element {!r} is not allowed here"
+msgstr "l'elemento {!r} non è consentito qui"
+
+#: xmlschema/validators/wildcards.py:651 xmlschema/validators/wildcards.py:681
+#, python-format
+msgid "attribute %r not allowed"
+msgstr "attributo %r non consentito"
+
+#: xmlschema/validators/wildcards.py:663 xmlschema/validators/wildcards.py:693
+#, python-format
+msgid "attribute %r not found"
+msgstr "attributo %r non trovato"
+
+#: xmlschema/validators/wildcards.py:670 xmlschema/validators/wildcards.py:700
+msgid "unavailable namespace {!r}"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:857
+#, python-format
+msgid "wrong value %r for 'mode' attribute"
+msgstr "valore errato %r per l'attributo 'mode'"
+
+#: xmlschema/validators/wildcards.py:863
+msgid ""
+"an openContent with mode='none' cannot have an <xs:any> child declaration"
+msgstr ""
+"un openContent con mode='none' non può avere una dichiarazione figlio <xs:"
+"any>"
+
+#: xmlschema/validators/wildcards.py:867
+msgid "an <xs:any> child declaration is required"
+msgstr "è richiesta una dichiarazione figlio <xs:any>"
+
+#: xmlschema/validators/wildcards.py:908
+msgid "defaultOpenContent must be a child of the schema"
+msgstr "defaultOpenContent deve essere un figlio dello schema"
+
+#: xmlschema/validators/wildcards.py:911
+msgid "the attribute 'mode' of a defaultOpenContent cannot be 'none'"
+msgstr "l'attributo 'mode' di un defaultOpenContent non può essere 'none'"
+
+#: xmlschema/validators/wildcards.py:914
+msgid "a defaultOpenContent declaration cannot be empty"
+msgstr "una dichiarazione defaultOpenContent non può essere vuota"
+
+#: xmlschema/validators/schemas.py:156
+msgid "XSD_VERSION must be '1.0' or '1.1'"
+msgstr "XSD_VERSION deve essere '1.0' o '1.1'"
+
+#: xmlschema/validators/schemas.py:336
+msgid "{!r} is not a valid loglevel"
+msgstr "{!r} non è un loglevel valido"
+
+#: xmlschema/validators/schemas.py:352
+msgid "no XSD source provided!"
+msgstr "nessun sorgente XSD fornito!"
+
+#: xmlschema/validators/schemas.py:380
+msgid "the attribute 'targetNamespace' cannot be an empty string"
+msgstr "l'attributo 'targetNamespace' non può essere una stringa vuota"
+
+#: xmlschema/validators/schemas.py:383
+msgid "wrong namespace ({0!r} instead of {1!r}) for XSD resource {2}"
+msgstr "spazio dei nomi errato ({0!r} invece di {1!r}) per la risorsa XSD {2}"
+
+#: xmlschema/validators/schemas.py:460
+#, python-format
+msgid "'global_maps' argument must be an %r instance"
+msgstr "l'argomento 'global_maps' deve essere un'istanza %r"
+
+#: xmlschema/validators/schemas.py:542
+msgid "cannot change the global maps instance of a meta-schema"
+msgstr ""
+"non è possibile modificare l'istanza delle mappe globali di un meta-schema"
+
+#: xmlschema/validators/schemas.py:675 xmlschema/validators/schemas.py:970
+#, python-format
+msgid "meta-schema unavailable for %r"
+msgstr "meta-schema non disponibile per %r"
+
+#: xmlschema/validators/schemas.py:682
+msgid "missing XSD namespace in meta-schema"
+msgstr "spazio dei nomi XSD mancante nel meta-schema"
+
+#: xmlschema/validators/schemas.py:754
+msgid "Missing meta-schema source URL"
+msgstr "URL di origine del meta-schema mancante"
+
+#: xmlschema/validators/schemas.py:766
+#, fuzzy
+msgid ""
+"The argument 'base_schemas' must be a dictionary or a sequence of couples"
+msgstr ""
+"l'argomento 'base_schemas' deve essere un dizionario o una sequenza di coppie"
+
+#: xmlschema/validators/schemas.py:803 xmlschema/validators/schemas.py:815
+msgid "(restriction | list | union) expected"
+msgstr "previsto (restriction | list | union)"
+
+#: xmlschema/validators/schemas.py:826
+msgid "missing attribute 'name' in a global simpleType"
+msgstr "attributo 'name' mancante in un simpleType globale"
+
+#: xmlschema/validators/schemas.py:831
+msgid "attribute 'name' not allowed for a local simpleType"
+msgstr "l'attributo 'name' non è consentito per un simpleType locale"
+
+#: xmlschema/validators/schemas.py:875
+msgid "'model' argument must be (sequence | choice | all)"
+msgstr "l'argomento 'model' deve essere (sequence | choice | all)"
+
+#: xmlschema/validators/schemas.py:990
+#, python-format
+msgid "schema %r is not built"
+msgstr "lo schema %r non è costruito"
+
+#: xmlschema/validators/schemas.py:1095
+msgid "the namespace {!r} is not loaded"
+msgstr "lo spazio dei nomi {!r} non è caricato"
+
+#: xmlschema/validators/schemas.py:1117
+msgid "'converter' argument must be a {0!r} subclass or instance: {1!r}"
+msgstr ""
+"l'argomento 'converter' deve essere una sottoclasse o un'istanza di {0!r}: "
+"{1!r}"
+
+#: xmlschema/validators/schemas.py:1172
+msgid "cannot include schema {0!r}: {1}"
+msgstr "impossibile includere lo schema {0!r}: {1}"
+
+#: xmlschema/validators/schemas.py:1186
+#, python-format
+msgid "Redefine schema failed: %s"
+msgstr "Ridefinizione dello schema non riuscita: %s"
+
+#: xmlschema/validators/schemas.py:1191
+msgid "cannot redefine schema {0!r}: {1}"
+msgstr "impossibile ridefinire lo schema {0!r}: {1}"
+
+#: xmlschema/validators/schemas.py:1207
+#, python-format
+msgid "Override schema failed: %s"
+msgstr "Sovrascrittura dello schema non riuscita: %s"
+
+#: xmlschema/validators/schemas.py:1269
+msgid ""
+"if the 'namespace' attribute is not present on the import statement then the "
+"imported schema must have a 'targetNamespace'"
+msgstr ""
+"se l'attributo 'namespace' non è presente nell'istruzione import, lo schema "
+"importato deve avere un 'targetNamespace'"
+
+#: xmlschema/validators/schemas.py:1275
+msgid ""
+"the attribute 'namespace' must be different from schema's 'targetNamespace'"
+msgstr ""
+"l'attributo 'namespace' deve essere diverso dal 'targetNamespace' dello "
+"schema"
+
+#: xmlschema/validators/schemas.py:1322
+msgid "cannot import namespace {0!r}: {1}"
+msgstr "impossibile importare lo spazio dei nomi {0!r}: {1}"
+
+#: xmlschema/validators/schemas.py:1324
+#, python-format
+msgid "cannot import chameleon schema: %s"
+msgstr "impossibile importare lo schema camaleonte: %s"
+
+#: xmlschema/validators/schemas.py:1388
+msgid "imported schema {0!r} has an unmatched namespace {1!r}"
+msgstr ""
+"lo schema importato {0!r} ha uno spazio dei nomi non corrispondente {1!r}"
+
+#: xmlschema/validators/schemas.py:1435
+msgid "target directory {} is not empty"
+msgstr "la directory target {} non è vuota"
+
+#: xmlschema/validators/schemas.py:1438
+msgid "target {} is not a directory"
+msgstr "il target {} non è una directory"
+
+#: xmlschema/validators/schemas.py:1441
+msgid "target parent directory {} does not exist"
+msgstr "la directory {} parent del target non esiste"
+
+#: xmlschema/validators/schemas.py:1444
+msgid "target parent {} is not a directory"
+msgstr "la directory {} parent del target non è una directory"
+
+#: xmlschema/validators/schemas.py:1537
+msgid "invalid attribute vc:minVersion value"
+msgstr "valore non valido per l'attributo vc:minVersion"
+
+#: xmlschema/validators/schemas.py:1546
+msgid "invalid attribute vc:maxVersion value"
+msgstr "valore non valido per l'attributo vc:maxVersion"
+
+#: xmlschema/validators/schemas.py:1622 xmlschema/validators/schemas.py:1629
+#: xmlschema/validators/schemas.py:1635
+msgid "{!r} is not a valid value for xs:QName"
+msgstr "{!r} non è un valore valido per xs:QName"
+
+#: xmlschema/validators/schemas.py:1641
+msgid "prefix {!r} not found in namespace map"
+msgstr "prefisso {!r} non trovato nella mappa degli spazi dei nomi"
+
+#: xmlschema/validators/schemas.py:1648
+msgid ""
+"the QName {!r} is mapped to no namespace, but this requires that there is an "
+"xs:import statement in the schema without the 'namespace' attribute."
+msgstr ""
+"il QName {!r} non è mappato su alcuno spazio dei nomi, ma ciò richiede che "
+"sia presente un'istruzione xs:import nello schema senza l'attributo "
+"'namespace'."
+
+#: xmlschema/validators/schemas.py:1657
+msgid ""
+"the QName {0!r} is mapped to the namespace {1!r}, but this namespace has not "
+"an xs:import statement in the schema."
+msgstr ""
+"il QName {0!r} è mappato allo spazio dei nomi {1!r}, ma questo spazio dei "
+"nomi non ha un'istruzione xs:import nello schema."
+
+#: xmlschema/validators/schemas.py:1798 xmlschema/validators/schemas.py:1852
+#: xmlschema/validators/schemas.py:1997
+msgid "{!r} is not an element of the schema"
+msgstr "{!r} non è un elemento dello schema"
+
+#: xmlschema/validators/schemas.py:1826
+#, python-format
+msgid "IDREF %r not found in XML document"
+msgstr "IDREF %r non trovato nel documento XML"
+
+#: xmlschema/validators/schemas.py:2076
+msgid "encoding needs at least one XSD element declaration"
+msgstr "la codifica richiede almeno una dichiarazione di elemento XSD"
+
+#: xmlschema/validators/schemas.py:2110
+#, python-format
+msgid "the path %r doesn't match any element of the schema!"
+msgstr "il path %r non corrisponde a nessun elemento dello schema!"
+
+#: xmlschema/validators/schemas.py:2112
+msgid ""
+"unable to select an element for decoding data, provide a valid 'path' "
+"argument."
+msgstr ""
+"impossibile selezionare un elemento per la decodifica dei dati, fornire un "
+"argomento 'path' valido."
+
+#: xmlschema/validators/simple_types.py:133
+msgid "facets not allowed for a direct derivation of xs:anySimpleType"
+msgstr "facet non consentite per una derivazione diretta di xs:anySimpleType"
+
+#: xmlschema/validators/simple_types.py:137
+msgid "facets not allowed for a direct content derivation of xs:anySimpleType"
+msgstr ""
+"facet non consentite per una derivazione diretta del contenuto di xs:"
+"anySimpleType"
+
+#: xmlschema/validators/simple_types.py:143
+msgid "one or more facets are not applicable, admitted set is {!r}"
+msgstr "una o più facet non sono applicabili, l'insieme ammesso è {!r}"
+
+#: xmlschema/validators/simple_types.py:149
+#, python-format
+msgid "facet group must have the same base type: %r"
+msgstr "il gruppo di vincoli facet deve avere lo stesso tipo di base: %r"
+
+#: xmlschema/validators/simple_types.py:159
+#, fuzzy
+msgid "'length' value must be non a negative integer"
+msgstr "il valore di 'length' deve essere un numero intero non negativo"
+
+#: xmlschema/validators/simple_types.py:163
+msgid "'minLength' value must be less than or equal to 'length'"
+msgstr "il valore di 'minLength' deve essere minore o uguale a 'length'"
+
+#: xmlschema/validators/simple_types.py:170
+msgid "cannot specify both 'length' and 'minLength'"
+msgstr "non si può specificare sia 'length' che 'minLength'"
+
+#: xmlschema/validators/simple_types.py:175
+msgid "'maxLength' value must be greater or equal to 'length'"
+msgstr "il valore di 'maxLength' deve essere maggiore o uguale a 'length'"
+
+#: xmlschema/validators/simple_types.py:183
+msgid "cannot specify both 'length' and 'maxLength'"
+msgstr "non si può specificare sia 'length' che 'maxLength'"
+
+#: xmlschema/validators/simple_types.py:192
+msgid "'minLength' value must be a non negative integer"
+msgstr "il valore di 'minLength' deve essere un numero intero non negativo"
+
+#: xmlschema/validators/simple_types.py:195
+msgid "'maxLength' value is less than 'minLength'"
+msgstr "il valore di 'maxLength' è minore di 'minLength'"
+
+#: xmlschema/validators/simple_types.py:198
+msgid "'minLength' has a lesser value than parent"
+msgstr "'minLength' ha un valore minore del genitore"
+
+#: xmlschema/validators/simple_types.py:201
+msgid "'minLength' has a greater value than parent 'maxLength'"
+msgstr "'minLength' ha un valore maggiore di 'maxLength' del genitore"
+
+#: xmlschema/validators/simple_types.py:206
+#, fuzzy
+msgid "'maxLength' value must be a non negative integer"
+msgstr "il valore 'maxLength' deve essere un numero intero non negativo"
+
+#: xmlschema/validators/simple_types.py:209
+msgid "'maxLength' has a lesser value than parent 'minLength'"
+msgstr "'maxLength' ha un valore inferiore rispetto a 'minLength' del genitore"
+
+#: xmlschema/validators/simple_types.py:212
+msgid "'maxLength' has a greater value than parent"
+msgstr "'maxLength' ha un valore maggiore del genitore"
+
+#: xmlschema/validators/simple_types.py:223
+msgid "cannot specify both 'minInclusive' and 'minExclusive'"
+msgstr "non è possibile specificare sia 'minInclusive' che 'minExclusive'"
+
+#: xmlschema/validators/simple_types.py:226
+msgid "'minInclusive' must be less or equal to 'maxInclusive'"
+msgstr "'minInclusive' deve essere minore o uguale a 'maxInclusive'"
+
+#: xmlschema/validators/simple_types.py:229
+msgid "'minInclusive' must be lesser than 'maxExclusive'"
+msgstr "'minInclusive' deve essere inferiore a 'maxExclusive'"
+
+#: xmlschema/validators/simple_types.py:234
+msgid "'minExclusive' must be lesser than 'maxInclusive'"
+msgstr "'minExclusive' deve essere inferiore a 'maxInclusive'"
+
+#: xmlschema/validators/simple_types.py:237
+msgid "'minExclusive' must be less or equal to 'maxExclusive'"
+msgstr "'minExclusive' deve essere minore o uguale a 'maxExclusive'"
+
+#: xmlschema/validators/simple_types.py:241
+msgid "cannot specify both 'maxInclusive' and 'maxExclusive'"
+msgstr "non è possibile specificare sia 'maxInclusive' che 'maxExclusive'"
+
+#: xmlschema/validators/simple_types.py:247
+msgid ""
+"fractionDigits facet value cannot be lesser than the value of totalDigits "
+"facet"
+msgstr ""
+"il valore della facet fractionDigits non può essere inferiore al valore "
+"della facet totalDigits"
+
+#: xmlschema/validators/simple_types.py:253
+msgid ""
+"totalDigits facet value cannot be greater than the value of the same facet "
+"in the base type"
+msgstr ""
+"il valore della facet totalDigits non può essere maggiore del valore della "
+"stessa facet nel tipo di base"
+
+#: xmlschema/validators/simple_types.py:262
+#, python-format
+msgid ""
+"the explicitTimezone facet value cannot be changed if the base type has the "
+"same facet with value %r"
+msgstr ""
+"il valore del facet explicitTimezone non può essere modificato se il tipo di "
+"base ha lo stesso facet con valore %r"
+
+#: xmlschema/validators/simple_types.py:460
+msgid "a {0!r} or {1!r} object required"
+msgstr "è richiesto un oggetto {0!r} o {1!r}"
+
+#: xmlschema/validators/simple_types.py:615
+msgid "value is not an instance of {!r}"
+msgstr "il valore non è un'istanza di {!r}"
+
+#: xmlschema/validators/simple_types.py:640
+#: xmlschema/validators/simple_types.py:753
+#: xmlschema/validators/simple_types.py:1107
+msgid "invalid value {!r}"
+msgstr "valore non valido {!r}"
+
+#: xmlschema/validators/simple_types.py:665
+#, python-format
+msgid "unmapped prefix %r in a QName"
+msgstr "prefisso %r non mappato in un QName"
+
+#: xmlschema/validators/simple_types.py:699
+#: xmlschema/validators/simple_types.py:711
+msgid "duplicated xs:ID value {!r}"
+msgstr "valore xs:ID {!r} duplicato"
+
+#: xmlschema/validators/simple_types.py:706
+msgid "no more than one attribute of type ID should be present in an element"
+msgstr "non deve essere presente più di un attributo di tipo ID in un elemento"
+
+#: xmlschema/validators/simple_types.py:731
+msgid "boolean value {0!r} requires a {1!r} decoder"
+msgstr "il valore booleano {0!r} richiede un decodificatore {1!r}"
+
+#: xmlschema/validators/simple_types.py:736
+msgid "{0!r} is not an instance of {1!r}"
+msgstr "{0!r} non è un'istanza di {1!r}"
+
+#: xmlschema/validators/simple_types.py:824
+#, python-format
+msgid "%r: a list must be based on atomic data types"
+msgstr "%r: una lista deve essere basata su tipi di dati atomici"
+
+#: xmlschema/validators/simple_types.py:843
+msgid "ambiguous list type declaration"
+msgstr "dichiarazione ambigua di tipo lista"
+
+#: xmlschema/validators/simple_types.py:851
+msgid "missing list type declaration"
+msgstr "dichiarazione di tipo lista mancante"
+
+#: xmlschema/validators/simple_types.py:864
+msgid "circular definition found for type {!r}"
+msgstr "definizione circolare trovata per il tipo {!r}"
+
+#: xmlschema/validators/simple_types.py:869
+#, python-format
+msgid "'final' value of the itemType %r forbids derivation by list"
+msgstr "il valore 'final' di itemType %r impedisce la derivazione da lista"
+
+#: xmlschema/validators/simple_types.py:873
+#: xmlschema/validators/simple_types.py:1048
+#: xmlschema/validators/simple_types.py:1335
+msgid "cannot use xs:anyAtomicType as base type of a user-defined type"
+msgstr ""
+"non si può usare xs:anyAtomicType come tipo base di un tipo definito "
+"dall'utente"
+
+#: xmlschema/validators/simple_types.py:996
+#, python-format
+msgid "wrong value %r for attribute 'white_space'"
+msgstr "valore errato %r per l'attributo 'white_space'"
+
+#: xmlschema/validators/simple_types.py:1031
+msgid "circular definition found on xs:union type {!r}"
+msgstr "definizione circolare trovata sul tipo xs:union {!r}"
+
+#: xmlschema/validators/simple_types.py:1035
+msgid "a {0!r} required, not {1!r}"
+msgstr "un {0!r} richiesto, non {1!r}"
+
+#: xmlschema/validators/simple_types.py:1039
+#, python-format
+msgid "'final' value of the memberTypes %r forbids derivation by union"
+msgstr ""
+"il valore 'final' dei memberTypes %r impedisce la derivazione per unione"
+
+#: xmlschema/validators/simple_types.py:1045
+msgid "missing xs:union type declarations"
+msgstr "dichiarazioni del tipo xs:union mancanti"
+
+#: xmlschema/validators/simple_types.py:1128
+#, python-format
+msgid "no type suitable for decoding the values %r"
+msgstr "nessun tipo adatto a decodificare i valori %r"
+
+#: xmlschema/validators/simple_types.py:1162
+msgid "no type suitable for encoding the object"
+msgstr "nessun tipo adatto per codificare l'oggetto"
+
+#: xmlschema/validators/simple_types.py:1210
+msgid "'name' attribute in a local simpleType definition"
+msgstr "attributo 'name' in una definizione simpleType locale"
+
+#: xmlschema/validators/simple_types.py:1252
+#, python-format
+msgid "wrong base type %r, an atomic type required"
+msgstr "tipo di base %r errato, è richiesto un tipo atomico"
+
+#: xmlschema/validators/simple_types.py:1258
+msgid "an xs:simpleType definition expected"
+msgstr "è prevista una definizione di xs:simpleType"
+
+#: xmlschema/validators/simple_types.py:1263
+msgid ""
+"when a complexType with simpleContent restricts a complexType with mixed and "
+"with emptiable content then a simpleType child declaration is required"
+msgstr ""
+"è richiesta una dichiarazione figlio simpleType quando un complexType con "
+"simpleContent restringe un complexType con contenuto misto e svuotabile"
+
+#: xmlschema/validators/simple_types.py:1268
+#, python-format
+msgid "simpleType restriction of %r is not allowed"
+msgstr "la restrizione simpleType di %r non è consentita"
+
+#: xmlschema/validators/simple_types.py:1277
+msgid "unexpected tag after attribute declarations"
+msgstr "tag imprevisto dopo le dichiarazioni di attributo"
+
+#: xmlschema/validators/simple_types.py:1282
+msgid "duplicated simpleType declaration"
+msgstr "dichiarazione simpleType duplicata"
+
+#: xmlschema/validators/simple_types.py:1304
+msgid "restriction with 'base' attribute and simpleType declaration"
+msgstr "restrizione con attributo 'base' e dichiarazione simpleType"
+
+#: xmlschema/validators/simple_types.py:1312
+#, python-format
+msgid "unexpected tag %r in restriction"
+msgstr "il tag %r non è previsto in una restrizione"
+
+#: xmlschema/validators/simple_types.py:1318
+#, python-format
+msgid "multiple %r constraint facet"
+msgstr "più vincoli facet %r"
+
+#: xmlschema/validators/simple_types.py:1330
+msgid "missing base type in restriction"
+msgstr "tipo di base mancante nella restrizione"
+
+#: xmlschema/validators/simple_types.py:1332
+#, python-format
+msgid "'final' value of the baseType %r forbids derivation by restriction"
+msgstr "il valore 'final' del baseType %r vieta la derivazione per restrizione"
+
+#: xmlschema/validators/simple_types.py:1381
+#: xmlschema/validators/simple_types.py:1430
+#, python-format
+msgid ""
+"wrong base type %r: a simpleType or a complexType with simple or mixed "
+"content required"
+msgstr ""
+"tipo base %r errato: è richiesto un simpleType o un complexType concontenuto "
+"semplice o misto"
+
+#: xmlschema/validators/identities.py:86
+msgid "'xpath' attribute required"
+msgstr "l'attributo 'xpath' è obbligatorio"
+
+#: xmlschema/validators/identities.py:98
+msgid "invalid XPath expression for an {}"
+msgstr "espressione XPath non valida per un {}"
+
+#: xmlschema/validators/identities.py:182
+msgid "missing required attribute 'name'"
+msgstr "attributo obbligatorio 'name' mancante"
+
+#: xmlschema/validators/identities.py:190
+msgid "missing 'selector' declaration"
+msgstr "dichiarazione 'selector' mancante"
+
+#: xmlschema/validators/identities.py:202
+msgid "unknown identity constraint {!r}"
+msgstr "vincolo di identità sconosciuto {!r}"
+
+#: xmlschema/validators/identities.py:207
+msgid "attribute 'ref' points to a different kind constraint"
+msgstr "l'attributo 'ref' punta a un vincolo di tipo diverso"
+
+#: xmlschema/validators/identities.py:296
+msgid "missing key field {0!r} for {1!r}"
+msgstr "campo chiave {0!r} mancante per {1!r}"
+
+#: xmlschema/validators/identities.py:304
+#, python-format
+msgid "%r field doesn't have a simple type!"
+msgstr "il campo %r non ha un tipo semplice!"
+
+#: xmlschema/validators/identities.py:325
+#, python-format
+msgid "%r field selects multiple values!"
+msgstr "il campo %r seleziona più valori!"
+
+#: xmlschema/validators/identities.py:359
+msgid "missing required attribute 'refer'"
+msgstr "attributo obbligatorio 'refer' mancante"
+
+#: xmlschema/validators/identities.py:381
+#, python-format
+msgid "key/unique identity constraint %r is missing"
+msgstr "vincolo di identità chiave/univoco %r mancante"
+
+#: xmlschema/validators/identities.py:386
+#, python-format
+msgid "reference to a non key/unique identity constraint %r"
+msgstr "riferimento a vincolo di identità non chiave/univoco %r"
+
+#: xmlschema/validators/identities.py:389
+msgid "field cardinality mismatch between {0!r} and {1!r}"
+msgstr "mancata corrispondenza della cardinalità del campo tra {0!r} e {1!r}"
+
+#: xmlschema/validators/identities.py:459
+msgid "duplicated value {0!r} for {1!r}"
+msgstr "valore duplicato {0!r} per {1!r}"
+
+#: xmlschema/validators/xsdbase.py:51
+#, python-format
+msgid "validation mode can be 'strict', 'lax' or 'skip': %r"
+msgstr "il modo di validazione può essere 'strict', 'lax' o 'skip': %r"
+
+#: xmlschema/validators/xsdbase.py:254
+msgid ""
+"wrong value {0!r} for 'xpathDefaultNamespace' attribute, can be (anyURI | "
+"{1})."
+msgstr ""
+"valore errato {0!r} per l'attributo 'xpathDefaultNamespace', può essere "
+"(anyURI | {1})."
+
+#: xmlschema/validators/xsdbase.py:405
+#, python-format
+msgid "missing attribute 'name' in a global %r"
+msgstr "attributo 'name' mancante in %r globale"
+
+#: xmlschema/validators/xsdbase.py:408
+#, python-format
+msgid "missing both attributes 'name' and 'ref' in local %r"
+msgstr "attributi 'name' e 'ref' entrambi mancanti in %r locale"
+
+#: xmlschema/validators/xsdbase.py:411
+msgid "attributes 'name' and 'ref' are mutually exclusive"
+msgstr "gli attributi 'name' e 'ref' sono mutuamente esclusivi"
+
+#: xmlschema/validators/xsdbase.py:414
+#, python-format
+msgid "attribute 'ref' not allowed in a global %r"
+msgstr "l'attributo 'ref' non è ammesso in un %r globale"
+
+#: xmlschema/validators/xsdbase.py:423
+msgid "a reference component cannot have child definitions/declarations"
+msgstr ""
+"un componente riferimento non può avere definizioni/dichiarazioni figlie"
+
+#: xmlschema/validators/xsdbase.py:438
+msgid "too many XSD components, unexpected {0!r} found at position {1}"
+msgstr "troppi componenti XSD, trovato un {0!r} inatteso alla posizione {1}"
+
+#: xmlschema/validators/xsdbase.py:454
+msgid ""
+"attribute 'name' must be present when 'targetNamespace' attribute is provided"
+msgstr ""
+"l'attributo 'name' deve essere presente quando viene fornito l'attributo "
+"'targetNamespace'"
+
+#: xmlschema/validators/xsdbase.py:458
+msgid ""
+"attribute 'form' must be absent when 'targetNamespace' attribute is provided"
+msgstr ""
+"l'attributo 'form' deve essere assente quando viene fornito l'attributo "
+"'targetNamespace'"
+
+#: xmlschema/validators/xsdbase.py:463
+#, python-format
+msgid "a global %s must have the same namespace as its parent schema"
+msgstr "un %r globale deve avere lo stesso namespace del suo schema genitore"
+
+#: xmlschema/validators/xsdbase.py:471
+msgid ""
+"a declaration contained in a global complexType must have the same namespace "
+"as its parent schema"
+msgstr ""
+"una dichiarazione contenuta in un complexType globale deve avere lo stesso "
+"namespace del suo schema genitore"
+
+#: xmlschema/validators/xsdbase.py:591
+msgid "parent circularity from {}"
+msgstr "circolarità del genitore da {}"
+
+#: xmlschema/validators/helpers.py:44
+#, python-format
+msgid "wrong value %r for attribute %r"
+msgstr "il valore %r per l'attributo %r è sbagliato"
+
+#: xmlschema/validators/helpers.py:59
+msgid "value is not a valid xs:decimal"
+msgstr "il valore non è un xs:decimal valido"
+
+#: xmlschema/validators/helpers.py:65
+msgid "value is not an xs:QName"
+msgstr "il valore non è un xs:QName"
+
+#: xmlschema/validators/helpers.py:71 xmlschema/validators/helpers.py:77
+#: xmlschema/validators/helpers.py:83 xmlschema/validators/helpers.py:89
+#: xmlschema/validators/helpers.py:95 xmlschema/validators/helpers.py:101
+#: xmlschema/validators/helpers.py:107 xmlschema/validators/helpers.py:113
+msgid "value must be {:s}"
+msgstr "il valore dev'essere {:s}"
+
+#: xmlschema/validators/helpers.py:119
+msgid "value must be negative"
+msgstr "il valore dev'essere negativo"
+
+#: xmlschema/validators/helpers.py:125
+msgid "value must be positive"
+msgstr "il valore dev'essere positivo"
+
+#: xmlschema/validators/helpers.py:131
+msgid "value must be non positive"
+msgstr "il valore dev'essere non positivo"
+
+#: xmlschema/validators/helpers.py:137
+msgid "value must be non negative"
+msgstr "il valore dev'essere non negativo"
+
+#: xmlschema/validators/helpers.py:144
+msgid "not an hexadecimal number"
+msgstr "non è un numero esadecimale"
+
+#: xmlschema/validators/helpers.py:157
+msgid "not a base64 encoding"
+msgstr "non è una codifica base64"
+
+#: xmlschema/validators/helpers.py:162
+msgid "no value is allowed for xs:error type"
+msgstr "nessun valore è ammesso per il tipo xs:error"
+
+#: xmlschema/validators/helpers.py:174
+msgid "{!r} is not a boolean value"
+msgstr "{!r} non è un valore booleano"
diff --git a/xmlschema/locale/ru/LC_MESSAGES/xmlschema.mo b/xmlschema/locale/ru/LC_MESSAGES/xmlschema.mo
new file mode 100644
index 0000000..53ad347
Binary files /dev/null and b/xmlschema/locale/ru/LC_MESSAGES/xmlschema.mo differ
diff --git a/xmlschema/locale/ru/LC_MESSAGES/xmlschema.po b/xmlschema/locale/ru/LC_MESSAGES/xmlschema.po
new file mode 100644
index 0000000..300076d
--- /dev/null
+++ b/xmlschema/locale/ru/LC_MESSAGES/xmlschema.po
@@ -0,0 +1,1729 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-05-12 17:25+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: xmlschema/validators/complex_types.py:134
+msgid "missing attribute 'name' in a global complexType"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:139
+msgid "attribute 'name' not allowed in a local complexType"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:162
+msgid "'mixed' attribute not allowed with simpleContent"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:177
+#, python-format
+msgid "unexpected tag %r after simpleContent declaration:"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:188
+msgid ""
+"value of 'mixed' attribute in complexType and complexContent must be the same"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:208
+#, python-format
+msgid "unexpected tag %r after complexContent declaration"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:232
+#, python-format
+msgid "unexpected tag %r for complexType content"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:240
+#: xmlschema/validators/simple_types.py:1227
+msgid "wrong definition with self-reference"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:243
+#: xmlschema/validators/simple_types.py:1234
+msgid "wrong redefinition without self-reference"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:254
+msgid "restriction or extension tag expected"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:261
+msgid "{!r} is expected to have a redefined/overridden component"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:266
+msgid "{0!r} derivation not allowed for {1!r}"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:276
+msgid "'base' attribute required"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:285
+#, python-format
+msgid "missing base type %r"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:293
+#: xmlschema/validators/simple_types.py:1247
+msgid "circular definition found between {0!r} and {1!r}"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:297
+#: xmlschema/validators/complex_types.py:311
+msgid "a complexType ancestor required: {!r}"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:302
+#, python-format
+msgid "derivation by %r blocked by attribute 'final' in base type"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:319
+msgid "a not empty simpleContent cannot restrict an empty content type"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:326
+msgid "content type is not a restriction of base content"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:332
+msgid "with simpleContent cannot restrict an element-only content type"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:344 xmlschema/validators/groups.py:478
+#, python-format
+msgid "unexpected tag %r"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:354
+#, python-format
+msgid "base type %r has no simple content"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:362
+msgid "the base type is not derivable by restriction"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:365
+#: xmlschema/validators/complex_types.py:458
+#: xmlschema/validators/complex_types.py:896
+#, python-format
+msgid "base %r is simple or has a simple content"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:377
+#, python-brace-format
+msgid ""
+"restriction of an xs:{0} with more than one particle with xs:{1} is forbidden"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:389
+msgid "derived a mixed content from a base type that has element-only content"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:392
+msgid "an empty content derivation from base type that has not empty content"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:403
+msgid "{0!r} is not a restriction of the base type {1!r}"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:412
+#: xmlschema/validators/complex_types.py:901
+msgid "the base type is not derivable by extension"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:445
+#: xmlschema/validators/complex_types.py:952
+#: xmlschema/validators/complex_types.py:1002
+#, python-format
+msgid ""
+"base has a different content type (mixed=%r) and the extension group is not "
+"empty."
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:465
+msgid "cannot extend a complex content with xs:all"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:468
+msgid "xs:sequence cannot extend xs:all"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:478
+msgid "XSD 1.0 does not allow extension of a not empty 'all' model group"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:481
+#, python-format
+msgid ""
+"base has a different content type (mixed=%r) and the extension group is not "
+"empty"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:495
+#: xmlschema/validators/complex_types.py:1017
+msgid "extended type has a mixed content but the base is element-only"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:655
+msgid "global type {!r} is not built"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:721
+#: xmlschema/validators/complex_types.py:746
+#, python-format
+msgid "cannot decode %(obj)r data with %(decoder)r"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:847
+msgid "the simple content of {!r} is not a valid simple type in XSD 1.1"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:854
+msgid "openContent mismatch between type and model group"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:869
+#, python-format
+msgid "attribute %r must be inheritable"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:885
+msgid "default attribute {!r} is already declared in the complex type"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:956
+msgid "cannot extend an empty mixed content with an xs:all"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:974
+#, python-format
+msgid "xs:all cannot extend a not empty xs:%s"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:989
+msgid "cannot extend a not empty 'all' model group with a different model"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:992
+msgid "when extend an xs:all group minOccurs must be the same"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:995
+msgid "cannot extend an xs:all group with mixed empty content"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:1035
+msgid "{0!r} is not an extension of the base type {1!r}"
+msgstr ""
+
+#: xmlschema/validators/notations.py:39
+msgid "a notation declaration must be global"
+msgstr ""
+
+#: xmlschema/validators/notations.py:43
+msgid "a notation must have a 'name' attribute"
+msgstr ""
+
+#: xmlschema/validators/notations.py:46
+msgid "a notation must have a 'public' or a 'system' attribute"
+msgstr ""
+
+#: xmlschema/validators/particles.py:122
+msgid "minOccurs value is not an integer value"
+msgstr ""
+
+#: xmlschema/validators/particles.py:126
+#, fuzzy
+msgid "minOccurs value must be a non negative integer"
+msgstr "значение не должно быть отрицательным"
+
+#: xmlschema/validators/particles.py:134
+msgid "minOccurs must be lesser or equal than maxOccurs"
+msgstr ""
+
+#: xmlschema/validators/particles.py:142
+msgid "maxOccurs value must be a non negative integer or 'unbounded'"
+msgstr ""
+
+#: xmlschema/validators/particles.py:146
+msgid "maxOccurs must be 'unbounded' or greater than minOccurs"
+msgstr ""
+
+#: xmlschema/validators/assertions.py:76
+msgid "base_type={!r} is not a complexType definition"
+msgstr ""
+
+#: xmlschema/validators/elements.py:162
+#, python-format
+msgid "unknown element %r"
+msgstr ""
+
+#: xmlschema/validators/elements.py:179
+msgid "attribute {!r} is not allowed when element reference is used"
+msgstr ""
+
+#: xmlschema/validators/elements.py:200
+msgid "local scope elements cannot have abstract attribute"
+msgstr ""
+
+#: xmlschema/validators/elements.py:227
+msgid "attribute {!r} is not allowed in a global element declaration"
+msgstr ""
+
+#: xmlschema/validators/elements.py:232
+msgid "attribute {!r} not allowed in a local element declaration"
+msgstr ""
+
+#: xmlschema/validators/elements.py:250 xmlschema/validators/elements.py:1460
+#: xmlschema/validators/simple_types.py:859
+#: xmlschema/validators/simple_types.py:1024
+#: xmlschema/validators/simple_types.py:1240
+msgid "unknown type {!r}"
+msgstr ""
+
+#: xmlschema/validators/elements.py:255
+msgid ""
+"the attribute 'type' and a xs:{} local declaration are mutually exclusive"
+msgstr ""
+
+#: xmlschema/validators/elements.py:274 xmlschema/validators/attributes.py:165
+msgid "'default' and 'fixed' attributes are mutually exclusive"
+msgstr ""
+
+#: xmlschema/validators/elements.py:278
+msgid "'default' value {!r} is not compatible with element's type"
+msgstr ""
+
+#: xmlschema/validators/elements.py:282
+msgid "xs:ID or a type derived from xs:ID cannot have a default value"
+msgstr ""
+
+#: xmlschema/validators/elements.py:288
+msgid "'fixed' value {!r} is not compatible with element's type"
+msgstr ""
+
+#: xmlschema/validators/elements.py:292
+msgid "xs:ID or a type derived from xs:ID cannot have a fixed value"
+msgstr ""
+
+#: xmlschema/validators/elements.py:311 xmlschema/validators/elements.py:319
+#, python-format
+msgid "duplicated identity constraint %r:"
+msgstr ""
+
+#: xmlschema/validators/elements.py:341
+#, python-format
+msgid "unknown substitutionGroup %r"
+msgstr ""
+
+#: xmlschema/validators/elements.py:346
+#, python-format
+msgid "circularity found for substitutionGroup %r"
+msgstr ""
+
+#: xmlschema/validators/elements.py:361
+msgid ""
+"{0!r} type is not of the same or a derivation of the head element {1!r} type"
+msgstr ""
+
+#: xmlschema/validators/elements.py:365
+#, python-format
+msgid ""
+"head element %r can't be substituted by an element that has a derivation of "
+"its type"
+msgstr ""
+
+#: xmlschema/validators/elements.py:369
+#, python-format
+msgid ""
+"head element %r can't be substituted by an element that has an extension of "
+"its type"
+msgstr ""
+
+#: xmlschema/validators/elements.py:373
+#, python-format
+msgid ""
+"head element %r can't be substituted by an element that has a restriction of "
+"its type"
+msgstr ""
+
+#: xmlschema/validators/elements.py:547
+msgid "schemaLocation declaration after namespace start"
+msgstr ""
+
+#: xmlschema/validators/elements.py:556
+#, python-format
+msgid "missing dynamic loaded schema from %s"
+msgstr ""
+
+#: xmlschema/validators/elements.py:559
+msgid "dynamic loaded schema change the assessment"
+msgstr ""
+
+#: xmlschema/validators/elements.py:610
+msgid "cannot use an abstract element for validation"
+msgstr ""
+
+#: xmlschema/validators/elements.py:667 xmlschema/validators/identities.py:219
+msgid "selector xpath expression can only select elements"
+msgstr ""
+
+#: xmlschema/validators/elements.py:673
+#, python-format
+msgid "usage of %r is blocked"
+msgstr ""
+
+#: xmlschema/validators/elements.py:677
+#, python-format
+msgid "%r is abstract"
+msgstr ""
+
+#: xmlschema/validators/elements.py:705
+msgid "element is not nillable"
+msgstr ""
+
+#: xmlschema/validators/elements.py:708
+msgid "xsi:nil attribute must have a boolean value"
+msgstr ""
+
+#: xmlschema/validators/elements.py:713
+msgid "xsi:nil='true' but the element has a fixed value"
+msgstr ""
+
+#: xmlschema/validators/elements.py:716
+msgid "xsi:nil='true' but the element is not empty"
+msgstr ""
+
+#: xmlschema/validators/elements.py:722
+msgid "character data is not allowed because content is empty"
+msgstr ""
+
+#: xmlschema/validators/elements.py:744 xmlschema/validators/elements.py:760
+#, python-format
+msgid "must have the fixed value %r"
+msgstr ""
+
+#: xmlschema/validators/elements.py:749
+msgid "a simple content element can't have child elements"
+msgstr ""
+
+#: xmlschema/validators/elements.py:778 xmlschema/validators/attributes.py:237
+msgid ""
+"cannot validate against xs:NOTATION directly, only against a subtype with an "
+"enumeration facet"
+msgstr ""
+
+#: xmlschema/validators/elements.py:782 xmlschema/validators/attributes.py:241
+msgid "missing enumeration facet in xs:NOTATION subtype"
+msgstr ""
+
+#: xmlschema/validators/elements.py:1245
+msgid "test attribute missing in non-final alternative"
+msgstr ""
+
+#: xmlschema/validators/elements.py:1370
+msgid "Maybe a not equivalent type table between elements {0!r} and {1!r}"
+msgstr ""
+
+#: xmlschema/validators/elements.py:1446
+msgid "missing 'type' attribute"
+msgstr ""
+
+#: xmlschema/validators/elements.py:1454
+msgid "declared type is not derived from {!r}"
+msgstr ""
+
+#: xmlschema/validators/elements.py:1464
+msgid "type {0!r} is not derived from {1!r}"
+msgstr ""
+
+#: xmlschema/validators/elements.py:1469
+#, python-format
+msgid ""
+"the attribute 'type' and the xs:%s local declaration are mutually exclusive"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:77
+msgid "global {0} with name={1!r} is already defined"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:90
+msgid "multiple redefinition for {0} {1!r}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:102
+msgid "circular redefinition for {0} {1!r}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:117
+msgid "not a redefinition!"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:234
+msgid "wrong tag {!r} for an XSD global definition/declaration"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:313
+#: xmlschema/validators/global_maps.py:330
+msgid "wrong element {0!r} for map {1!r}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:339
+msgid "redefined schema {!r} has a different targetNamespace"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:350
+msgid "unexpected instance {!r} in global map"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:382
+msgid "{0!r} cannot substitute {1!r}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:578
+msgid "missing XSD namespace in meta-schema instance {!r}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:587
+msgid "missing default meta-schema instance {!r}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:639
+msgid "defaultAttributes={0!r} doesn't match any attribute group of {1!r}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:682
+msgid "global element not built!"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:684
+msgid "circularity found for substitution group with head element {}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:689
+#, python-format
+msgid "global map has unbuilt components: %r"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:694
+msgid "global group not built!"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:701
+msgid "the redefined group is an illegal restriction"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:717
+msgid "the derived group is an illegal restriction"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:727
+msgid "restriction has an open content but base type has not"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:733
+msgid ""
+"can't verify the content model of {!r} due to exceeding of maximum recursion "
+"depth"
+msgstr ""
+
+#: xmlschema/validators/facets.py:63
+msgid "invalid type {!r} provided"
+msgstr ""
+
+#: xmlschema/validators/facets.py:84
+msgid "{0!r} facet value is fixed to {1!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:135 xmlschema/validators/facets.py:138
+msgid "facet value can be only 'collapse'"
+msgstr ""
+
+#: xmlschema/validators/facets.py:140
+msgid "facet value can be only 'replace' or 'collapse'"
+msgstr ""
+
+#: xmlschema/validators/facets.py:145
+msgid "value contains tabs or newlines"
+msgstr ""
+
+#: xmlschema/validators/facets.py:151
+msgid "value contains non collapsed white spaces"
+msgstr ""
+
+#: xmlschema/validators/facets.py:175
+msgid "base facet has a different length ({})"
+msgstr ""
+
+#: xmlschema/validators/facets.py:185
+msgid "length has to be {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:209
+msgid "base facet has a greater min length ({})"
+msgstr ""
+
+#: xmlschema/validators/facets.py:219
+msgid "value length cannot be lesser than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:243
+msgid "base type has a lesser max length ({})"
+msgstr ""
+
+#: xmlschema/validators/facets.py:253
+msgid "value length cannot be greater than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:276 xmlschema/validators/facets.py:307
+#: xmlschema/validators/facets.py:342 xmlschema/validators/facets.py:373
+msgid "invalid restriction: {}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:281
+msgid "value has to be greater or equal than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:311
+msgid "invalid restriction: {} is also the maximum"
+msgstr ""
+
+#: xmlschema/validators/facets.py:317
+msgid "value has to be greater than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:347
+msgid "value has to be less than or equal than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:377
+msgid "invalid restriction: {} is also the minimum"
+msgstr ""
+
+#: xmlschema/validators/facets.py:383
+msgid "value has to be lesser than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:418 xmlschema/validators/facets.py:475
+msgid "invalid restriction: base value is lower ({})"
+msgstr ""
+
+#: xmlschema/validators/facets.py:428
+msgid "the number of digits has to be lesser or equal than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:456
+msgid ""
+"fractionDigits facet can be applied only to types derived from xs:decimal"
+msgstr ""
+
+#: xmlschema/validators/facets.py:470
+msgid "fractionDigits facet value must be 0 for types derived from xs:integer"
+msgstr ""
+
+#: xmlschema/validators/facets.py:485
+msgid "the number of fraction digits has to be lesser or equal than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:517
+msgid "invalid restriction from {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:522
+msgid "time zone required for value {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:527
+msgid "time zone prohibited for value {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:571
+msgid "value {!r} must match a notation declaration"
+msgstr ""
+
+#: xmlschema/validators/facets.py:629
+#, fuzzy
+msgid "value must be one of {!r}"
+msgstr "значение должно быть {:s}"
+
+#: xmlschema/validators/facets.py:725
+msgid "value doesn't match any pattern of {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:789
+msgid "missing attribute 'test'"
+msgstr ""
+
+#: xmlschema/validators/facets.py:819
+msgid "value is not true with test path {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:82
+msgid "unknown attribute {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:97
+msgid "referenced attribute has a different fixed value {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:102
+msgid "attribute {!r} is not allowed when attribute reference is used"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:118
+msgid "an attribute name must be different from 'xmlns'"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:125
+#, python-format
+msgid "cannot add attributes in %r namespace"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:146
+msgid "ambiguous type definition for XSD attribute"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:158
+msgid "XSD attribute's type must be a simpleType"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:169
+msgid ""
+"the attribute 'use' must be 'optional' if the attribute 'default' is present"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:174
+msgid "default value {!r} is not compatible with attribute's type"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:177
+msgid "xs:ID key attributes cannot have a default value"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:183
+msgid "fixed value {!r} is not compatible with attribute's type"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:186
+msgid "xs:ID key attributes cannot have a fixed value"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:249
+msgid "attribute {0!r} has a fixed value {1!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:254
+msgid "attribute {0}={1!r}: {2}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:319
+msgid "attribute 'fixed' with use=prohibited is not allowed in XSD 1.1"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:413
+msgid "more anyAttribute declarations in the same attribute group"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:416
+msgid "another declaration after anyAttribute"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:431
+msgid "multiple declaration for attribute {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:440
+msgid "the attribute 'ref' is required in a local attributeGroup"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:450
+msgid "duplicated attributeGroup {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:456
+msgid "in a redefinition the reference to itself must be the first"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:467
+msgid "attributeGroup ref={!r} is not in the redefined group"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:471
+msgid "Circular attribute groups not allowed in XSD 1.0"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:479
+msgid "unknown attribute group {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:488
+msgid "multiple declaration of attribute {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:497
+msgid "Circular reference found between attribute groups {0!r} and {1!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:502
+msgid "(attribute | attributeGroup) expected, found {!r}."
+msgstr ""
+
+#: xmlschema/validators/attributes.py:513
+msgid "Unexpected attribute {!r} in restriction"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:529
+msgid "Attribute wildcard is not a restriction of the base wildcard"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:539
+msgid "Attribute type is not a restriction of the base attribute type"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:544
+msgid "Attribute {!r}: unmatched attribute use in restriction"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:550
+msgid "Attribute {!r}: derived attribute has a different fixed value"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:554
+msgid "Attribute {!r}: 'inheritable' property change in restriction"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:568
+msgid "Missing required attribute {!r} in redefinition restriction"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:573
+msgid "Attribute {!r}: unmatched attribute use in redefinition"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:576
+msgid "Attribute {!r}: redefinition remove fixed constraint"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:585
+msgid "Redefinition restriction contains additional attribute {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:589
+msgid "Wrong attribute order in redefinition restriction"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:607
+msgid "multiple ID attributes not allowed for XSD 1.0"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:660
+#: xmlschema/validators/attributes.py:738
+msgid "missing required attribute {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:695
+#: xmlschema/validators/attributes.py:760
+#, python-format
+msgid "%r is not an attribute of the XSI namespace"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:703
+#: xmlschema/validators/attributes.py:768
+#, python-format
+msgid "%r attribute not allowed for element"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:709
+#, python-format
+msgid "use of attribute %r is prohibited"
+msgstr ""
+
+#: xmlschema/validators/exceptions.py:345
+#, python-format
+msgid "Unexpected child with tag %r at position %d."
+msgstr "Неожиданный дочерний тэг %r в позиции %d."
+
+#: xmlschema/validators/exceptions.py:372
+#, python-format
+msgid " Tag (%s) expected."
+msgstr " Ожидается тэг (%s)"
+
+#: xmlschema/validators/exceptions.py:374
+#, python-format
+msgid " Tag %s expected."
+msgstr " Ожидается тэг %s"
+
+#: xmlschema/validators/exceptions.py:376
+#, python-format
+msgid " Tag %r expected."
+msgstr " Ожидается тэг (%r)"
+
+#: xmlschema/validators/groups.py:355
+msgid "{!r} is not a particle of the model group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:413 xmlschema/validators/groups.py:455
+msgid "attribute 'name' not allowed in a local group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:422
+#, python-format
+msgid "missing group %r"
+msgstr ""
+
+#: xmlschema/validators/groups.py:429 xmlschema/validators/groups.py:485
+msgid "maxOccurs must be 1 for 'all' model groups"
+msgstr ""
+
+#: xmlschema/validators/groups.py:432 xmlschema/validators/groups.py:488
+#: xmlschema/validators/groups.py:1285
+msgid "minOccurs must be (0 | 1) for 'all' model groups"
+msgstr ""
+
+#: xmlschema/validators/groups.py:435
+msgid "in XSD 1.0 an 'all' model group cannot be nested"
+msgstr ""
+
+#: xmlschema/validators/groups.py:441 xmlschema/validators/groups.py:523
+#: xmlschema/validators/groups.py:1317
+#, python-format
+msgid "Circular definition detected for group %r"
+msgstr ""
+
+#: xmlschema/validators/groups.py:459 xmlschema/validators/groups.py:469
+msgid "attribute 'minOccurs' not allowed in a global group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:462 xmlschema/validators/groups.py:472
+msgid "attribute 'maxOccurs' not allowed in a global group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:499
+msgid "'all' model can contain only elements"
+msgstr ""
+
+#: xmlschema/validators/groups.py:509 xmlschema/validators/groups.py:1301
+msgid "missing attribute 'ref' in local group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:518
+msgid "'all' model can appears only at 1st level of a model group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:527 xmlschema/validators/groups.py:1321
+msgid "Redefined group reference cannot have minOccurs/maxOccurs other than 1"
+msgstr ""
+
+#: xmlschema/validators/groups.py:821
+msgid ""
+"Element Declarations Consistent violation between {0!r} and {1!r}: match the "
+"same name but with different types"
+msgstr ""
+
+#: xmlschema/validators/groups.py:835
+msgid "{0!r} and {1!r} overlap and are in the same {2!r} group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:847
+msgid "Unique Particle Attribution violation between {0!r} and {1!r}"
+msgstr ""
+
+#: xmlschema/validators/groups.py:860
+#, python-format
+msgid "substitution of %r is blocked"
+msgstr ""
+
+#: xmlschema/validators/groups.py:909
+msgid "usage of {0!r} with type {1} is blocked by head element"
+msgstr ""
+
+#: xmlschema/validators/groups.py:934
+msgid "{0!r} that matches {1!r} is not consistent with local declaration {2!r}"
+msgstr ""
+
+#: xmlschema/validators/groups.py:940
+msgid "Maybe a not equivalent type table between elements {0!r} and {1!r}."
+msgstr ""
+
+#: xmlschema/validators/groups.py:970
+msgid "an empty 'choice' group with minOccurs > 0 cannot validate any content"
+msgstr ""
+
+#: xmlschema/validators/groups.py:982 xmlschema/validators/groups.py:1242
+msgid "character data between child elements not allowed"
+msgstr ""
+
+#: xmlschema/validators/groups.py:995
+#, python-format
+msgid "XML data depth exceeded (MAX_XML_DEPTH=%r)"
+msgstr ""
+
+#: xmlschema/validators/groups.py:1202
+msgid "{!r} does not match any declared element of the model group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:1205
+msgid "{0} has an unknown prefix {1!r}"
+msgstr ""
+
+#: xmlschema/validators/groups.py:1238
+msgid "wrong content type {!r}"
+msgstr ""
+
+#: xmlschema/validators/groups.py:1282
+msgid "maxOccurs must be (0 | 1) for 'all' model groups"
+msgstr ""
+
+#: xmlschema/validators/groups.py:1311
+#, python-brace-format
+msgid "an xs:{0} group cannot include a reference to an xs:{1} group"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:76
+#, fuzzy, python-format
+msgid "wrong value %r in 'namespace' attribute"
+msgstr "неверное значение %r для атрибута %r"
+
+#: xmlschema/validators/wildcards.py:85
+#, fuzzy, python-format
+msgid "wrong value %r for 'processContents' attribute"
+msgstr "неверное значение %r для атрибута %r"
+
+#: xmlschema/validators/wildcards.py:94
+msgid "'namespace' and 'notNamespace' attributes are mutually exclusive"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:105
+#, fuzzy, python-format
+msgid "wrong value %r in 'notNamespace' attribute"
+msgstr "неверное значение %r для атрибута %r"
+
+#: xmlschema/validators/wildcards.py:121
+#, fuzzy
+msgid "wrong value for 'notQName' attribute"
+msgstr "неверное значение %r для атрибута %r"
+
+#: xmlschema/validators/wildcards.py:128
+#, python-format
+msgid "unmapped QName in 'notQName' attribute: %s"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:132
+#, fuzzy, python-format
+msgid "wrong QName format in 'notQName' attribute: %s"
+msgstr "неверное значение %r для атрибута %r"
+
+#: xmlschema/validators/wildcards.py:140
+msgid "the namespace of each QName in notQName is allowed by notNamespace"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:144
+msgid "names in notQName must be in namespaces that are allowed"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:319
+msgid "not expressible wildcard namespace union: {0!r} V {1!r}:"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:473 xmlschema/validators/wildcards.py:515
+msgid "element {!r} is not allowed here"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:651 xmlschema/validators/wildcards.py:681
+#, python-format
+msgid "attribute %r not allowed"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:663 xmlschema/validators/wildcards.py:693
+#, python-format
+msgid "attribute %r not found"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:670 xmlschema/validators/wildcards.py:700
+msgid "unavailable namespace {!r}"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:857
+#, fuzzy, python-format
+msgid "wrong value %r for 'mode' attribute"
+msgstr "неверное значение %r для атрибута %r"
+
+#: xmlschema/validators/wildcards.py:863
+msgid ""
+"an openContent with mode='none' cannot have an <xs:any> child declaration"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:867
+msgid "an <xs:any> child declaration is required"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:908
+msgid "defaultOpenContent must be a child of the schema"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:911
+msgid "the attribute 'mode' of a defaultOpenContent cannot be 'none'"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:914
+msgid "a defaultOpenContent declaration cannot be empty"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:156
+msgid "XSD_VERSION must be '1.0' or '1.1'"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:336
+#, fuzzy
+msgid "{!r} is not a valid loglevel"
+msgstr "{!r} не булево значение"
+
+#: xmlschema/validators/schemas.py:352
+msgid "no XSD source provided!"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:380
+msgid "the attribute 'targetNamespace' cannot be an empty string"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:383
+msgid "wrong namespace ({0!r} instead of {1!r}) for XSD resource {2}"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:460
+#, python-format
+msgid "'global_maps' argument must be an %r instance"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:542
+msgid "cannot change the global maps instance of a meta-schema"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:675 xmlschema/validators/schemas.py:970
+#, python-format
+msgid "meta-schema unavailable for %r"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:682
+msgid "missing XSD namespace in meta-schema"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:754
+msgid "Missing meta-schema source URL"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:766
+msgid ""
+"The argument 'base_schemas' must be a dictionary or a sequence of couples"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:803 xmlschema/validators/schemas.py:815
+msgid "(restriction | list | union) expected"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:826
+msgid "missing attribute 'name' in a global simpleType"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:831
+msgid "attribute 'name' not allowed for a local simpleType"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:875
+msgid "'model' argument must be (sequence | choice | all)"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:990
+#, python-format
+msgid "schema %r is not built"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1095
+msgid "the namespace {!r} is not loaded"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1117
+msgid "'converter' argument must be a {0!r} subclass or instance: {1!r}"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1172
+msgid "cannot include schema {0!r}: {1}"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1186
+#, python-format
+msgid "Redefine schema failed: %s"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1191
+msgid "cannot redefine schema {0!r}: {1}"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1207
+#, python-format
+msgid "Override schema failed: %s"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1269
+msgid ""
+"if the 'namespace' attribute is not present on the import statement then the "
+"imported schema must have a 'targetNamespace'"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1275
+msgid ""
+"the attribute 'namespace' must be different from schema's 'targetNamespace'"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1322
+msgid "cannot import namespace {0!r}: {1}"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1324
+#, python-format
+msgid "cannot import chameleon schema: %s"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1388
+msgid "imported schema {0!r} has an unmatched namespace {1!r}"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1435
+msgid "target directory {} is not empty"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1438
+msgid "target {} is not a directory"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1441
+msgid "target parent directory {} does not exist"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1444
+msgid "target parent {} is not a directory"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1537
+msgid "invalid attribute vc:minVersion value"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1546
+msgid "invalid attribute vc:maxVersion value"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1622 xmlschema/validators/schemas.py:1629
+#: xmlschema/validators/schemas.py:1635
+#, fuzzy
+msgid "{!r} is not a valid value for xs:QName"
+msgstr "{!r} не булево значение"
+
+#: xmlschema/validators/schemas.py:1641
+msgid "prefix {!r} not found in namespace map"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1648
+msgid ""
+"the QName {!r} is mapped to no namespace, but this requires that there is an "
+"xs:import statement in the schema without the 'namespace' attribute."
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1657
+msgid ""
+"the QName {0!r} is mapped to the namespace {1!r}, but this namespace has not "
+"an xs:import statement in the schema."
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1798 xmlschema/validators/schemas.py:1852
+#: xmlschema/validators/schemas.py:1997
+#, fuzzy
+msgid "{!r} is not an element of the schema"
+msgstr "{!r} не булево значение"
+
+#: xmlschema/validators/schemas.py:1826
+#, python-format
+msgid "IDREF %r not found in XML document"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:2076
+msgid "encoding needs at least one XSD element declaration"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:2110
+#, python-format
+msgid "the path %r doesn't match any element of the schema!"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:2112
+msgid ""
+"unable to select an element for decoding data, provide a valid 'path' "
+"argument."
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:133
+msgid "facets not allowed for a direct derivation of xs:anySimpleType"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:137
+msgid "facets not allowed for a direct content derivation of xs:anySimpleType"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:143
+msgid "one or more facets are not applicable, admitted set is {!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:149
+#, python-format
+msgid "facet group must have the same base type: %r"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:159
+#, fuzzy
+msgid "'length' value must be non a negative integer"
+msgstr "значение не должно быть отрицательным"
+
+#: xmlschema/validators/simple_types.py:163
+msgid "'minLength' value must be less than or equal to 'length'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:170
+msgid "cannot specify both 'length' and 'minLength'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:175
+msgid "'maxLength' value must be greater or equal to 'length'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:183
+msgid "cannot specify both 'length' and 'maxLength'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:192
+#, fuzzy
+msgid "'minLength' value must be a non negative integer"
+msgstr "значение не должно быть отрицательным"
+
+#: xmlschema/validators/simple_types.py:195
+msgid "'maxLength' value is less than 'minLength'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:198
+msgid "'minLength' has a lesser value than parent"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:201
+msgid "'minLength' has a greater value than parent 'maxLength'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:206
+#, fuzzy
+msgid "'maxLength' value must be a non negative integer"
+msgstr "значение не должно быть отрицательным"
+
+#: xmlschema/validators/simple_types.py:209
+msgid "'maxLength' has a lesser value than parent 'minLength'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:212
+msgid "'maxLength' has a greater value than parent"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:223
+msgid "cannot specify both 'minInclusive' and 'minExclusive'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:226
+msgid "'minInclusive' must be less or equal to 'maxInclusive'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:229
+msgid "'minInclusive' must be lesser than 'maxExclusive'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:234
+msgid "'minExclusive' must be lesser than 'maxInclusive'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:237
+msgid "'minExclusive' must be less or equal to 'maxExclusive'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:241
+msgid "cannot specify both 'maxInclusive' and 'maxExclusive'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:247
+msgid ""
+"fractionDigits facet value cannot be lesser than the value of totalDigits "
+"facet"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:253
+msgid ""
+"totalDigits facet value cannot be greater than the value of the same facet "
+"in the base type"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:262
+#, python-format
+msgid ""
+"the explicitTimezone facet value cannot be changed if the base type has the "
+"same facet with value %r"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:460
+msgid "a {0!r} or {1!r} object required"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:615
+#, fuzzy
+msgid "value is not an instance of {!r}"
+msgstr "значение не xs:QName"
+
+#: xmlschema/validators/simple_types.py:640
+#: xmlschema/validators/simple_types.py:753
+#: xmlschema/validators/simple_types.py:1107
+msgid "invalid value {!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:665
+#, python-format
+msgid "unmapped prefix %r in a QName"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:699
+#: xmlschema/validators/simple_types.py:711
+msgid "duplicated xs:ID value {!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:706
+msgid "no more than one attribute of type ID should be present in an element"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:731
+msgid "boolean value {0!r} requires a {1!r} decoder"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:736
+msgid "{0!r} is not an instance of {1!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:824
+#, python-format
+msgid "%r: a list must be based on atomic data types"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:843
+msgid "ambiguous list type declaration"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:851
+msgid "missing list type declaration"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:864
+msgid "circular definition found for type {!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:869
+#, python-format
+msgid "'final' value of the itemType %r forbids derivation by list"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:873
+#: xmlschema/validators/simple_types.py:1048
+#: xmlschema/validators/simple_types.py:1335
+msgid "cannot use xs:anyAtomicType as base type of a user-defined type"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:996
+#, fuzzy, python-format
+msgid "wrong value %r for attribute 'white_space'"
+msgstr "неверное значение %r для атрибута %r"
+
+#: xmlschema/validators/simple_types.py:1031
+msgid "circular definition found on xs:union type {!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1035
+msgid "a {0!r} required, not {1!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1039
+#, python-format
+msgid "'final' value of the memberTypes %r forbids derivation by union"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1045
+msgid "missing xs:union type declarations"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1128
+#, python-format
+msgid "no type suitable for decoding the values %r"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1162
+msgid "no type suitable for encoding the object"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1210
+msgid "'name' attribute in a local simpleType definition"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1252
+#, python-format
+msgid "wrong base type %r, an atomic type required"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1258
+msgid "an xs:simpleType definition expected"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1263
+msgid ""
+"when a complexType with simpleContent restricts a complexType with mixed and "
+"with emptiable content then a simpleType child declaration is required"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1268
+#, python-format
+msgid "simpleType restriction of %r is not allowed"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1277
+msgid "unexpected tag after attribute declarations"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1282
+msgid "duplicated simpleType declaration"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1304
+msgid "restriction with 'base' attribute and simpleType declaration"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1312
+#, fuzzy, python-format
+msgid "unexpected tag %r in restriction"
+msgstr "Неожиданный дочерний тэг %r в позиции %d."
+
+#: xmlschema/validators/simple_types.py:1318
+#, python-format
+msgid "multiple %r constraint facet"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1330
+msgid "missing base type in restriction"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1332
+#, python-format
+msgid "'final' value of the baseType %r forbids derivation by restriction"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1381
+#: xmlschema/validators/simple_types.py:1430
+#, python-format
+msgid ""
+"wrong base type %r: a simpleType or a complexType with simple or mixed "
+"content required"
+msgstr ""
+
+#: xmlschema/validators/identities.py:86
+msgid "'xpath' attribute required"
+msgstr ""
+
+#: xmlschema/validators/identities.py:98
+msgid "invalid XPath expression for an {}"
+msgstr ""
+
+#: xmlschema/validators/identities.py:182
+msgid "missing required attribute 'name'"
+msgstr ""
+
+#: xmlschema/validators/identities.py:190
+msgid "missing 'selector' declaration"
+msgstr ""
+
+#: xmlschema/validators/identities.py:202
+msgid "unknown identity constraint {!r}"
+msgstr ""
+
+#: xmlschema/validators/identities.py:207
+msgid "attribute 'ref' points to a different kind constraint"
+msgstr ""
+
+#: xmlschema/validators/identities.py:296
+msgid "missing key field {0!r} for {1!r}"
+msgstr ""
+
+#: xmlschema/validators/identities.py:304
+#, python-format
+msgid "%r field doesn't have a simple type!"
+msgstr ""
+
+#: xmlschema/validators/identities.py:325
+#, python-format
+msgid "%r field selects multiple values!"
+msgstr ""
+
+#: xmlschema/validators/identities.py:359
+msgid "missing required attribute 'refer'"
+msgstr ""
+
+#: xmlschema/validators/identities.py:381
+#, python-format
+msgid "key/unique identity constraint %r is missing"
+msgstr ""
+
+#: xmlschema/validators/identities.py:386
+#, python-format
+msgid "reference to a non key/unique identity constraint %r"
+msgstr ""
+
+#: xmlschema/validators/identities.py:389
+msgid "field cardinality mismatch between {0!r} and {1!r}"
+msgstr ""
+
+#: xmlschema/validators/identities.py:459
+msgid "duplicated value {0!r} for {1!r}"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:51
+#, python-format
+msgid "validation mode can be 'strict', 'lax' or 'skip': %r"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:254
+msgid ""
+"wrong value {0!r} for 'xpathDefaultNamespace' attribute, can be (anyURI | "
+"{1})."
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:405
+#, python-format
+msgid "missing attribute 'name' in a global %r"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:408
+#, python-format
+msgid "missing both attributes 'name' and 'ref' in local %r"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:411
+msgid "attributes 'name' and 'ref' are mutually exclusive"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:414
+#, python-format
+msgid "attribute 'ref' not allowed in a global %r"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:423
+msgid "a reference component cannot have child definitions/declarations"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:438
+msgid "too many XSD components, unexpected {0!r} found at position {1}"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:454
+msgid ""
+"attribute 'name' must be present when 'targetNamespace' attribute is provided"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:458
+msgid ""
+"attribute 'form' must be absent when 'targetNamespace' attribute is provided"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:463
+#, python-format
+msgid "a global %s must have the same namespace as its parent schema"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:471
+msgid ""
+"a declaration contained in a global complexType must have the same namespace "
+"as its parent schema"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:591
+msgid "parent circularity from {}"
+msgstr ""
+
+#: xmlschema/validators/helpers.py:44
+#, python-format
+msgid "wrong value %r for attribute %r"
+msgstr "неверное значение %r для атрибута %r"
+
+#: xmlschema/validators/helpers.py:59
+msgid "value is not a valid xs:decimal"
+msgstr "значение неверно для типа xs:decimal"
+
+#: xmlschema/validators/helpers.py:65
+msgid "value is not an xs:QName"
+msgstr "значение не xs:QName"
+
+#: xmlschema/validators/helpers.py:71 xmlschema/validators/helpers.py:77
+#: xmlschema/validators/helpers.py:83 xmlschema/validators/helpers.py:89
+#: xmlschema/validators/helpers.py:95 xmlschema/validators/helpers.py:101
+#: xmlschema/validators/helpers.py:107 xmlschema/validators/helpers.py:113
+msgid "value must be {:s}"
+msgstr "значение должно быть {:s}"
+
+#: xmlschema/validators/helpers.py:119
+msgid "value must be negative"
+msgstr "значение должно быть отрицательным"
+
+#: xmlschema/validators/helpers.py:125
+msgid "value must be positive"
+msgstr "значение должно быть положительным"
+
+#: xmlschema/validators/helpers.py:131
+msgid "value must be non positive"
+msgstr "значение не должно быть положительным"
+
+#: xmlschema/validators/helpers.py:137
+msgid "value must be non negative"
+msgstr "значение не должно быть отрицательным"
+
+#: xmlschema/validators/helpers.py:144
+msgid "not an hexadecimal number"
+msgstr "не шестнадцатеричное число"
+
+#: xmlschema/validators/helpers.py:157
+msgid "not a base64 encoding"
+msgstr "не закодировано в base64"
+
+#: xmlschema/validators/helpers.py:162
+msgid "no value is allowed for xs:error type"
+msgstr "значение недоступно для типа xs:error"
+
+#: xmlschema/validators/helpers.py:174
+msgid "{!r} is not a boolean value"
+msgstr "{!r} не булево значение"
+
+#~ msgid "invalid"
+#~ msgstr "невалидный"
diff --git a/xmlschema/locale/xmlschema.pot b/xmlschema/locale/xmlschema.pot
new file mode 100644
index 0000000..f2274ad
--- /dev/null
+++ b/xmlschema/locale/xmlschema.pot
@@ -0,0 +1,1716 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR , 2016, SISSA (International School for Advanced Studies).
+# This file is distributed under the same license as the xmlschema package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: xmlschema\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-05-12 17:25+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: xmlschema/validators/complex_types.py:134
+msgid "missing attribute 'name' in a global complexType"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:139
+msgid "attribute 'name' not allowed in a local complexType"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:162
+msgid "'mixed' attribute not allowed with simpleContent"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:177
+#, python-format
+msgid "unexpected tag %r after simpleContent declaration:"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:188
+msgid ""
+"value of 'mixed' attribute in complexType and complexContent must be the same"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:208
+#, python-format
+msgid "unexpected tag %r after complexContent declaration"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:232
+#, python-format
+msgid "unexpected tag %r for complexType content"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:240
+#: xmlschema/validators/simple_types.py:1227
+msgid "wrong definition with self-reference"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:243
+#: xmlschema/validators/simple_types.py:1234
+msgid "wrong redefinition without self-reference"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:254
+msgid "restriction or extension tag expected"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:261
+msgid "{!r} is expected to have a redefined/overridden component"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:266
+msgid "{0!r} derivation not allowed for {1!r}"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:276
+msgid "'base' attribute required"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:285
+#, python-format
+msgid "missing base type %r"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:293
+#: xmlschema/validators/simple_types.py:1247
+msgid "circular definition found between {0!r} and {1!r}"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:297
+#: xmlschema/validators/complex_types.py:311
+msgid "a complexType ancestor required: {!r}"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:302
+#, python-format
+msgid "derivation by %r blocked by attribute 'final' in base type"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:319
+msgid "a not empty simpleContent cannot restrict an empty content type"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:326
+msgid "content type is not a restriction of base content"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:332
+msgid "with simpleContent cannot restrict an element-only content type"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:344 xmlschema/validators/groups.py:478
+#, python-format
+msgid "unexpected tag %r"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:354
+#, python-format
+msgid "base type %r has no simple content"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:362
+msgid "the base type is not derivable by restriction"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:365
+#: xmlschema/validators/complex_types.py:458
+#: xmlschema/validators/complex_types.py:896
+#, python-format
+msgid "base %r is simple or has a simple content"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:377
+#, python-brace-format
+msgid ""
+"restriction of an xs:{0} with more than one particle with xs:{1} is forbidden"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:389
+msgid "derived a mixed content from a base type that has element-only content"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:392
+msgid "an empty content derivation from base type that has not empty content"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:403
+msgid "{0!r} is not a restriction of the base type {1!r}"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:412
+#: xmlschema/validators/complex_types.py:901
+msgid "the base type is not derivable by extension"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:445
+#: xmlschema/validators/complex_types.py:952
+#: xmlschema/validators/complex_types.py:1002
+#, python-format
+msgid ""
+"base has a different content type (mixed=%r) and the extension group is not "
+"empty."
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:465
+msgid "cannot extend a complex content with xs:all"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:468
+msgid "xs:sequence cannot extend xs:all"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:478
+msgid "XSD 1.0 does not allow extension of a not empty 'all' model group"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:481
+#, python-format
+msgid ""
+"base has a different content type (mixed=%r) and the extension group is not "
+"empty"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:495
+#: xmlschema/validators/complex_types.py:1017
+msgid "extended type has a mixed content but the base is element-only"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:655
+msgid "global type {!r} is not built"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:721
+#: xmlschema/validators/complex_types.py:746
+#, python-format
+msgid "cannot decode %(obj)r data with %(decoder)r"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:847
+msgid "the simple content of {!r} is not a valid simple type in XSD 1.1"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:854
+msgid "openContent mismatch between type and model group"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:869
+#, python-format
+msgid "attribute %r must be inheritable"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:885
+msgid "default attribute {!r} is already declared in the complex type"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:956
+msgid "cannot extend an empty mixed content with an xs:all"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:974
+#, python-format
+msgid "xs:all cannot extend a not empty xs:%s"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:989
+msgid "cannot extend a not empty 'all' model group with a different model"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:992
+msgid "when extend an xs:all group minOccurs must be the same"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:995
+msgid "cannot extend an xs:all group with mixed empty content"
+msgstr ""
+
+#: xmlschema/validators/complex_types.py:1035
+msgid "{0!r} is not an extension of the base type {1!r}"
+msgstr ""
+
+#: xmlschema/validators/notations.py:39
+msgid "a notation declaration must be global"
+msgstr ""
+
+#: xmlschema/validators/notations.py:43
+msgid "a notation must have a 'name' attribute"
+msgstr ""
+
+#: xmlschema/validators/notations.py:46
+msgid "a notation must have a 'public' or a 'system' attribute"
+msgstr ""
+
+#: xmlschema/validators/particles.py:122
+msgid "minOccurs value is not an integer value"
+msgstr ""
+
+#: xmlschema/validators/particles.py:126
+msgid "minOccurs value must be a non negative integer"
+msgstr ""
+
+#: xmlschema/validators/particles.py:134
+msgid "minOccurs must be lesser or equal than maxOccurs"
+msgstr ""
+
+#: xmlschema/validators/particles.py:142
+msgid "maxOccurs value must be a non negative integer or 'unbounded'"
+msgstr ""
+
+#: xmlschema/validators/particles.py:146
+msgid "maxOccurs must be 'unbounded' or greater than minOccurs"
+msgstr ""
+
+#: xmlschema/validators/assertions.py:76
+msgid "base_type={!r} is not a complexType definition"
+msgstr ""
+
+#: xmlschema/validators/elements.py:162
+#, python-format
+msgid "unknown element %r"
+msgstr ""
+
+#: xmlschema/validators/elements.py:179
+msgid "attribute {!r} is not allowed when element reference is used"
+msgstr ""
+
+#: xmlschema/validators/elements.py:200
+msgid "local scope elements cannot have abstract attribute"
+msgstr ""
+
+#: xmlschema/validators/elements.py:227
+msgid "attribute {!r} is not allowed in a global element declaration"
+msgstr ""
+
+#: xmlschema/validators/elements.py:232
+msgid "attribute {!r} not allowed in a local element declaration"
+msgstr ""
+
+#: xmlschema/validators/elements.py:250 xmlschema/validators/elements.py:1460
+#: xmlschema/validators/simple_types.py:859
+#: xmlschema/validators/simple_types.py:1024
+#: xmlschema/validators/simple_types.py:1240
+msgid "unknown type {!r}"
+msgstr ""
+
+#: xmlschema/validators/elements.py:255
+msgid ""
+"the attribute 'type' and a xs:{} local declaration are mutually exclusive"
+msgstr ""
+
+#: xmlschema/validators/elements.py:274 xmlschema/validators/attributes.py:165
+msgid "'default' and 'fixed' attributes are mutually exclusive"
+msgstr ""
+
+#: xmlschema/validators/elements.py:278
+msgid "'default' value {!r} is not compatible with element's type"
+msgstr ""
+
+#: xmlschema/validators/elements.py:282
+msgid "xs:ID or a type derived from xs:ID cannot have a default value"
+msgstr ""
+
+#: xmlschema/validators/elements.py:288
+msgid "'fixed' value {!r} is not compatible with element's type"
+msgstr ""
+
+#: xmlschema/validators/elements.py:292
+msgid "xs:ID or a type derived from xs:ID cannot have a fixed value"
+msgstr ""
+
+#: xmlschema/validators/elements.py:311 xmlschema/validators/elements.py:319
+#, python-format
+msgid "duplicated identity constraint %r:"
+msgstr ""
+
+#: xmlschema/validators/elements.py:341
+#, python-format
+msgid "unknown substitutionGroup %r"
+msgstr ""
+
+#: xmlschema/validators/elements.py:346
+#, python-format
+msgid "circularity found for substitutionGroup %r"
+msgstr ""
+
+#: xmlschema/validators/elements.py:361
+msgid ""
+"{0!r} type is not of the same or a derivation of the head element {1!r} type"
+msgstr ""
+
+#: xmlschema/validators/elements.py:365
+#, python-format
+msgid ""
+"head element %r can't be substituted by an element that has a derivation of "
+"its type"
+msgstr ""
+
+#: xmlschema/validators/elements.py:369
+#, python-format
+msgid ""
+"head element %r can't be substituted by an element that has an extension of "
+"its type"
+msgstr ""
+
+#: xmlschema/validators/elements.py:373
+#, python-format
+msgid ""
+"head element %r can't be substituted by an element that has a restriction of "
+"its type"
+msgstr ""
+
+#: xmlschema/validators/elements.py:547
+msgid "schemaLocation declaration after namespace start"
+msgstr ""
+
+#: xmlschema/validators/elements.py:556
+#, python-format
+msgid "missing dynamic loaded schema from %s"
+msgstr ""
+
+#: xmlschema/validators/elements.py:559
+msgid "dynamic loaded schema change the assessment"
+msgstr ""
+
+#: xmlschema/validators/elements.py:610
+msgid "cannot use an abstract element for validation"
+msgstr ""
+
+#: xmlschema/validators/elements.py:667 xmlschema/validators/identities.py:219
+msgid "selector xpath expression can only select elements"
+msgstr ""
+
+#: xmlschema/validators/elements.py:673
+#, python-format
+msgid "usage of %r is blocked"
+msgstr ""
+
+#: xmlschema/validators/elements.py:677
+#, python-format
+msgid "%r is abstract"
+msgstr ""
+
+#: xmlschema/validators/elements.py:705
+msgid "element is not nillable"
+msgstr ""
+
+#: xmlschema/validators/elements.py:708
+msgid "xsi:nil attribute must have a boolean value"
+msgstr ""
+
+#: xmlschema/validators/elements.py:713
+msgid "xsi:nil='true' but the element has a fixed value"
+msgstr ""
+
+#: xmlschema/validators/elements.py:716
+msgid "xsi:nil='true' but the element is not empty"
+msgstr ""
+
+#: xmlschema/validators/elements.py:722
+msgid "character data is not allowed because content is empty"
+msgstr ""
+
+#: xmlschema/validators/elements.py:744 xmlschema/validators/elements.py:760
+#, python-format
+msgid "must have the fixed value %r"
+msgstr ""
+
+#: xmlschema/validators/elements.py:749
+msgid "a simple content element can't have child elements"
+msgstr ""
+
+#: xmlschema/validators/elements.py:778 xmlschema/validators/attributes.py:237
+msgid ""
+"cannot validate against xs:NOTATION directly, only against a subtype with an "
+"enumeration facet"
+msgstr ""
+
+#: xmlschema/validators/elements.py:782 xmlschema/validators/attributes.py:241
+msgid "missing enumeration facet in xs:NOTATION subtype"
+msgstr ""
+
+#: xmlschema/validators/elements.py:1245
+msgid "test attribute missing in non-final alternative"
+msgstr ""
+
+#: xmlschema/validators/elements.py:1370
+msgid "Maybe a not equivalent type table between elements {0!r} and {1!r}"
+msgstr ""
+
+#: xmlschema/validators/elements.py:1446
+msgid "missing 'type' attribute"
+msgstr ""
+
+#: xmlschema/validators/elements.py:1454
+msgid "declared type is not derived from {!r}"
+msgstr ""
+
+#: xmlschema/validators/elements.py:1464
+msgid "type {0!r} is not derived from {1!r}"
+msgstr ""
+
+#: xmlschema/validators/elements.py:1469
+#, python-format
+msgid ""
+"the attribute 'type' and the xs:%s local declaration are mutually exclusive"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:77
+msgid "global {0} with name={1!r} is already defined"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:90
+msgid "multiple redefinition for {0} {1!r}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:102
+msgid "circular redefinition for {0} {1!r}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:117
+msgid "not a redefinition!"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:234
+msgid "wrong tag {!r} for an XSD global definition/declaration"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:313
+#: xmlschema/validators/global_maps.py:330
+msgid "wrong element {0!r} for map {1!r}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:339
+msgid "redefined schema {!r} has a different targetNamespace"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:350
+msgid "unexpected instance {!r} in global map"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:382
+msgid "{0!r} cannot substitute {1!r}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:578
+msgid "missing XSD namespace in meta-schema instance {!r}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:587
+msgid "missing default meta-schema instance {!r}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:639
+msgid "defaultAttributes={0!r} doesn't match any attribute group of {1!r}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:682
+msgid "global element not built!"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:684
+msgid "circularity found for substitution group with head element {}"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:689
+#, python-format
+msgid "global map has unbuilt components: %r"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:694
+msgid "global group not built!"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:701
+msgid "the redefined group is an illegal restriction"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:717
+msgid "the derived group is an illegal restriction"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:727
+msgid "restriction has an open content but base type has not"
+msgstr ""
+
+#: xmlschema/validators/global_maps.py:733
+msgid ""
+"can't verify the content model of {!r} due to exceeding of maximum recursion "
+"depth"
+msgstr ""
+
+#: xmlschema/validators/facets.py:63
+msgid "invalid type {!r} provided"
+msgstr ""
+
+#: xmlschema/validators/facets.py:84
+msgid "{0!r} facet value is fixed to {1!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:135 xmlschema/validators/facets.py:138
+msgid "facet value can be only 'collapse'"
+msgstr ""
+
+#: xmlschema/validators/facets.py:140
+msgid "facet value can be only 'replace' or 'collapse'"
+msgstr ""
+
+#: xmlschema/validators/facets.py:145
+msgid "value contains tabs or newlines"
+msgstr ""
+
+#: xmlschema/validators/facets.py:151
+msgid "value contains non collapsed white spaces"
+msgstr ""
+
+#: xmlschema/validators/facets.py:175
+msgid "base facet has a different length ({})"
+msgstr ""
+
+#: xmlschema/validators/facets.py:185
+msgid "length has to be {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:209
+msgid "base facet has a greater min length ({})"
+msgstr ""
+
+#: xmlschema/validators/facets.py:219
+msgid "value length cannot be lesser than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:243
+msgid "base type has a lesser max length ({})"
+msgstr ""
+
+#: xmlschema/validators/facets.py:253
+msgid "value length cannot be greater than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:276 xmlschema/validators/facets.py:307
+#: xmlschema/validators/facets.py:342 xmlschema/validators/facets.py:373
+msgid "invalid restriction: {}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:281
+msgid "value has to be greater or equal than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:311
+msgid "invalid restriction: {} is also the maximum"
+msgstr ""
+
+#: xmlschema/validators/facets.py:317
+msgid "value has to be greater than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:347
+msgid "value has to be less than or equal than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:377
+msgid "invalid restriction: {} is also the minimum"
+msgstr ""
+
+#: xmlschema/validators/facets.py:383
+msgid "value has to be lesser than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:418 xmlschema/validators/facets.py:475
+msgid "invalid restriction: base value is lower ({})"
+msgstr ""
+
+#: xmlschema/validators/facets.py:428
+msgid "the number of digits has to be lesser or equal than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:456
+msgid ""
+"fractionDigits facet can be applied only to types derived from xs:decimal"
+msgstr ""
+
+#: xmlschema/validators/facets.py:470
+msgid "fractionDigits facet value must be 0 for types derived from xs:integer"
+msgstr ""
+
+#: xmlschema/validators/facets.py:485
+msgid "the number of fraction digits has to be lesser or equal than {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:517
+msgid "invalid restriction from {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:522
+msgid "time zone required for value {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:527
+msgid "time zone prohibited for value {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:571
+msgid "value {!r} must match a notation declaration"
+msgstr ""
+
+#: xmlschema/validators/facets.py:629
+msgid "value must be one of {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:725
+msgid "value doesn't match any pattern of {!r}"
+msgstr ""
+
+#: xmlschema/validators/facets.py:789
+msgid "missing attribute 'test'"
+msgstr ""
+
+#: xmlschema/validators/facets.py:819
+msgid "value is not true with test path {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:82
+msgid "unknown attribute {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:97
+msgid "referenced attribute has a different fixed value {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:102
+msgid "attribute {!r} is not allowed when attribute reference is used"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:118
+msgid "an attribute name must be different from 'xmlns'"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:125
+#, python-format
+msgid "cannot add attributes in %r namespace"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:146
+msgid "ambiguous type definition for XSD attribute"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:158
+msgid "XSD attribute's type must be a simpleType"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:169
+msgid ""
+"the attribute 'use' must be 'optional' if the attribute 'default' is present"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:174
+msgid "default value {!r} is not compatible with attribute's type"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:177
+msgid "xs:ID key attributes cannot have a default value"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:183
+msgid "fixed value {!r} is not compatible with attribute's type"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:186
+msgid "xs:ID key attributes cannot have a fixed value"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:249
+msgid "attribute {0!r} has a fixed value {1!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:254
+msgid "attribute {0}={1!r}: {2}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:319
+msgid "attribute 'fixed' with use=prohibited is not allowed in XSD 1.1"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:413
+msgid "more anyAttribute declarations in the same attribute group"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:416
+msgid "another declaration after anyAttribute"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:431
+msgid "multiple declaration for attribute {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:440
+msgid "the attribute 'ref' is required in a local attributeGroup"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:450
+msgid "duplicated attributeGroup {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:456
+msgid "in a redefinition the reference to itself must be the first"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:467
+msgid "attributeGroup ref={!r} is not in the redefined group"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:471
+msgid "Circular attribute groups not allowed in XSD 1.0"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:479
+msgid "unknown attribute group {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:488
+msgid "multiple declaration of attribute {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:497
+msgid "Circular reference found between attribute groups {0!r} and {1!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:502
+msgid "(attribute | attributeGroup) expected, found {!r}."
+msgstr ""
+
+#: xmlschema/validators/attributes.py:513
+msgid "Unexpected attribute {!r} in restriction"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:529
+msgid "Attribute wildcard is not a restriction of the base wildcard"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:539
+msgid "Attribute type is not a restriction of the base attribute type"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:544
+msgid "Attribute {!r}: unmatched attribute use in restriction"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:550
+msgid "Attribute {!r}: derived attribute has a different fixed value"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:554
+msgid "Attribute {!r}: 'inheritable' property change in restriction"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:568
+msgid "Missing required attribute {!r} in redefinition restriction"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:573
+msgid "Attribute {!r}: unmatched attribute use in redefinition"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:576
+msgid "Attribute {!r}: redefinition remove fixed constraint"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:585
+msgid "Redefinition restriction contains additional attribute {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:589
+msgid "Wrong attribute order in redefinition restriction"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:607
+msgid "multiple ID attributes not allowed for XSD 1.0"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:660
+#: xmlschema/validators/attributes.py:738
+msgid "missing required attribute {!r}"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:695
+#: xmlschema/validators/attributes.py:760
+#, python-format
+msgid "%r is not an attribute of the XSI namespace"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:703
+#: xmlschema/validators/attributes.py:768
+#, python-format
+msgid "%r attribute not allowed for element"
+msgstr ""
+
+#: xmlschema/validators/attributes.py:709
+#, python-format
+msgid "use of attribute %r is prohibited"
+msgstr ""
+
+#: xmlschema/validators/exceptions.py:345
+#, python-format
+msgid "Unexpected child with tag %r at position %d."
+msgstr ""
+
+#: xmlschema/validators/exceptions.py:372
+#, python-format
+msgid " Tag (%s) expected."
+msgstr ""
+
+#: xmlschema/validators/exceptions.py:374
+#, python-format
+msgid " Tag %s expected."
+msgstr ""
+
+#: xmlschema/validators/exceptions.py:376
+#, python-format
+msgid " Tag %r expected."
+msgstr ""
+
+#: xmlschema/validators/groups.py:355
+msgid "{!r} is not a particle of the model group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:413 xmlschema/validators/groups.py:455
+msgid "attribute 'name' not allowed in a local group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:422
+#, python-format
+msgid "missing group %r"
+msgstr ""
+
+#: xmlschema/validators/groups.py:429 xmlschema/validators/groups.py:485
+msgid "maxOccurs must be 1 for 'all' model groups"
+msgstr ""
+
+#: xmlschema/validators/groups.py:432 xmlschema/validators/groups.py:488
+#: xmlschema/validators/groups.py:1285
+msgid "minOccurs must be (0 | 1) for 'all' model groups"
+msgstr ""
+
+#: xmlschema/validators/groups.py:435
+msgid "in XSD 1.0 an 'all' model group cannot be nested"
+msgstr ""
+
+#: xmlschema/validators/groups.py:441 xmlschema/validators/groups.py:523
+#: xmlschema/validators/groups.py:1317
+#, python-format
+msgid "Circular definition detected for group %r"
+msgstr ""
+
+#: xmlschema/validators/groups.py:459 xmlschema/validators/groups.py:469
+msgid "attribute 'minOccurs' not allowed in a global group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:462 xmlschema/validators/groups.py:472
+msgid "attribute 'maxOccurs' not allowed in a global group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:499
+msgid "'all' model can contain only elements"
+msgstr ""
+
+#: xmlschema/validators/groups.py:509 xmlschema/validators/groups.py:1301
+msgid "missing attribute 'ref' in local group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:518
+msgid "'all' model can appears only at 1st level of a model group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:527 xmlschema/validators/groups.py:1321
+msgid "Redefined group reference cannot have minOccurs/maxOccurs other than 1"
+msgstr ""
+
+#: xmlschema/validators/groups.py:821
+msgid ""
+"Element Declarations Consistent violation between {0!r} and {1!r}: match the "
+"same name but with different types"
+msgstr ""
+
+#: xmlschema/validators/groups.py:835
+msgid "{0!r} and {1!r} overlap and are in the same {2!r} group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:847
+msgid "Unique Particle Attribution violation between {0!r} and {1!r}"
+msgstr ""
+
+#: xmlschema/validators/groups.py:860
+#, python-format
+msgid "substitution of %r is blocked"
+msgstr ""
+
+#: xmlschema/validators/groups.py:909
+msgid "usage of {0!r} with type {1} is blocked by head element"
+msgstr ""
+
+#: xmlschema/validators/groups.py:934
+msgid "{0!r} that matches {1!r} is not consistent with local declaration {2!r}"
+msgstr ""
+
+#: xmlschema/validators/groups.py:940
+msgid "Maybe a not equivalent type table between elements {0!r} and {1!r}."
+msgstr ""
+
+#: xmlschema/validators/groups.py:970
+msgid "an empty 'choice' group with minOccurs > 0 cannot validate any content"
+msgstr ""
+
+#: xmlschema/validators/groups.py:982 xmlschema/validators/groups.py:1242
+msgid "character data between child elements not allowed"
+msgstr ""
+
+#: xmlschema/validators/groups.py:995
+#, python-format
+msgid "XML data depth exceeded (MAX_XML_DEPTH=%r)"
+msgstr ""
+
+#: xmlschema/validators/groups.py:1202
+msgid "{!r} does not match any declared element of the model group"
+msgstr ""
+
+#: xmlschema/validators/groups.py:1205
+msgid "{0} has an unknown prefix {1!r}"
+msgstr ""
+
+#: xmlschema/validators/groups.py:1238
+msgid "wrong content type {!r}"
+msgstr ""
+
+#: xmlschema/validators/groups.py:1282
+msgid "maxOccurs must be (0 | 1) for 'all' model groups"
+msgstr ""
+
+#: xmlschema/validators/groups.py:1311
+#, python-brace-format
+msgid "an xs:{0} group cannot include a reference to an xs:{1} group"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:76
+#, python-format
+msgid "wrong value %r in 'namespace' attribute"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:85
+#, python-format
+msgid "wrong value %r for 'processContents' attribute"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:94
+msgid "'namespace' and 'notNamespace' attributes are mutually exclusive"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:105
+#, python-format
+msgid "wrong value %r in 'notNamespace' attribute"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:121
+msgid "wrong value for 'notQName' attribute"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:128
+#, python-format
+msgid "unmapped QName in 'notQName' attribute: %s"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:132
+#, python-format
+msgid "wrong QName format in 'notQName' attribute: %s"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:140
+msgid "the namespace of each QName in notQName is allowed by notNamespace"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:144
+msgid "names in notQName must be in namespaces that are allowed"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:319
+msgid "not expressible wildcard namespace union: {0!r} V {1!r}:"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:473 xmlschema/validators/wildcards.py:515
+msgid "element {!r} is not allowed here"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:651 xmlschema/validators/wildcards.py:681
+#, python-format
+msgid "attribute %r not allowed"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:663 xmlschema/validators/wildcards.py:693
+#, python-format
+msgid "attribute %r not found"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:670 xmlschema/validators/wildcards.py:700
+msgid "unavailable namespace {!r}"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:857
+#, python-format
+msgid "wrong value %r for 'mode' attribute"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:863
+msgid ""
+"an openContent with mode='none' cannot have an <xs:any> child declaration"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:867
+msgid "an <xs:any> child declaration is required"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:908
+msgid "defaultOpenContent must be a child of the schema"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:911
+msgid "the attribute 'mode' of a defaultOpenContent cannot be 'none'"
+msgstr ""
+
+#: xmlschema/validators/wildcards.py:914
+msgid "a defaultOpenContent declaration cannot be empty"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:156
+msgid "XSD_VERSION must be '1.0' or '1.1'"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:336
+msgid "{!r} is not a valid loglevel"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:352
+msgid "no XSD source provided!"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:380
+msgid "the attribute 'targetNamespace' cannot be an empty string"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:383
+msgid "wrong namespace ({0!r} instead of {1!r}) for XSD resource {2}"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:460
+#, python-format
+msgid "'global_maps' argument must be an %r instance"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:542
+msgid "cannot change the global maps instance of a meta-schema"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:675 xmlschema/validators/schemas.py:970
+#, python-format
+msgid "meta-schema unavailable for %r"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:682
+msgid "missing XSD namespace in meta-schema"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:754
+msgid "Missing meta-schema source URL"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:766
+msgid ""
+"The argument 'base_schemas' must be a dictionary or a sequence of couples"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:803 xmlschema/validators/schemas.py:815
+msgid "(restriction | list | union) expected"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:826
+msgid "missing attribute 'name' in a global simpleType"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:831
+msgid "attribute 'name' not allowed for a local simpleType"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:875
+msgid "'model' argument must be (sequence | choice | all)"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:990
+#, python-format
+msgid "schema %r is not built"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1095
+msgid "the namespace {!r} is not loaded"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1117
+msgid "'converter' argument must be a {0!r} subclass or instance: {1!r}"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1172
+msgid "cannot include schema {0!r}: {1}"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1186
+#, python-format
+msgid "Redefine schema failed: %s"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1191
+msgid "cannot redefine schema {0!r}: {1}"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1207
+#, python-format
+msgid "Override schema failed: %s"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1269
+msgid ""
+"if the 'namespace' attribute is not present on the import statement then the "
+"imported schema must have a 'targetNamespace'"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1275
+msgid ""
+"the attribute 'namespace' must be different from schema's 'targetNamespace'"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1322
+msgid "cannot import namespace {0!r}: {1}"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1324
+#, python-format
+msgid "cannot import chameleon schema: %s"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1388
+msgid "imported schema {0!r} has an unmatched namespace {1!r}"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1435
+msgid "target directory {} is not empty"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1438
+msgid "target {} is not a directory"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1441
+msgid "target parent directory {} does not exist"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1444
+msgid "target parent {} is not a directory"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1537
+msgid "invalid attribute vc:minVersion value"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1546
+msgid "invalid attribute vc:maxVersion value"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1622 xmlschema/validators/schemas.py:1629
+#: xmlschema/validators/schemas.py:1635
+msgid "{!r} is not a valid value for xs:QName"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1641
+msgid "prefix {!r} not found in namespace map"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1648
+msgid ""
+"the QName {!r} is mapped to no namespace, but this requires that there is an "
+"xs:import statement in the schema without the 'namespace' attribute."
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1657
+msgid ""
+"the QName {0!r} is mapped to the namespace {1!r}, but this namespace has not "
+"an xs:import statement in the schema."
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1798 xmlschema/validators/schemas.py:1852
+#: xmlschema/validators/schemas.py:1997
+msgid "{!r} is not an element of the schema"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:1826
+#, python-format
+msgid "IDREF %r not found in XML document"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:2076
+msgid "encoding needs at least one XSD element declaration"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:2110
+#, python-format
+msgid "the path %r doesn't match any element of the schema!"
+msgstr ""
+
+#: xmlschema/validators/schemas.py:2112
+msgid ""
+"unable to select an element for decoding data, provide a valid 'path' "
+"argument."
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:133
+msgid "facets not allowed for a direct derivation of xs:anySimpleType"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:137
+msgid "facets not allowed for a direct content derivation of xs:anySimpleType"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:143
+msgid "one or more facets are not applicable, admitted set is {!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:149
+#, python-format
+msgid "facet group must have the same base type: %r"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:159
+msgid "'length' value must be non a negative integer"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:163
+msgid "'minLength' value must be less than or equal to 'length'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:170
+msgid "cannot specify both 'length' and 'minLength'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:175
+msgid "'maxLength' value must be greater or equal to 'length'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:183
+msgid "cannot specify both 'length' and 'maxLength'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:192
+msgid "'minLength' value must be a non negative integer"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:195
+msgid "'maxLength' value is less than 'minLength'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:198
+msgid "'minLength' has a lesser value than parent"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:201
+msgid "'minLength' has a greater value than parent 'maxLength'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:206
+msgid "'maxLength' value must be a non negative integer"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:209
+msgid "'maxLength' has a lesser value than parent 'minLength'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:212
+msgid "'maxLength' has a greater value than parent"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:223
+msgid "cannot specify both 'minInclusive' and 'minExclusive'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:226
+msgid "'minInclusive' must be less or equal to 'maxInclusive'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:229
+msgid "'minInclusive' must be lesser than 'maxExclusive'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:234
+msgid "'minExclusive' must be lesser than 'maxInclusive'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:237
+msgid "'minExclusive' must be less or equal to 'maxExclusive'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:241
+msgid "cannot specify both 'maxInclusive' and 'maxExclusive'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:247
+msgid ""
+"fractionDigits facet value cannot be lesser than the value of totalDigits "
+"facet"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:253
+msgid ""
+"totalDigits facet value cannot be greater than the value of the same facet "
+"in the base type"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:262
+#, python-format
+msgid ""
+"the explicitTimezone facet value cannot be changed if the base type has the "
+"same facet with value %r"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:460
+msgid "a {0!r} or {1!r} object required"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:615
+msgid "value is not an instance of {!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:640
+#: xmlschema/validators/simple_types.py:753
+#: xmlschema/validators/simple_types.py:1107
+msgid "invalid value {!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:665
+#, python-format
+msgid "unmapped prefix %r in a QName"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:699
+#: xmlschema/validators/simple_types.py:711
+msgid "duplicated xs:ID value {!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:706
+msgid "no more than one attribute of type ID should be present in an element"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:731
+msgid "boolean value {0!r} requires a {1!r} decoder"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:736
+msgid "{0!r} is not an instance of {1!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:824
+#, python-format
+msgid "%r: a list must be based on atomic data types"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:843
+msgid "ambiguous list type declaration"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:851
+msgid "missing list type declaration"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:864
+msgid "circular definition found for type {!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:869
+#, python-format
+msgid "'final' value of the itemType %r forbids derivation by list"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:873
+#: xmlschema/validators/simple_types.py:1048
+#: xmlschema/validators/simple_types.py:1335
+msgid "cannot use xs:anyAtomicType as base type of a user-defined type"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:996
+#, python-format
+msgid "wrong value %r for attribute 'white_space'"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1031
+msgid "circular definition found on xs:union type {!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1035
+msgid "a {0!r} required, not {1!r}"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1039
+#, python-format
+msgid "'final' value of the memberTypes %r forbids derivation by union"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1045
+msgid "missing xs:union type declarations"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1128
+#, python-format
+msgid "no type suitable for decoding the values %r"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1162
+msgid "no type suitable for encoding the object"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1210
+msgid "'name' attribute in a local simpleType definition"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1252
+#, python-format
+msgid "wrong base type %r, an atomic type required"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1258
+msgid "an xs:simpleType definition expected"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1263
+msgid ""
+"when a complexType with simpleContent restricts a complexType with mixed and "
+"with emptiable content then a simpleType child declaration is required"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1268
+#, python-format
+msgid "simpleType restriction of %r is not allowed"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1277
+msgid "unexpected tag after attribute declarations"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1282
+msgid "duplicated simpleType declaration"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1304
+msgid "restriction with 'base' attribute and simpleType declaration"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1312
+#, python-format
+msgid "unexpected tag %r in restriction"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1318
+#, python-format
+msgid "multiple %r constraint facet"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1330
+msgid "missing base type in restriction"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1332
+#, python-format
+msgid "'final' value of the baseType %r forbids derivation by restriction"
+msgstr ""
+
+#: xmlschema/validators/simple_types.py:1381
+#: xmlschema/validators/simple_types.py:1430
+#, python-format
+msgid ""
+"wrong base type %r: a simpleType or a complexType with simple or mixed "
+"content required"
+msgstr ""
+
+#: xmlschema/validators/identities.py:86
+msgid "'xpath' attribute required"
+msgstr ""
+
+#: xmlschema/validators/identities.py:98
+msgid "invalid XPath expression for an {}"
+msgstr ""
+
+#: xmlschema/validators/identities.py:182
+msgid "missing required attribute 'name'"
+msgstr ""
+
+#: xmlschema/validators/identities.py:190
+msgid "missing 'selector' declaration"
+msgstr ""
+
+#: xmlschema/validators/identities.py:202
+msgid "unknown identity constraint {!r}"
+msgstr ""
+
+#: xmlschema/validators/identities.py:207
+msgid "attribute 'ref' points to a different kind constraint"
+msgstr ""
+
+#: xmlschema/validators/identities.py:296
+msgid "missing key field {0!r} for {1!r}"
+msgstr ""
+
+#: xmlschema/validators/identities.py:304
+#, python-format
+msgid "%r field doesn't have a simple type!"
+msgstr ""
+
+#: xmlschema/validators/identities.py:325
+#, python-format
+msgid "%r field selects multiple values!"
+msgstr ""
+
+#: xmlschema/validators/identities.py:359
+msgid "missing required attribute 'refer'"
+msgstr ""
+
+#: xmlschema/validators/identities.py:381
+#, python-format
+msgid "key/unique identity constraint %r is missing"
+msgstr ""
+
+#: xmlschema/validators/identities.py:386
+#, python-format
+msgid "reference to a non key/unique identity constraint %r"
+msgstr ""
+
+#: xmlschema/validators/identities.py:389
+msgid "field cardinality mismatch between {0!r} and {1!r}"
+msgstr ""
+
+#: xmlschema/validators/identities.py:459
+msgid "duplicated value {0!r} for {1!r}"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:51
+#, python-format
+msgid "validation mode can be 'strict', 'lax' or 'skip': %r"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:254
+msgid ""
+"wrong value {0!r} for 'xpathDefaultNamespace' attribute, can be (anyURI | "
+"{1})."
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:405
+#, python-format
+msgid "missing attribute 'name' in a global %r"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:408
+#, python-format
+msgid "missing both attributes 'name' and 'ref' in local %r"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:411
+msgid "attributes 'name' and 'ref' are mutually exclusive"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:414
+#, python-format
+msgid "attribute 'ref' not allowed in a global %r"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:423
+msgid "a reference component cannot have child definitions/declarations"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:438
+msgid "too many XSD components, unexpected {0!r} found at position {1}"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:454
+msgid ""
+"attribute 'name' must be present when 'targetNamespace' attribute is provided"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:458
+msgid ""
+"attribute 'form' must be absent when 'targetNamespace' attribute is provided"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:463
+#, python-format
+msgid "a global %s must have the same namespace as its parent schema"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:471
+msgid ""
+"a declaration contained in a global complexType must have the same namespace "
+"as its parent schema"
+msgstr ""
+
+#: xmlschema/validators/xsdbase.py:591
+msgid "parent circularity from {}"
+msgstr ""
+
+#: xmlschema/validators/helpers.py:44
+#, python-format
+msgid "wrong value %r for attribute %r"
+msgstr ""
+
+#: xmlschema/validators/helpers.py:59
+msgid "value is not a valid xs:decimal"
+msgstr ""
+
+#: xmlschema/validators/helpers.py:65
+msgid "value is not an xs:QName"
+msgstr ""
+
+#: xmlschema/validators/helpers.py:71 xmlschema/validators/helpers.py:77
+#: xmlschema/validators/helpers.py:83 xmlschema/validators/helpers.py:89
+#: xmlschema/validators/helpers.py:95 xmlschema/validators/helpers.py:101
+#: xmlschema/validators/helpers.py:107 xmlschema/validators/helpers.py:113
+msgid "value must be {:s}"
+msgstr ""
+
+#: xmlschema/validators/helpers.py:119
+msgid "value must be negative"
+msgstr ""
+
+#: xmlschema/validators/helpers.py:125
+msgid "value must be positive"
+msgstr ""
+
+#: xmlschema/validators/helpers.py:131
+msgid "value must be non positive"
+msgstr ""
+
+#: xmlschema/validators/helpers.py:137
+msgid "value must be non negative"
+msgstr ""
+
+#: xmlschema/validators/helpers.py:144
+msgid "not an hexadecimal number"
+msgstr ""
+
+#: xmlschema/validators/helpers.py:157
+msgid "not a base64 encoding"
+msgstr ""
+
+#: xmlschema/validators/helpers.py:162
+msgid "no value is allowed for xs:error type"
+msgstr ""
+
+#: xmlschema/validators/helpers.py:174
+msgid "{!r} is not a boolean value"
+msgstr ""
diff --git a/xmlschema/namespaces.py b/xmlschema/namespaces.py
index a20847d..fa17847 100644
--- a/xmlschema/namespaces.py
+++ b/xmlschema/namespaces.py
@@ -159,7 +159,7 @@ class NamespaceMapper(MutableMapping[str, str]):
         except IndexError:
             return qname
         except ValueError:
-            raise XMLSchemaValueError("the argument 'qname' has a wrong format: %r" % qname)
+            raise XMLSchemaValueError("the argument 'qname' has an invalid value %r" % qname)
         except TypeError:
             raise XMLSchemaTypeError("the argument 'qname' must be a string-like object")
 
@@ -191,7 +191,7 @@ class NamespaceMapper(MutableMapping[str, str]):
             return qname
         except ValueError:
             if ':' in qname:
-                raise XMLSchemaValueError("the argument 'qname' has a wrong format: %r" % qname)
+                raise XMLSchemaValueError("the argument 'qname' has an invalid value %r" % qname)
             if not self._namespaces.get(''):
                 return qname
             elif name_table is None or qname not in name_table:
diff --git a/xmlschema/resources.py b/xmlschema/resources.py
index 684e267..81fb02d 100644
--- a/xmlschema/resources.py
+++ b/xmlschema/resources.py
@@ -133,7 +133,7 @@ class _PurePath(PurePath):
 
             obj = _PureWindowsPath(unquote(path))
             if len(obj.drive) != 2 or obj.drive[1] != ':':
-                raise XMLSchemaValueError("Invalid URI {!r}".format(uri))
+                raise XMLSchemaValueError("Invalid URI %r" % uri)
             return obj
 
         if '\\' in path:
@@ -334,7 +334,7 @@ def fetch_resource(location: str, base_url: Optional[str] = None, timeout: int =
     :return: a normalized URL.
     """
     if not location:
-        raise XMLSchemaValueError("'location' argument must contain a not empty string")
+        raise XMLSchemaValueError("'location' argument should contain a not empty string")
 
     url = normalize_url(location, base_url)
     try:
@@ -344,13 +344,15 @@ def fetch_resource(location: str, base_url: Optional[str] = None, timeout: int =
         # fallback joining the path without a base URL
         alt_url = normalize_url(location)
         if url == alt_url:
-            raise XMLResourceError("cannot access to resource %r: %s" % (url, err.reason))
+            msg = "cannot access to resource %(url)r: %(reason)s"
+            raise XMLResourceError(msg % {'url': url, 'reason': err.reason})
 
         try:
             with urlopen(alt_url, timeout=timeout):
                 return alt_url
         except URLError:
-            raise XMLResourceError("cannot access to resource %r: %s" % (url, err.reason))
+            msg = "cannot access to resource %(url)r: %(reason)s"
+            raise XMLResourceError(msg % {'url': url, 'reason': err.reason})
 
 
 def fetch_schema_locations(source: Union['XMLResource', XMLSourceType],
@@ -384,8 +386,8 @@ def fetch_schema_locations(source: Union['XMLResource', XMLSourceType],
     namespace = resource.namespace
     locations = resource.get_locations(locations, root_only=False)
     if not locations:
-        msg = "{!r} does not contain any schema location hint"
-        raise XMLSchemaValueError(msg.format(source))
+        msg = "%r does not contain any schema location hint"
+        raise XMLSchemaValueError(msg % source)
 
     for ns, url in sorted(locations, key=lambda x: x[0] != namespace):
         try:
@@ -393,7 +395,7 @@ def fetch_schema_locations(source: Union['XMLResource', XMLSourceType],
         except XMLResourceError:
             pass
 
-    raise XMLSchemaValueError("not found a schema for XML data resource {!r}.".format(source))
+    raise XMLSchemaValueError("not found a schema for XML data resource %r" % source)
 
 
 def fetch_schema(source: Union['XMLResource', XMLSourceType],
@@ -478,31 +480,31 @@ class XMLResource:
                 raise XMLSchemaValueError("'base_url' argument is not an URL")
             self._base_url = base_url.decode()
         elif base_url is not None:
-            msg = "invalid type {!r} for argument 'base_url'"
-            raise XMLSchemaTypeError(msg.format(type(base_url)))
+            msg = "invalid type %r for argument 'base_url'"
+            raise XMLSchemaTypeError(msg % type(base_url))
 
         if not isinstance(allow, str):
-            msg = "invalid type {!r} for argument 'allow'"
-            raise XMLSchemaTypeError(msg.format(type(allow)))
+            msg = "invalid type %r for argument 'allow'"
+            raise XMLSchemaTypeError(msg % type(allow))
         elif allow not in SECURITY_MODES:
-            msg = "'allow' argument: {!r} is not a security mode"
-            raise XMLSchemaValueError(msg.format(allow))
+            msg = "'allow' argument: %r is not a security mode"
+            raise XMLSchemaValueError(msg % allow)
         elif allow == 'sandbox' and self._base_url is None:
             msg = "block access to files out of sandbox requires 'base_url' to be set"
             raise XMLResourceError(msg)
         self._allow = allow
 
         if not isinstance(defuse, str):
-            msg = "invalid type {!r} for argument 'defuse'"
-            raise XMLSchemaTypeError(msg.format(type(defuse)))
+            msg = "invalid type %r for argument 'defuse'"
+            raise XMLSchemaTypeError(msg % type(defuse))
         elif defuse not in DEFUSE_MODES:
-            msg = "'defuse' argument: {!r} is not a defuse mode"
-            raise XMLSchemaValueError(msg.format(defuse))
+            msg = "'defuse' argument: %r is not a defuse mode"
+            raise XMLSchemaValueError(msg % defuse)
         self._defuse = defuse
 
         if not isinstance(timeout, int):
-            msg = "invalid type {!r} for argument 'timeout'"
-            raise XMLSchemaTypeError(msg.format(type(timeout)))
+            msg = "invalid type %r for argument 'timeout'"
+            raise XMLSchemaTypeError(msg % type(timeout))
         elif timeout <= 0:
             msg = "the argument 'timeout' must be a positive integer"
             raise XMLSchemaValueError(msg)
@@ -733,11 +735,11 @@ class XMLResource:
         if isinstance(lazy, bool):
             pass
         elif not isinstance(lazy, int):
-            msg = "invalid type {!r} for the attribute 'lazy'"
-            raise XMLSchemaTypeError(msg.format(type(lazy)))
+            msg = "invalid type %r for the attribute 'lazy'"
+            raise XMLSchemaTypeError(msg % type(lazy))
         elif lazy < 0:
-            msg = "invalid value {!r} for the attribute 'lazy'"
-            raise XMLSchemaValueError(msg.format(lazy))
+            msg = "invalid value %r for the attribute 'lazy'"
+            raise XMLSchemaValueError(msg % lazy)
 
         url: Optional[str]
         if isinstance(source, str):
@@ -944,9 +946,8 @@ class XMLResource:
         try:
             return cast(IO[AnyStr], urlopen(self._url, timeout=self._timeout))
         except URLError as err:
-            raise XMLResourceError(
-                "cannot access to resource %r: %s" % (self._url, err.reason)
-            )
+            msg = "cannot access to resource %(url)r: %(reason)s"
+            raise XMLResourceError(msg % {'url': self._url, 'reason': err.reason})
 
     def seek(self, position: int) -> Optional[int]:
         """
@@ -1290,10 +1291,10 @@ class XMLResource:
 
         try:
             if root_only or root_only is None and self._lazy:
-                for _ in self.iter(nsmap=namespaces):
+                for _elem in self.iter(nsmap=namespaces):
                     break
             else:
-                for _ in self.iter(nsmap=namespaces):
+                for _elem in self.iter(nsmap=namespaces):
                     pass
         except (ElementTree.ParseError, PyElementTree.ParseError, UnicodeEncodeError):
             pass
diff --git a/xmlschema/schemas/XSD_1.0/XMLSchema.xsd b/xmlschema/schemas/XSD_1.0/XMLSchema.xsd
index 91cd4be..c75baaf 100644
--- a/xmlschema/schemas/XSD_1.0/XMLSchema.xsd
+++ b/xmlschema/schemas/XSD_1.0/XMLSchema.xsd
@@ -34,6 +34,11 @@
 <!--
      keep this schema XML1.0 DTD valid
   -->
+<!--
+     Commented to make xmlschema compatible with defusedxml.defuse_stdlib()
+     that creates a monkey patched version of xml.etree.ElementTree library
+     with a safe parser.
+
         <!ENTITY % schemaAttrs 'xmlns:hfp CDATA #IMPLIED'>
 
         <!ELEMENT hfp:hasFacet EMPTY>
@@ -44,6 +49,7 @@
         <!ATTLIST hfp:hasProperty
                 name NMTOKEN #REQUIRED
                 value CDATA #REQUIRED>
+  -->
 <!--
         Make sure that processors that do not read the external
         subset will know about the various IDs we declare
diff --git a/xmlschema/translation.py b/xmlschema/translation.py
new file mode 100644
index 0000000..7ad0453
--- /dev/null
+++ b/xmlschema/translation.py
@@ -0,0 +1,71 @@
+#
+# Copyright (c), 2016-2022, SISSA (International School for Advanced Studies).
+# All rights reserved.
+# This file is distributed under the terms of the MIT License.
+# See the file 'LICENSE' in the root directory of the present
+# distribution, or http://opensource.org/licenses/MIT.
+#
+# @author Davide Brunato <brunato@sissa.it>
+#
+#
+from typing import cast, Any, Iterable, Optional, Union
+import gettext as _gettext
+from pathlib import Path
+
+__all__ = ['activate', 'deactivate', 'gettext']
+
+_translation: Any = None
+_installed: bool = False
+
+
+def activate(localedir: Union[None, str, Path] = None,
+             languages: Optional[Iterable[str]] = None,
+             fallback: bool = True,
+             install: bool = False) -> None:
+    """
+    Activate translation of xmlschema parsing/validation error messages.
+
+    :param localedir: a string or Path-like object to locale directory
+    :param languages: list of language codes
+    :param fallback: for default fallback mode is activated
+    :param install: if `True` installs function _() in Python’s builtins namespace
+    """
+    global _translation
+    global _installed
+
+    if localedir is None:
+        localedir = Path(__file__).parent.joinpath('locale').resolve()
+
+    translation = _gettext.translation(
+        domain='xmlschema',
+        localedir=localedir,
+        languages=languages,
+        fallback=fallback,
+    )
+
+    deactivate()
+
+    _translation = translation
+    if install:
+        _translation.install()
+        _installed = True
+
+
+def deactivate() -> None:
+    """Deactivate translation of xmlschema parsing/validation error messages."""
+    global _translation
+    global _installed
+
+    if _installed and _translation is not None:
+        import builtins
+        if builtins.__dict__.get('_') == _translation.gettext:
+            builtins.__dict__.pop('_')
+
+    _translation = None
+    _installed = False
+
+
+def gettext(message: str) -> str:
+    if _translation is None:
+        return message
+    return cast(str, _translation.gettext(message))
diff --git a/xmlschema/validators/assertions.py b/xmlschema/validators/assertions.py
index 5a29c26..71b5ee6 100644
--- a/xmlschema/validators/assertions.py
+++ b/xmlschema/validators/assertions.py
@@ -13,6 +13,7 @@ from elementpath import XPath2Parser, XPathContext, XPathToken, ElementPathError
 
 from ..names import XSD_ASSERT
 from ..aliases import ElementType, SchemaType, SchemaElementType, NamespacesType
+from ..translation import gettext as _
 from ..xpath import XMLSchemaProtocol, ElementProtocol, ElementPathMixin, XMLSchemaProxy
 
 from .exceptions import XMLSchemaNotBuiltError, XMLSchemaValidationError
@@ -72,7 +73,8 @@ class XsdAssert(XsdComponent, ElementPathMixin[Union['XsdAssert', SchemaElementT
 
     def _parse(self) -> None:
         if self.base_type.is_simple():
-            self.parse_error("base_type=%r is not a complexType definition" % self.base_type)
+            msg = _("base_type={!r} is not a complexType definition")
+            self.parse_error(msg.format(self.base_type))
         else:
             try:
                 self.path = self.elem.attrib['test'].strip()
@@ -115,7 +117,7 @@ class XsdAssert(XsdComponent, ElementPathMixin[Union['XsdAssert', SchemaElementT
                  **kwargs: Any) -> Iterator[XMLSchemaValidationError]:
 
         if self.parser is None or self.token is None:
-            raise XMLSchemaNotBuiltError(self, "schema bound parser not set")
+            raise XMLSchemaNotBuiltError(self, 'schema bound parser not set')
 
         with self._xpath_lock:
             if not self.parser.is_schema_bound() and self.parser.schema:
diff --git a/xmlschema/validators/attributes.py b/xmlschema/validators/attributes.py
index ee0f65e..bae2403 100644
--- a/xmlschema/validators/attributes.py
+++ b/xmlschema/validators/attributes.py
@@ -22,6 +22,7 @@ from ..names import XSI_NAMESPACE, XSD_ANY_SIMPLE_TYPE, XSD_SIMPLE_TYPE, \
     XSD_ASSERT, XSD_NOTATION_TYPE, XSD_ANNOTATION
 from ..aliases import ComponentClassType, ElementType, IterDecodeType, \
     IterEncodeType, AtomicValueType, SchemaType, DecodedValueType, EncodedValueType
+from ..translation import gettext as _
 from ..helpers import get_namespace, get_qname
 
 from .exceptions import XMLSchemaValidationError
@@ -78,7 +79,8 @@ class XsdAttribute(XsdComponent, ValidationMixin[str, DecodedValueType]):
                 xsd_attribute = self.maps.lookup_attribute(self.name)
             except LookupError:
                 self.type = self.any_simple_type
-                self.parse_error("unknown attribute {!r}".format(self.name))
+                msg = _("unknown attribute {!r}")
+                self.parse_error(msg.format(self.name))
             else:
                 self.ref = xsd_attribute
                 self.type = xsd_attribute.type
@@ -92,13 +94,13 @@ class XsdAttribute(XsdComponent, ValidationMixin[str, DecodedValueType]):
                     if 'fixed' not in attrib:
                         self.fixed = xsd_attribute.fixed
                     elif xsd_attribute.fixed != attrib['fixed']:
-                        msg = "referenced attribute has a different fixed value {!r}"
+                        msg = _("referenced attribute has a different fixed value {!r}")
                         self.parse_error(msg.format(xsd_attribute.fixed))
 
             for attribute in ('form', 'type'):
                 if attribute in self.elem.attrib:
-                    self.parse_error("attribute {!r} is not allowed when "
-                                     "attribute reference is used".format(attribute))
+                    msg = _("attribute {!r} is not allowed when attribute reference is used")
+                    self.parse_error(msg.format(attribute))
         else:
             if 'form' in attrib:
                 self.form = attrib['form']
@@ -113,13 +115,15 @@ class XsdAttribute(XsdComponent, ValidationMixin[str, DecodedValueType]):
                 pass
             else:
                 if name == 'xmlns':
-                    self.parse_error("an attribute name must be different from 'xmlns'")
+                    msg = _("an attribute name must be different from 'xmlns'")
+                    self.parse_error(msg)
 
                 if self.parent is None or self.qualified:
                     if self.target_namespace == XSI_NAMESPACE and \
                             name not in {'nil', 'type', 'schemaLocation',
                                          'noNamespaceSchemaLocation'}:
-                        self.parse_error("cannot add attributes in %r namespace" % XSI_NAMESPACE)
+                        msg = _("cannot add attributes in %r namespace")
+                        self.parse_error(msg % XSI_NAMESPACE)
                     self.name = get_qname(self.target_namespace, name)
                 else:
                     self.name = name
@@ -139,7 +143,8 @@ class XsdAttribute(XsdComponent, ValidationMixin[str, DecodedValueType]):
                         self.parse_error(err)
 
                     if child is not None and child.tag == XSD_SIMPLE_TYPE:
-                        self.parse_error("ambiguous type definition for XSD attribute")
+                        msg = _("ambiguous type definition for XSD attribute")
+                        self.parse_error(msg)
 
             elif child is not None:
                 # No 'type' attribute in declaration, parse for child local simpleType
@@ -150,31 +155,36 @@ class XsdAttribute(XsdComponent, ValidationMixin[str, DecodedValueType]):
 
             if not isinstance(self.type, XsdSimpleType):
                 self.type = self.any_simple_type
-                self.parse_error("XSD attribute's type must be a simpleType")
+                msg = _("XSD attribute's type must be a simpleType")
+                self.parse_error(msg)
 
         # Check value constraints
         if 'default' in attrib:
             self.default = attrib['default']
             if 'fixed' in attrib:
-                self.parse_error("'default' and 'fixed' attributes are mutually exclusive")
+                msg = _("'default' and 'fixed' attributes are mutually exclusive")
+                self.parse_error(msg)
 
             if self.use != 'optional':
-                self.parse_error("the attribute 'use' must be 'optional' "
-                                 "if the attribute 'default' is present")
+                msg = _("the attribute 'use' must be 'optional' "
+                        "if the attribute 'default' is present")
+                self.parse_error(msg)
 
             if not self.type.is_valid(self.default):
-                msg = "default value {!r} is not compatible with attribute's type"
+                msg = _("default value {!r} is not compatible with attribute's type")
                 self.parse_error(msg.format(self.default))
             elif self.type.is_key() and self.xsd_version == '1.0':
-                self.parse_error("xs:ID key attributes cannot have a default value")
+                msg = _("xs:ID key attributes cannot have a default value")
+                self.parse_error(msg)
 
         elif 'fixed' in attrib:
             self.fixed = attrib['fixed']
             if not self.type.is_valid(self.fixed):
-                msg = "fixed value {!r} is not compatible with attribute's type"
+                msg = _("fixed value {!r} is not compatible with attribute's type")
                 self.parse_error(msg.format(self.fixed))
             elif self.type.is_key() and self.xsd_version == '1.0':
-                self.parse_error("xs:ID key attributes cannot have a fixed value")
+                msg = _("xs:ID key attributes cannot have a fixed value")
+                self.parse_error(msg)
 
     @property
     def built(self) -> bool:
@@ -224,11 +234,11 @@ class XsdAttribute(XsdComponent, ValidationMixin[str, DecodedValueType]):
 
         if self.type.is_notation():
             if self.type.name == XSD_NOTATION_TYPE:
-                msg = "cannot validate against xs:NOTATION directly, " \
-                      "only against a subtype with an enumeration facet"
+                msg = _("cannot validate against xs:NOTATION directly, "
+                        "only against a subtype with an enumeration facet")
                 yield self.validation_error(validation, msg, obj, **kwargs)
             elif not self.type.enumeration:
-                msg = "missing enumeration facet in xs:NOTATION subtype"
+                msg = _("missing enumeration facet in xs:NOTATION subtype")
                 yield self.validation_error(validation, msg, obj, **kwargs)
 
         if self.fixed is not None:
@@ -236,12 +246,12 @@ class XsdAttribute(XsdComponent, ValidationMixin[str, DecodedValueType]):
                 obj = self.fixed
             elif obj != self.fixed and \
                     self.type.text_decode(obj) != self.type.text_decode(self.fixed):
-                msg = "attribute {!r} has a fixed value {!r}".format(self.name, self.fixed)
+                msg = _("attribute {0!r} has a fixed value {1!r}").format(self.name, self.fixed)
                 yield self.validation_error(validation, msg, obj, **kwargs)
 
         for value in self.type.iter_decode(obj, validation, **kwargs):
             if isinstance(value, XMLSchemaValidationError):
-                value.reason = 'attribute {}={!r}: {}'.format(
+                value.reason = _('attribute {0}={1!r}: {2}').format(
                     self.prefixed_name, obj, value.reason
                 )
                 yield value
@@ -306,7 +316,8 @@ class Xsd11Attribute(XsdAttribute):
     def _parse(self) -> None:
         super()._parse()
         if self.use == 'prohibited' and 'fixed' in self.elem.attrib:
-            self.parse_error("attribute 'fixed' with use=prohibited is not allowed in XSD 1.1")
+            msg = _("attribute 'fixed' with use=prohibited is not allowed in XSD 1.1")
+            self.parse_error(msg)
         if 'inheritable' in self.elem.attrib:
             if self.elem.attrib['inheritable'].strip() in {'true', '1'}:
                 self.inheritable = True
@@ -361,7 +372,8 @@ class XsdAttributeGroup(
     def __setitem__(self, key: Optional[str],
                     value: Union[XsdAttribute, XsdAnyAttribute]) -> None:
         if value.name != key:
-            raise XMLSchemaValueError("%r name and key %r mismatch" % (value.name, key))
+            msg = "mismatch between %(attr)r name and item key %(key)r"
+            raise XMLSchemaValueError(msg % {'attr': value, 'key': key})
         self._attribute_group[key] = value
 
     def __delitem__(self, key: Optional[str]) -> None:
@@ -398,9 +410,11 @@ class XsdAttributeGroup(
                 continue  # pragma: no cover
             elif any_attribute is not None:
                 if child.tag == XSD_ANY_ATTRIBUTE:
-                    self.parse_error("more anyAttribute declarations in the same attribute group")
+                    msg = _("more anyAttribute declarations in the same attribute group")
+                    self.parse_error(msg)
                 elif child.tag != XSD_ASSERT:
-                    self.parse_error("another declaration after anyAttribute")
+                    msg = _("another declaration after anyAttribute")
+                    self.parse_error(msg)
 
             elif child.tag == XSD_ANY_ATTRIBUTE:
                 any_attribute = self.schema.xsd_any_attribute_class(child, self.schema, self)
@@ -414,8 +428,8 @@ class XsdAttributeGroup(
             elif child.tag == XSD_ATTRIBUTE:
                 attribute = self.schema.xsd_attribute_class(child, self.schema, self)
                 if attribute.name in attributes:
-                    self.parse_error("multiple declaration for attribute "
-                                     "{!r}".format(attribute.name))
+                    msg = _("multiple declaration for attribute {!r}")
+                    self.parse_error(msg.format(attribute.name))
                 elif attribute.use != 'prohibited' or self.elem.tag != XSD_ATTRIBUTE_GROUP:
                     attributes[attribute.name] = attribute
 
@@ -423,8 +437,8 @@ class XsdAttributeGroup(
                 try:
                     ref = child.attrib['ref']
                 except KeyError:
-                    self.parse_error("the attribute 'ref' is required "
-                                     "in a local attributeGroup")
+                    msg = _("the attribute 'ref' is required in a local attributeGroup")
+                    self.parse_error(msg)
                     continue
 
                 try:
@@ -433,29 +447,37 @@ class XsdAttributeGroup(
                     self.parse_error(err)
                 else:
                     if attribute_group_qname in attribute_group_refs:
-                        self.parse_error("duplicated attributeGroup %r" % ref)
+                        msg = _("duplicated attributeGroup {!r}")
+                        self.parse_error(msg.format(ref))
+
                     elif self.redefine is not None:
                         if attribute_group_qname == self.name:
                             if attribute_group_refs:
-                                self.parse_error("in a redefinition the reference "
-                                                 "to itself must be the first")
+                                msg = _("in a redefinition the reference to "
+                                        "itself must be the first")
+                                self.parse_error(msg)
+
                             attribute_group_refs.append(attribute_group_qname)
                             attributes.update(self._attribute_group)
                             continue
                         elif not attribute_group_refs:
-                            # May be an attributeGroup restriction with a ref to another group
+                            # Maybe an attributeGroup restriction with a ref to another group
                             if not any(e.tag == XSD_ATTRIBUTE_GROUP and ref == e.get('ref')
                                        for e in self.redefine.elem):
-                                self.parse_error("attributeGroup ref=%r is not "
-                                                 "in the redefined group" % ref)
+                                msg = _("attributeGroup ref={!r} is not in the redefined group")
+                                self.parse_error(msg.format(ref))
+
                     elif attribute_group_qname == self.name and self.xsd_version == '1.0':
-                        self.parse_error("Circular attribute groups not allowed in XSD 1.0")
+                        msg = _("Circular attribute groups not allowed in XSD 1.0")
+                        self.parse_error(msg)
+
                     attribute_group_refs.append(attribute_group_qname)
 
                     try:
                         ref_attributes = self.maps.lookup_attribute_group(attribute_group_qname)
                     except LookupError:
-                        self.parse_error("unknown attribute group %r" % child.attrib['ref'])
+                        msg = _("unknown attribute group {!r}")
+                        self.parse_error(msg.format(child.attrib['ref']))
                     else:
                         if not isinstance(ref_attributes, tuple):
                             for name, base_attr in ref_attributes.items():
@@ -463,9 +485,8 @@ class XsdAttributeGroup(
                                     attributes[name] = base_attr
                                 elif name is not None:
                                     if base_attr is not attributes[name]:
-                                        self.parse_error(
-                                            f"multiple declaration of attribute {name!r}"
-                                        )
+                                        msg = _("multiple declaration of attribute {!r}")
+                                        self.parse_error(msg.format(name))
                                 else:
                                     assert isinstance(base_attr, XsdAnyAttribute)
                                     attributes[None] = attr = attributes[None].copy()
@@ -473,13 +494,13 @@ class XsdAttributeGroup(
                                     attr.intersection(base_attr)
 
                         elif self.xsd_version == '1.0':
-                            self.parse_error(
-                                "Circular reference found between attribute groups "
-                                "{!r} and {!r}".format(self.name, attribute_group_qname)
-                            )
+                            msg = _("Circular reference found between "
+                                    "attribute groups {0!r} and {1!r}")
+                            self.parse_error(msg.format(self.name, attribute_group_qname))
 
             elif self.name is not None:
-                self.parse_error("(attribute | attributeGroup) expected, found %r." % child)
+                msg = _("(attribute | attributeGroup) expected, found {!r}.")
+                self.parse_error(msg.format(child))
 
         # Check and copy base attributes
         if self.base_attributes is not None:
@@ -489,7 +510,8 @@ class XsdAttributeGroup(
                     if self.derivation != 'restriction':
                         continue
                     elif wildcard is None or not wildcard.is_matching(name, self.default_namespace):
-                        self.parse_error("Unexpected attribute %r in restriction" % name)
+                        msg = _("Unexpected attribute {!r} in restriction")
+                        self.parse_error(msg.format(name))
                     continue
 
                 base_attr = self.base_attributes[name]
@@ -504,8 +526,9 @@ class XsdAttributeGroup(
                         except ValueError as err:
                             self.parse_error(err)
                     elif not attr.is_restriction(base_attr):
-                        self.parse_error("Attribute wildcard is not a restriction "
-                                         "of the base wildcard")
+                        msg = _("Attribute wildcard is not a restriction of the base wildcard")
+                        self.parse_error(msg)
+
                     continue
 
                 assert name is not None, "None key resolves to an xs:attribute"
@@ -513,19 +536,23 @@ class XsdAttributeGroup(
 
                 if self.derivation == 'restriction' and attr.type.name != XSD_ANY_SIMPLE_TYPE and \
                         not attr.type.is_derived(base_attr.type, 'restriction'):
-                    self.parse_error("Attribute type is not a restriction "
-                                     "of the base attribute type")
+                    msg = _("Attribute type is not a restriction of the base attribute type")
+                    self.parse_error(msg)
+
                 if base_attr.use != 'optional' and attr.use == 'optional' or \
                         base_attr.use == 'required' and attr.use != 'required':
-                    self.parse_error("Attribute %r: unmatched attribute use in restriction" % name)
+                    msg = _("Attribute {!r}: unmatched attribute use in restriction")
+                    self.parse_error(msg.format(name))
+
                 if base_attr.fixed is not None:
                     if attr.fixed is None or attr.type.normalize(attr.fixed) != \
                             base_attr.type.normalize(base_attr.fixed):
-                        self.parse_error("Attribute %r: derived attribute "
-                                         "has a different fixed value" % name)
+                        msg = _("Attribute {!r}: derived attribute has a different fixed value")
+                        self.parse_error(msg.format(name))
+
                 if base_attr.inheritable is not attr.inheritable:
-                    msg = "Attribute %r: attribute 'inheritable' value change in restriction"
-                    self.parse_error(msg % name)
+                    msg = _("Attribute {!r}: 'inheritable' property change in restriction")
+                    self.parse_error(msg.format(name))
 
             if self.redefine is not None:
                 pass  # In case of redefinition do not copy base attributes
@@ -538,13 +565,16 @@ class XsdAttributeGroup(
                     continue
                 elif name not in attributes:
                     if attr.use == 'required':
-                        self.parse_error("Missing required attribute %r in "
-                                         "redefinition restriction" % name)
+                        msg = _("Missing required attribute {!r} in redefinition restriction")
+                        self.parse_error(msg.format(name))
                     continue
+
                 if attr.use != 'optional' and attributes[name].use != attr.use:
-                    self.parse_error("Attribute %r: unmatched attribute use in redefinition" % name)
+                    msg = _("Attribute {!r}: unmatched attribute use in redefinition")
+                    self.parse_error(msg.format(name))
                 if attr.fixed is not None and attributes[name].fixed is None:
-                    self.parse_error("Attribute %r: redefinition remove fixed constraint" % name)
+                    msg = _("Attribute {!r}: redefinition remove fixed constraint")
+                    self.parse_error(msg.format(name))
 
             pos = 0
             keys = list(self._attribute_group.keys())
@@ -552,11 +582,12 @@ class XsdAttributeGroup(
                 try:
                     next_pos = keys.index(name)
                 except ValueError:
-                    self.parse_error("Redefinition restriction contains "
-                                     "additional attribute %r" % name)
+                    msg = _("Redefinition restriction contains additional attribute {!r}")
+                    self.parse_error(msg.format(name))
                 else:
                     if next_pos < pos:
-                        self.parse_error("Wrong attribute order in redefinition restriction")
+                        msg = _("Wrong attribute order in redefinition restriction")
+                        self.parse_error(msg)
                         break
                     pos = next_pos
             self.clear()
@@ -573,7 +604,8 @@ class XsdAttributeGroup(
             for attr in self._attribute_group.values():
                 if attr.type is not None and attr.type.is_key():
                     if has_key:
-                        self.parse_error("multiple ID attributes not allowed for XSD 1.0")
+                        msg = _("multiple ID attributes not allowed for XSD 1.0")
+                        self.parse_error(msg)
                         break
                     has_key = True
 
@@ -625,7 +657,7 @@ class XsdAttributeGroup(
             return
 
         for name in filter(lambda x: x not in obj, self.iter_required()):
-            reason = "missing required attribute {!r}".format(name)
+            reason = _("missing required attribute {!r}").format(name)
             yield self.validation_error(validation, reason, obj, **kwargs)
 
         kwargs['level'] = kwargs.get('level', 0) + 1
@@ -660,7 +692,7 @@ class XsdAttributeGroup(
                             xsd_attribute = self._attribute_group[None]  # None == anyAttribute
                             value = (name, value)
                         except KeyError:
-                            reason = "%r is not an attribute of the XSI namespace." % name
+                            reason = _("%r is not an attribute of the XSI namespace") % name
                             yield self.validation_error(validation, reason, obj, **kwargs)
                             continue
                 else:
@@ -668,13 +700,13 @@ class XsdAttributeGroup(
                         xsd_attribute = self._attribute_group[None]  # None == anyAttribute
                         value = (name, value)
                     except KeyError:
-                        reason = "%r attribute not allowed for element." % name
+                        reason = _("%r attribute not allowed for element") % name
                         yield self.validation_error(validation, reason, obj, **kwargs)
                         continue
             else:
                 if xsd_attribute.use == 'prohibited' and \
                         (None not in self or not self._attribute_group[None].is_matching(name)):
-                    reason = "use of attribute %r is prohibited" % name
+                    reason = _("use of attribute %r is prohibited") % name
                     yield self.validation_error(validation, reason, obj, **kwargs)
 
             for result in xsd_attribute.iter_decode(value, validation, **kwargs):
@@ -703,7 +735,7 @@ class XsdAttributeGroup(
             return
 
         for name in filter(lambda x: x not in obj, self.iter_required()):
-            reason = "missing required attribute {!r}".format(name)
+            reason = _("missing required attribute {!r}").format(name)
             yield self.validation_error(validation, reason, obj, **kwargs)
 
         try:
@@ -725,7 +757,7 @@ class XsdAttributeGroup(
                             xsd_attribute = self._attribute_group[None]  # None == anyAttribute
                             value = (name, value)
                         except KeyError:
-                            reason = "%r is not an attribute of the XSI namespace." % name
+                            reason = _("%r is not an attribute of the XSI namespace") % name
                             yield self.validation_error(validation, reason, obj, **kwargs)
                             continue
                 else:
@@ -733,7 +765,7 @@ class XsdAttributeGroup(
                         xsd_attribute = self._attribute_group[None]  # None == anyAttribute
                         value = (name, value)
                     except KeyError:
-                        reason = "%r attribute not allowed for element." % name
+                        reason = _("%r attribute not allowed for element") % name
                         yield self.validation_error(validation, reason, obj, **kwargs)
                         continue
 
diff --git a/xmlschema/validators/builtins.py b/xmlschema/validators/builtins.py
index 6449266..191173e 100644
--- a/xmlschema/validators/builtins.py
+++ b/xmlschema/validators/builtins.py
@@ -39,7 +39,7 @@ from .helpers import decimal_validator, qname_validator, byte_validator, \
     unsigned_short_validator, unsigned_int_validator, unsigned_long_validator, \
     negative_int_validator, positive_int_validator, non_positive_int_validator, \
     non_negative_int_validator, hex_binary_validator, base64_binary_validator, \
-    error_type_validator, boolean_to_python, python_to_boolean
+    error_type_validator, boolean_to_python, python_to_boolean, python_to_float
 from .facets import XSD_10_FACETS_BUILDERS, XSD_11_FACETS_BUILDERS
 from .simple_types import XsdSimpleType, XsdAtomicBuiltin
 
@@ -334,12 +334,14 @@ XSD_10_BUILTIN_TYPES: Tuple[Dict[str, Any], ...] = XSD_COMMON_BUILTIN_TYPES + (
         'python_type': float,
         'admitted_facets': FLOAT_FACETS,
         'facets': [XSD10_FLOAT_PATTERN_ELEMENT, COLLAPSE_WHITE_SPACE_ELEMENT],
+        'from_python': python_to_float,
     },  # 64 bit floating point
     {
         'name': XSD_FLOAT,
         'python_type': float,
         'admitted_facets': FLOAT_FACETS,
         'facets': [XSD10_FLOAT_PATTERN_ELEMENT, COLLAPSE_WHITE_SPACE_ELEMENT],
+        'from_python': python_to_float,
     },  # 32 bit floating point
 
     # --- Year related primitive types (year 0 not allowed) ---
@@ -379,12 +381,14 @@ XSD_11_BUILTIN_TYPES: Tuple[Dict[str, Any], ...] = XSD_COMMON_BUILTIN_TYPES + (
         'python_type': float,
         'admitted_facets': FLOAT_FACETS,
         'facets': [XSD11_FLOAT_PATTERN_ELEMENT, COLLAPSE_WHITE_SPACE_ELEMENT],
+        'from_python': python_to_float,
     },  # 64 bit floating point
     {
         'name': XSD_FLOAT,
         'python_type': float,
         'admitted_facets': FLOAT_FACETS,
         'facets': [XSD11_FLOAT_PATTERN_ELEMENT, COLLAPSE_WHITE_SPACE_ELEMENT],
+        'from_python': python_to_float,
     },  # 32 bit floating point
 
     # --- Year related primitive types (year 0 allowed and mapped to 1 BCE) ---
diff --git a/xmlschema/validators/complex_types.py b/xmlschema/validators/complex_types.py
index 467d227..29078e3 100644
--- a/xmlschema/validators/complex_types.py
+++ b/xmlschema/validators/complex_types.py
@@ -18,6 +18,7 @@ from ..names import XSD_GROUP, XSD_ATTRIBUTE_GROUP, XSD_SEQUENCE, XSD_OVERRIDE,
 from ..aliases import ElementType, NamespacesType, SchemaType, ComponentClassType, \
     DecodeType, IterDecodeType, IterEncodeType, BaseXsdType, AtomicValueType, \
     ExtraValidatorType
+from ..translation import gettext as _
 from ..helpers import get_prefixed_qname, get_qname, local_name
 from .. import dataobjects
 
@@ -130,11 +131,13 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
         except KeyError:
             self.name = None
             if self.parent is None:
-                self.parse_error("missing attribute 'name' in a global complexType")
+                msg = _("missing attribute 'name' in a global complexType")
+                self.parse_error(msg)
                 self.name = 'nameless_%s' % str(id(self))
         else:
             if self.parent is not None:
-                self.parse_error("attribute 'name' not allowed for a local complexType")
+                msg = _("attribute 'name' not allowed in a local complexType")
+                self.parse_error(msg)
                 self.name = None
 
         content_elem = self._parse_child_component(self.elem, strict=False)
@@ -156,7 +159,8 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
 
         elif content_elem.tag == XSD_SIMPLE_CONTENT:
             if 'mixed' in content_elem.attrib:
-                self.parse_error("'mixed' attribute not allowed with simpleContent", content_elem)
+                msg = _("'mixed' attribute not allowed with simpleContent")
+                self.parse_error(msg, content_elem)
 
             derivation_elem = self._parse_derivation_elem(content_elem)
             if derivation_elem is None:
@@ -170,9 +174,8 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
 
             if content_elem is not self.elem[-1]:
                 k = 2 if content_elem is not self.elem[0] else 1
-                self.parse_error(
-                    "unexpected tag %r after simpleContent declaration:" % self.elem[k].tag
-                )
+                msg = _("unexpected tag %r after simpleContent declaration:")
+                self.parse_error(msg % self.elem[k].tag)
 
         elif content_elem.tag == XSD_COMPLEX_CONTENT:
             #
@@ -182,8 +185,9 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
                 if mixed is not self.mixed:
                     self.mixed = mixed
                     if 'mixed' in self.elem.attrib and self.xsd_version == '1.1':
-                        self.parse_error("value of 'mixed' attribute in complexType "
-                                         "and complexContent must be same")
+                        msg = _("value of 'mixed' attribute in complexType "
+                                "and complexContent must be the same")
+                        self.parse_error(msg)
 
             derivation_elem = self._parse_derivation_elem(content_elem)
             if derivation_elem is None:
@@ -201,9 +205,8 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
 
             if content_elem is not self.elem[-1]:
                 k = 2 if content_elem is not self.elem[0] else 1
-                self.parse_error(
-                    "unexpected tag %r after complexContent declaration:" % self.elem[k].tag
-                )
+                msg = _("unexpected tag %r after complexContent declaration")
+                self.parse_error(msg % self.elem[k].tag)
 
         elif content_elem.tag == XSD_OPEN_CONTENT and self.xsd_version > '1.0':
             self.open_content = XsdOpenContent(content_elem, self.schema, self)
@@ -226,17 +229,19 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
         else:
             if self.schema.validation == 'skip':
                 # Also generated by meta-schema validation for 'lax' and 'strict' modes
-                self.parse_error(
-                    "unexpected tag %r for complexType content:" % content_elem.tag
-                )
+                msg = _("unexpected tag %r for complexType content")
+                self.parse_error(msg % content_elem.tag)
+
             self.content = self.schema.create_any_content_group(self)
             self.attributes = self.schema.create_any_attribute_group(self)
 
         if self.redefine is None:
             if self.base_type is not None and self.base_type.name == self.name:
-                self.parse_error("wrong definition with self-reference")
+                msg = _("wrong definition with self-reference")
+                self.parse_error(msg)
         elif self.base_type is None or self.base_type.name != self.name:
-            self.parse_error("wrong redefinition without self-reference")
+            msg = _("wrong redefinition without self-reference")
+            self.parse_error(msg)
 
     def _parse_content_tail(self, elem: ElementType, **kwargs: Any) -> None:
         self.attributes = self.schema.xsd_attribute_group_class(
@@ -246,18 +251,20 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
     def _parse_derivation_elem(self, elem: ElementType) -> Optional[ElementType]:
         derivation_elem = self._parse_child_component(elem)
         if derivation_elem is None or derivation_elem.tag not in {XSD_RESTRICTION, XSD_EXTENSION}:
-            self.parse_error("restriction or extension tag expected", derivation_elem)
+            msg = _("restriction or extension tag expected")
+            self.parse_error(msg, derivation_elem)
             self.content = self.schema.create_any_content_group(self)
             self.attributes = self.schema.create_any_attribute_group(self)
             return None
 
         if self.derivation is not None and self.redefine is None:
-            raise XMLSchemaValueError("{!r} is expected to have a redefined/"
-                                      "overridden component".format(self))
+            msg = _("{!r} is expected to have a redefined/overridden component")
+            raise XMLSchemaValueError(msg.format(self))
         self.derivation = local_name(derivation_elem.tag)
 
         if self.base_type is not None and self.derivation in self.base_type.final:
-            self.parse_error(f"{self.derivation!r} derivation not allowed for {self!r}")
+            msg = _("{0!r} derivation not allowed for {1!r}")
+            self.parse_error(msg.format(self.derivation, self))
         return derivation_elem
 
     def _parse_base_type(self, elem: ElementType, complex_content: bool = False) \
@@ -266,7 +273,8 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
             base_qname = self.schema.resolve_qname(elem.attrib['base'])
         except (KeyError, ValueError, RuntimeError) as err:
             if 'base' not in elem.attrib:
-                self.parse_error("'base' attribute required", elem)
+                msg = _("'base' attribute required")
+                self.parse_error(msg, elem)
             else:
                 self.parse_error(err, elem)
             return self.any_type
@@ -274,22 +282,24 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
         try:
             base_type = self.maps.lookup_type(base_qname)
         except KeyError:
-            self.parse_error("missing base type %r" % base_qname, elem)
+            msg = _("missing base type %r")
+            self.parse_error(msg % base_qname, elem)
             if complex_content:
                 return self.any_type
             else:
                 return self.any_simple_type
         else:
             if isinstance(base_type, tuple):
-                self.parse_error("circularity definition found between %r "
-                                 "and %r" % (self, base_qname), elem)
+                msg = _("circular definition found between {0!r} and {1!r}")
+                self.parse_error(msg.format(self, base_qname), elem)
                 return self.any_type
             elif complex_content and base_type.is_simple():
-                self.parse_error("a complexType ancestor required: %r" % base_type, elem)
+                msg = _("a complexType ancestor required: {!r}")
+                self.parse_error(msg.format(base_type), elem)
                 return self.any_type
 
             if base_type.final and elem.tag.rsplit('}', 1)[-1] in base_type.final:
-                msg = "derivation by %r blocked by attribute 'final' in base type"
+                msg = _("derivation by %r blocked by attribute 'final' in base type")
                 self.parse_error(msg % elem.tag.rsplit('}', 1)[-1])
 
             return base_type
@@ -298,27 +308,29 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
         # simpleContent restriction: the base type must be a complexType with a simple
         # content or a complex content with a mixed and emptiable content.
         if base_type.is_simple():
-            self.parse_error("a complexType ancestor required: %r" % base_type, elem)
+            msg = _("a complexType ancestor required: {!r}")
+            self.parse_error(msg.format(base_type), elem)
             self.content = self.schema.create_any_content_group(self)
             self._parse_content_tail(elem)
         else:
             if base_type.is_empty():
                 self.content = self.schema.xsd_atomic_restriction_class(elem, self.schema, self)
                 if not self.is_empty():
-                    self.parse_error("a not empty simpleContent cannot restrict "
-                                     "an empty content type", elem)
+                    msg = _("a not empty simpleContent cannot restrict an empty content type")
+                    self.parse_error(msg, elem)
                     self.content = self.schema.create_any_content_group(self)
 
             elif base_type.has_simple_content():
                 self.content = self.schema.xsd_atomic_restriction_class(elem, self.schema, self)
                 if not self.content.is_derived(base_type.content, 'restriction'):
-                    self.parse_error("content type is not a restriction of base content", elem)
+                    msg = _("content type is not a restriction of base content")
+                    self.parse_error(msg, elem)
 
             elif base_type.mixed and base_type.is_emptiable():
                 self.content = self.schema.xsd_atomic_restriction_class(elem, self.schema, self)
             else:
-                self.parse_error("with simpleContent cannot restrict an "
-                                 "element-only content type", elem)
+                msg = _("with simpleContent cannot restrict an element-only content type")
+                self.parse_error(msg, elem)
                 self.content = self.schema.create_any_content_group(self)
 
             self._parse_content_tail(elem, derivation='restriction',
@@ -329,7 +341,8 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
         # with simple content.
         child = self._parse_child_component(elem, strict=False)
         if child is not None and child.tag not in self._CONTENT_TAIL_TAGS:
-            self.parse_error('unexpected tag %r' % child.tag, child)
+            msg = _('unexpected tag %r')
+            self.parse_error(msg % child.tag, child)
 
         if base_type.is_simple():
             self.content = base_type
@@ -338,7 +351,7 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
             if base_type.has_simple_content():
                 self.content = base_type.content
             else:
-                self.parse_error("base type %r has not simple content." % base_type, elem)
+                self.parse_error(_("base type %r has no simple content") % base_type, elem)
                 self.content = self.schema.create_any_content_group(self)
 
             self._parse_content_tail(elem, derivation='extension',
@@ -346,9 +359,11 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
 
     def _parse_complex_content_restriction(self, elem: ElementType, base_type: Any) -> None:
         if 'restriction' in base_type.final:
-            self.parse_error("the base type is not derivable by restriction")
+            msg = _("the base type is not derivable by restriction")
+            self.parse_error(msg)
         if base_type.is_simple() or base_type.has_simple_content():
-            self.parse_error("base %r is simple or has a simple content." % base_type, elem)
+            msg = _("base %r is simple or has a simple content")
+            self.parse_error(msg % base_type, elem)
             base_type = self.any_type
 
         # complexContent restriction: the base type must be a complexType with a complex content.
@@ -359,10 +374,9 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
             elif child.tag in XSD_MODEL_GROUP_TAGS:
                 content = self.schema.xsd_group_class(child, self.schema, self)
                 if not base_type.content.admits_restriction(content.model):
-                    self.parse_error(
-                        "restriction of an xs:{} with more than one particle with xs:{} is "
-                        "forbidden".format(base_type.content.model, content.model)
-                    )
+                    msg = _("restriction of an xs:{0} with more than "
+                            "one particle with xs:{1} is forbidden")
+                    self.parse_error(msg.format(base_type.content.model, content.model))
                 break
         else:
             content = self.schema.create_empty_content_group(
@@ -372,13 +386,11 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
         content.restriction = base_type.content
 
         if base_type.is_element_only() and content.mixed:
-            self.parse_error(
-                "derived a mixed content from a base type that has element-only content.", elem
-            )
+            msg = _("derived a mixed content from a base type that has element-only content")
+            self.parse_error(msg, elem)
         elif base_type.is_empty() and not content.is_empty():
-            self.parse_error(
-                "derived an empty content from base type that has not empty content.", elem
-            )
+            msg = _("an empty content derivation from base type that has not empty content")
+            self.parse_error(msg, elem)
 
         if self.open_content is None:
             default_open_content = self.default_open_content
@@ -388,7 +400,7 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
 
         if self.open_content and content and \
                 not self.open_content.is_restriction(base_type.open_content):
-            msg = "{!r} is not a restriction of the base type {!r}"
+            msg = _("{0!r} is not a restriction of the base type {1!r}")
             self.parse_error(msg.format(self.open_content, base_type.open_content))
 
         self.content = content
@@ -397,7 +409,8 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
 
     def _parse_complex_content_extension(self, elem: ElementType, base_type: Any) -> None:
         if 'extension' in base_type.final:
-            self.parse_error("the base type is not derivable by extension")
+            msg = _("the base type is not derivable by extension")
+            self.parse_error(msg)
 
         group_elem: Optional[ElementType]
         for group_elem in elem:
@@ -429,8 +442,9 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
                         group_elem, self.schema, self.content
                     )
                     if not self.mixed:
-                        self.parse_error("base has a different content type (mixed=%r) and the "
-                                         "extension group is not empty." % base_type.mixed, elem)
+                        msg = _("base has a different content type (mixed=%r) "
+                                "and the extension group is not empty.")
+                        self.parse_error(msg % base_type.mixed, elem)
                 else:
                     group = self.schema.create_empty_content_group(self)
 
@@ -441,15 +455,18 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
         elif group_elem is not None and group_elem.tag in XSD_MODEL_GROUP_TAGS:
             # Derivation from a simple content is forbidden if base type is not empty.
             if base_type.is_simple() or base_type.has_simple_content():
-                self.parse_error("base %r is simple or has a simple content." % base_type, elem)
+                msg = _("base %r is simple or has a simple content")
+                self.parse_error(msg % base_type, elem)
                 base_type = self.any_type
 
             group = self.schema.xsd_group_class(group_elem, self.schema, self)
 
             if group.model == 'all':
-                self.parse_error("cannot extend a complex content with xs:all")
+                msg = _("cannot extend a complex content with xs:all")
+                self.parse_error(msg)
             if base_type.content.model == 'all' and group.model == 'sequence':
-                self.parse_error("xs:sequence cannot extend xs:all")
+                msg = _("xs:sequence cannot extend xs:all")
+                self.parse_error(msg)
 
             content = self.schema.create_empty_content_group(self)
             content.append(base_type.content)
@@ -458,12 +475,12 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
             content.elem.append(group.elem)
 
             if base_type.content.model == 'all' and base_type.content and group:
-                self.parse_error(
-                    "XSD 1.0 does not allow extension of a not empty 'all' model group"
-                )
+                msg = _("XSD 1.0 does not allow extension of a not empty 'all' model group")
+                self.parse_error(msg)
             if base_type.mixed != self.mixed and base_type.name != XSD_ANY_TYPE:
-                self.parse_error("base has a different content type (mixed=%r) and the "
-                                 "extension group is not empty" % base_type.mixed, elem)
+                msg = _("base has a different content type (mixed=%r) "
+                        "and the extension group is not empty")
+                self.parse_error(msg % base_type.mixed, elem)
             self.content = content
 
         elif base_type.is_simple():
@@ -475,9 +492,8 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
             self.content.append(base_type.content)
             self.content.elem.append(base_type.content.elem)
             if base_type.mixed != self.mixed and base_type.name != XSD_ANY_TYPE and self.mixed:
-                self.parse_error(
-                    "extended type has a mixed content but the base is element-only", elem
-                )
+                msg = _("extended type has a mixed content but the base is element-only")
+                self.parse_error(msg, elem)
 
         self._parse_content_tail(elem, derivation='extension', base_attributes=base_type.attributes)
 
@@ -636,7 +652,8 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
         if self is other:
             return derivation is None
         elif isinstance(other, tuple):
-            other[1].parse_error(f"global type {other[0].tag!r} is not built")
+            msg = _("global type {!r} is not built")
+            other[1].parse_error(msg.format(other[0].tag))
             return False
         elif other.name == XSD_ANY_TYPE:
             return True
@@ -701,8 +718,9 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
         elif isinstance(self.content, XsdSimpleType):
             return self.content.decode(obj, *args, **kwargs)
         else:
+            msg = _("cannot decode %(obj)r data with %(decoder)r")
             raise XMLSchemaDecodeError(
-                self, obj, str, "cannot decode %r data with %r" % (obj, self)
+                self, obj, str, msg % {'obj': obj, 'decoder': self}
             )
 
     def iter_decode(self, obj: Union[ElementType, str, bytes],
@@ -725,8 +743,9 @@ class XsdComplexType(XsdType, ValidationMixin[Union[ElementType, str, bytes], An
         elif isinstance(self.content, XsdSimpleType):
             yield from self.content.iter_decode(obj, validation, **kwargs)
         else:
+            msg = _("cannot decode %(obj)r data with %(decoder)r")
             raise XMLSchemaDecodeError(
-                self, obj, str, "cannot decode %r data with %r" % (obj, self)
+                self, obj, str, msg % {'obj': obj, 'decoder': self}
             )
 
     def iter_encode(self, obj: Any, validation: str = 'lax', **kwargs: Any) \
@@ -825,14 +844,15 @@ class Xsd11ComplexType(XsdComplexType):
                 self.base_type.derivation == 'extension' and not self.attributes:
             # Derivation from xs:anySimpleType with missing variety.
             # See: http://www.w3.org/TR/xmlschema11-1/#Simple_Type_Definition_details
-            msg = "the simple content of {!r} is not a valid simple type in XSD 1.1"
+            msg = _("the simple content of {!r} is not a valid simple type in XSD 1.1")
             self.parse_error(msg.format(self.base_type))
 
         # Add open content to a complex content type
         if isinstance(self.content, XsdGroup):
             if self.open_content is None:
                 if self.content.interleave is not None or self.content.suffix is not None:
-                    self.parse_error("openContent mismatch between type and model group")
+                    msg = _("openContent mismatch between type and model group")
+                    self.parse_error(msg)
             elif self.open_content.mode == 'interleave':
                 self.content.interleave = self.content.suffix \
                     = self.open_content.any_element
@@ -846,7 +866,8 @@ class Xsd11ComplexType(XsdComplexType):
                     if name not in self.attributes:
                         self.attributes[name] = attr
                     elif not self.attributes[name].inheritable:
-                        self.parse_error("attribute %r must be inheritable")
+                        msg = _("attribute %r must be inheritable")
+                        self.parse_error(msg % name)
 
         if 'defaultAttributesApply' not in self.elem.attrib:
             self.default_attributes_apply = True
@@ -861,8 +882,9 @@ class Xsd11ComplexType(XsdComplexType):
             if self.redefine is None:
                 for k in self.default_attributes:
                     if k in self.attributes:
-                        self.parse_error(f"default attribute {k!r} is already "
-                                         f"declared in the complex type")
+                        msg = _("default attribute {!r} is already "
+                                "declared in the complex type")
+                        self.parse_error(msg.format(k))
 
             self.attributes.update((k, v) for k, v in self.default_attributes.items())
 
@@ -871,11 +893,13 @@ class Xsd11ComplexType(XsdComplexType):
         # For the detailed rule refer to XSD 1.1 documentation:
         #   https://www.w3.org/TR/2012/REC-xmlschema11-1-20120405/#sec-cos-ct-extends
         if base_type.is_simple() or base_type.has_simple_content():
-            self.parse_error("base %r is simple or has a simple content." % base_type, elem)
+            msg = _("base %r is simple or has a simple content")
+            self.parse_error(msg % base_type, elem)
             base_type = self.any_type
 
         if 'extension' in base_type.final:
-            self.parse_error("the base type is not derivable by extension")
+            msg = _("the base type is not derivable by extension")
+            self.parse_error(msg)
 
         # Parse openContent
         group_elem: Any
@@ -925,10 +949,12 @@ class Xsd11ComplexType(XsdComplexType):
                         group_elem, self.schema, self.content
                     )
                     if not self.mixed:
-                        self.parse_error("base has a different content type (mixed=%r) and the "
-                                         "extension group is not empty." % base_type.mixed, elem)
+                        msg = _("base has a different content type (mixed=%r) "
+                                "and the extension group is not empty.")
+                        self.parse_error(msg % base_type.mixed, elem)
                     if group.model == 'all':
-                        self.parse_error("cannot extend an empty mixed content with an xs:all")
+                        msg = _("cannot extend an empty mixed content with an xs:all")
+                        self.parse_error(msg)
                 else:
                     group = self.schema.create_empty_content_group(self)
 
@@ -945,7 +971,7 @@ class Xsd11ComplexType(XsdComplexType):
                 content.elem.append(base_type.content.elem)
 
                 if group.model == 'all':
-                    msg = "xs:all cannot extend a not empty xs:%s"
+                    msg = _("xs:all cannot extend a not empty xs:%s")
                     self.parse_error(msg % base_type.content.model)
                 else:
                     content.append(group)
@@ -960,20 +986,22 @@ class Xsd11ComplexType(XsdComplexType):
                 if not group:
                     pass
                 elif group.model != 'all':
-                    self.parse_error(
-                        "cannot extend a not empty 'all' model group with a different model"
-                    )
+                    msg = _("cannot extend a not empty 'all' model group with a different model")
+                    self.parse_error(msg)
                 elif base_type.content.min_occurs != group.min_occurs:
-                    self.parse_error("when extend an xs:all group minOccurs must be the same")
+                    msg = _("when extend an xs:all group minOccurs must be the same")
+                    self.parse_error(msg)
                 elif base_type.mixed and not base_type.content:
-                    self.parse_error("cannot extend an xs:all group with mixed empty content")
+                    msg = _("cannot extend an xs:all group with mixed empty content")
+                    self.parse_error(msg)
                 else:
                     content.extend(group)
                     content.elem.extend(group.elem)
 
             if base_type.mixed != self.mixed and base_type.name != XSD_ANY_TYPE:
-                self.parse_error("base has a different content type (mixed=%r) and the "
-                                 "extension group is not empty." % base_type.mixed, elem)
+                msg = _("base has a different content type (mixed=%r) "
+                        "and the extension group is not empty.")
+                self.parse_error(msg % base_type.mixed, elem)
 
             self.content = content
 
@@ -986,9 +1014,8 @@ class Xsd11ComplexType(XsdComplexType):
             self.content.append(base_type.content)
             self.content.elem.append(base_type.content.elem)
             if base_type.mixed != self.mixed and base_type.name != XSD_ANY_TYPE and self.mixed:
-                self.parse_error(
-                    "extended type has a mixed content but the base is element-only", elem
-                )
+                msg = _("extended type has a mixed content but the base is element-only")
+                self.parse_error(msg, elem)
 
         if self.open_content is None:
             default_open_content = self.default_open_content
@@ -1005,7 +1032,7 @@ class Xsd11ComplexType(XsdComplexType):
             if self.open_content.mode == 'none':
                 self.open_content = base_type.open_content
             elif not base_type.open_content.is_restriction(self.open_content):
-                msg = "{!r} is not an extension of the base type {!r}"
+                msg = _("{0!r} is not an extension of the base type {1!r}")
                 self.parse_error(msg.format(self.open_content, base_type.open_content))
 
         self._parse_content_tail(elem, derivation='extension',
diff --git a/xmlschema/validators/elements.py b/xmlschema/validators/elements.py
index 430f1af..93fd259 100644
--- a/xmlschema/validators/elements.py
+++ b/xmlschema/validators/elements.py
@@ -25,6 +25,7 @@ from ..etree import ElementData, etree_element
 from ..aliases import ElementType, SchemaType, BaseXsdType, SchemaElementType, \
     ModelParticleType, ComponentClassType, AtomicValueType, DecodeType, \
     IterDecodeType, IterEncodeType
+from ..translation import gettext as _
 from ..helpers import get_qname, get_namespace, etree_iter_location_hints, \
     raw_xml_encode, strictly_equal
 from .. import dataobjects
@@ -158,7 +159,7 @@ class XsdElement(XsdComponent, ParticleMixin,
                 xsd_element: XsdElement = self.maps.lookup_element(self.name)
             except KeyError:
                 self.type = self.any_type
-                self.parse_error('unknown element %r' % self.name)
+                self.parse_error(_('unknown element %r') % self.name)
             else:
                 self.ref = xsd_element
                 self.type = xsd_element.type
@@ -175,7 +176,7 @@ class XsdElement(XsdComponent, ParticleMixin,
             for attr_name in {'type', 'nillable', 'default', 'fixed', 'form',
                               'block', 'abstract', 'final', 'substitutionGroup'}:
                 if attr_name in attrib:
-                    msg = "attribute {!r} is not allowed when element reference is used"
+                    msg = _("attribute {!r} is not allowed when element reference is used")
                     self.parse_error(msg.format(attr_name))
             return
 
@@ -196,7 +197,8 @@ class XsdElement(XsdComponent, ParticleMixin,
 
         if 'abstract' in attrib:
             if self.parent is not None:
-                self.parse_error("local scope elements cannot have abstract attribute")
+                msg = _("local scope elements cannot have abstract attribute")
+                self.parse_error(msg)
             if attrib['abstract'].strip() in {'true', '1'}:
                 self.abstract = True
 
@@ -222,12 +224,12 @@ class XsdElement(XsdComponent, ParticleMixin,
 
             for attr_name in {'ref', 'form', 'minOccurs', 'maxOccurs'}:
                 if attr_name in attrib:
-                    msg = "attribute {!r} is not allowed in a global element declaration"
+                    msg = _("attribute {!r} is not allowed in a global element declaration")
                     self.parse_error(msg.format(attr_name))
         else:
             for attr_name in {'final', 'substitutionGroup'}:
                 if attr_name in attrib:
-                    msg = "attribute {!r} not allowed in a local element declaration"
+                    msg = _("attribute {!r} not allowed in a local element declaration")
                     self.parse_error(msg.format(attr_name))
 
     def _parse_type(self) -> None:
@@ -245,13 +247,14 @@ class XsdElement(XsdComponent, ParticleMixin,
                     try:
                         self.type = self.maps.lookup_type(extended_name)
                     except KeyError:
-                        self.parse_error('unknown type {!r}'.format(type_name))
+                        self.parse_error(_('unknown type {!r}').format(type_name))
                         self.type = self.any_type
             finally:
                 child = self._parse_child_component(self.elem, strict=False)
                 if child is not None and child.tag in (XSD_COMPLEX_TYPE, XSD_SIMPLE_TYPE):
-                    self.parse_error("the attribute 'type' and a {} local declaration "
-                                     "are mutually exclusive".format(child.tag.split('}')[-1]))
+                    msg = _("the attribute 'type' and a xs:{} local "
+                            "declaration are mutually exclusive")
+                    self.parse_error(msg.format(child.tag.split('}')[-1]))
         else:
             child = self._parse_child_component(self.elem, strict=False)
             if child is None:
@@ -268,25 +271,26 @@ class XsdElement(XsdComponent, ParticleMixin,
         if 'default' in self.elem.attrib:
             self.default = self.elem.attrib['default']
             if 'fixed' in self.elem.attrib:
-                self.parse_error("'default' and 'fixed' attributes are mutually exclusive")
+                msg = _("'default' and 'fixed' attributes are mutually exclusive")
+                self.parse_error(msg)
 
             if not self.type.is_valid(self.default):
-                msg = "'default' value {!r} is not compatible with element's type"
+                msg = _("'default' value {!r} is not compatible with element's type")
                 self.parse_error(msg.format(self.default))
                 self.default = None
             elif self.xsd_version == '1.0' and self.type.is_key():
-                self.parse_error("xs:ID or a type derived from xs:ID "
-                                 "cannot have a default value")
+                msg = _("xs:ID or a type derived from xs:ID cannot have a default value")
+                self.parse_error(msg)
 
         elif 'fixed' in self.elem.attrib:
             self.fixed = self.elem.attrib['fixed']
             if not self.type.is_valid(self.fixed):
-                msg = "'fixed' value {!r} is not compatible with element's type"
+                msg = _("'fixed' value {!r} is not compatible with element's type")
                 self.parse_error(msg.format(self.fixed))
                 self.fixed = None
             elif self.xsd_version == '1.0' and self.type.is_key():
-                self.parse_error("xs:ID or a type derived from xs:ID "
-                                 "cannot have a fixed value")
+                msg = _("xs:ID or a type derived from xs:ID cannot have a fixed value")
+                self.parse_error(msg)
 
         # Identity constraints
         self.identities = {}
@@ -304,13 +308,16 @@ class XsdElement(XsdComponent, ParticleMixin,
 
             if constraint.ref:
                 if constraint.name in self.identities:
-                    self.parse_error("duplicated identity constraint %r:" % constraint.name, child)
+                    msg = _("duplicated identity constraint %r:")
+                    self.parse_error(msg % constraint.name, child)
+
                 self.identities[constraint.name] = constraint
                 continue
 
             try:
                 if child != self.maps.identities[constraint.name].elem:
-                    self.parse_error("duplicated identity constraint %r:" % constraint.name, child)
+                    msg = _("duplicated identity constraint %r:")
+                    self.parse_error(msg % constraint.name, child)
             except KeyError:
                 self.maps.identities[constraint.name] = constraint
             finally:
@@ -331,11 +338,13 @@ class XsdElement(XsdComponent, ParticleMixin,
         try:
             head_element = self.maps.lookup_element(substitution_group_qname)
         except KeyError:
-            self.parse_error("unknown substitutionGroup %r" % substitution_group)
+            msg = _("unknown substitutionGroup %r")
+            self.parse_error(msg % substitution_group)
             return
         else:
             if isinstance(head_element, tuple):
-                self.parse_error("circularity found for substitutionGroup %r" % substitution_group)
+                msg = _("circularity found for substitutionGroup %r")
+                self.parse_error(msg % substitution_group)
                 return
             elif 'substitution' in head_element.block:
                 return
@@ -349,17 +358,21 @@ class XsdElement(XsdComponent, ParticleMixin,
                 # ref: https://www.w3.org/TR/xmlschema-1/#cElement_Declarations
                 self._head_type = head_element.type
         elif not self.type.is_derived(head_element.type):
-            self.parse_error("%r type is not of the same or a derivation "
-                             "of the head element %r type." % (self, head_element))
+            msg = _("{0!r} type is not of the same or a derivation "
+                    "of the head element {1!r} type")
+            self.parse_error(msg.format(self, head_element))
         elif final == '#all' or 'extension' in final and 'restriction' in final:
-            self.parse_error("head element %r can't be substituted by an element "
-                             "that has a derivation of its type" % head_element)
+            msg = _("head element %r can't be substituted by an "
+                    "element that has a derivation of its type")
+            self.parse_error(msg % head_element)
         elif 'extension' in final and self.type.is_derived(head_element.type, 'extension'):
-            self.parse_error("head element %r can't be substituted by an element "
-                             "that has an extension of its type" % head_element)
+            msg = _("head element %r can't be substituted by an "
+                    "element that has an extension of its type")
+            self.parse_error(msg % head_element)
         elif 'restriction' in final and self.type.is_derived(head_element.type, 'restriction'):
-            self.parse_error("head element %r can't be substituted by an element "
-                             "that has a restriction of its type" % head_element)
+            msg = _("head element %r can't be substituted by an "
+                    "element that has a restriction of its type")
+            self.parse_error(msg % head_element)
 
         try:
             self.maps.substitution_groups[substitution_group_qname].add(self)
@@ -531,7 +544,7 @@ class XsdElement(XsdComponent, ParticleMixin,
             if ns not in locations:
                 locations[ns] = url
             elif locations[ns] is None:
-                reason = "schemaLocation declaration after namespace start"
+                reason = _("schemaLocation declaration after namespace start")
                 raise XMLSchemaValidationError(self, elem, reason)
 
             if ns == self.target_namespace:
@@ -540,10 +553,10 @@ class XsdElement(XsdComponent, ParticleMixin,
                 schema = self.schema.import_schema(ns, url, self.schema.base_url)
 
             if schema is None:
-                reason = f"missing dynamic loaded schema from {url}"
+                reason = _("missing dynamic loaded schema from %s") % url
                 raise XMLSchemaValidationError(self, elem, reason)
             elif not schema.built:
-                reason = "dynamic loaded schema change the assessment"
+                reason = _("dynamic loaded schema change the assessment")
                 raise XMLSchemaValidationError(self, elem, reason)
 
         if elem.attrib:
@@ -594,7 +607,7 @@ class XsdElement(XsdComponent, ParticleMixin,
         validation or decoding errors.
         """
         if self.abstract:
-            reason = "cannot use an abstract element for validation"
+            reason = _("cannot use an abstract element for validation")
             yield self.validation_error(validation, reason, obj, **kwargs)
 
         try:
@@ -651,17 +664,18 @@ class XsdElement(XsdComponent, ParticleMixin,
                         )
                         for e in identity.selector.token.select_results(context):
                             if not isinstance(e, XsdElement):
-                                reason = "selector xpath expression can only select elements"
+                                reason = _("selector xpath expression can only select elements")
                                 yield self.validation_error(validation, reason, e, **kwargs)
                             elif e not in identity.elements:
                                 identity.elements[e] = None
 
             if xsd_type.is_blocked(self):
-                reason = "usage of %r is blocked" % xsd_type
+                reason = _("usage of %r is blocked") % xsd_type
                 yield self.validation_error(validation, reason, obj, **kwargs)
 
         if xsd_type.abstract:
-            yield self.validation_error(validation, "%r is abstract", obj, **kwargs)
+            reason = _("%r is abstract") % xsd_type
+            yield self.validation_error(validation, reason, obj, **kwargs)
         if xsd_type.is_complex() and self.xsd_version == '1.1':
             kwargs['id_list'] = []  # Track XSD 1.1 multiple xs:ID attributes/children
 
@@ -688,24 +702,24 @@ class XsdElement(XsdComponent, ParticleMixin,
         if XSI_NIL in obj.attrib:
             xsi_nil = obj.attrib[XSI_NIL].strip()
             if not self.nillable:
-                reason = "element is not nillable."
+                reason = _("element is not nillable")
                 yield self.validation_error(validation, reason, obj, **kwargs)
             elif xsi_nil not in {'0', '1', 'false', 'true'}:
-                reason = "xsi:nil attribute must have a boolean value."
+                reason = _("xsi:nil attribute must have a boolean value")
                 yield self.validation_error(validation, reason, obj, **kwargs)
             elif xsi_nil in ('0', 'false'):
                 pass
             elif self.fixed is not None:
-                reason = "xsi:nil='true' but the element has a fixed value."
+                reason = _("xsi:nil='true' but the element has a fixed value")
                 yield self.validation_error(validation, reason, obj, **kwargs)
             elif obj.text is not None or len(obj):
-                reason = "xsi:nil='true' but the element is not empty."
+                reason = _("xsi:nil='true' but the element is not empty")
                 yield self.validation_error(validation, reason, obj, **kwargs)
             else:
                 nilled = True
 
         if xsd_type.is_empty() and obj.text and xsd_type.normalize(obj.text):
-            reason = "character data is not allowed because content is empty"
+            reason = _("character data is not allowed because content is empty")
             yield self.validation_error(validation, reason, obj, **kwargs)
 
         if nilled:
@@ -727,12 +741,12 @@ class XsdElement(XsdComponent, ParticleMixin,
 
             if self.fixed is not None and \
                     (len(obj) > 0 or value is not None and self.fixed != value):
-                reason = "must have the fixed value %r" % self.fixed
+                reason = _("must have the fixed value %r") % self.fixed
                 yield self.validation_error(validation, reason, obj, **kwargs)
 
         else:
             if len(obj):
-                reason = "a simple content element can't have child elements."
+                reason = _("a simple content element can't have child elements")
                 yield self.validation_error(validation, reason, obj, **kwargs)
 
             text = obj.text
@@ -743,7 +757,7 @@ class XsdElement(XsdComponent, ParticleMixin,
                     pass
                 elif not strictly_equal(xsd_type.text_decode(text),
                                         xsd_type.text_decode(self.fixed)):
-                    reason = "must have the fixed value %r" % self.fixed
+                    reason = _("must have the fixed value %r") % self.fixed
                     yield self.validation_error(validation, reason, obj, **kwargs)
 
             elif not text and self.default is not None and kwargs.get('use_defaults'):
@@ -761,11 +775,11 @@ class XsdElement(XsdComponent, ParticleMixin,
 
             elif xsd_type.is_notation():
                 if xsd_type.name == XSD_NOTATION_TYPE:
-                    msg = "cannot validate against xs:NOTATION directly, " \
-                          "only against a subtype with an enumeration facet"
+                    msg = _("cannot validate against xs:NOTATION directly, "
+                            "only against a subtype with an enumeration facet")
                     yield self.validation_error(validation, msg, text, **kwargs)
                 elif not xsd_type.enumeration:
-                    msg = "missing enumeration facet in xs:NOTATION subtype"
+                    msg = _("missing enumeration facet in xs:NOTATION subtype")
                     yield self.validation_error(validation, msg, text, **kwargs)
 
             if text is None:
@@ -1228,7 +1242,8 @@ class Xsd11Element(XsdElement):
             if child.tag == XSD_ALTERNATIVE:
                 alternatives.append(XsdAlternative(child, self.schema, self))
                 if not has_test:
-                    self.parse_error("test attribute missing on non-final alternative")
+                    msg = _("test attribute missing in non-final alternative")
+                    self.parse_error(msg)
                 has_test = 'test' in child.attrib
 
         if alternatives:
@@ -1352,8 +1367,8 @@ class Xsd11Element(XsdElement):
         elif e1.type is not e2.type or \
                 not all(any(a == x for x in e2.alternatives) for a in e1.alternatives) or \
                 not all(any(a == x for x in e1.alternatives) for a in e2.alternatives):
-            msg = "Maybe a not equivalent type table between elements %r and %r." % (e1, e2)
-            warnings.warn(msg, XMLSchemaTypeTableWarning, stacklevel=3)
+            msg = _("Maybe a not equivalent type table between elements {0!r} and {1!r}")
+            warnings.warn(msg.format(e1, e2), XMLSchemaTypeTableWarning, stacklevel=3)
         return True
 
 
@@ -1428,7 +1443,7 @@ class XsdAlternative(XsdComponent):
             else:
                 child = self._parse_child_component(self.elem, strict=False)
                 if child is None or child.tag not in (XSD_COMPLEX_TYPE, XSD_SIMPLE_TYPE):
-                    self.parse_error("missing 'type' attribute")
+                    self.parse_error(_("missing 'type' attribute"))
                     self.type = self.any_type
                 elif child.tag == XSD_COMPLEX_TYPE:
                     self.type = self.schema.xsd_complex_type_class(child, self.schema, self)
@@ -1436,23 +1451,24 @@ class XsdAlternative(XsdComponent):
                     self.type = self.schema.simple_type_factory(child, self.schema, self)
 
                 if not self.type.is_derived(self.parent.type):
-                    msg = "declared type is not derived from {!r}"
+                    msg = _("declared type is not derived from {!r}")
                     self.parse_error(msg.format(self.parent.type))
         else:
             try:
                 self.type = self.maps.lookup_type(type_qname)
             except KeyError:
-                self.parse_error("unknown type %r" % attrib['type'])
+                self.parse_error(_("unknown type {!r}").format(attrib['type']))
                 self.type = self.any_type
             else:
                 if self.type.name != XSD_ERROR and not self.type.is_derived(self.parent.type):
-                    msg = "type {!r} is not derived from {!r}"
+                    msg = _("type {0!r} is not derived from {1!r}")
                     self.parse_error(msg.format(attrib['type'], self.parent.type))
 
                 child = self._parse_child_component(self.elem, strict=False)
                 if child is not None and child.tag in (XSD_COMPLEX_TYPE, XSD_SIMPLE_TYPE):
-                    self.parse_error("the attribute 'type' and the <%s> local declaration "
-                                     "are mutually exclusive" % child.tag.split('}')[-1])
+                    msg = _("the attribute 'type' and the xs:%s local "
+                            "declaration are mutually exclusive")
+                    self.parse_error(msg % child.tag.split('}')[-1])
 
     @property
     def built(self) -> bool:
diff --git a/xmlschema/validators/exceptions.py b/xmlschema/validators/exceptions.py
index b7cda27..d617bba 100644
--- a/xmlschema/validators/exceptions.py
+++ b/xmlschema/validators/exceptions.py
@@ -8,10 +8,12 @@
 # @author Davide Brunato <brunato@sissa.it>
 #
 from typing import TYPE_CHECKING, Any, Optional, cast, Iterable, Union, Callable
+
 from ..exceptions import XMLSchemaException, XMLSchemaWarning, XMLSchemaValueError
 from ..etree import etree_tostring
 from ..aliases import ElementType, NamespacesType, SchemaElementType, ModelParticleType
 from ..helpers import get_prefixed_qname, etree_getpath, is_etree_element
+from ..translation import gettext as _
 
 if TYPE_CHECKING:
     from ..resources import XMLResource
@@ -340,7 +342,7 @@ class XMLSchemaChildrenValidationError(XMLSchemaValidationError):
             reason = "The content of element %r is not complete." % tag
         else:
             child_tag = get_prefixed_qname(elem[index].tag, validator.namespaces, use_empty=False)
-            reason = "Unexpected child with tag %r at position %d." % (child_tag, index + 1)
+            reason = _("Unexpected child with tag %r at position %d.") % (child_tag, index + 1)
 
         if occurs and particle.is_missing(occurs):
             reason += " The particle %r occurs %d times but the minimum is %d." % (
@@ -367,11 +369,11 @@ class XMLSchemaChildrenValidationError(XMLSchemaValidationError):
             if not expected_tags:
                 pass
             elif len(expected_tags) > 1:
-                reason += " Tag (%s) expected." % ' | '.join(repr(tag) for tag in expected_tags)
+                reason += _(" Tag (%s) expected.") % ' | '.join(repr(tag) for tag in expected_tags)
             elif expected_tags[0].startswith('from '):
-                reason += " Tag %s expected." % expected_tags[0]
+                reason += _(" Tag %s expected.") % expected_tags[0]
             else:
-                reason += " Tag %r expected." % expected_tags[0]
+                reason += _(" Tag %r expected.") % expected_tags[0]
 
         super(XMLSchemaChildrenValidationError, self).\
             __init__(validator, elem, reason, source, namespaces)
diff --git a/xmlschema/validators/facets.py b/xmlschema/validators/facets.py
index 2d6f3ed..d75d4b7 100644
--- a/xmlschema/validators/facets.py
+++ b/xmlschema/validators/facets.py
@@ -26,6 +26,7 @@ from ..names import XSD_LENGTH, XSD_MIN_LENGTH, XSD_MAX_LENGTH, XSD_ENUMERATION,
     XSD_ANNOTATION
 from ..etree import etree_element
 from ..aliases import ElementType, SchemaType, AtomicValueType, BaseXsdType
+from ..translation import gettext as _
 from ..helpers import count_digits, local_name
 from .exceptions import XMLSchemaValidationError, XMLSchemaDecodeError
 from .xsdbase import XsdComponent, XsdAnnotation
@@ -59,7 +60,7 @@ class XsdFacet(XsdComponent):
         try:
             self._validator(value)
         except TypeError:
-            reason = "invalid type {!r} provided".format(type(value))
+            reason = _("invalid type {!r} provided").format(type(value))
             raise XMLSchemaValidationError(self, value, reason) from None
 
     @staticmethod
@@ -80,8 +81,8 @@ class XsdFacet(XsdComponent):
         else:
             if base_facet is not None and base_facet.fixed and \
                     base_facet.value is not None and self.value != base_facet.value:
-                self.parse_error("{!r} facet value is fixed to {!r}"
-                                 .format(local_name(self.elem.tag), base_facet.value))
+                msg = _("{0!r} facet value is fixed to {1!r}")
+                self.parse_error(msg.format(local_name(self.elem.tag), base_facet.value))
 
     def _parse_value(self, elem: ElementType) -> Union[None, AtomicValueType, Pattern[str]]:
         self.value = elem.attrib['value']  # pragma: no cover
@@ -131,23 +132,23 @@ class XsdWhiteSpaceFacet(XsdFacet):
             self._validator = self.collapse_white_space_validator  # type: ignore[assignment]
         elif self.value == 'replace':
             if self.base_value == 'collapse':
-                self.parse_error("facet value can be only 'collapse'")
+                self.parse_error(_("facet value can be only 'collapse'"))
             self._validator = self.replace_white_space_validator  # type: ignore[assignment]
         elif self.base_value == 'collapse':
-            self.parse_error("facet value can be only 'collapse'")
+            self.parse_error(_("facet value can be only 'collapse'"))
         elif self.base_value == 'replace':
-            self.parse_error("facet value can be only 'replace' or 'collapse'")
+            self.parse_error(_("facet value can be only 'replace' or 'collapse'"))
 
     def replace_white_space_validator(self, value: str) -> None:
         if '\t' in value or '\n' in value:
             raise XMLSchemaValidationError(
-                self, value, "value contains tabs or newlines"
+                self, value, _("value contains tabs or newlines")
             )
 
     def collapse_white_space_validator(self, value: str) -> None:
         if '\t' in value or '\n' in value or '  ' in value:
             raise XMLSchemaValidationError(
-                self, value, "value contains non collapsed white spaces"
+                self, value, _("value contains non collapsed white spaces")
             )
 
 
@@ -171,7 +172,8 @@ class XsdLengthFacet(XsdFacet):
     def _parse_value(self, elem: ElementType) -> None:
         self.value = int(elem.attrib['value'])
         if self.base_value is not None and self.value != self.base_value:
-            self.parse_error("base facet has a different length ({})".format(self.base_value))
+            msg = _("base facet has a different length ({})")
+            self.parse_error(msg.format(self.base_value))
 
         primitive_type = getattr(self.base_type, 'primitive_type', None)
         if primitive_type is None or primitive_type.name not in {XSD_QNAME, XSD_NOTATION_TYPE}:
@@ -180,7 +182,7 @@ class XsdLengthFacet(XsdFacet):
 
     def _length_validator(self, value: Any) -> None:
         if len(value) != self.value:
-            reason = "length has to be {!r}".format(self.value)
+            reason = _("length has to be {!r}").format(self.value)
             raise XMLSchemaValidationError(self, value, reason)
 
 
@@ -204,7 +206,8 @@ class XsdMinLengthFacet(XsdFacet):
     def _parse_value(self, elem: ElementType) -> None:
         self.value = int(elem.attrib['value'])
         if self.base_value is not None and self.value < self.base_value:
-            self.parse_error("base facet has a greater min length ({})".format(self.base_value))
+            msg = _("base facet has a greater min length ({})")
+            self.parse_error(msg.format(self.base_value))
 
         primitive_type = getattr(self.base_type, 'primitive_type', None)
         if primitive_type is None or primitive_type.name not in {XSD_QNAME, XSD_NOTATION_TYPE}:
@@ -213,7 +216,7 @@ class XsdMinLengthFacet(XsdFacet):
 
     def _min_length_validator(self, value: Any) -> None:
         if len(value) < self.value:
-            reason = "value length cannot be lesser than {!r}".format(self.value)
+            reason = _("value length cannot be lesser than {!r}").format(self.value)
             raise XMLSchemaValidationError(self, value, reason)
 
 
@@ -237,7 +240,8 @@ class XsdMaxLengthFacet(XsdFacet):
     def _parse_value(self, elem: ElementType) -> None:
         self.value = int(elem.attrib['value'])
         if self.base_value is not None and self.value > self.base_value:
-            self.parse_error("base type has a lesser max length ({})".format(self.base_value))
+            msg = _("base type has a lesser max length ({})")
+            self.parse_error(msg.format(self.base_value))
 
         primitive_type = getattr(self.base_type, 'primitive_type', None)
         if primitive_type is None or primitive_type.name not in {XSD_QNAME, XSD_NOTATION_TYPE}:
@@ -246,7 +250,7 @@ class XsdMaxLengthFacet(XsdFacet):
 
     def _max_length_validator(self, value: Any) -> None:
         if len(value) > self.value:
-            reason = "value length cannot be greater than {!r}".format(self.value)
+            reason = _("value length cannot be greater than {!r}").format(self.value)
             raise XMLSchemaValidationError(self, value, reason)
 
 
@@ -269,12 +273,12 @@ class XsdMinInclusiveFacet(XsdFacet):
         value = elem.attrib['value']
         self.value, errors = cast(LaxDecodeType, self.base_type.decode(value, 'lax'))
         for e in errors:
-            self.parse_error("invalid restriction: {}".format(e.reason))
+            self.parse_error(_("invalid restriction: {}").format(e.reason))
 
     def __call__(self, value: Any) -> None:
         try:
             if value < self.value:
-                reason = "value has to be greater or equal than {!r}".format(self.value)
+                reason = _("value has to be greater or equal than {!r}").format(self.value)
                 raise XMLSchemaValidationError(self, value, reason)
         except TypeError as err:
             raise XMLSchemaValidationError(self, value, str(err)) from None
@@ -300,16 +304,17 @@ class XsdMinExclusiveFacet(XsdFacet):
         self.value, errors = cast(LaxDecodeType, self.base_type.decode(value, 'lax'))
         for e in errors:
             if not isinstance(e.validator, self.__class__) or e.validator.value != self.value:
-                self.parse_error("invalid restriction: {}".format(e.reason))
+                self.parse_error(_("invalid restriction: {}").format(e.reason))
 
         facet: Any = self.base_type.get_facet(XSD_MAX_INCLUSIVE)
         if facet is not None and facet.value == self.value:
-            self.parse_error("invalid restriction: {} is also the maximum".format(self.value))
+            msg = _("invalid restriction: {} is also the maximum")
+            self.parse_error(msg.format(self.value))
 
     def __call__(self, value: Any) -> None:
         try:
             if value <= self.value:
-                reason = "value has to be greater than {!r}".format(self.value)
+                reason = _("value has to be greater than {!r}").format(self.value)
                 raise XMLSchemaValidationError(self, value, reason)
         except TypeError as err:
             raise XMLSchemaValidationError(self, value, str(err)) from None
@@ -334,12 +339,12 @@ class XsdMaxInclusiveFacet(XsdFacet):
         value = elem.attrib['value']
         self.value, errors = cast(LaxDecodeType, self.base_type.decode(value, 'lax'))
         for e in errors:
-            self.parse_error("invalid restriction: {}".format(e.reason))
+            self.parse_error(_("invalid restriction: {}").format(e.reason))
 
     def __call__(self, value: Any) -> None:
         try:
             if value > self.value:
-                reason = "value has to be lesser or equal than {!r}".format(self.value)
+                reason = _("value has to be less than or equal than {!r}").format(self.value)
                 raise XMLSchemaValidationError(self, value, reason)
         except TypeError as err:
             raise XMLSchemaValidationError(self, value, str(err)) from None
@@ -365,16 +370,17 @@ class XsdMaxExclusiveFacet(XsdFacet):
         self.value, errors = cast(LaxDecodeType, self.base_type.decode(value, 'lax'))
         for e in errors:
             if not isinstance(e.validator, self.__class__) or e.validator.value != self.value:
-                self.parse_error("invalid restriction: {}".format(e.reason))
+                self.parse_error(_("invalid restriction: {}").format(e.reason))
 
         facet: Any = self.base_type.get_facet(XSD_MIN_INCLUSIVE)
         if facet is not None and facet.value == self.value:
-            self.parse_error("invalid restriction: {} is also the minimum".format(self.value))
+            msg = _("invalid restriction: {} is also the minimum")
+            self.parse_error(msg.format(self.value))
 
     def __call__(self, value: Any) -> None:
         try:
             if value >= self.value:
-                reason = "value has to be lesser than {!r}".format(self.value)
+                reason = _("value has to be lesser than {!r}").format(self.value)
                 raise XMLSchemaValidationError(self, value, reason)
         except TypeError as err:
             raise XMLSchemaValidationError(self, value, str(err)) from None
@@ -409,9 +415,8 @@ class XsdTotalDigitsFacet(XsdFacet):
 
             facet: Any = self.base_type.get_facet(XSD_TOTAL_DIGITS)
             if facet is not None and facet.value < self.value:
-                self.parse_error(
-                    "invalid restriction: base value is lower ({})".format(facet.value)
-                )
+                msg = _("invalid restriction: base value is lower ({})")
+                self.parse_error(msg.format(facet.value))
 
     def __call__(self, value: Any) -> None:
         try:
@@ -420,8 +425,8 @@ class XsdTotalDigitsFacet(XsdFacet):
         except (TypeError, ValueError, ArithmeticError) as err:
             raise XMLSchemaValidationError(self, value, str(err)) from None
         else:
-            reason = "the number of digits has to be lesser or equal " \
-                     "than {!r}".format(self.value)
+            reason = _("the number of digits has to be lesser or equal "
+                       "than {!r}").format(self.value)
             raise XMLSchemaValidationError(self, value, reason)
 
 
@@ -448,9 +453,8 @@ class XsdFractionDigitsFacet(XsdFacet):
 
         super(XsdFractionDigitsFacet, self).__init__(elem, schema, parent, base_type)
         if not base_type.is_derived(self.maps.types[XSD_DECIMAL]):
-            self.parse_error(
-                "fractionDigits facet can be applied only to types derived from xs:decimal"
-            )
+            msg = _("fractionDigits facet can be applied only to types derived from xs:decimal")
+            self.parse_error(msg)
 
     def _parse_value(self, elem: ElementType) -> None:
         # Errors are detected by meta-schema validation. For schemas with
@@ -463,14 +467,13 @@ class XsdFractionDigitsFacet(XsdFacet):
             if self.value < 0:
                 self.value = 9999
             elif self.value > 0 and self.base_type.is_derived(self.maps.types[XSD_INTEGER]):
-                raise ValueError("fractionDigits facet value has to be 0 "
-                                 "for types derived from xs:integer.")
+                msg = _("fractionDigits facet value must be 0 for types derived from xs:integer")
+                raise ValueError(msg)
 
             facet: Any = self.base_type.get_facet(XSD_FRACTION_DIGITS)
             if facet is not None and facet.value < self.value:
-                self.parse_error(
-                    "invalid restriction: base value is lower ({})".format(facet.value)
-                )
+                msg = _("invalid restriction: base value is lower ({})")
+                self.parse_error(msg.format(facet.value))
 
     def __call__(self, value: Any) -> None:
         try:
@@ -479,8 +482,8 @@ class XsdFractionDigitsFacet(XsdFacet):
         except (TypeError, ValueError, ArithmeticError) as err:
             raise XMLSchemaValidationError(self, value, str(err)) from None
         else:
-            reason = "the number of fraction digits has to be lesser " \
-                     "or equal than {!r}".format(self.value)
+            reason = _("the number of fraction digits has to be lesser "
+                       "or equal than {!r}").format(self.value)
             raise XMLSchemaValidationError(self, value, reason)
 
 
@@ -511,19 +514,18 @@ class XsdExplicitTimezoneFacet(XsdFacet):
 
         facet: Any = self.base_type.get_facet(XSD_EXPLICIT_TIMEZONE)
         if facet is not None and facet.value != self.value and facet.value != 'optional':
-            self.parse_error("invalid restriction from {!r}".format(facet.value))
+            msg = _("invalid restriction from {!r}")
+            self.parse_error(msg.format(facet.value))
 
     def _required_timezone_validator(self, value: Any) -> None:
         if value.tzinfo is None:
-            raise XMLSchemaValidationError(
-                self, value, "time zone required for value {!r}".format(self.value)
-            )
+            reason = _("time zone required for value {!r}").format(self.value)
+            raise XMLSchemaValidationError(self, value, reason)
 
     def _prohibited_timezone_validator(self, value: Any) -> None:
         if value.tzinfo is not None:
-            raise XMLSchemaValidationError(
-                self, value, "time zone prohibited for value {!r}".format(self.value)
-            )
+            reason = _("time zone prohibited for value {!r}").format(self.value)
+            raise XMLSchemaValidationError(self, value, reason)
 
 
 class XsdEnumerationFacets(MutableSequence[ElementType], XsdFacet):
@@ -566,7 +568,7 @@ class XsdEnumerationFacets(MutableSequence[ElementType], XsdFacet):
                     self.parse_error(err, elem)
                 else:
                     if notation_qname not in self.maps.notations:
-                        msg = "value {!r} must match a notation declaration"
+                        msg = _("value {!r} must match a notation declaration")
                         self.parse_error(msg.format(value), elem)
             return cast(AtomicValueType, value)
         return None
@@ -624,7 +626,7 @@ class XsdEnumerationFacets(MutableSequence[ElementType], XsdFacet):
         except TypeError:
             pass
 
-        reason = "value must be one of {!r}".format(self.enumeration)
+        reason = _("value must be one of {!r}").format(self.enumeration)
         raise XMLSchemaValidationError(self, value, reason)
 
     def get_annotation(self, i: int) -> Optional[XsdAnnotation]:
@@ -720,7 +722,7 @@ class XsdPatternFacets(MutableSequence[ElementType], XsdFacet):
     def __call__(self, text: str) -> None:
         try:
             if all(pattern.match(text) is None for pattern in self.patterns):
-                reason = "value doesn't match any pattern of {!r}".format(self.regexps)
+                reason = _("value doesn't match any pattern of {!r}").format(self.regexps)
                 raise XMLSchemaValidationError(self, text, reason)
         except TypeError as err:
             raise XMLSchemaValidationError(self, text, str(err)) from None
@@ -784,7 +786,7 @@ class XsdAssertionFacet(XsdFacet):
         try:
             self.path = self.elem.attrib['test']
         except KeyError:
-            self.parse_error("missing attribute 'test'")
+            self.parse_error(_("missing attribute 'test'"))
             self.path = 'true()'
 
         try:
@@ -814,7 +816,7 @@ class XsdAssertionFacet(XsdFacet):
         context = XPathContext(self._root, variables={'value': value})
         try:
             if not self.token.evaluate(context):
-                reason = "value is not true with test path {!r}".format(self.path)
+                reason = _("value is not true with test path {!r}").format(self.path)
                 raise XMLSchemaValidationError(self, value, reason)
         except ElementPathError as err:
             raise XMLSchemaValidationError(self, value, reason=str(err)) from None
diff --git a/xmlschema/validators/global_maps.py b/xmlschema/validators/global_maps.py
index cf30367..3deed7a 100644
--- a/xmlschema/validators/global_maps.py
+++ b/xmlschema/validators/global_maps.py
@@ -25,6 +25,8 @@ from ..aliases import ComponentClassType, ElementType, SchemaType, BaseXsdType,
     SchemaGlobalType
 from ..helpers import get_qname, local_name, get_extended_qname
 from ..namespaces import NamespaceResourcesMap
+from ..translation import gettext as _
+
 from .exceptions import XMLSchemaNotBuiltError, XMLSchemaModelError, XMLSchemaModelDepthError, \
     XMLSchemaParseError
 from .xsdbase import XsdValidator, XsdComponent
@@ -72,7 +74,7 @@ def create_load_function(tag: str) \
                             xsd_globals[qname] = (elem, schema)
                             continue
 
-                    msg = "global {} with name={!r} is already defined"
+                    msg = _("global {0} with name={1!r} is already defined")
                     schema.parse_error(msg.format(local_name(tag), qname))
 
         redefined_names = Counter(x[0] for x in redefinitions)
@@ -85,7 +87,7 @@ def create_load_function(tag: str) \
                 redefined_schemas: Any
                 redefined_schemas = [x[-1] for x in redefinitions if x[0] == qname]
                 if any(redefined_schemas.count(x) > 1 for x in redefined_schemas):
-                    msg = "multiple redefinition for {} {!r}"
+                    msg = _("multiple redefinition for {0} {1!r}")
                     schema.parse_error(msg.format(local_name(child.tag), qname), child)
                 else:
                     redefined_schemas = {x[-1]: x[-2] for x in redefinitions if x[0] == qname}
@@ -97,7 +99,7 @@ def create_load_function(tag: str) \
                                 break
 
                             if s is rs:
-                                msg = "circular redefinition for {} {!r}"
+                                msg = _("circular redefinition for {0} {1!r}")
                                 schema.parse_error(msg.format(local_name(child.tag), qname), child)
                                 break
 
@@ -108,11 +110,11 @@ def create_load_function(tag: str) \
                 if qname in xsd_globals:
                     xsd_globals[qname] = (child, schema)
             else:
-                # Append to a list if it's a redefine
+                # Append to a list if it's a redefinition
                 try:
                     xsd_globals[qname].append((child, schema))
                 except KeyError:
-                    schema.parse_error("not a redefinition!", child)
+                    schema.parse_error(_("not a redefinition!"), child)
                 except AttributeError:
                     xsd_globals[qname] = [xsd_globals[qname], (child, schema)]
 
@@ -229,7 +231,7 @@ class XsdGlobals(XsdValidator):
         try:
             lookup_function = getattr(self, self._lookup_function_resolver[tag])
         except KeyError:
-            msg = "wrong tag {!r} for an XSD global definition/declaration"
+            msg = _("wrong tag {!r} for an XSD global definition/declaration")
             raise XMLSchemaValueError(msg.format(tag)) from None
         else:
             return lookup_function(qname)
@@ -308,7 +310,8 @@ class XsdGlobals(XsdValidator):
             try:
                 factory_or_class = self._builders[elem.tag]
             except KeyError:
-                raise XMLSchemaKeyError("wrong element %r for map %r." % (elem, global_map))
+                msg = _("wrong element {0!r} for map {1!r}")
+                raise XMLSchemaKeyError(msg.format(elem, global_map))
 
             global_map[qname] = obj,  # Encapsulate into a tuple to catch circular builds
             global_map[qname] = factory_or_class(elem, schema)
@@ -324,7 +327,8 @@ class XsdGlobals(XsdValidator):
             try:
                 factory_or_class = self._builders[elem.tag]
             except KeyError:
-                raise XMLSchemaKeyError("wrong element %r for map %r." % (elem, global_map))
+                msg = _("wrong element {0!r} for map {1!r}")
+                raise XMLSchemaKeyError(msg.format(elem, global_map))
 
             global_map[qname] = obj[0],  # To catch circular builds
             global_map[qname] = component = factory_or_class(elem, schema)
@@ -332,7 +336,7 @@ class XsdGlobals(XsdValidator):
             # Apply redefinitions (changing elem involve a re-parsing of the component)
             for elem, schema in obj[1:]:
                 if component.schema.target_namespace != schema.target_namespace:
-                    msg = "redefined schema {!r} has a different targetNamespace"
+                    msg = _("redefined schema {!r} has a different targetNamespace")
                     raise XMLSchemaValueError(msg.format(schema))
 
                 component.redefine = component.copy()
@@ -343,7 +347,8 @@ class XsdGlobals(XsdValidator):
             return global_map[qname]
 
         else:
-            raise XMLSchemaTypeError(f"unexpected instance {obj} in global map")
+            msg = _("unexpected instance {!r} in global map")
+            raise XMLSchemaTypeError(msg.format(obj))
 
     def get_instance_type(self, type_name: str, base_type: BaseXsdType,
                           namespaces: MutableMapping[str, str]) -> BaseXsdType:
@@ -374,7 +379,8 @@ class XsdGlobals(XsdValidator):
                 if xsi_type in base_type.member_types:
                     return xsi_type
 
-        raise XMLSchemaTypeError("%r cannot substitute %r" % (xsi_type, base_type))
+        msg = _("{0!r} cannot substitute {1!r}")
+        raise XMLSchemaTypeError(msg.format(xsi_type, base_type))
 
     @property
     def built(self) -> bool:
@@ -569,7 +575,7 @@ class XsdGlobals(XsdValidator):
             meta_schema = self.namespaces[XSD_NAMESPACE][0]
         except KeyError:
             if self.validator.meta_schema is None:
-                msg = "missing XSD namespace in meta-schema instance {!r}"
+                msg = _("missing XSD namespace in meta-schema instance {!r}")
                 raise XMLSchemaValueError(msg.format(self.validator))
             meta_schema = None
 
@@ -578,7 +584,7 @@ class XsdGlobals(XsdValidator):
             # Creates a new meta-schema instance from the XSD meta-schema source and
             # replaces the default meta-schema instance in all registered schemas.
             if self.validator.meta_schema is None:
-                msg = "missing default meta-schema instance {!r}"
+                msg = _("missing default meta-schema instance {!r}")
                 raise XMLSchemaRuntimeError(msg.format(self.validator))
 
             url = self.validator.meta_schema.url
@@ -630,7 +636,7 @@ class XsdGlobals(XsdValidator):
                 attributes = schema.maps.attribute_groups[schema.default_attributes]
             except KeyError:
                 schema.default_attributes = None
-                msg = "defaultAttributes={!r} doesn't match an attribute group of {!r}"
+                msg = _("defaultAttributes={0!r} doesn't match any attribute group of {1!r}")
                 schema.parse_error(
                     error=msg.format(schema.root.get('defaultAttributes'), schema),
                     elem=schema.root,
@@ -673,26 +679,26 @@ class XsdGlobals(XsdValidator):
         # Checks substitution groups circularity
         for qname in self.substitution_groups:
             xsd_element = self.elements[qname]
-            assert isinstance(xsd_element, XsdElement), "global element not built!"
+            assert isinstance(xsd_element, XsdElement), _("global element not built!")
             if any(e is xsd_element for e in xsd_element.iter_substitutes()):
-                msg = "circularity found for substitution group with head element %r"
+                msg = _("circularity found for substitution group with head element {}")
                 xsd_element.parse_error(msg.format(xsd_element), validation=validation)
 
         if validation == 'strict' and not self.built:
             raise XMLSchemaNotBuiltError(
-                self, "global map has unbuilt components: %r" % self.unbuilt
+                self, _("global map has unbuilt components: %r") % self.unbuilt
             )
 
         # Check redefined global groups restrictions
         for group in self.groups.values():
-            assert isinstance(group, XsdGroup), "global group not built!"
+            assert isinstance(group, XsdGroup), _("global group not built!")
             if group.schema not in _schemas or group.redefine is None:
                 continue
 
             while group.redefine is not None:
                 if not any(isinstance(e, XsdGroup) and e.name == group.name for e in group) \
                         and not group.is_restriction(group.redefine):
-                    msg = "the redefined group is an illegal restriction of the original group"
+                    msg = _("the redefined group is an illegal restriction")
                     group.parse_error(msg, validation=validation)
 
                 group = group.redefine
@@ -708,8 +714,8 @@ class XsdGlobals(XsdValidator):
                     base_type = xsd_type.base_type
                     if base_type and base_type.name != XSD_ANY_TYPE and base_type.is_complex():
                         if not xsd_type.content.is_restriction(base_type.content):
-                            xsd_type.parse_error("the derived group is an illegal restriction "
-                                                 "of the base type group", validation=validation)
+                            msg = _("the derived group is an illegal restriction")
+                            xsd_type.parse_error(msg, validation=validation)
 
                     if base_type.is_complex() and not base_type.open_content and \
                             xsd_type.open_content and xsd_type.open_content.mode != 'none':
@@ -718,15 +724,15 @@ class XsdGlobals(XsdValidator):
                             any_element=xsd_type.open_content.any_element
                         )
                         if not _group.is_restriction(base_type.content):
-                            msg = "restriction has an open content but base type has not"
+                            msg = _("restriction has an open content but base type has not")
                             _group.parse_error(msg, validation=validation)
 
                 try:
                     xsd_type.content.check_model()
                 except XMLSchemaModelDepthError:
-                    msg = "cannot verify the content model of {!r} " \
-                          "due to maximum recursion depth exceeded".format(xsd_type)
-                    xsd_type.schema.warnings.append(msg)
+                    msg = _("can't verify the content model of {!r} "
+                            "due to exceeding of maximum recursion depth")
+                    xsd_type.schema.warnings.append(msg.format(xsd_type))
                     warnings.warn(msg, XMLSchemaWarning, stacklevel=4)
                 except XMLSchemaModelError as err:
                     if validation == 'strict':
diff --git a/xmlschema/validators/groups.py b/xmlschema/validators/groups.py
index be5e25b..b8a9bc4 100644
--- a/xmlschema/validators/groups.py
+++ b/xmlschema/validators/groups.py
@@ -22,6 +22,7 @@ from ..names import XSD_GROUP, XSD_SEQUENCE, XSD_ALL, XSD_CHOICE, XSD_ELEMENT, \
 from ..etree import etree_element, ElementData
 from ..aliases import ElementType, NamespacesType, SchemaType, IterDecodeType, \
     IterEncodeType, ModelParticleType, SchemaElementType, ComponentClassType
+from ..translation import gettext as _
 from ..helpers import get_qname, local_name, raw_xml_encode
 
 from .exceptions import XMLSchemaModelError, XMLSchemaModelDepthError, \
@@ -351,7 +352,7 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
                 try:
                     group, children = subgroups.pop()
                 except IndexError:
-                    msg = '{!r} is not a particle of the model group'
+                    msg = _('{!r} is not a particle of the model group')
                     raise XMLSchemaModelError(self, msg.format(item)) from None
                 else:
                     continue
@@ -409,7 +410,8 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
         if self.elem.tag != XSD_GROUP:
             # Local group (sequence|all|choice)
             if 'name' in self.elem.attrib:
-                self.parse_error("attribute 'name' not allowed for a local group")
+                msg = _("attribute 'name' not allowed in a local group")
+                self.parse_error(msg)
             self._parse_content_model(self.elem)
 
         elif self._parse_reference():
@@ -417,24 +419,27 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
             try:
                 xsd_group = self.maps.lookup_group(self.name)
             except KeyError:
-                self.parse_error("missing group %r" % self.prefixed_name)
+                self.parse_error(_("missing group %r") % self.prefixed_name)
                 xsd_group = self.schema.create_any_content_group(parent=self)
 
             if isinstance(xsd_group, XsdGroup):
                 self.model = xsd_group.model
                 if self.model == 'all':
                     if self.max_occurs != 1:
-                        self.parse_error("maxOccurs must be 1 for 'all' model groups")
+                        msg = _("maxOccurs must be 1 for 'all' model groups")
+                        self.parse_error(msg)
                     if self.min_occurs not in (0, 1):
-                        self.parse_error("minOccurs must be (0 | 1) for 'all' model groups")
+                        msg = _("minOccurs must be (0 | 1) for 'all' model groups")
+                        self.parse_error(msg)
                     if self.xsd_version == '1.0' and isinstance(self.parent, XsdGroup):
-                        self.parse_error("in XSD 1.0 the 'all' model group cannot be nested")
+                        msg = _("in XSD 1.0 an 'all' model group cannot be nested")
+                        self.parse_error(msg)
                 self._group.append(xsd_group)
                 self.ref = xsd_group
             else:
                 # Disallowed circular definition, substitute with any content group.
-                self.parse_error("Circular definitions detected for group %r:" % self.name,
-                                 xsd_group[0])
+                msg = _("Circular definition detected for group %r")
+                self.parse_error(msg % self.name, xsd_group[0])
                 self.model = 'sequence'
                 self.mixed = True
                 self._group.append(self.schema.xsd_any_class(ANY_ELEMENT, self.schema, self))
@@ -447,35 +452,41 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
                 pass
             else:
                 if self.parent is not None:
-                    self.parse_error("attribute 'name' not allowed for a local group")
+                    msg = _("attribute 'name' not allowed in a local group")
+                    self.parse_error(msg)
                 else:
                     if 'minOccurs' in attrib:
-                        self.parse_error("attribute 'minOccurs' not allowed for a global group")
+                        msg = _("attribute 'minOccurs' not allowed in a global group")
+                        self.parse_error(msg)
                     if 'maxOccurs' in attrib:
-                        self.parse_error("attribute 'maxOccurs' not allowed for a global group")
+                        msg = _("attribute 'maxOccurs' not allowed in a global group")
+                        self.parse_error(msg)
 
                 content_model = self._parse_child_component(self.elem, strict=True)
                 if content_model is not None:
                     if self.parent is None:
                         if 'minOccurs' in content_model.attrib:
-                            self.parse_error("attribute 'minOccurs' not allowed for the model "
-                                             "of a global group", content_model)
+                            msg = _("attribute 'minOccurs' not allowed in a global group")
+                            self.parse_error(msg, content_model)
                         if 'maxOccurs' in content_model.attrib:
-                            self.parse_error("attribute 'maxOccurs' not allowed for the model "
-                                             "of a global group", content_model)
+                            msg = _("attribute 'maxOccurs' not allowed in a global group")
+                            self.parse_error(msg, content_model)
 
                     if content_model.tag in {XSD_SEQUENCE, XSD_ALL, XSD_CHOICE}:
                         self._parse_content_model(content_model)
                     else:
-                        self.parse_error('unexpected tag %r' % content_model.tag, content_model)
+                        msg = _('unexpected tag %r')
+                        self.parse_error(msg % content_model.tag, content_model)
 
     def _parse_content_model(self, content_model: ElementType) -> None:
         self.model = local_name(content_model.tag)
         if self.model == 'all':
             if self.max_occurs != 1:
-                self.parse_error("maxOccurs must be 1 for 'all' model groups")
+                msg = _("maxOccurs must be 1 for 'all' model groups")
+                self.parse_error(msg)
             if self.min_occurs not in (0, 1):
-                self.parse_error("minOccurs must be (0 | 1) for 'all' model groups")
+                msg = _("minOccurs must be (0 | 1) for 'all' model groups")
+                self.parse_error(msg)
 
         child: ElementType
         for child in content_model:
@@ -485,7 +496,7 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
                 # Builds inner elements later, for avoid circularity.
                 self.append(self.schema.xsd_element_class(child, self.schema, self, False))
             elif content_model.tag == XSD_ALL:
-                self.parse_error("'all' model can contains only elements.")
+                self.parse_error(_("'all' model can contain only elements"))
             elif child.tag == XSD_ANY:
                 self._group.append(XsdAnyElement(child, self.schema, self))
             elif child.tag in (XSD_SEQUENCE, XSD_CHOICE):
@@ -495,7 +506,8 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
                     ref = self.schema.resolve_qname(child.attrib['ref'])
                 except (KeyError, ValueError, RuntimeError) as err:
                     if 'ref' not in child.attrib:
-                        self.parse_error("missing attribute 'ref' in local group", child)
+                        msg = _("missing attribute 'ref' in local group")
+                        self.parse_error(msg, child)
                     else:
                         self.parse_error(err, child)
                     continue
@@ -503,16 +515,18 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
                 if ref != self.name:
                     xsd_group = XsdGroup(child, self.schema, self)
                     if xsd_group.model == 'all':
-                        self.parse_error("'all' model can appears only at 1st level "
-                                         "of a model group")
+                        msg = _("'all' model can appears only at 1st level of a model group")
+                        self.parse_error(msg)
                     else:
                         self._group.append(xsd_group)
                 elif self.redefine is None:
-                    self.parse_error("Circular definition detected for group %r:" % self.name)
+                    msg = _("Circular definition detected for group %r")
+                    self.parse_error(msg % self.name)
                 else:
                     if child.get('minOccurs', '1') != '1' or child.get('maxOccurs', '1') != '1':
-                        self.parse_error("Redefined group reference cannot have "
-                                         "minOccurs/maxOccurs other than 1:")
+                        msg = _("Redefined group reference cannot have "
+                                "minOccurs/maxOccurs other than 1")
+                        self.parse_error(msg)
                     self._group.append(self.redefine)
 
     def build(self) -> None:
@@ -804,8 +818,8 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
             for pe, previous_path in paths.values():
                 # EDC check
                 if not e.is_consistent(pe) or any_element and not any_element.is_consistent(pe):
-                    msg = "Element Declarations Consistent violation between %r and %r: " \
-                          "match the same name but with different types" % (e, pe)
+                    msg = _("Element Declarations Consistent violation between {0!r} and {1!r}"
+                            ": match the same name but with different types").format(e, pe)
                     raise XMLSchemaModelError(self, msg)
 
                 # UPA check
@@ -818,7 +832,7 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
                         elif isinstance(e, Xsd11AnyElement) and not isinstance(pe, XsdAnyElement):
                             e.add_precedence(pe, self)
                         else:
-                            msg = "{!r} and {!r} overlap and are in the same {!r} group"
+                            msg = _("{0!r} and {1!r} overlap and are in the same {2!r} group")
                             raise XMLSchemaModelError(self, msg.format(pe, e, pe.parent.model))
                     elif pe.min_occurs == pe.max_occurs:
                         continue
@@ -830,7 +844,7 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
                 elif isinstance(e, Xsd11AnyElement) and not isinstance(pe, XsdAnyElement):
                     e.add_precedence(pe, self)
                 else:
-                    msg = "Unique Particle Attribution violation between {!r} and {!r}"
+                    msg = _("Unique Particle Attribution violation between {0!r} and {1!r}")
                     raise XMLSchemaModelError(self, msg.format(pe, e))
 
             paths[e.name] = e, current_path[:]
@@ -843,9 +857,8 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
         if model_element is not xsd_element and isinstance(model_element, XsdElement):
             if 'substitution' in model_element.block \
                     or xsd_element.type and xsd_element.type.is_blocked(model_element):
-                raise XMLSchemaValidationError(
-                    model_element, elem, "substitution of %r is blocked" % model_element
-                )
+                reason = _("substitution of %r is blocked") % model_element
+                raise XMLSchemaValidationError(model_element, elem, reason)
 
         alternatives: Union[Tuple[()], List[XsdAlternative]] = []
         if isinstance(xsd_element, XsdAnyElement):
@@ -893,10 +906,9 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
                 for derivation in model_element.block.split():
                     if xsd_type is not model_element.type and \
                             xsd_type.is_derived(model_element.type, derivation):
-                        reason = "usage of %r with type %s is blocked by head element"
-                        raise XMLSchemaValidationError(
-                            self, elem, reason % (xsd_element, derivation)
-                        )
+                        reason = _("usage of {0!r} with type {1} is blocked by "
+                                   "head element").format(xsd_element, derivation)
+                        raise XMLSchemaValidationError(self, elem, reason)
 
             if XSI_TYPE not in elem.attrib:
                 return
@@ -919,13 +931,15 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
 
             if len(other.alternatives) != len(alternatives) or \
                     not xsd_type.is_dynamic_consistent(other.type):
-                reason = "%r that matches %r is not consistent with local declaration %r"
-                raise XMLSchemaValidationError(self, reason % (elem, xsd_element, other))
+                reason = _("{0!r} that matches {1!r} is not consistent with local "
+                           "declaration {2!r}").format(elem, xsd_element, other)
+                raise XMLSchemaValidationError(self, reason)
 
             if not all(any(a == x for x in alternatives) for a in other.alternatives) or \
                     not all(any(a == x for x in other.alternatives) for a in alternatives):
-                msg = "Maybe a not equivalent type table between elements %r and %r."
-                warnings.warn(msg % (self, xsd_element), XMLSchemaTypeTableWarning, stacklevel=3)
+                msg = _("Maybe a not equivalent type table between elements "
+                        "{0!r} and {1!r}.").format(self, xsd_element)
+                warnings.warn(msg, XMLSchemaTypeTableWarning, stacklevel=3)
 
     def match_element(self, name: str, default_namespace: Optional[str] = None) \
             -> Optional[SchemaElementType]:
@@ -953,7 +967,7 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
         cdata_index = 1  # keys for CDATA sections are positive integers
 
         if not self._group and self.model == 'choice' and self.min_occurs:
-            reason = "an empty 'choice' group with minOccurs > 0 cannot validate any content"
+            reason = _("an empty 'choice' group with minOccurs > 0 cannot validate any content")
             yield self.validation_error(validation, reason, obj, **kwargs)
             yield result_list
             return
@@ -965,7 +979,7 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
                 if len(self) == 1 and isinstance(self[0], XsdAnyElement):
                     pass  # [XsdAnyElement()] equals to an empty complexType declaration
                 else:
-                    reason = "character data between child elements not allowed"
+                    reason = _("character data between child elements not allowed")
                     yield self.validation_error(validation, reason, obj, **kwargs)
                     cdata_index = 0  # Do not decode CDATA
 
@@ -978,7 +992,7 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
         level = kwargs['level'] = kwargs.pop('level', 0) + 1
         over_max_depth = 'max_depth' in kwargs and kwargs['max_depth'] <= level
         if level > limits.MAX_XML_DEPTH:
-            reason = "XML data depth exceeded (MAX_XML_DEPTH=%r)" % limits.MAX_XML_DEPTH
+            reason = _("XML data depth exceeded (MAX_XML_DEPTH=%r)") % limits.MAX_XML_DEPTH
             self.validation_error('strict', reason, obj, **kwargs)
 
         try:
@@ -1185,10 +1199,10 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
                             value = get_qname(default_namespace, name), value
                         elif xsd_element is None:
                             if name.startswith('{') or ':' not in name:
-                                reason = '{!r} does not match any declared element ' \
-                                         'of the model group.'.format(name)
+                                reason = _('{!r} does not match any declared element '
+                                           'of the model group').format(name)
                             else:
-                                reason = '{} has an unknown prefix {!r}'.format(
+                                reason = _('{0} has an unknown prefix {1!r}').format(
                                     name, name.split(':')[0]
                                 )
                             yield self.validation_error(validation, reason, value, **kwargs)
@@ -1221,11 +1235,11 @@ class XsdGroup(XsdComponent, MutableSequence[ModelParticleType],
             elem = converter.etree_element(obj.tag, text, children, attrib)
 
             if wrong_content_type:
-                reason = "wrong content type {!r}".format(type(obj.content))
+                reason = _("wrong content type {!r}").format(type(obj.content))
                 yield self.validation_error(validation, reason, elem, **kwargs)
 
             if cdata_not_allowed:
-                reason = "character data between child elements not allowed"
+                reason = _("character data between child elements not allowed")
                 yield self.validation_error(validation, reason, elem, **kwargs)
 
             for index, particle, occurs, expected in errors:
@@ -1265,9 +1279,11 @@ class Xsd11Group(XsdGroup):
         self.model = local_name(content_model.tag)
         if self.model == 'all':
             if self.max_occurs not in (0, 1):
-                self.parse_error("maxOccurs must be (0 | 1) for 'all' model groups")
+                msg = _("maxOccurs must be (0 | 1) for 'all' model groups")
+                self.parse_error(msg)
             if self.min_occurs not in (0, 1):
-                self.parse_error("minOccurs must be (0 | 1) for 'all' model groups")
+                msg = _("minOccurs must be (0 | 1) for 'all' model groups")
+                self.parse_error(msg)
 
         for child in content_model:
             if child.tag == XSD_ELEMENT:
@@ -1282,7 +1298,8 @@ class Xsd11Group(XsdGroup):
                     ref = self.schema.resolve_qname(child.attrib['ref'])
                 except (KeyError, ValueError, RuntimeError) as err:
                     if 'ref' not in child.attrib:
-                        self.parse_error("missing attribute 'ref' in local group", child)
+                        msg = _("missing attribute 'ref' in local group")
+                        self.parse_error(msg, child)
                     else:
                         self.parse_error(err, child)
                     continue
@@ -1291,16 +1308,19 @@ class Xsd11Group(XsdGroup):
                     xsd_group = Xsd11Group(child, self.schema, self)
                     self._group.append(xsd_group)
                     if (self.model != 'all') ^ (xsd_group.model != 'all'):
-                        msg = "an xs:%s group cannot include a reference to an xs:%s group"
-                        self.parse_error(msg % (self.model, xsd_group.model))
+                        msg = _("an xs:{0} group cannot include a reference to an "
+                                "xs:{1} group").format(self.model, xsd_group.model)
+                        self.parse_error(msg)
                         self.pop()
 
                 elif self.redefine is None:
-                    self.parse_error("Circular definition detected for group %r:" % self.name)
+                    msg = _("Circular definition detected for group %r")
+                    self.parse_error(msg % self.name)
                 else:
                     if child.get('minOccurs', '1') != '1' or child.get('maxOccurs', '1') != '1':
-                        self.parse_error("Redefined group reference cannot have "
-                                         "minOccurs/maxOccurs other than 1:")
+                        msg = _("Redefined group reference cannot have "
+                                "minOccurs/maxOccurs other than 1")
+                        self.parse_error(msg)
                     self._group.append(self.redefine)
 
     def admits_restriction(self, model: str) -> bool:
diff --git a/xmlschema/validators/helpers.py b/xmlschema/validators/helpers.py
index a9903f9..0e51bc6 100644
--- a/xmlschema/validators/helpers.py
+++ b/xmlschema/validators/helpers.py
@@ -9,11 +9,12 @@
 #
 from decimal import Decimal
 from math import isinf, isnan
-from typing import Optional, Set, Union
+from typing import Optional, Set, SupportsFloat, Union
 from xml.etree.ElementTree import Element
 from elementpath import datatypes
 
 from ..exceptions import XMLSchemaValueError
+from ..translation import gettext as _
 from .exceptions import XMLSchemaValidationError
 
 XSD_FINAL_ATTRIBUTE_VALUES = {'restriction', 'extension', 'list', 'union'}
@@ -40,7 +41,7 @@ def get_xsd_derivation_attribute(elem: Element, attribute: str,
     if len(items) == 1 and items[0] == '#all':
         return ' '.join(values)
     elif not all(s in values for s in items):
-        raise ValueError("wrong value %r for attribute %r" % (value, attribute))
+        raise ValueError(_("wrong value %r for attribute %r") % (value, attribute))
     return value
 
 
@@ -55,92 +56,92 @@ def decimal_validator(value: Union[Decimal, int, float, str]) -> None:
             raise ValueError()
     except (ValueError, TypeError):
         raise XMLSchemaValidationError(decimal_validator, value,
-                                       "value is not a valid xs:decimal") from None
+                                       _("value is not a valid xs:decimal")) from None
 
 
 def qname_validator(value: str) -> None:
     if datatypes.QName.pattern.match(value) is None:
         raise XMLSchemaValidationError(qname_validator, value,
-                                       "value is not an xs:QName")
+                                       _("value is not an xs:QName"))
 
 
 def byte_validator(value: int) -> None:
     if not (-2**7 <= value < 2 ** 7):
         raise XMLSchemaValidationError(int_validator, value,
-                                       "value must be -128 <= x < 128")
+                                       _("value must be {:s}").format("-128 <= x < 128"))
 
 
 def short_validator(value: int) -> None:
     if not (-2**15 <= value < 2 ** 15):
         raise XMLSchemaValidationError(short_validator, value,
-                                       "value must be -2^15 <= x < 2^15")
+                                       _("value must be {:s}").format("-2^15 <= x < 2^15"))
 
 
 def int_validator(value: int) -> None:
     if not (-2**31 <= value < 2 ** 31):
         raise XMLSchemaValidationError(int_validator, value,
-                                       "value must be -2^31 <= x < 2^31")
+                                       _("value must be {:s}").format("-2^31 <= x < 2^31"))
 
 
 def long_validator(value: int) -> None:
     if not (-2**63 <= value < 2 ** 63):
         raise XMLSchemaValidationError(long_validator, value,
-                                       "value must be -2^63 <= x < 2^63")
+                                       _("value must be {:s}").format("-2^63 <= x < 2^63"))
 
 
 def unsigned_byte_validator(value: int) -> None:
     if not (0 <= value < 2 ** 8):
         raise XMLSchemaValidationError(unsigned_byte_validator, value,
-                                       "value must be 0 <= x < 256")
+                                       _("value must be {:s}").format("0 <= x < 256"))
 
 
 def unsigned_short_validator(value: int) -> None:
     if not (0 <= value < 2 ** 16):
         raise XMLSchemaValidationError(unsigned_short_validator, value,
-                                       "value must be 0 <= x < 2^16")
+                                       _("value must be {:s}").format("0 <= x < 2^16"))
 
 
 def unsigned_int_validator(value: int) -> None:
     if not (0 <= value < 2 ** 32):
         raise XMLSchemaValidationError(unsigned_int_validator, value,
-                                       "value must be 0 <= x < 2^32")
+                                       _("value must be {:s}").format("0 <= x < 2^32"))
 
 
 def unsigned_long_validator(value: int) -> None:
     if not (0 <= value < 2 ** 64):
         raise XMLSchemaValidationError(unsigned_long_validator, value,
-                                       "value must be 0 <= x < 2^64")
+                                       _("value must be {:s}").format("0 <= x < 2^64"))
 
 
 def negative_int_validator(value: int) -> None:
     if value >= 0:
         raise XMLSchemaValidationError(negative_int_validator, value,
-                                       "value must be negative")
+                                       _("value must be negative"))
 
 
 def positive_int_validator(value: int) -> None:
     if value <= 0:
         raise XMLSchemaValidationError(positive_int_validator, value,
-                                       "value must be positive")
+                                       _("value must be positive"))
 
 
 def non_positive_int_validator(value: int) -> None:
     if value > 0:
         raise XMLSchemaValidationError(non_positive_int_validator, value,
-                                       "value must be non positive")
+                                       _("value must be non positive"))
 
 
 def non_negative_int_validator(value: int) -> None:
     if value < 0:
         raise XMLSchemaValidationError(non_negative_int_validator, value,
-                                       "value must be non negative")
+                                       _("value must be non negative"))
 
 
 def hex_binary_validator(value: Union[str, datatypes.HexBinary]) -> None:
     if not isinstance(value, datatypes.HexBinary) and \
             datatypes.HexBinary.pattern.match(value) is None:
         raise XMLSchemaValidationError(hex_binary_validator, value,
-                                       "not an hexadecimal number")
+                                       _("not an hexadecimal number"))
 
 
 def base64_binary_validator(value: Union[str, datatypes.Base64Binary]) -> None:
@@ -153,12 +154,12 @@ def base64_binary_validator(value: Union[str, datatypes.Base64Binary]) -> None:
     match = datatypes.Base64Binary.pattern.match(value)
     if match is None or match.group(0) != value:
         raise XMLSchemaValidationError(base64_binary_validator, value,
-                                       "not a base64 encoding")
+                                       _("not a base64 encoding"))
 
 
 def error_type_validator(value: object) -> None:
     raise XMLSchemaValidationError(error_type_validator, value,
-                                   "no value is allowed for xs:error type")
+                                   _("no value is allowed for xs:error type"))
 
 
 #
@@ -170,8 +171,18 @@ def boolean_to_python(value: str) -> bool:
     elif value in {'false', '0'}:
         return False
     else:
-        raise XMLSchemaValueError('{!r} is not a boolean value'.format(value))
+        raise XMLSchemaValueError(_('{!r} is not a boolean value').format(value))
 
 
 def python_to_boolean(value: object) -> str:
     return str(value).lower()
+
+
+def python_to_float(value: SupportsFloat) -> str:
+    if isnan(value):
+        return "NaN"
+    if value == float("inf"):
+        return "INF"
+    if value == float("-inf"):
+        return "-INF"
+    return str(value)
diff --git a/xmlschema/validators/identities.py b/xmlschema/validators/identities.py
index 19724ba..f52e483 100644
--- a/xmlschema/validators/identities.py
+++ b/xmlschema/validators/identities.py
@@ -19,6 +19,7 @@ from elementpath import XPath2Parser, ElementPathError, XPathToken, XPathContext
 
 from ..exceptions import XMLSchemaTypeError, XMLSchemaValueError
 from ..names import XSD_QNAME, XSD_UNIQUE, XSD_KEY, XSD_KEYREF, XSD_SELECTOR, XSD_FIELD
+from ..translation import gettext as _
 from ..helpers import get_qname, get_extended_qname
 from ..aliases import ElementType, SchemaType, NamespacesType, AtomicValueType
 from ..xpath import iter_schema_nodes
@@ -82,7 +83,7 @@ class XsdSelector(XsdComponent):
         try:
             self.path = self.elem.attrib['xpath']
         except KeyError:
-            self.parse_error("'xpath' attribute required")
+            self.parse_error(_("'xpath' attribute required"))
             self.path = '*'
         else:
             path = self.path.replace(' ', '')
@@ -94,7 +95,7 @@ class XsdSelector(XsdComponent):
                 _match = self.pattern.match(path)  # type: ignore[union-attr]
 
             if not _match:
-                msg = "invalid XPath expression for an {}"
+                msg = _("invalid XPath expression for an {}")
                 self.parse_error(msg.format(self.__class__.__name__))
 
         # XSD 1.1 xpathDefaultNamespace attribute
@@ -178,7 +179,7 @@ class XsdIdentity(XsdComponent):
         try:
             self.name = get_qname(self.target_namespace, self.elem.attrib['name'])
         except KeyError:
-            self.parse_error("missing required attribute 'name'")
+            self.parse_error(_("missing required attribute 'name'"))
             self.name = ''
 
         for child in self.elem:
@@ -186,7 +187,7 @@ class XsdIdentity(XsdComponent):
                 self.selector = XsdSelector(child, self.schema, self)
                 break
         else:
-            self.parse_error("missing 'selector' declaration.")
+            self.parse_error(_("missing 'selector' declaration"))
 
         self.fields = []
         for child in self.elem:
@@ -198,11 +199,13 @@ class XsdIdentity(XsdComponent):
             try:
                 ref = self.maps.identities[self.name]
             except KeyError:
-                self.parse_error("unknown identity constraint {!r}".format(self.name))
+                msg = _("unknown identity constraint {!r}")
+                self.parse_error(msg.format(self.name))
                 return
             else:
                 if not isinstance(ref, self.__class__):
-                    self.parse_error("attribute 'ref' points to a different kind constraint")
+                    msg = _("attribute 'ref' points to a different kind constraint")
+                    self.parse_error(msg)
                 self.selector = ref.selector
                 self.fields = ref.fields
                 self.ref = ref
@@ -213,7 +216,8 @@ class XsdIdentity(XsdComponent):
         try:
             for e in self.selector.token.select_results(context):
                 if not isinstance(e, XsdComponent) or isinstance(e, XsdAttribute):
-                    self.parse_error("selector xpath expression can only select elements")
+                    msg = _("selector xpath expression can only select elements")
+                    self.parse_error(msg)
                 elif e.name is not None:
                     if TYPE_CHECKING:
                         assert isinstance(e, XsdElement)  # for mypy checks with Python 3.7
@@ -289,7 +293,7 @@ class XsdIdentity(XsdComponent):
                 elif field.target_namespace not in self.maps.namespaces:
                     fields.append(None)
                 else:
-                    msg = "missing key field {!r} for {!r}"
+                    msg = _("missing key field {0!r} for {1!r}")
                     raise XMLSchemaValueError(msg.format(field.path, self))
 
             elif len(result) == 1:
@@ -297,7 +301,8 @@ class XsdIdentity(XsdComponent):
                     fields.append(result[0])
                 else:
                     if decoders[k].type.content_type_label not in ('simple', 'mixed'):
-                        raise XMLSchemaTypeError("%r field doesn't have a simple type!" % field)
+                        msg = _("%r field doesn't have a simple type!")
+                        raise XMLSchemaTypeError(msg % field)
 
                     value = decoders[k].data_value(result[0])
                     if decoders[k].type.root_type.name == XSD_QNAME:
@@ -317,7 +322,8 @@ class XsdIdentity(XsdComponent):
                     else:
                         fields.append((value, float))
             else:
-                raise XMLSchemaValueError("%r field selects multiple values!" % field)
+                msg = _("%r field selects multiple values!")
+                raise XMLSchemaValueError(msg % field)
 
         return tuple(fields)
 
@@ -350,7 +356,7 @@ class XsdKeyref(XsdIdentity):
             self.refer = self.schema.resolve_qname(self.elem.attrib['refer'])
         except (KeyError, ValueError, RuntimeError) as err:
             if 'refer' not in self.elem.attrib:
-                self.parse_error("missing required attribute 'refer'")
+                self.parse_error(_("missing required attribute 'refer'"))
             else:
                 self.parse_error(err)
 
@@ -372,13 +378,16 @@ class XsdKeyref(XsdIdentity):
                 try:
                     self.refer = self.maps.identities[self.refer]  # type: ignore[assignment]
                 except KeyError:
-                    self.parse_error("key/unique identity constraint %r is missing" % self.refer)
+                    msg = _("key/unique identity constraint %r is missing")
+                    self.parse_error(msg % self.refer)
                     return
 
         if not isinstance(self.refer, (XsdKey, XsdUnique)):
-            self.parse_error("reference to a non key/unique identity constraint %r" % self.refer)
+            msg = _("reference to a non key/unique identity constraint %r")
+            self.parse_error(msg % self.refer)
         elif len(self.refer.fields) != len(self.fields):
-            self.parse_error("field cardinality mismatch between %r and %r" % (self, self.refer))
+            msg = _("field cardinality mismatch between {0!r} and {1!r}")
+            self.parse_error(msg.format(self, self.refer))
         elif self.parent is not self.refer.parent:
             refer_path = self.refer.parent.get_path(ancestor=self.parent)
             if refer_path is None:
@@ -447,7 +456,7 @@ class IdentityCounter:
     def increase(self, fields: IdentityCounterType) -> None:
         self.counter[fields] += 1
         if self.counter[fields] == 2:
-            msg = "duplicated value {!r} for {!r}"
+            msg = _("duplicated value {0!r} for {1!r}")
             raise XMLSchemaValueError(msg.format(fields, self.identity))
 
 
diff --git a/xmlschema/validators/notations.py b/xmlschema/validators/notations.py
index 8c6ff37..16cce20 100644
--- a/xmlschema/validators/notations.py
+++ b/xmlschema/validators/notations.py
@@ -10,6 +10,7 @@
 from typing import Optional
 
 from ..names import XSD_NOTATION
+from ..translation import gettext as _
 from ..helpers import get_qname
 from .xsdbase import XsdComponent
 
@@ -35,14 +36,14 @@ class XsdNotation(XsdComponent):
 
     def _parse(self) -> None:
         if self.parent is not None:
-            self.parse_error("a notation declaration must be global")
+            self.parse_error(_("a notation declaration must be global"))
         try:
             self.name = get_qname(self.target_namespace, self.elem.attrib['name'])
         except KeyError:
-            self.parse_error("a notation must have a 'name' attribute")
+            self.parse_error(_("a notation must have a 'name' attribute"))
 
         if 'public' not in self.elem.attrib and 'system' not in self.elem.attrib:
-            self.parse_error("a notation must have a 'public' or a 'system' attribute")
+            self.parse_error(_("a notation must have a 'public' or a 'system' attribute"))
 
     @property
     def public(self) -> Optional[str]:
diff --git a/xmlschema/validators/particles.py b/xmlschema/validators/particles.py
index 55ab760..4c6429c 100644
--- a/xmlschema/validators/particles.py
+++ b/xmlschema/validators/particles.py
@@ -11,6 +11,7 @@ from typing import Any, Optional, Tuple, Union
 
 from ..exceptions import XMLSchemaValueError
 from ..aliases import ElementType, ModelParticleType
+from ..translation import gettext as _
 
 
 class ParticleMixin:
@@ -118,27 +119,32 @@ class ParticleMixin:
             try:
                 min_occurs = int(elem.attrib['minOccurs'])
             except (TypeError, ValueError):
-                self.parse_error("minOccurs value is not an integer value")
+                msg = _("minOccurs value is not an integer value")
+                self.parse_error(msg)
             else:
                 if min_occurs < 0:
-                    self.parse_error("minOccurs value must be a non negative integer")
+                    msg = _("minOccurs value must be a non negative integer")
+                    self.parse_error(msg)
                 else:
                     self.min_occurs = min_occurs
 
         max_occurs = elem.get('maxOccurs')
         if max_occurs is None:
             if self.min_occurs > 1:
-                self.parse_error("minOccurs must be lesser or equal than maxOccurs")
+                msg = _("minOccurs must be lesser or equal than maxOccurs")
+                self.parse_error(msg)
         elif max_occurs == 'unbounded':
             self.max_occurs = None
         else:
             try:
                 self.max_occurs = int(max_occurs)
             except ValueError:
-                self.parse_error("maxOccurs value must be a non negative integer or 'unbounded'")
+                msg = _("maxOccurs value must be a non negative integer or 'unbounded'")
+                self.parse_error(msg)
             else:
                 if self.min_occurs > self.max_occurs:
-                    self.parse_error("maxOccurs must be 'unbounded' or greater than minOccurs")
+                    msg = _("maxOccurs must be 'unbounded' or greater than minOccurs")
+                    self.parse_error(msg)
                     self.max_occurs = None
 
 
diff --git a/xmlschema/validators/schemas.py b/xmlschema/validators/schemas.py
index 8e699f5..ce25e15 100644
--- a/xmlschema/validators/schemas.py
+++ b/xmlschema/validators/schemas.py
@@ -15,6 +15,7 @@ XMLSchema11 for XSD 1.1. The latter class parses also XSD 1.0 schemas, as prescr
 the standard.
 """
 import sys
+
 if sys.version_info < (3, 7):
     from typing import GenericMeta as ABCMeta
 else:
@@ -47,6 +48,7 @@ from ..etree import etree_element, ParseError
 from ..aliases import ElementType, XMLSourceType, NamespacesType, LocationsType, \
     SchemaType, SchemaSourceType, ConverterType, ComponentClassType, DecodeType, \
     EncodeType, BaseXsdType, AtomicValueType, ExtraValidatorType, SchemaGlobalType
+from ..translation import gettext as _
 from ..helpers import prune_etree, get_namespace, get_qname
 from ..namespaces import NamespaceResourcesMap, NamespaceView
 from ..resources import is_local_url, is_remote_url, url_path_is_file, \
@@ -151,7 +153,7 @@ class XMLSchemaMeta(ABCMeta):
         # Create the class and check some basic attributes
         cls = super(XMLSchemaMeta, mcs).__new__(mcs, name, bases, dict_)
         if cls.XSD_VERSION not in ('1.0', '1.1'):
-            raise XMLSchemaValueError("XSD_VERSION must be '1.0' or '1.1'")
+            raise XMLSchemaValueError(_("XSD_VERSION must be '1.0' or '1.1'"))
         return cls
 
 
@@ -330,7 +332,9 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
             if isinstance(loglevel, str):
                 level = loglevel.strip().upper()
                 if level not in {'DEBUG', 'INFO', 'WARN', 'WARNING', 'ERROR', 'CRITICAL'}:
-                    raise XMLSchemaValueError("{!r} is not a valid loglevel".format(loglevel))
+                    raise XMLSchemaValueError(
+                        _("{!r} is not a valid loglevel").format(loglevel)
+                    )
                 logger.setLevel(getattr(logging, level))
             else:
                 logger.setLevel(loglevel)
@@ -345,7 +349,7 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
         other_sources: List[SchemaSourceType]
         if isinstance(source, list):
             if not source:
-                raise XMLSchemaValueError("no XSD source provided!")
+                raise XMLSchemaValueError(_("no XSD source provided!"))
             other_sources = source[1:]
             source = source[0]
         else:
@@ -373,10 +377,11 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
             self.target_namespace = root.attrib['targetNamespace'].strip()
             if not self.target_namespace:
                 # https://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#element-schema
-                self.parse_error("the attribute 'targetNamespace' cannot be an empty string", root)
+                msg = _("the attribute 'targetNamespace' cannot be an empty string")
+                self.parse_error(msg, root)
             elif namespace is not None and self.target_namespace != namespace:
-                msg = "wrong namespace (%r instead of %r) for XSD resource %s"
-                self.parse_error(msg % (self.target_namespace, namespace, self.url), root)
+                msg = _("wrong namespace ({0!r} instead of {1!r}) for XSD resource {2}")
+                self.parse_error(msg.format(self.target_namespace, namespace, self.url), root)
 
         if not self.target_namespace and namespace is not None:
             # Chameleon schema case
@@ -451,7 +456,9 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
         if isinstance(global_maps, XsdGlobals):
             self.maps = global_maps
         elif global_maps is not None:
-            raise XMLSchemaTypeError("'global_maps' argument must be an %r instance" % XsdGlobals)
+            raise XMLSchemaTypeError(
+                _("'global_maps' argument must be an %r instance") % XsdGlobals
+            )
         elif use_meta and self.target_namespace not in self.meta_schema.maps.namespaces:
             self.maps = self.meta_schema.maps.copy(self, validation)
         else:
@@ -532,7 +539,7 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
     def __setattr__(self, name: str, value: Any) -> None:
         if name == 'maps':
             if self.meta_schema is None and hasattr(self, 'maps'):
-                msg = "cannot change the global maps instance of a meta-schema"
+                msg = _("cannot change the global maps instance of a meta-schema")
                 raise XMLSchemaValueError(msg)
 
             super(XMLSchemaBase, self).__setattr__(name, value)
@@ -665,13 +672,15 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
     def builtin_types(cls) -> NamespaceView[BaseXsdType]:
         """Returns the XSD built-in types of the meta-schema."""
         if cls.meta_schema is None:
-            raise XMLSchemaRuntimeError("meta-schema unavailable for %r" % cls)
+            raise XMLSchemaRuntimeError(_("meta-schema unavailable for %r") % cls)
 
         try:
             meta_schema: SchemaType = cls.meta_schema.maps.namespaces[XSD_NAMESPACE][0]
             builtin_types = meta_schema.types
         except KeyError:
-            raise XMLSchemaNotBuiltError(cls.meta_schema, "missing XSD namespace in meta-schema")
+            raise XMLSchemaNotBuiltError(
+                cls.meta_schema, _("missing XSD namespace in meta-schema")
+            )
         else:
             if not builtin_types:
                 cls.meta_schema.build()
@@ -742,7 +751,7 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
         """
         if source is None:
             if cls.meta_schema is None or cls.meta_schema.url:
-                raise XMLSchemaValueError("Missing meta-schema source URL")
+                raise XMLSchemaValueError(_("Missing meta-schema source URL"))
             source = cast(str, cls.meta_schema.url)
 
         _base_schemas: Union[ItemsView[str, str], List[Tuple[str, str]]]
@@ -754,9 +763,9 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
             try:
                 _base_schemas = [(n, l) for n, l in base_schemas]
             except ValueError:
-                raise ValueError(
-                    "The argument 'base_schemas' is not a dictionary nor a sequence of items"
-                )
+                msg = _("The argument 'base_schemas' must be a "
+                        "dictionary or a sequence of couples")
+                raise XMLSchemaValueError(msg) from None
 
         meta_schema: SchemaType
         meta_schema_class = cls if cls.meta_schema is None else cls.meta_schema.__class__
@@ -791,7 +800,8 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
                 try:
                     child = elem[1]
                 except IndexError:
-                    schema.parse_error("(restriction | list | union) expected", elem)
+                    msg = _("(restriction | list | union) expected")
+                    schema.parse_error(msg, elem)
                     return cast(XsdSimpleType, self.maps.types[XSD_ANY_SIMPLE_TYPE])
 
         xsd_type: XsdSimpleType
@@ -802,7 +812,8 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
         elif child.tag == XSD_UNION:
             xsd_type = self.xsd_union_class(child, schema, parent)
         else:
-            schema.parse_error("(restriction | list | union) expected", elem)
+            msg = _("(restriction | list | union) expected")
+            schema.parse_error(msg, elem)
             return cast(XsdSimpleType, self.maps.types[XSD_ANY_SIMPLE_TYPE])
 
         if annotation is not None:
@@ -812,11 +823,13 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
             xsd_type.name = get_qname(schema.target_namespace, elem.attrib['name'])
         except KeyError:
             if parent is None:
-                schema.parse_error("missing attribute 'name' in a global simpleType", elem)
+                msg = _("missing attribute 'name' in a global simpleType")
+                schema.parse_error(msg, elem)
                 xsd_type.name = 'nameless_%s' % str(id(xsd_type))
         else:
             if parent is not None:
-                schema.parse_error("attribute 'name' not allowed for a local simpleType", elem)
+                msg = _("attribute 'name' not allowed for a local simpleType")
+                schema.parse_error(msg, elem)
                 xsd_type.name = None
 
         if 'final' in elem.attrib:
@@ -859,7 +872,8 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
         elif model == 'all':
             group_elem = etree_element(XSD_ALL, **attrib)
         else:
-            raise XMLSchemaValueError("'model' argument must be (sequence | choice | all)")
+            msg = _("'model' argument must be (sequence | choice | all)")
+            raise XMLSchemaValueError(msg)
 
         group_elem.text = '\n    '
         return self.xsd_group_class(group_elem, self, parent)
@@ -953,7 +967,7 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
         :raises: :exc:`XMLSchemaValidationError` if the schema is invalid.
         """
         if cls.meta_schema is None:
-            raise XMLSchemaRuntimeError("meta-schema unavailable for %r" % cls)
+            raise XMLSchemaRuntimeError(_("meta-schema unavailable for %r") % cls)
         elif not cls.meta_schema.maps.types:
             cls.meta_schema.maps.build()
 
@@ -973,7 +987,7 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
                     for comp in self.iter_globals()):
             pass
         else:
-            raise XMLSchemaNotBuiltError(self, "schema %r is not built" % self)
+            raise XMLSchemaNotBuiltError(self, _("schema %r is not built") % self)
 
     def build(self) -> None:
         """Builds the schema's XSD global maps."""
@@ -987,7 +1001,7 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
     def built(self) -> bool:
         if any(not isinstance(g, XsdComponent) or not g.built for g in self.iter_globals()):
             return False
-        for _ in self.iter_globals():
+        for _xsd_global in self.iter_globals():
             return True
         if self.meta_schema is None:
             return False
@@ -1078,7 +1092,8 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
         except KeyError:
             if not namespace:
                 return self
-            raise XMLSchemaKeyError('the namespace {!r} is not loaded'.format(namespace)) from None
+            msg = _('the namespace {!r} is not loaded')
+            raise XMLSchemaKeyError(msg.format(namespace)) from None
 
     def get_converter(self, converter: Optional[ConverterType] = None,
                       **kwargs: Any) -> XMLSchemaConverter:
@@ -1099,8 +1114,8 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
             # noinspection PyCallingNonCallable
             return converter(**kwargs)
         else:
-            msg = "'converter' argument must be a %r subclass or instance: %r"
-            raise XMLSchemaTypeError(msg % (XMLSchemaConverter, converter))
+            msg = _("'converter' argument must be a {0!r} subclass or instance: {1!r}")
+            raise XMLSchemaTypeError(msg.format(XMLSchemaConverter, converter))
 
     def get_locations(self, namespace: str) -> List[str]:
         """Get a list of location hints for a namespace."""
@@ -1139,14 +1154,14 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
     def _parse_inclusions(self) -> None:
         """Processes schema document inclusions and redefinitions/overrides."""
         for child in self.source.root:
+            if 'schemaLocation' not in child.attrib:
+                continue
+
+            location = child.attrib['schemaLocation'].strip()
             if child.tag == XSD_INCLUDE:
                 try:
-                    location = child.attrib['schemaLocation'].strip()
                     logger.info("Include schema from %r", location)
                     self.include_schema(location, self.base_url)
-                except KeyError:
-                    # Attribute missing error already found by validation against meta-schema
-                    pass
                 except (OSError, IOError) as err:
                     # It is not an error if the location fail to resolve:
                     #   https://www.w3.org/TR/2012/REC-xmlschema11-1-20120405/#compound-schema
@@ -1154,50 +1169,42 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
                     self.warnings.append("Include schema failed: %s." % str(err))
                     warnings.warn(self.warnings[-1], XMLSchemaIncludeWarning, stacklevel=3)
                 except (XMLSchemaParseError, XMLSchemaTypeError, ParseError) as err:
-                    msg = 'cannot include schema %r: %s' % (child.attrib['schemaLocation'], err)
+                    msg = _('cannot include schema {0!r}: {1}')
                     if isinstance(err, (XMLSchemaParseError, ParseError)):
-                        self.parse_error(msg)
+                        self.parse_error(msg.format(location, err), child)
                     else:
-                        raise type(err)(msg)
+                        raise type(err)(msg.format(location, err))
 
             elif child.tag == XSD_REDEFINE:
                 try:
-                    location = child.attrib['schemaLocation'].strip()
                     logger.info("Redefine schema %r", location)
                     schema = self.include_schema(location, self.base_url)
-                except KeyError:
-                    # Attribute missing error already found by validation against meta-schema
-                    pass
                 except (OSError, IOError) as err:
                     # If the redefine doesn't contain components (annotation excluded)
                     # the statement is equivalent to an include, so no error is generated.
                     # Otherwise fails.
-                    self.warnings.append("Redefine schema failed: %s." % str(err))
+                    self.warnings.append(_("Redefine schema failed: %s") % str(err))
                     warnings.warn(self.warnings[-1], XMLSchemaIncludeWarning, stacklevel=3)
                     if any(e.tag != XSD_ANNOTATION and not callable(e.tag) for e in child):
                         self.parse_error(err, child)
                 except (XMLSchemaParseError, XMLSchemaTypeError, ParseError) as err:
-                    msg = 'cannot redefine schema %r: %s' % (child.attrib['schemaLocation'], err)
+                    msg = _('cannot redefine schema {0!r}: {1}')
                     if isinstance(err, (XMLSchemaParseError, ParseError)):
-                        self.parse_error(msg, child)
+                        self.parse_error(msg.format(location, err), child)
                     else:
-                        raise type(err)(msg)
+                        raise type(err)(msg.format(location, err))
                 else:
                     schema.redefine = self
 
             elif child.tag == XSD_OVERRIDE and self.XSD_VERSION != '1.0':
                 try:
-                    location = child.attrib['schemaLocation'].strip()
                     logger.info("Override schema %r", location)
                     schema = self.include_schema(location, self.base_url)
-                except KeyError:
-                    # Attribute missing error already found by validation against meta-schema
-                    pass
                 except (OSError, IOError) as err:
                     # If the override doesn't contain components (annotation excluded)
                     # the statement is equivalent to an include, so no error is generated.
                     # Otherwise fails.
-                    self.warnings.append("Override schema failed: %s." % str(err))
+                    self.warnings.append(_("Override schema failed: %s") % str(err))
                     warnings.warn(self.warnings[-1], XMLSchemaIncludeWarning, stacklevel=3)
                     if any(e.tag != XSD_ANNOTATION and not callable(e.tag) for e in child):
                         self.parse_error(str(err), child)
@@ -1259,13 +1266,15 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
             if namespace is None:
                 namespace = ''
                 if namespace == self.target_namespace:
-                    self.parse_error("if the 'namespace' attribute is not present on "
-                                     "the import statement then the importing schema "
-                                     "must have a 'targetNamespace'")
+                    msg = _("if the 'namespace' attribute is not present on "
+                            "the import statement then the imported schema "
+                            "must have a 'targetNamespace'")
+                    self.parse_error(msg)
                     continue
             elif namespace == self.target_namespace:
-                self.parse_error("the attribute 'namespace' must be different from "
-                                 "schema's 'targetNamespace'")
+                msg = _("the attribute 'namespace' must be different "
+                        "from schema's 'targetNamespace'")
+                self.parse_error(msg)
                 continue
 
             # Skip import of already imported namespaces
@@ -1310,13 +1319,14 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
                     import_error = err
             except (XMLSchemaParseError, XMLSchemaTypeError, ParseError) as err:
                 if namespace:
-                    msg = "cannot import namespace %r: %s." % (namespace, err)
+                    msg = _("cannot import namespace {0!r}: {1}").format(namespace, err)
                 else:
-                    msg = "cannot import chameleon schema: %s." % err
+                    msg = _("cannot import chameleon schema: %s") % err
                 if isinstance(err, (XMLSchemaParseError, ParseError)):
                     self.parse_error(msg)
                 else:
                     raise type(err)(msg)
+
             except XMLSchemaValueError as err:
                 self.parse_error(err)
             else:
@@ -1375,9 +1385,9 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
             build=build,
         )
         if schema.target_namespace != namespace:
-            raise XMLSchemaValueError(
-                'imported schema %r has an unmatched namespace %r' % (location, namespace)
-            )
+            msg = _('imported schema {0!r} has an unmatched namespace {1!r}')
+            raise XMLSchemaValueError(msg.format(location, namespace))
+
         self.imports[namespace] = schema
         return schema
 
@@ -1422,15 +1432,16 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
         target_path = pathlib.Path(target)
         if target_path.is_dir():
             if list(target_path.iterdir()):
-                raise XMLSchemaValueError("target directory {!r} is not empty".format(target))
+                msg = _("target directory {} is not empty")
+                raise XMLSchemaValueError(msg.format(target))
         elif target_path.exists():
-            msg = "target {} is not a directory"
+            msg = _("target {} is not a directory")
             raise XMLSchemaValueError(msg.format(target_path.parent))
         elif not target_path.parent.exists():
-            msg = "target parent directory {} does not exist"
+            msg = _("target parent directory {} does not exist")
             raise XMLSchemaValueError(msg.format(target_path.parent))
         elif not target_path.parent.is_dir():
-            msg = "target parent {} is not a directory"
+            msg = _("target parent {} is not a directory")
             raise XMLSchemaValueError(msg.format(target_path.parent))
 
         url = self.url or 'schema.xsd'
@@ -1523,7 +1534,8 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
             vc_min_version = elem.attrib[VC_MIN_VERSION]
             if not XSD_VERSION_PATTERN.match(vc_min_version):
                 if self.XSD_VERSION > '1.0':
-                    self.parse_error("invalid attribute vc:minVersion value", elem)
+                    msg = _("invalid attribute vc:minVersion value")
+                    self.parse_error(msg, elem)
             elif vc_min_version > self.XSD_VERSION:
                 return False
 
@@ -1531,7 +1543,8 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
             vc_max_version = elem.attrib[VC_MAX_VERSION]
             if not XSD_VERSION_PATTERN.match(vc_max_version):
                 if self.XSD_VERSION > '1.0':
-                    self.parse_error("invalid attribute vc:maxVersion value", elem)
+                    msg = _("invalid attribute vc:maxVersion value")
+                    self.parse_error(msg, elem)
             elif vc_max_version <= self.XSD_VERSION:
                 return False
 
@@ -1606,42 +1619,45 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
         """
         qname = qname.strip()
         if not qname or ' ' in qname or '\t' in qname or '\n' in qname:
-            raise XMLSchemaValueError("{!r} is not a valid value for xs:QName".format(qname))
+            msg = _("{!r} is not a valid value for xs:QName")
+            raise XMLSchemaValueError(msg.format(qname))
 
         if qname[0] == '{':
             try:
                 namespace, local_name = qname[1:].split('}')
             except ValueError:
-                raise XMLSchemaValueError("{!r} is not a valid value for xs:QName".format(qname))
+                msg = _("{!r} is not a valid value for xs:QName")
+                raise XMLSchemaValueError(msg.format(qname))
         elif ':' in qname:
             try:
                 prefix, local_name = qname.split(':')
             except ValueError:
-                raise XMLSchemaValueError("{!r} is not a valid value for xs:QName".format(qname))
+                msg = _("{!r} is not a valid value for xs:QName")
+                raise XMLSchemaValueError(msg.format(qname))
             else:
                 try:
                     namespace = self.namespaces[prefix]
                 except KeyError:
-                    raise XMLSchemaKeyError("prefix %r not found in namespace map" % prefix)
+                    msg = _("prefix {!r} not found in namespace map")
+                    raise XMLSchemaKeyError(msg.format(prefix))
         else:
             namespace, local_name = self.namespaces.get('', ''), qname
 
         if not namespace:
             if namespace_imported and self.target_namespace and '' not in self.imports:
-                raise XMLSchemaNamespaceError(
-                    "the QName {!r} is mapped to no namespace, but this requires "
-                    "that there is an xs:import statement in the schema without "
-                    "the 'namespace' attribute.".format(qname)
-                )
+                msg = _("the QName {!r} is mapped to no namespace, but this requires "
+                        "that there is an xs:import statement in the schema without "
+                        "the 'namespace' attribute.")
+                raise XMLSchemaNamespaceError(msg.format(qname))
             return local_name
         elif namespace_imported and self.meta_schema is not None and \
                 namespace != self.target_namespace and \
                 namespace not in {XSD_NAMESPACE, XSI_NAMESPACE} and \
                 namespace not in self.imports:
-            raise XMLSchemaNamespaceError(
-                "the QName {!r} is mapped to the namespace {!r}, but this namespace has "
-                "not an xs:import statement in the schema.".format(qname, namespace)
-            )
+            msg = _("the QName {0!r} is mapped to the namespace {1!r}, but this "
+                    "namespace has not an xs:import statement in the schema.")
+            raise XMLSchemaNamespaceError(msg.format(qname, namespace))
+
         return '{%s}%s' % (namespace, local_name)
 
     def validate(self, source: Union[XMLSourceType, XMLResource],
@@ -1779,7 +1795,7 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
                 elif elem is not resource.root and ancestors:
                     continue
                 else:
-                    reason = "{!r} is not an element of the schema".format(elem)
+                    reason = _("{!r} is not an element of the schema").format(elem)
                     yield schema.validation_error('lax', reason, elem, resource, namespaces)
                     return
 
@@ -1807,7 +1823,7 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
         if id_map is not None:
             for k, v in id_map.items():
                 if v == 0:
-                    msg = "IDREF %r not found in XML document" % k
+                    msg = _("IDREF %r not found in XML document") % k
                     yield self.validation_error(validation, msg, source.root)
 
         # Check still enabled key references (lazy validation cases)
@@ -1833,7 +1849,7 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
                 if XSI_TYPE in elem.attrib:
                     xsd_element = self.create_element(name=elem.tag)
                 else:
-                    reason = "{!r} is not an element of the schema".format(elem)
+                    reason = _("{!r} is not an element of the schema").format(elem)
                     yield self.validation_error(validation, reason, elem, source, namespaces)
                     continue
 
@@ -1978,7 +1994,7 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
                 if XSI_TYPE in elem.attrib:
                     xsd_element = self.create_element(name=elem.tag)
                 else:
-                    reason = "{!r} is not an element of the schema".format(elem)
+                    reason = _("{!r} is not an element of the schema").format(elem)
                     yield schema.validation_error(validation, reason, elem, resource, namespaces)
                     return
 
@@ -2057,7 +2073,8 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
         """
         self.check_validator(validation)
         if not self.elements:
-            raise XMLSchemaValueError("encoding needs at least one XSD element declaration!")
+            msg = _("encoding needs at least one XSD element declaration")
+            raise XMLSchemaValueError(msg)
 
         if namespaces is None:
             namespaces = {}
@@ -2090,10 +2107,10 @@ class XMLSchemaBase(XsdValidator, ElementPathMixin[Union[SchemaType, XsdElement]
 
         if not isinstance(xsd_element, XsdElement):
             if path is not None:
-                reason = "the path %r doesn't match any element of the schema!" % path
+                reason = _("the path %r doesn't match any element of the schema!") % path
             else:
-                reason = "unable to select an element for decoding data, " \
-                         "provide a valid 'path' argument."
+                reason = _("unable to select an element for decoding data, "
+                           "provide a valid 'path' argument.")
             raise XMLSchemaEncodeError(self, obj, self.elements, reason, namespaces=namespaces)
         else:
             yield from xsd_element.iter_encode(obj, validation, use_defaults=use_defaults,
diff --git a/xmlschema/validators/simple_types.py b/xmlschema/validators/simple_types.py
index 6165324..8076952 100644
--- a/xmlschema/validators/simple_types.py
+++ b/xmlschema/validators/simple_types.py
@@ -26,6 +26,7 @@ from ..names import XSD_NAMESPACE, XSD_ANY_TYPE, XSD_SIMPLE_TYPE, XSD_PATTERN, \
     XSD_LIST, XSD_ANY_SIMPLE_TYPE, XSD_UNION, XSD_RESTRICTION, XSD_ANNOTATION, \
     XSD_ASSERTION, XSD_ID, XSD_IDREF, XSD_FRACTION_DIGITS, XSD_TOTAL_DIGITS, \
     XSD_EXPLICIT_TIMEZONE, XSD_ERROR, XSD_ASSERT, XSD_QNAME, XSD_UNTYPED_ATOMIC
+from ..translation import gettext as _
 from ..helpers import get_prefixed_qname, local_name
 
 from .exceptions import XMLSchemaValidationError, XMLSchemaEncodeError, \
@@ -129,24 +130,24 @@ class XsdSimpleType(XsdType, ValidationMixin[Union[str, bytes], DecodedValueType
         if facets and self.base_type is not None:
             if isinstance(self.base_type, XsdSimpleType):
                 if self.base_type.name == XSD_ANY_SIMPLE_TYPE:
-                    self.parse_error(
-                        "facets not allowed for a direct derivation of xs:anySimpleType"
-                    )
+                    msg = _("facets not allowed for a direct derivation of xs:anySimpleType")
+                    self.parse_error(msg)
             elif self.base_type.has_simple_content():
                 if self.base_type.content.name == XSD_ANY_SIMPLE_TYPE:
-                    self.parse_error(
-                        "facets not allowed for a direct content derivation of xs:anySimpleType"
-                    )
+                    msg = _("facets not allowed for a direct content "
+                            "derivation of xs:anySimpleType")
+                    self.parse_error(msg)
 
         # Checks the applicability of the facets
         if any(k not in self.admitted_facets for k in facets if k is not None):
-            reason = "one or more facets are not applicable, admitted set is %r:"
-            self.parse_error(reason % {local_name(e) for e in self.admitted_facets if e})
+            msg = _("one or more facets are not applicable, admitted set is {!r}")
+            self.parse_error(msg.format({local_name(e) for e in self.admitted_facets if e}))
 
         # Check group base_type
         base_type = {t.base_type for t in facets.values() if isinstance(t, XsdFacet)}
         if len(base_type) > 1:
-            self.parse_error("facet group must have the same base_type: %r" % base_type)
+            msg = _("facet group must have the same base type: %r")
+            self.parse_error(msg % base_type)
         base_type = base_type.pop() if base_type else None
 
         # Checks length based facets
@@ -155,46 +156,61 @@ class XsdSimpleType(XsdType, ValidationMixin[Union[str, bytes], DecodedValueType
         max_length = getattr(facets.get(XSD_MAX_LENGTH), 'value', None)
         if length is not None:
             if length < 0:
-                self.parse_error("'length' value must be non negative integer")
+                self.parse_error(_("'length' value must be non a negative integer"))
+
             if min_length is not None:
                 if min_length > length:
-                    self.parse_error("'minLength' value must be less or equal to 'length'")
+                    msg = _("'minLength' value must be less than or equal to 'length'")
+                    self.parse_error(msg)
                 min_length_facet = base_type.get_facet(XSD_MIN_LENGTH)
                 length_facet = base_type.get_facet(XSD_LENGTH)
                 if (min_length_facet is None
                         or (length_facet is not None
                             and length_facet.base_type == min_length_facet.base_type)):
-                    self.parse_error("cannot specify both 'length' and 'minLength'")
+                    msg = _("cannot specify both 'length' and 'minLength'")
+                    self.parse_error(msg)
+
             if max_length is not None:
                 if max_length < length:
-                    self.parse_error("'maxLength' value must be greater or equal to 'length'")
+                    msg = _("'maxLength' value must be greater or equal to 'length'")
+                    self.parse_error(msg)
+
                 max_length_facet = base_type.get_facet(XSD_MAX_LENGTH)
                 length_facet = base_type.get_facet(XSD_LENGTH)
                 if max_length_facet is None \
                         or (length_facet is not None
                             and length_facet.base_type == max_length_facet.base_type):
-                    self.parse_error("cannot specify both 'length' and 'maxLength'")
+                    msg = _("cannot specify both 'length' and 'maxLength'")
+                    self.parse_error(msg)
+
             min_length = max_length = length
         elif min_length is not None or max_length is not None:
             min_length_facet = base_type.get_facet(XSD_MIN_LENGTH)
             max_length_facet = base_type.get_facet(XSD_MAX_LENGTH)
             if min_length is not None:
                 if min_length < 0:
-                    self.parse_error("'minLength' value must be non negative integer")
+                    msg = _("'minLength' value must be a non negative integer")
+                    self.parse_error(msg)
                 if max_length is not None and max_length < min_length:
-                    self.parse_error("'maxLength' value is lesser than 'minLength'")
+                    msg = _("'maxLength' value is less than 'minLength'")
+                    self.parse_error(msg)
                 if min_length_facet is not None and min_length_facet.value > min_length:
-                    self.parse_error("'minLength' has a lesser value than parent")
+                    msg = _("'minLength' has a lesser value than parent")
+                    self.parse_error(msg)
                 if max_length_facet is not None and min_length > max_length_facet.value:
-                    self.parse_error("'minLength' has a greater value than parent 'maxLength'")
+                    msg = _("'minLength' has a greater value than parent 'maxLength'")
+                    self.parse_error(msg)
 
             if max_length is not None:
                 if max_length < 0:
-                    self.parse_error("'maxLength' value mu  st be non negative integer")
+                    msg = _("'maxLength' value must be a non negative integer")
+                    self.parse_error(msg)
                 if min_length_facet is not None and min_length_facet.value > max_length:
-                    self.parse_error("'maxLength' has a lesser value than parent 'minLength'")
+                    msg = _("'maxLength' has a lesser value than parent 'minLength'")
+                    self.parse_error(msg)
                 if max_length_facet is not None and max_length > max_length_facet.value:
-                    self.parse_error("'maxLength' has a greater value than parent")
+                    msg = _("'maxLength' has a greater value than parent")
+                    self.parse_error(msg)
 
         # Checks min/max values
         min_inclusive = getattr(facets.get(XSD_MIN_INCLUSIVE), 'value', None)
@@ -204,39 +220,48 @@ class XsdSimpleType(XsdType, ValidationMixin[Union[str, bytes], DecodedValueType
 
         if min_inclusive is not None:
             if min_exclusive is not None:
-                self.parse_error("cannot specify both 'minInclusive' and 'minExclusive")
+                msg = _("cannot specify both 'minInclusive' and 'minExclusive'")
+                self.parse_error(msg)
             if max_inclusive is not None and min_inclusive > max_inclusive:
-                self.parse_error("'minInclusive' must be less or equal to 'maxInclusive'")
+                msg = _("'minInclusive' must be less or equal to 'maxInclusive'")
+                self.parse_error(msg)
             elif max_exclusive is not None and min_inclusive >= max_exclusive:
-                self.parse_error("'minInclusive' must be lesser than 'maxExclusive'")
+                msg = _("'minInclusive' must be lesser than 'maxExclusive'")
+                self.parse_error(msg)
 
         elif min_exclusive is not None:
             if max_inclusive is not None and min_exclusive >= max_inclusive:
-                self.parse_error("'minExclusive' must be lesser than 'maxInclusive'")
+                msg = _("'minExclusive' must be lesser than 'maxInclusive'")
+                self.parse_error(msg)
             elif max_exclusive is not None and min_exclusive > max_exclusive:
-                self.parse_error("'minExclusive' must be less or equal to 'maxExclusive'")
+                msg = _("'minExclusive' must be less or equal to 'maxExclusive'")
+                self.parse_error(msg)
 
         if max_inclusive is not None and max_exclusive is not None:
-            self.parse_error("cannot specify both 'maxInclusive' and 'maxExclusive")
+            self.parse_error(_("cannot specify both 'maxInclusive' and 'maxExclusive'"))
 
         # Checks fraction digits
         if XSD_TOTAL_DIGITS in facets:
             if XSD_FRACTION_DIGITS in facets and \
                     facets[XSD_TOTAL_DIGITS].value < facets[XSD_FRACTION_DIGITS].value:
-                self.parse_error("fractionDigits facet value cannot be lesser than the "
-                                 "value of totalDigits facet")
+                msg = _("fractionDigits facet value cannot be lesser "
+                        "than the value of totalDigits facet")
+                self.parse_error(msg)
+
             total_digits = base_type.get_facet(XSD_TOTAL_DIGITS)
             if total_digits is not None and total_digits.value < facets[XSD_TOTAL_DIGITS].value:
-                self.parse_error("totalDigits facet value cannot be greater than "
-                                 "the value of the same facet in the base type")
+                msg = _("totalDigits facet value cannot be greater than "
+                        "the value of the same facet in the base type")
+                self.parse_error(msg)
 
         # Checks XSD 1.1 facets
         if XSD_EXPLICIT_TIMEZONE in facets:
             explicit_tz_facet = base_type.get_facet(XSD_EXPLICIT_TIMEZONE)
             if explicit_tz_facet and explicit_tz_facet.value in ('prohibited', 'required') \
                     and facets[XSD_EXPLICIT_TIMEZONE].value != explicit_tz_facet.value:
-                self.parse_error("the explicitTimezone facet value cannot be changed if the base "
-                                 "type has the same facet with value %r" % explicit_tz_facet.value)
+                msg = _("the explicitTimezone facet value cannot be changed "
+                        "if the base type has the same facet with value %r")
+                self.parse_error(msg % explicit_tz_facet.value)
 
         self.min_length = min_length
         self.max_length = max_length
@@ -432,7 +457,7 @@ class XsdSimpleType(XsdType, ValidationMixin[Union[str, bytes], DecodedValueType
     def iter_encode(self, obj: Any, validation: str = 'lax', **kwargs: Any) \
             -> IterEncodeType[EncodedValueType]:
         if not isinstance(obj, (str, bytes)):
-            reason = "a {!r} or {!r} object required".format(str, bytes)
+            reason = _("a {0!r} or {1!r} object required").format(str, bytes)
             yield XMLSchemaEncodeError(self, obj, str, reason)
         else:
             text = self.normalize(obj)
@@ -587,7 +612,7 @@ class XsdAtomicBuiltin(XsdAtomic):
         if isinstance(obj, (str, bytes)):
             obj = self.normalize(obj)
         elif obj is not None and not isinstance(obj, self.instance_types):
-            reason = "value is not an instance of {!r}".format(self.instance_types)
+            reason = _("value is not an instance of {!r}").format(self.instance_types)
             yield XMLSchemaDecodeError(self, obj, self.to_python, reason)
 
         if validation == 'skip':
@@ -606,12 +631,13 @@ class XsdAtomicBuiltin(XsdAtomic):
         try:
             result = self.to_python(obj)
         except (ValueError, DecimalException) as err:
+            # todo: maybe need to translate python error messages?
             yield XMLSchemaDecodeError(self, obj, self.to_python, reason=str(err))
             yield None
             return
         except TypeError:
             # xs:error type (eg. an XSD 1.1 type alternative used to catch invalid values)
-            reason = "invalid value {!r}".format(obj)
+            reason = _("invalid value {!r}").format(obj)
             yield self.validation_error(validation, error=reason, obj=obj)
             yield None
             return
@@ -636,7 +662,7 @@ class XsdAtomicBuiltin(XsdAtomic):
                     except (TypeError, KeyError):
                         try:
                             if kwargs['source'].namespace != XSD_NAMESPACE:
-                                reason = "unmapped prefix %r on QName" % prefix
+                                reason = _("unmapped prefix %r in a QName") % prefix
                                 yield self.validation_error(validation, error=reason, obj=obj)
                         except KeyError:
                             pass
@@ -670,19 +696,19 @@ class XsdAtomicBuiltin(XsdAtomic):
                     if not id_map[obj]:
                         id_map[obj] = 1
                     else:
-                        reason = "duplicated xs:ID value {!r}".format(obj)
+                        reason = _("duplicated xs:ID value {!r}").format(obj)
                         yield self.validation_error(validation, error=reason, obj=obj)
                 else:
                     if not id_map[obj]:
                         id_map[obj] = 1
                         id_list.append(obj)
                         if len(id_list) > 1 and self.xsd_version == '1.0':
-                            reason = "no more than one attribute of type ID should " \
-                                     "be present in an element"
+                            reason = _("no more than one attribute of type ID should "
+                                       "be present in an element")
                             yield self.validation_error(validation, reason, obj, **kwargs)
 
                     elif obj not in id_list or self.xsd_version == '1.0':
-                        reason = "duplicated xs:ID value {!r}".format(obj)
+                        reason = _("duplicated xs:ID value {!r}").format(obj)
                         yield self.validation_error(validation, error=reason, obj=obj)
 
         yield result
@@ -702,12 +728,12 @@ class XsdAtomicBuiltin(XsdAtomic):
         elif isinstance(obj, bool):
             types_: Any = self.instance_types
             if types_ is not bool or (isinstance(types_, tuple) and bool in types_):
-                reason = "boolean value {!r} requires a {!r} decoder".format(obj, bool)
+                reason = _("boolean value {0!r} requires a {1!r} decoder").format(obj, bool)
                 yield XMLSchemaEncodeError(self, obj, self.from_python, reason)
                 obj = self.python_type(obj)
 
         elif not isinstance(obj, self.instance_types):
-            reason = "{!r} is not an instance of {!r}".format(obj, self.instance_types)
+            reason = _("{0!r} is not an instance of {1!r}").format(obj, self.instance_types)
             yield XMLSchemaEncodeError(self, obj, self.from_python, reason)
 
             try:
@@ -724,7 +750,7 @@ class XsdAtomicBuiltin(XsdAtomic):
                 if value == obj or str(value) == str(obj):
                     obj = value
                 else:
-                    reason = "Invalid value {!r}".format(obj)
+                    reason = _("invalid value {!r}").format(obj)
                     yield XMLSchemaEncodeError(self, obj, self.from_python, reason)
                     yield None
                     return
@@ -789,10 +815,14 @@ class XsdList(XsdSimpleType):
                     if child.tag == XSD_LIST:
                         super(XsdList, self).__setattr__(name, child)
                         return
-            raise XMLSchemaValueError("a %r definition required for %r." % (XSD_LIST, self))
+            raise XMLSchemaValueError(
+                "a {0!r} definition required for {1!r}".format(XSD_LIST, self)
+            )
         elif name == 'base_type':
             if not value.is_atomic():
-                raise XMLSchemaValueError("%r: a list must be based on atomic data types." % self)
+                raise XMLSchemaValueError(
+                    _("%r: a list must be based on atomic data types") % self
+                )
         elif name == 'white_space' and value is None:
             value = 'collapse'
         super(XsdList, self).__setattr__(name, value)
@@ -810,7 +840,7 @@ class XsdList(XsdSimpleType):
                 base_type = self.any_atomic_type
 
             if 'itemType' in self.elem.attrib:
-                self.parse_error("ambiguous list type declaration")
+                self.parse_error(_("ambiguous list type declaration"))
 
         else:
             # List tag with itemType attribute that refers to a global type
@@ -818,7 +848,7 @@ class XsdList(XsdSimpleType):
                 item_qname = self.schema.resolve_qname(self.elem.attrib['itemType'])
             except (KeyError, ValueError, RuntimeError) as err:
                 if 'itemType' not in self.elem.attrib:
-                    self.parse_error("missing list type declaration")
+                    self.parse_error(_("missing list type declaration"))
                 else:
                     self.parse_error(err)
                 base_type = self.any_atomic_type
@@ -826,22 +856,22 @@ class XsdList(XsdSimpleType):
                 try:
                     base_type = self.maps.lookup_type(item_qname)
                 except KeyError:
-                    self.parse_error("unknown itemType %r" % self.elem.attrib['itemType'])
+                    msg = _("unknown type {!r}")
+                    self.parse_error(msg.format(self.elem.attrib['itemType']))
                     base_type = self.any_atomic_type
                 else:
                     if isinstance(base_type, tuple):
-                        self.parse_error(
-                            "circular definition found for type {!r}".format(item_qname)
-                        )
+                        msg = _("circular definition found for type {!r}")
+                        self.parse_error(msg.format(item_qname))
                         base_type = self.any_atomic_type
 
         if base_type.final == '#all' or 'list' in base_type.final:
-            self.parse_error(
-                "'final' value of the itemType %r forbids derivation by list" % base_type
-            )
+            msg = _("'final' value of the itemType %r forbids derivation by list")
+            self.parse_error(msg % base_type)
 
         if base_type.name == XSD_ANY_ATOMIC_TYPE:
-            self.parse_error("Cannot use xs:anyAtomicType as base type of a user-defined type")
+            msg = _("cannot use xs:anyAtomicType as base type of a user-defined type")
+            self.parse_error(msg)
 
         try:
             self.base_type = base_type
@@ -957,11 +987,14 @@ class XsdUnion(XsdSimpleType):
                     if child.tag == XSD_UNION:
                         super(XsdUnion, self).__setattr__(name, child)
                         return
-            raise XMLSchemaValueError("a %r definition required for %r." % (XSD_UNION, self))
+            raise XMLSchemaValueError(
+                "a {0!r} definition required for {1!r}".format(XSD_UNION, self)
+            )
 
         elif name == 'white_space':
             if not (value is None or value == 'collapse'):
-                raise XMLSchemaValueError("Wrong value % for attribute 'white_space'." % value)
+                msg = _("wrong value %r for attribute 'white_space'")
+                raise XMLSchemaValueError(msg % value)
             value = 'collapse'
         super(XsdUnion, self).__setattr__(name, value)
 
@@ -988,31 +1021,32 @@ class XsdUnion(XsdSimpleType):
                 try:
                     mt = self.maps.lookup_type(type_qname)
                 except KeyError:
-                    self.parse_error("unknown member type %r" % type_qname)
+                    self.parse_error(_("unknown type {!r}").format(type_qname))
                     mt = self.any_atomic_type
                 except XMLSchemaParseError as err:
                     self.parse_error(err)
                     mt = self.any_atomic_type
 
                 if isinstance(mt, tuple):
-                    self.parse_error(
-                        "circular definition found on xs:union type {!r}".format(self.name)
-                    )
+                    msg = _("circular definition found on xs:union type {!r}")
+                    self.parse_error(msg.format(self.name))
                     continue
                 elif not isinstance(mt, self._ADMITTED_TYPES):
-                    self.parse_error("a {!r} required, not {!r}".format(self._ADMITTED_TYPES, mt))
+                    msg = _("a {0!r} required, not {1!r}")
+                    self.parse_error(msg.format(self._ADMITTED_TYPES, mt))
                     continue
                 elif mt.final == '#all' or 'union' in mt.final:
-                    self.parse_error("'final' value of the memberTypes %r "
-                                     "forbids derivation by union" % member_types)
+                    msg = _("'final' value of the memberTypes %r forbids derivation by union")
+                    self.parse_error(msg % member_types)
 
                 member_types.append(mt)
 
         if not member_types:
-            self.parse_error("missing xs:union type declarations")
+            self.parse_error(_("missing xs:union type declarations"))
             self.member_types = [self.any_atomic_type]
         elif any(mt.name == XSD_ANY_ATOMIC_TYPE for mt in member_types):
-            self.parse_error("Cannot use xs:anyAtomicType as base type of a user-defined type")
+            msg = _("cannot use xs:anyAtomicType as base type of a user-defined type")
+            self.parse_error(msg)
         else:
             self.member_types = member_types
             if all(not mt.allow_empty for mt in member_types):
@@ -1070,7 +1104,7 @@ class XsdUnion(XsdSimpleType):
                 break
 
         if ' ' not in obj.strip():
-            reason = "invalid value %r." % obj
+            reason = _("invalid value {!r}").format(obj)
             yield XMLSchemaDecodeError(self, obj, self.member_types, reason)
 
         items = []
@@ -1091,7 +1125,7 @@ class XsdUnion(XsdSimpleType):
                     items.append(str(chunk))
 
         if not_decodable:
-            reason = "no type suitable for decoding the values %r." % not_decodable
+            reason = _("no type suitable for decoding the values %r") % not_decodable
             yield XMLSchemaDecodeError(self, obj, self.member_types, reason)
 
         yield items if len(items) > 1 else items[0] if items else None
@@ -1125,7 +1159,7 @@ class XsdUnion(XsdSimpleType):
                     break
 
         if validation != 'skip':
-            reason = "no type suitable for encoding the object."
+            reason = _("no type suitable for encoding the object")
             yield XMLSchemaEncodeError(self, obj, self.member_types, reason)
             yield None
         else:
@@ -1173,7 +1207,8 @@ class XsdAtomicRestriction(XsdAtomic):
             elem = cast(ElementType, self._parse_child_component(elem))
 
         if self.name is not None and self.parent is not None:
-            self.parse_error("'name' attribute in a local simpleType definition")
+            msg = _("'name' attribute in a local simpleType definition")
+            self.parse_error(msg)
 
         base_type: Any = None
         facets: Any = {}
@@ -1189,46 +1224,49 @@ class XsdAtomicRestriction(XsdAtomic):
             else:
                 if base_qname == self.name:
                     if self.redefine is None:
-                        self.parse_error("wrong definition with self-reference")
+                        msg = _("wrong definition with self-reference")
+                        self.parse_error(msg)
                         base_type = self.any_atomic_type
                     else:
                         base_type = self.base_type
                 else:
                     if self.redefine is not None:
-                        self.parse_error("wrong redefinition without self-reference")
+                        msg = _("wrong redefinition without self-reference")
+                        self.parse_error(msg)
 
                     try:
                         base_type = self.maps.lookup_type(base_qname)
                     except KeyError:
-                        self.parse_error("unknown type %r" % elem.attrib['base'])
+                        self.parse_error(_("unknown type {!r}").format(elem.attrib['base']))
                         base_type = self.any_atomic_type
                     except XMLSchemaParseError as err:
                         self.parse_error(err)
                         base_type = self.any_atomic_type
                     else:
                         if isinstance(base_type, tuple):
-                            msg = "circularity definition between {!r} and {!r}"
+                            msg = _("circular definition found between {0!r} and {1!r}")
                             self.parse_error(msg.format(self, base_qname))
                             base_type = self.any_atomic_type
 
             if base_type.is_simple() and base_type.name == XSD_ANY_SIMPLE_TYPE:
-                self.parse_error("wrong base type {!r}, an atomic type required")
+                msg = _("wrong base type %r, an atomic type required")
+                self.parse_error(msg % XSD_ANY_SIMPLE_TYPE)
             elif base_type.is_complex():
                 if base_type.mixed and base_type.is_emptiable():
                     child = self._parse_child_component(elem, strict=False)
                     if child is None:
-                        self.parse_error("an xs:simpleType definition expected")
+                        msg = _("an xs:simpleType definition expected")
+                        self.parse_error(msg)
                     elif child.tag != XSD_SIMPLE_TYPE:
                         # See: "http://www.w3.org/TR/xmlschema-2/#element-restriction"
-                        self.parse_error(
+                        self.parse_error(_(
                             "when a complexType with simpleContent restricts a complexType "
                             "with mixed and with emptiable content then a simpleType child "
-                            "declaration is required."
-                        )
+                            "declaration is required"
+                        ))
                 elif self.parent is None or self.parent.is_simple():
-                    self.parse_error(
-                        "simpleType restriction of %r is not allowed" % base_type
-                    )
+                    msg = _("simpleType restriction of %r is not allowed")
+                    self.parse_error(msg % base_type)
 
         for child in elem:
             if child.tag == XSD_ANNOTATION or callable(child.tag):
@@ -1236,11 +1274,13 @@ class XsdAtomicRestriction(XsdAtomic):
             elif child.tag in self._CONTENT_TAIL_TAGS:
                 has_attributes = True  # only if it's a complexType restriction
             elif has_attributes:
-                self.parse_error("unexpected tag after attribute declarations")
+                msg = _("unexpected tag after attribute declarations")
+                self.parse_error(msg)
             elif child.tag == XSD_SIMPLE_TYPE:
                 # Case of simpleType declaration inside a restriction
                 if has_simple_type_child:
-                    self.parse_error("duplicated simpleType declaration")
+                    msg = _("duplicated simpleType declaration")
+                    self.parse_error(msg)
 
                 if base_type is None:
                     try:
@@ -1261,22 +1301,22 @@ class XsdAtomicRestriction(XsdAtomic):
                             final=base_type.final,
                         )
                 elif 'base' in elem.attrib:
-                    self.parse_error(
-                        "restriction with 'base' attribute and simpleType declaration"
-                    )
+                    msg = _("restriction with 'base' attribute and simpleType declaration")
+                    self.parse_error(msg)
 
                 has_simple_type_child = True
             else:
                 try:
                     facet_class = self._FACETS_BUILDERS[child.tag]
                 except KeyError:
-                    self.parse_error("unexpected tag %r in restriction:" % child.tag)
+                    self.parse_error(_("unexpected tag %r in restriction") % child.tag)
                     continue
 
                 if child.tag not in facets:
                     facets[child.tag] = facet_class(child, self.schema, self, base_type)
                 elif child.tag not in MULTIPLE_FACETS:
-                    self.parse_error("multiple %r constraint facet" % local_name(child.tag))
+                    msg = _("multiple %r constraint facet")
+                    self.parse_error(msg % local_name(child.tag))
                 elif child.tag != XSD_ASSERTION:
                     facets[child.tag].append(child)
                 else:
@@ -1287,12 +1327,13 @@ class XsdAtomicRestriction(XsdAtomic):
                         facets[child.tag] = [facets[child.tag], assertion]
 
         if base_type is None:
-            self.parse_error("missing base type in restriction:")
+            self.parse_error(_("missing base type in restriction"))
         elif base_type.final == '#all' or 'restriction' in base_type.final:
-            self.parse_error("'final' value of the baseType %r forbids "
-                             "derivation by restriction" % base_type)
+            msg = _("'final' value of the baseType %r forbids derivation by restriction")
+            self.parse_error(msg % base_type)
         if base_type is self.any_atomic_type:
-            self.parse_error("Cannot use xs:anyAtomicType as base type of a user-defined type")
+            msg = _("cannot use xs:anyAtomicType as base type of a user-defined type")
+            self.parse_error(msg)
 
         self.base_type = base_type
         self.facets = facets
@@ -1337,8 +1378,9 @@ class XsdAtomicRestriction(XsdAtomic):
             yield obj
             return
         else:
-            raise XMLSchemaValueError("wrong base type %r: a simpleType or a complexType with "
-                                      "simple or mixed content required." % self.base_type)
+            msg = _("wrong base type %r: a simpleType or a complexType "
+                    "with simple or mixed content required")
+            raise XMLSchemaValueError(msg % self.base_type)
 
         if self.patterns:
             if not isinstance(self.primitive_type, XsdUnion):
@@ -1385,8 +1427,9 @@ class XsdAtomicRestriction(XsdAtomic):
                 yield str(obj)
                 return
             else:
-                raise XMLSchemaValueError("wrong base type %r: a simpleType or a complexType with "
-                                          "simple or mixed content required." % self.base_type)
+                msg = _("wrong base type %r: a simpleType or a complexType "
+                        "with simple or mixed content required")
+                raise XMLSchemaValueError(msg % self.base_type)
 
         result: Any
         for result in base_type.iter_encode(obj, validation):
diff --git a/xmlschema/validators/wildcards.py b/xmlschema/validators/wildcards.py
index 0fd6ef3..6ada65e 100644
--- a/xmlschema/validators/wildcards.py
+++ b/xmlschema/validators/wildcards.py
@@ -19,6 +19,7 @@ from ..names import XSI_NAMESPACE, XSD_ANY, XSD_ANY_ATTRIBUTE, \
 from ..aliases import ElementType, SchemaType, SchemaElementType, SchemaAttributeType, \
     ModelGroupType, ModelParticleType, AtomicValueType, IterDecodeType, IterEncodeType, \
     DecodedValueType, EncodedValueType
+from ..translation import gettext as _
 from ..helpers import get_namespace, raw_xml_encode
 from ..xpath import XMLSchemaProtocol, ElementProtocol, XMLSchemaProxy, ElementPathMixin
 from .xsdbase import ValidationMixin, XsdComponent
@@ -72,7 +73,8 @@ class XsdWildcard(XsdComponent):
                 elif ns == '##targetNamespace':
                     self.namespace.append(self.target_namespace)
                 elif ns.startswith('##'):
-                    self.parse_error("wrong value %r in 'namespace' attribute" % ns)
+                    msg = _("wrong value %r in 'namespace' attribute")
+                    self.parse_error(msg % ns)
                 else:
                     self.namespace.append(ns)
 
@@ -80,8 +82,8 @@ class XsdWildcard(XsdComponent):
         if process_contents == 'strict':
             pass
         elif process_contents not in ('lax', 'skip'):
-            self.parse_error("wrong value %r for 'processContents' "
-                             "attribute" % self.process_contents)
+            msg = _("wrong value %r for 'processContents' attribute")
+            self.parse_error(msg % self.process_contents)
         else:
             self.process_contents = process_contents
 
@@ -89,7 +91,8 @@ class XsdWildcard(XsdComponent):
         if 'notNamespace' not in self.elem.attrib:
             pass
         elif 'namespace' in self.elem.attrib:
-            self.parse_error("'namespace' and 'notNamespace' attributes are mutually exclusive")
+            msg = _("'namespace' and 'notNamespace' attributes are mutually exclusive")
+            self.parse_error(msg)
         else:
             self.namespace = []
             self.not_namespace = []
@@ -99,7 +102,8 @@ class XsdWildcard(XsdComponent):
                 elif ns == '##targetNamespace':
                     self.not_namespace.append(self.target_namespace)
                 elif ns.startswith('##'):
-                    self.parse_error("wrong value %r in 'notNamespace' attribute" % ns)
+                    msg = _("wrong value %r in 'notNamespace' attribute")
+                    self.parse_error(msg % ns)
                 else:
                     self.not_namespace.append(ns)
 
@@ -114,28 +118,31 @@ class XsdWildcard(XsdComponent):
                         for s in not_qname) or \
                 not all(not s.startswith('##') or s in {'##defined', '##definedSibling'}
                         for s in not_qname):
-            self.parse_error("wrong value for 'notQName' attribute")
+            self.parse_error(_("wrong value for 'notQName' attribute"))
             return
 
         try:
             names = [x if x.startswith('##') else self.schema.resolve_qname(x, False)
                      for x in not_qname]
         except KeyError as err:
-            self.parse_error("unmapped QName in 'notQName' attribute: %s" % str(err))
+            msg = _("unmapped QName in 'notQName' attribute: %s")
+            self.parse_error(msg % str(err))
             return
         except ValueError as err:
-            self.parse_error("wrong QName format in 'notQName' attribute: %s" % str(err))
+            msg = _("wrong QName format in 'notQName' attribute: %s")
+            self.parse_error(msg % str(err))
             return
 
         if self.not_namespace:
             if any(not x.startswith('##') for x in names) and \
                     all(get_namespace(x) in self.not_namespace
                         for x in names if not x.startswith('##')):
-                self.parse_error("the namespace of each QName in notQName "
-                                 "is allowed by notNamespace")
+                msg = _("the namespace of each QName in notQName is allowed by notNamespace")
+                self.parse_error(msg)
         elif any(not self.is_namespace_allowed(get_namespace(x))
                  for x in names if not x.startswith('##')):
-            self.parse_error("names in notQName must be in namespaces that are allowed")
+            msg = _("names in notQName must be in namespaces that are allowed")
+            self.parse_error(msg)
 
         self.not_qname = names
 
@@ -309,7 +316,7 @@ class XsdWildcard(XsdComponent):
         elif '' not in w2.namespace and w1.target_namespace == w2.target_namespace:
             self.namespace = ['##other']
         elif self.xsd_version == '1.0':
-            msg = "not expressible wildcard namespace union: {!r} V {!r}:"
+            msg = _("not expressible wildcard namespace union: {0!r} V {1!r}:")
             raise XMLSchemaValueError(msg.format(other.namespace, self.namespace))
         else:
             self.namespace = []
@@ -463,7 +470,7 @@ class XsdAnyElement(XsdWildcard, ParticleMixin,
             -> IterDecodeType[Any]:
 
         if not self.is_matching(obj.tag):
-            reason = "{!r} is not allowed here".format(obj)
+            reason = _("element {!r} is not allowed here").format(obj)
             yield self.validation_error(validation, reason, obj, **kwargs)
 
         if self.process_contents == 'skip':
@@ -505,7 +512,7 @@ class XsdAnyElement(XsdWildcard, ParticleMixin,
         namespace = get_namespace(name)
 
         if not self.is_namespace_allowed(namespace):
-            reason = "element {!r} is not allowed here".format(name)
+            reason = _("element {!r} is not allowed here").format(name)
             yield self.validation_error(validation, reason, value, **kwargs)
 
         if self.process_contents == 'skip':
@@ -641,7 +648,7 @@ class XsdAnyAttribute(XsdWildcard, ValidationMixin[Tuple[str, str], DecodedValue
         name, value = obj
 
         if not self.is_matching(name):
-            reason = "attribute %r not allowed." % name
+            reason = _("attribute %r not allowed") % name
             yield self.validation_error(validation, reason, obj, **kwargs)
 
         if self.process_contents == 'skip':
@@ -653,14 +660,14 @@ class XsdAnyAttribute(XsdWildcard, ValidationMixin[Tuple[str, str], DecodedValue
                 xsd_attribute = self.maps.lookup_attribute(name)
             except LookupError:
                 if validation != 'skip' and self.process_contents == 'strict':
-                    reason = "attribute %r not found." % name
+                    reason = _("attribute %r not found") % name
                     yield self.validation_error(validation, reason, obj, **kwargs)
             else:
                 yield from xsd_attribute.iter_decode(value, validation, **kwargs)
                 return
 
         elif validation != 'skip' and self.process_contents == 'strict':
-            reason = "unavailable namespace {!r}".format(get_namespace(name))
+            reason = _("unavailable namespace {!r}").format(get_namespace(name))
             yield self.validation_error(validation, reason, **kwargs)
 
         yield value
@@ -671,7 +678,7 @@ class XsdAnyAttribute(XsdWildcard, ValidationMixin[Tuple[str, str], DecodedValue
         namespace = get_namespace(name)
 
         if not self.is_namespace_allowed(namespace):
-            reason = "attribute %r not allowed." % name
+            reason = _("attribute %r not allowed") % name
             yield self.validation_error(validation, reason, obj, **kwargs)
 
         if self.process_contents == 'skip':
@@ -683,14 +690,14 @@ class XsdAnyAttribute(XsdWildcard, ValidationMixin[Tuple[str, str], DecodedValue
                 xsd_attribute = self.maps.lookup_attribute(name)
             except LookupError:
                 if validation != 'skip' and self.process_contents == 'strict':
-                    reason = "attribute %r not found." % name
+                    reason = _("attribute %r not found") % name
                     yield self.validation_error(validation, reason, obj, **kwargs)
             else:
                 yield from xsd_attribute.iter_encode(value, validation, **kwargs)
                 return
 
         elif validation != 'skip' and self.process_contents == 'strict':
-            reason = "unavailable namespace {!r}".format(get_namespace(name))
+            reason = _("unavailable namespace {!r}").format(get_namespace(name))
             yield self.validation_error(validation, reason, **kwargs)
 
         yield raw_xml_encode(value)
@@ -847,15 +854,17 @@ class XsdOpenContent(XsdComponent):
             pass
         else:
             if self.mode not in {'none', 'interleave', 'suffix'}:
-                self.parse_error("wrong value %r for 'mode' attribute." % self.mode)
+                msg = _("wrong value %r for 'mode' attribute")
+                self.parse_error(msg % self.mode)
 
         child = self._parse_child_component(self.elem)
         if self.mode == 'none':
             if child is not None and child.tag == XSD_ANY:
-                self.parse_error("an openContent with mode='none' must not "
-                                 "have an <xs:any> child declaration")
+                msg = _("an openContent with mode='none' cannot "
+                        "have an <xs:any> child declaration")
+                self.parse_error(msg)
         elif child is None or child.tag != XSD_ANY:
-            self.parse_error("an <xs:any> child declaration is required")
+            self.parse_error(_("an <xs:any> child declaration is required"))
         else:
             any_element = Xsd11AnyElement(child, self.schema, self)
             any_element.min_occurs = 0
@@ -896,11 +905,14 @@ class XsdDefaultOpenContent(XsdOpenContent):
     def _parse(self) -> None:
         super(XsdDefaultOpenContent, self)._parse()
         if self.parent is not None:
-            self.parse_error("defaultOpenContent must be a child of the schema")
+            msg = _("defaultOpenContent must be a child of the schema")
+            self.parse_error(msg)
         if self.mode == 'none':
-            self.parse_error("the attribute 'mode' of a defaultOpenContent cannot be 'none'")
+            msg = _("the attribute 'mode' of a defaultOpenContent cannot be 'none'")
+            self.parse_error(msg)
         if self._parse_child_component(self.elem) is None:
-            self.parse_error("a defaultOpenContent declaration cannot be empty")
+            msg = _("a defaultOpenContent declaration cannot be empty")
+            self.parse_error(msg)
 
         if 'appliesToEmpty' in self.elem.attrib:
             if self.elem.attrib['appliesToEmpty'].strip() in {'true', '1'}:
diff --git a/xmlschema/validators/xsdbase.py b/xmlschema/validators/xsdbase.py
index 37733fa..2798a28 100644
--- a/xmlschema/validators/xsdbase.py
+++ b/xmlschema/validators/xsdbase.py
@@ -24,6 +24,7 @@ from ..etree import is_etree_element, etree_tostring, etree_element
 from ..aliases import ElementType, NamespacesType, SchemaType, BaseXsdType, \
     ComponentClassType, ExtraValidatorType, DecodeType, IterDecodeType, \
     EncodeType, IterEncodeType
+from ..translation import gettext as _
 from ..helpers import get_qname, local_name, get_prefixed_qname
 from ..resources import XMLResource
 from .exceptions import XMLSchemaParseError, XMLSchemaValidationError
@@ -47,8 +48,8 @@ Ref.: https://www.w3.org/TR/xmlschema11-1/#key-va
 
 def check_validation_mode(validation: str) -> None:
     if validation not in XSD_VALIDATION_MODES:
-        raise XMLSchemaValueError("validation mode can be 'strict', "
-                                  "'lax' or 'skip': %r" % validation)
+        raise XMLSchemaValueError(_("validation mode can be 'strict', "
+                                    "'lax' or 'skip': %r") % validation)
 
 
 class XsdValidator:
@@ -250,8 +251,9 @@ class XsdValidator:
             return value
         else:
             admitted_values = ('##defaultNamespace', '##targetNamespace', '##local')
-            msg = "wrong value %r for 'xpathDefaultNamespace' attribute, can be (anyURI | %s)."
-            self.parse_error(msg % (value, ' | '.join(admitted_values)), elem)
+            msg = _("wrong value {0!r} for 'xpathDefaultNamespace' "
+                    "attribute, can be (anyURI | {1}).")
+            self.parse_error(msg.format(value, ' | '.join(admitted_values)), elem)
             return ''
 
 
@@ -400,15 +402,17 @@ class XsdComponent(XsdValidator):
             if 'name' in self.elem.attrib:
                 return None
             elif self.parent is None:
-                self.parse_error("missing attribute 'name' in a global %r" % type(self))
+                msg = _("missing attribute 'name' in a global %r")
+                self.parse_error(msg % type(self))
             else:
-                self.parse_error(
-                    "missing both attributes 'name' and 'ref' in local %r" % type(self)
-                )
+                msg = _("missing both attributes 'name' and 'ref' in local %r")
+                self.parse_error(msg % type(self))
         elif 'name' in self.elem.attrib:
-            self.parse_error("attributes 'name' and 'ref' are mutually exclusive")
+            msg = _("attributes 'name' and 'ref' are mutually exclusive")
+            self.parse_error(msg)
         elif self.parent is None:
-            self.parse_error("attribute 'ref' not allowed in a global %r" % type(self))
+            msg = _("attribute 'ref' not allowed in a global %r")
+            self.parse_error(msg % type(self))
         else:
             try:
                 self.name = self.schema.resolve_qname(ref)
@@ -416,8 +420,8 @@ class XsdComponent(XsdValidator):
                 self.parse_error(err)
             else:
                 if self._parse_child_component(self.elem, strict=False) is not None:
-                    self.parse_error("a reference component cannot have "
-                                     "child definitions/declarations")
+                    msg = _("a reference component cannot have child definitions/declarations")
+                    self.parse_error(msg)
                 return True
 
         return None
@@ -431,7 +435,7 @@ class XsdComponent(XsdValidator):
             elif not strict:
                 return e
             elif child is not None:
-                msg = "too many XSD components, unexpected {!r} found at position {}"
+                msg = _("too many XSD components, unexpected {0!r} found at position {1}")
                 self.parse_error(msg.format(child, elem[:].index(e)), elem)
                 break
             else:
@@ -447,23 +451,26 @@ class XsdComponent(XsdValidator):
 
         self._target_namespace = self.elem.attrib['targetNamespace'].strip()
         if 'name' not in self.elem.attrib:
-            self.parse_error("attribute 'name' must be present when "
-                             "'targetNamespace' attribute is provided")
+            msg = _("attribute 'name' must be present when "
+                    "'targetNamespace' attribute is provided")
+            self.parse_error(msg)
         if 'form' in self.elem.attrib:
-            self.parse_error("attribute 'form' must be absent when "
-                             "'targetNamespace' attribute is provided")
+            msg = _("attribute 'form' must be absent when "
+                    "'targetNamespace' attribute is provided")
+            self.parse_error(msg)
         if self._target_namespace != self.schema.target_namespace:
             if self.parent is None:
-                self.parse_error("a global %s must have the same namespace as "
-                                 "its parent schema" % self.__class__.__name__)
+                msg = _("a global %s must have the same namespace as its parent schema")
+                self.parse_error(msg % self.__class__.__name__)
 
             xsd_type = self.get_parent_type()
             if xsd_type is None or xsd_type.parent is not None:
                 pass
             elif xsd_type.derivation != 'restriction' or \
                     getattr(xsd_type.base_type, 'name', None) == XSD_ANY_TYPE:
-                self.parse_error("a declaration contained in a global complexType "
-                                 "must have the same namespace as its parent schema")
+                msg = _("a declaration contained in a global complexType "
+                        "must have the same namespace as its parent schema")
+                self.parse_error(msg)
 
         if self.name is None:
             pass  # pragma: no cover
@@ -581,7 +588,8 @@ class XsdComponent(XsdValidator):
                 return component
             component = component.parent
         else:
-            raise XMLSchemaValueError(f"parent circularity from {self}")  # pragma: no cover
+            msg = _("parent circularity from {}")
+            raise XMLSchemaValueError(msg.format(self))  # pragma: no cover
 
     def get_parent_type(self) -> Optional['XsdType']:
         """
diff --git a/xmlschema/xpath.py b/xmlschema/xpath.py
index 5a09594..38fb330 100644
--- a/xmlschema/xpath.py
+++ b/xmlschema/xpath.py
@@ -112,7 +112,8 @@ class XMLSchemaProxy(AbstractSchemaProxy):
         if base_element is not None:
             try:
                 if base_element.schema is not schema:
-                    raise XMLSchemaValueError("%r is not an element of %r" % (base_element, schema))
+                    msg = "{} is not an element of {}"
+                    raise XMLSchemaValueError(msg.format(base_element, schema))
             except AttributeError:
                 raise XMLSchemaTypeError("%r is not an XsdElement" % base_element)
 
@@ -141,7 +142,8 @@ class XMLSchemaProxy(AbstractSchemaProxy):
         xsd_type = self._schema.maps.types[type_qname]
         if isinstance(xsd_type, tuple):
             from .validators import XMLSchemaNotBuiltError
-            raise XMLSchemaNotBuiltError(xsd_type[1], f"XSD type {type_qname} is not built")
+            msg = "XSD type %r is not built"
+            raise XMLSchemaNotBuiltError(xsd_type[1], msg % type_qname)
 
         try:
             xsd_type.encode(obj)
@@ -154,7 +156,8 @@ class XMLSchemaProxy(AbstractSchemaProxy):
         xsd_type = self._schema.maps.types[type_qname]
         if isinstance(xsd_type, tuple):
             from .validators import XMLSchemaNotBuiltError
-            raise XMLSchemaNotBuiltError(xsd_type[1], f"XSD type {type_qname} is not built")
+            msg = "XSD type %r is not built"
+            raise XMLSchemaNotBuiltError(xsd_type[1], msg % type_qname)
         return xsd_type.decode(obj)
 
     def iter_atomic_types(self) -> Iterator[XsdTypeProtocol]: