├── .coveragerc ├── .flake8 ├── .github ├── dependabot.yml └── workflows │ └── ci-tests.yml ├── .gitignore ├── .readthedocs.yaml ├── CHANGES.rst ├── CONTRIBUTORS.txt ├── COPYRIGHT.txt ├── LICENSE.txt ├── MANIFEST.in ├── README.rst ├── RELEASING.txt ├── TODO.txt ├── contributing.md ├── docs ├── .gitignore ├── Makefile ├── api.rst ├── basics.rst ├── binding.rst ├── changes.rst ├── conf.py ├── extending.rst ├── glossary.rst ├── index.rst ├── interfaces.rst ├── manipulation.rst └── null_and_drop.rst ├── pyproject.toml ├── pytest.ini ├── rtd.txt ├── setup.cfg ├── setup.py ├── src └── colander │ ├── __init__.py │ ├── interfaces.py │ └── locale │ ├── colander.pot │ ├── cs │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── de │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── el │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── es │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── fi │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── fr │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── it │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── ja │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── nl │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── pl │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── pt │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── pt_BR │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── ro │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── ru │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── sv │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ ├── zh_Hans │ └── LC_MESSAGES │ │ ├── colander.mo │ │ └── colander.po │ └── zh_Hant │ └── LC_MESSAGES │ ├── colander.mo │ └── colander.po ├── tests ├── __init__.py ├── relative.py ├── test_colander.py └── test_interfaces.py └── tox.ini /.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | parallel = true 3 | source = 4 | colander 5 | 6 | [paths] 7 | source = 8 | src/colander 9 | */src/colander 10 | */site-packages/colander 11 | 12 | [report] 13 | show_missing = true 14 | precision = 2 15 | -------------------------------------------------------------------------------- /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | ignore = 3 | # E731: do not assign a lambda expression, use a def 4 | E731 5 | # W503: line break before binary operator (flake8 is not PEP8 compliant) 6 | W503 7 | # W504: line break after binary operator (flake8 is not PEP8 compliant) 8 | W504 9 | show-source = True 10 | max-line-length = 79 11 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # Set update schedule for GitHub Actions 2 | 3 | version: 2 4 | updates: 5 | 6 | - package-ecosystem: "github-actions" 7 | directory: "/" 8 | schedule: 9 | # Check for updates to GitHub Actions every weekday 10 | interval: "daily" 11 | -------------------------------------------------------------------------------- /.github/workflows/ci-tests.yml: -------------------------------------------------------------------------------- 1 | name: Build and test 2 | 3 | on: 4 | # Only on pushes to main or one of the release branches we build on push 5 | push: 6 | branches: 7 | - main 8 | - "[0-9].[0-9]+-branch" 9 | tags: 10 | # Build pull requests 11 | pull_request: 12 | 13 | jobs: 14 | test: 15 | strategy: 16 | matrix: 17 | py: 18 | - "3.7" 19 | - "3.8" 20 | - "3.9" 21 | - "3.10" 22 | - "3.11" 23 | - "3.12" 24 | - "pypy-3.8" 25 | os: 26 | - "ubuntu-latest" 27 | - "windows-latest" 28 | # later versions no longer support Python < 3.10. 29 | - "macos-11" 30 | architecture: 31 | - x64 32 | - x86 33 | exclude: 34 | # Linux and macOS don't have x86 python 35 | - os: "ubuntu-latest" 36 | architecture: x86 37 | - os: "macos-11" 38 | architecture: x86 39 | name: "Python: ${{ matrix.py }}-${{ matrix.architecture }} on ${{ matrix.os }}" 40 | runs-on: ${{ matrix.os }} 41 | steps: 42 | - uses: actions/checkout@v4 43 | - name: Setup python 44 | uses: actions/setup-python@v5 45 | with: 46 | python-version: ${{ matrix.py }} 47 | architecture: ${{ matrix.architecture }} 48 | - run: pip install tox 49 | - name: Running tox 50 | run: tox -e py 51 | coverage: 52 | runs-on: ubuntu-latest 53 | name: Validate coverage 54 | steps: 55 | - uses: actions/checkout@v4 56 | - name: Setup python 3.10 57 | uses: actions/setup-python@v5 58 | with: 59 | python-version: "3.10" 60 | architecture: x64 61 | 62 | - run: pip install tox 63 | - run: tox -e py310,coverage 64 | docs: 65 | runs-on: ubuntu-latest 66 | name: Build the documentation 67 | steps: 68 | - uses: actions/checkout@v4 69 | - name: Setup python 70 | uses: actions/setup-python@v5 71 | with: 72 | python-version: "3.10" 73 | architecture: x64 74 | - run: pip install tox 75 | - run: tox -e docs 76 | lint: 77 | runs-on: ubuntu-latest 78 | name: Lint the package 79 | steps: 80 | - uses: actions/checkout@v4 81 | - name: Setup python 82 | uses: actions/setup-python@v5 83 | with: 84 | python-version: "3.10" 85 | architecture: x64 86 | - run: pip install tox 87 | - run: tox -e lint 88 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.egg-info/ 2 | *.pyc 3 | env*/ 4 | .coverage 5 | .coverage.* 6 | .tox/ 7 | dist/ 8 | build/ 9 | coverage.xml 10 | -------------------------------------------------------------------------------- /.readthedocs.yaml: -------------------------------------------------------------------------------- 1 | # https://docs.readthedocs.io/en/stable/config-file/v2.html 2 | version: 2 3 | build: 4 | os: ubuntu-22.04 5 | tools: 6 | python: '3.12' 7 | sphinx: 8 | configuration: docs/conf.py 9 | formats: 10 | - pdf 11 | - epub 12 | python: 13 | install: 14 | - method: pip 15 | path: . 16 | extra_requirements: 17 | - docs 18 | -------------------------------------------------------------------------------- /CONTRIBUTORS.txt: -------------------------------------------------------------------------------- 1 | Pylons Project Contributor Agreement 2 | ==================================== 3 | 4 | The submitter agrees by adding his or her name within the section below named 5 | "Contributors" and submitting the resulting modified document to the 6 | canonical shared repository location for this software project (whether 7 | directly, as a user with "direct commit access", or via a "pull request"), he 8 | or she is signing a contract electronically. The submitter becomes a 9 | Contributor after a) he or she signs this document by adding their name 10 | beneath the "Contributors" section below, and b) the resulting document is 11 | accepted into the canonical version control repository. 12 | 13 | Treatment of Account 14 | --------------------- 15 | 16 | Contributor will not allow anyone other than the Contributor to use his or 17 | her username or source repository login to submit code to a Pylons Project 18 | source repository. Should Contributor become aware of any such use, 19 | Contributor will immediately notify Agendaless Consulting. 20 | Notification must be performed by sending an email to 21 | webmaster@agendaless.com. Until such notice is received, Contributor will be 22 | presumed to have taken all actions made through Contributor's account. If the 23 | Contributor has direct commit access, Agendaless Consulting will have 24 | complete control and discretion over capabilities assigned to Contributor's 25 | account, and may disable Contributor's account for any reason at any time. 26 | 27 | Legal Effect of Contribution 28 | ---------------------------- 29 | 30 | Upon submitting a change or new work to a Pylons Project source Repository (a 31 | "Contribution"), you agree to assign, and hereby do assign, a one-half 32 | interest of all right, title and interest in and to copyright and other 33 | intellectual property rights with respect to your new and original portions 34 | of the Contribution to Agendaless Consulting. You and Agendaless Consulting 35 | each agree that the other shall be free to exercise any and all exclusive 36 | rights in and to the Contribution, without accounting to one another, 37 | including without limitation, the right to license the Contribution to others 38 | under the Repoze Public License. This agreement shall run with title to the 39 | Contribution. Agendaless Consulting does not convey to you any right, title 40 | or interest in or to the Program or such portions of the Contribution that 41 | were taken from the Program. Your transmission of a submission to the Pylons 42 | Project source Repository and marks of identification concerning the 43 | Contribution itself constitute your intent to contribute and your assignment 44 | of the work in accordance with the provisions of this Agreement. 45 | 46 | License Terms 47 | ------------- 48 | 49 | Code committed to the Pylons Project source repository (Committed Code) must 50 | be governed by the Repoze Public License (http://repoze.org/LICENSE.txt, aka 51 | "the RPL") or another license acceptable to Agendaless Consulting. Until 52 | Agendaless Consulting declares in writing an acceptable license other than 53 | the RPL, only the RPL shall be used. A list of exceptions is detailed within 54 | the "Licensing Exceptions" section of this document, if one exists. 55 | 56 | Representations, Warranty, and Indemnification 57 | ---------------------------------------------- 58 | 59 | Contributor represents and warrants that the Committed Code does not violate 60 | the rights of any person or entity, and that the Contributor has legal 61 | authority to enter into this Agreement and legal authority over Contributed 62 | Code. Further, Contributor indemnifies Agendaless Consulting against 63 | violations. 64 | 65 | Cryptography 66 | ------------ 67 | 68 | Contributor understands that cryptographic code may be subject to government 69 | regulations with which Agendaless Consulting and/or entities using Committed 70 | Code must comply. Any code which contains any of the items listed below must 71 | not be checked-in until Agendaless Consulting staff has been notified and has 72 | approved such contribution in writing. 73 | 74 | - Cryptographic capabilities or features 75 | 76 | - Calls to cryptographic features 77 | 78 | - User interface elements which provide context relating to cryptography 79 | 80 | - Code which may, under casual inspection, appear to be cryptographic. 81 | 82 | Notices 83 | ------- 84 | 85 | Contributor confirms that any notices required will be included in any 86 | Committed Code. 87 | 88 | Licensing Exceptions 89 | ==================== 90 | 91 | None. 92 | 93 | List of Contributors 94 | ==================== 95 | 96 | The below-signed are contributors to a code repository that is part of the 97 | project named "Colander". Each below-signed contributor has read, understand 98 | and agrees to the terms above in the section within this document entitled 99 | "Pylons Project Contributor Agreement" as of the date beside his or her name. 100 | 101 | Contributors 102 | ------------ 103 | 104 | - Chris McDonough, 2010/03/11 105 | - Tres Seaver, 2010/04/05 106 | - Chris Withers, 2011/05/45 107 | - Mathieu Le Marec - Pasquet (kiorky), 2011/07/11 108 | - Atsushi Odagiri, 2012/02/04 109 | - Daniel Nouri, 2012/03/28 110 | - Gary van der Merwe, 2012/04/05 111 | - Domen Kožar, 2012/04/16 112 | - Lorenzo M. Catucci, 2013/01/29 113 | - Doug Latornell, 2013/03/17 114 | - Clayton Parker, 2013/08/15 115 | - Michael Merickel, 2013/08/15 116 | - Brian Sutherland, 2013/08/16 117 | - Peter Lamut, 2013/08/16 118 | - Veeti Paananen, 2013/08/20 119 | - Michael Howitz, 2013/12/05 120 | - Alex Marandon, 2013/12/21 121 | - Joe Dallago, 2014/2/10 122 | - Jaseem Abid, 2014/06/16 123 | - Cédric Messiant, 2014/06/27 124 | - Gouji Ochiai, 2014/08/21 125 | - Tim Tisdall, 2014/09/10 126 | - Romain Commandé, 2014/10/11 127 | - Lucas Taylor, 2014/11/26 128 | - Nando Florestan, 2014/11/27 129 | - Amos Latteier, 2014/11/30 130 | - Jimmy Thrasibule, 2014/12/11 131 | - Hugo Branquinho, 2015/01/21 132 | - Daniel Dourvaris, 2015/03/04 133 | - Dmitry Bogun, 2015/09/10 134 | - Tinne Cahy, 2015/12/22 135 | - Antti Haapala, 2016/01/17 136 | - Bert JW Regeer, 2016/02/16 137 | - Steve Piercy, 2016/02/26 138 | - Sergiu Bivol, 2016/04/23 139 | - Michael Lenaghan, 2016/05/27 140 | - Denis Nasyrov, 2016/08/23 141 | - Gabriela Surita, 2017/01/31 142 | - Manuel Vázquez, 2018/11/22 143 | - Kirill Kuzminykh, 2019/01/27 144 | - Rangel Reale, 2020/01/09 145 | - Damian Dimmich, 2020/07/19 146 | - Keith M Franklin, 2020/07/30 147 | - Scott Maki, 2020/11/15 148 | - Jens Troeger, 2022/07/03 149 | -------------------------------------------------------------------------------- /COPYRIGHT.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011 Agendaless Consulting and Contributors. 2 | (http://www.agendaless.com), All Rights Reserved 3 | 4 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | License 2 | 3 | A copyright notice accompanies this license document that identifies 4 | the copyright holders. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are 8 | met: 9 | 10 | 1. Redistributions in source code must retain the accompanying 11 | copyright notice, this list of conditions, and the following 12 | disclaimer. 13 | 14 | 2. Redistributions in binary form must reproduce the accompanying 15 | copyright notice, this list of conditions, and the following 16 | disclaimer in the documentation and/or other materials provided 17 | with the distribution. 18 | 19 | 3. Names of the copyright holders must not be used to endorse or 20 | promote products derived from this software without prior 21 | written permission from the copyright holders. 22 | 23 | 4. If any files are modified, you must cause the modified files to 24 | carry prominent notices stating that you changed the files and 25 | the date of any change. 26 | 27 | Disclaimer 28 | 29 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND 30 | ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 31 | TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 32 | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 33 | HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 34 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 35 | TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 36 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 37 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 38 | TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 39 | THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 40 | SUCH DAMAGE. 41 | 42 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | graft src/colander 2 | graft tests 3 | graft docs 4 | prune docs/_build 5 | graft .github 6 | 7 | include README.rst 8 | include RELEASING.txt 9 | include LICENSE.txt 10 | include contributing.md 11 | include CONTRIBUTORS.txt 12 | include COPYRIGHT.txt 13 | include CHANGES.rst 14 | 15 | include setup.cfg pyproject.toml 16 | include .coveragerc .flake8 pytest.ini 17 | include tox.ini rtd.txt 18 | include .readthedocs.yaml 19 | 20 | exclude TODO.txt 21 | 22 | recursive-exclude * __pycache__ *.py[cod] 23 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | Colander 2 | ======== 3 | 4 | .. image:: https://img.shields.io/pypi/v/colander.svg 5 | :target: https://pypi.python.org/pypi/colander 6 | 7 | .. image:: https://github.com/Pylons/colander/actions/workflows/ci-tests.yml/badge.svg?branch=main 8 | :target: https://github.com/Pylons/colander/actions/workflows/ci-tests.yml?query=branch%3Amain 9 | 10 | .. image:: https://readthedocs.org/projects/colander/badge/?version=latest 11 | :target: https://readthedocs.org/projects/colander/?badge=latest 12 | :alt: Documentation Status 13 | 14 | An extensible package which can be used to: 15 | 16 | - deserialize and validate a data structure composed of strings, 17 | mappings, and lists. 18 | 19 | - serialize an arbitrary data structure to a data structure composed 20 | of strings, mappings, and lists. 21 | 22 | It is tested on Python 3.7, 3.8, 3.9, 3.10, and 3.11, and PyPy 3.8. 23 | 24 | Please see https://docs.pylonsproject.org/projects/colander/en/latest/ 25 | for documentation. 26 | 27 | See https://github.com/Pylons/colander for in-development version. 28 | -------------------------------------------------------------------------------- /RELEASING.txt: -------------------------------------------------------------------------------- 1 | Releasing 2 | ========= 3 | 4 | - For clarity, we define releases as follows. 5 | 6 | - Alpha, beta, dev and similar statuses do not qualify whether a release is 7 | major or minor. The term "pre-release" means alpha, beta, or dev. 8 | 9 | - A release is final when it is no longer pre-release. 10 | 11 | - A *major* release is where the first number either before or after the 12 | first dot increases. Examples: 1.0 to 1.1a1, or 0.9 to 1.0. 13 | 14 | - A *minor* or *bug fix* release is where the number after the second dot 15 | increases. Example: 1.0 to 1.0.1. 16 | 17 | Prepare new release 18 | ------------------- 19 | 20 | - Do platform test via tox: 21 | 22 | $ tox -r 23 | 24 | Make sure statement coverage is at 100% (the test run will fail if not). 25 | 26 | - Run tests on Windows if feasible. 27 | 28 | - Ensure all features of the release are documented (audit CHANGES.rst or 29 | communicate with contributors). 30 | 31 | - Change CHANGES.rst heading to reflect the new version number. 32 | 33 | - Minor releases should include a link under "Bug Fix Releases" to the minor 34 | feature changes in CHANGES.rst. 35 | 36 | - Change setup.py version to the release version number. 37 | 38 | - Make sure PyPI long description renders (requires ``readme_renderer`` 39 | installed into your Python):: 40 | 41 | $ python setup.py check -r -s -m 42 | 43 | - Create a release tag. 44 | 45 | - Make sure your Python has ``setuptools-git``, ``twine``, and ``wheel`` 46 | installed and release to PyPI:: 47 | 48 | $ python setup.py sdist bdist_wheel 49 | $ twine upload dist/colander-X.X-* 50 | 51 | 52 | Prepare "main" for further development (major releases only) 53 | ------------------------------------------------------------ 54 | 55 | - In CHANGES.rst, preserve headings but clear out content. Add heading 56 | "unreleased" for the version number. 57 | 58 | - Change setup.py version to the next version number. 59 | 60 | 61 | Marketing and communications 62 | ---------------------------- 63 | 64 | - Announce to Twitter. 65 | 66 | ``` 67 | colander 2.x released. 68 | 69 | PyPI 70 | https://pypi.org/project/colander/2.x/ 71 | 72 | Changes 73 | https://docs.pylonsproject.org/projects/colander/en/latest/changes.html 74 | 75 | Documentation: 76 | https://docs.pylonsproject.org/projects/colander/en/latest/ 77 | 78 | Issues 79 | https://github.com/Pylons/colander/issues 80 | ``` 81 | 82 | - Announce to maillist. 83 | 84 | ``` 85 | colander 2.X.X has been released. 86 | 87 | The full changelog is here: 88 | https://docs.pylonsproject.org/projects/colander/en/latest/changes.html 89 | 90 | Documentation: 91 | https://docs.pylonsproject.org/projects/colander/en/latest/ 92 | 93 | You can install it via PyPI: 94 | 95 | pip install colander==2.X 96 | 97 | Enjoy, and please report any issues you find to the issue tracker at 98 | https://github.com/Pylons/colander/issues 99 | 100 | Thanks! 101 | 102 | - colander core developers 103 | ``` 104 | -------------------------------------------------------------------------------- /TODO.txt: -------------------------------------------------------------------------------- 1 | - Try using https://gist.github.com/DasIch/5562625 to preserve ordering of 2 | schemanode attributes within a schema/schemanode subclass. 3 | 4 | -------------------------------------------------------------------------------- /contributing.md: -------------------------------------------------------------------------------- 1 | Contributing 2 | ============ 3 | 4 | All projects under the Pylons Projects, including this one, follow the guidelines established at [How to Contribute](https://pylonsproject.org/community-how-to-contribute.html) and [Coding Style and Standards](https://pylonsproject.org/community-coding-style-standards.html). 5 | 6 | 7 | Get support 8 | ----------- 9 | 10 | See [Get Support](https://pylonsproject.org/community-support.html). You are reading this document most likely because you want to *contribute* to the project and not *get support*. 11 | 12 | 13 | Working on issues 14 | ----------------- 15 | 16 | To respect both your time and ours, we emphasize the following points. 17 | 18 | * We use the [Issue Tracker on GitHub](https://github.com/Pylons/colander/issues) to discuss bugs, improvements, and feature requests. Search through existing issues before reporting a new one. Issues may be complex or wide-ranging. A discussion up front sets us all on the best path forward. 19 | * Minor issues—such as spelling, grammar, and syntax—don't require discussion and a pull request is sufficient. 20 | * After discussing the issue with maintainers and agreeing on a resolution, submit a pull request of your work. [GitHub Flow](https://guides.github.com/introduction/flow/index.html) describes the workflow process and why it's a good practice. 21 | 22 | 23 | Git branches 24 | ------------ 25 | 26 | There is a single branch [main](https://github.com/Pylons/colander/) on which development takes place and from which releases to PyPI are tagged. This is the default branch on GitHub. 27 | 28 | 29 | Running tests and building documentation 30 | ---------------------------------------- 31 | 32 | We use [tox](https://tox.readthedocs.io/en/latest/) to automate test running, coverage, and building documentation across all supported Python versions. 33 | 34 | To run everything configured in the `tox.ini` file: 35 | 36 | $ tox 37 | 38 | To run tests and ensure full coverage, but exclude building of docs: 39 | 40 | $ tox -e py311,coverage 41 | 42 | To build the docs only: 43 | 44 | $ tox -e docs 45 | 46 | See the `tox.ini` file for details. 47 | 48 | Updating localizations 49 | ---------------------- 50 | 51 | Extract new messages: 52 | 53 | $ PY=.tox/py311/bin/python 54 | $ "$PY" setup.py extract_messages 55 | $ find src/colander/locale -type d -depth 1 -exec basename {} \; | xargs -n 1 "$PY" setup.py update_catalog -l 56 | $ find src/colander/locale -type d -depth 1 -exec basename {} \; | xargs -n 1 "$PY" setup.py compile_catalog -l 57 | 58 | Contributing documentation 59 | -------------------------- 60 | 61 | *Note:* These instructions might not work for Windows users. Suggestions to improve the process for Windows users are welcome by submitting an issue or a pull request. 62 | 63 | 1. Fork the repo on GitHub by clicking the [Fork] button. 64 | 2. Clone your fork into a workspace on your local machine. 65 | 66 | cd ~/projects 67 | git clone git@github.com:/colander.git 68 | 69 | 3. Add a git remote "upstream" for the cloned fork. 70 | 71 | git remote add upstream git@github.com:Pylons/colander.git 72 | 73 | 4. Set an environment variable to your virtual environment. 74 | 75 | # Mac and Linux 76 | $ export VENV=~/projects/colander/env 77 | 78 | # Windows 79 | set VENV=c:\projects\colander\env 80 | 81 | 5. Try to build the docs in your workspace. 82 | 83 | # Mac and Linux 84 | $ make clean html SPHINXBUILD=$VENV/bin/sphinx-build 85 | 86 | # Windows 87 | c:\> make clean html SPHINXBUILD=%VENV%\bin\sphinx-build 88 | 89 | If successful, then you can make changes to the documentation. You can load the built documentation in the `/_build/html/` directory in a web browser. 90 | 91 | 6. From this point forward, follow the typical [git workflow](https://help.github.com/articles/what-is-a-good-git-workflow/). Start by pulling from the upstream to get the most current changes. 92 | 93 | git pull upstream main 94 | 95 | 7. Make a branch, make changes to the docs, and rebuild them as indicated in step 5. To speed up the build process, you can omit `clean` from the above command to rebuild only those pages that depend on the files you have changed. 96 | 97 | 8. Once you are satisfied with your changes and the documentation builds successfully without errors or warnings, then git commit and push them to your "origin" repository on GitHub. 98 | 99 | git commit -m "commit message" 100 | git push -u origin --all # first time only, subsequent can be just 'git push'. 101 | 102 | 9. Create a [pull request](https://help.github.com/articles/using-pull-requests/). 103 | 104 | 10. Repeat the process starting from Step 6. 105 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | _build 2 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = -W 6 | SPHINXBUILD = sphinx-build 7 | PAPER = 8 | 9 | # Internal variables. 10 | PAPEROPT_a4 = -D latex_paper_size=a4 11 | PAPEROPT_letter = -D latex_paper_size=letter 12 | ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . 13 | 14 | .PHONY: help clean html web pickle htmlhelp latex changes linkcheck 15 | 16 | help: 17 | @echo "Please use \`make ' where is one of" 18 | @echo " html to make standalone HTML files" 19 | @echo " pickle to make pickle files (usable by e.g. sphinx-web)" 20 | @echo " htmlhelp to make HTML files and a HTML help project" 21 | @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" 22 | @echo " changes to make an overview over all changed/added/deprecated items" 23 | @echo " linkcheck to check all external links for integrity" 24 | 25 | clean: 26 | -rm -rf _build/* 27 | 28 | html: 29 | mkdir -p _build/html _build/doctrees 30 | $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) _build/html 31 | @echo 32 | @echo "Build finished. The HTML pages are in _build/html." 33 | 34 | text: 35 | mkdir -p _build/text _build/doctrees 36 | $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) _build/text 37 | @echo 38 | @echo "Build finished. The HTML pages are in _build/text." 39 | 40 | pickle: 41 | mkdir -p _build/pickle _build/doctrees 42 | $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) _build/pickle 43 | @echo 44 | @echo "Build finished; now you can process the pickle files or run" 45 | @echo " sphinx-web _build/pickle" 46 | @echo "to start the sphinx-web server." 47 | 48 | web: pickle 49 | 50 | htmlhelp: 51 | mkdir -p _build/htmlhelp _build/doctrees 52 | $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) _build/htmlhelp 53 | @echo 54 | @echo "Build finished; now you can run HTML Help Workshop with the" \ 55 | ".hhp project file in _build/htmlhelp." 56 | 57 | latex: 58 | mkdir -p _build/latex _build/doctrees 59 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex 60 | cp _static/*.png _build/latex 61 | ./convert_images.sh 62 | cp _static/latex-warning.png _build/latex 63 | cp _static/latex-note.png _build/latex 64 | @echo 65 | @echo "Build finished; the LaTeX files are in _build/latex." 66 | @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ 67 | "run these through (pdf)latex." 68 | 69 | changes: 70 | mkdir -p _build/changes _build/doctrees 71 | $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) _build/changes 72 | @echo 73 | @echo "The overview file is in _build/changes." 74 | 75 | linkcheck: 76 | mkdir -p _build/linkcheck _build/doctrees 77 | $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) _build/linkcheck 78 | @echo 79 | @echo "Link check complete; look for any errors in the above output " \ 80 | "or in _build/linkcheck/output.txt." 81 | 82 | epub: 83 | $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) _build/epub 84 | @echo 85 | @echo "Build finished. The epub file is in _build/epub." 86 | 87 | -------------------------------------------------------------------------------- /docs/api.rst: -------------------------------------------------------------------------------- 1 | Colander API 2 | ------------ 3 | 4 | Exceptions 5 | ~~~~~~~~~~ 6 | 7 | .. automodule:: colander 8 | 9 | .. autoclass:: Invalid 10 | :members: 11 | 12 | .. attribute:: pos 13 | 14 | An integer representing the position of this exception's 15 | schema node relative to all other child nodes of this 16 | exception's parent schema node. For example, if this 17 | exception is related to the third child node of its parent's 18 | schema, ``pos`` might be the integer ``3``. ``pos`` may also 19 | be ``None``, in which case this exception is the root 20 | exception. 21 | 22 | .. attribute:: children 23 | 24 | A list of child exceptions. Each element in this list (if 25 | any) will also be an :exc:`colander.Invalid` exception, 26 | recursively, representing the error circumstances for a 27 | particular schema deserialization. 28 | 29 | .. attribute:: msg 30 | 31 | A ``str`` or ``unicode`` object, or a *translation string* 32 | instance representing a freeform error value set by a 33 | particular type during an unsuccessful deserialization. If 34 | this exception is only structural (only exists to be a parent 35 | to some inner child exception), this value will be ``None``. 36 | 37 | .. attribute:: node 38 | 39 | The schema node to which this exception relates. 40 | 41 | .. attribute:: value 42 | 43 | An attribute not used internally by Colander, but which can be 44 | used by higher-level systems to attach arbitrary values to 45 | Colander exception nodes. For example, In the system named 46 | Deform, which uses Colander schemas to define HTML form 47 | renderings, the ``value`` is used when raising an exception 48 | from a widget as the value which should be redisplayed when an 49 | error is shown. 50 | 51 | .. autoclass:: UnsupportedFields 52 | 53 | .. attribute:: fields 54 | 55 | The ``dict`` with all detected extra fields and their values. 56 | 57 | Nodes that contain extra fields can be located by the position of 58 | this exception in the exception tree hierarchy. 59 | 60 | .. autoclass:: UnboundDeferredError 61 | 62 | 63 | Validators 64 | ~~~~~~~~~~ 65 | 66 | .. autoclass:: All 67 | 68 | .. autoclass:: Any 69 | 70 | .. autoclass:: Range 71 | 72 | .. autoclass:: Length 73 | 74 | .. autoclass:: OneOf 75 | 76 | .. autoclass:: NoneOf 77 | 78 | .. autoclass:: ContainsOnly 79 | 80 | .. autoclass:: Function 81 | 82 | .. autoclass:: Regex 83 | 84 | .. autoclass:: Email 85 | 86 | .. autoclass:: DataURL 87 | 88 | .. autofunction:: luhnok 89 | 90 | .. attribute:: url 91 | 92 | A validator which ensures the value is a URL (via regex). 93 | 94 | .. attribute:: uuid 95 | 96 | A UUID hexadecimal string validator via regular expression 97 | using :class:`colander.Regex`. 98 | 99 | Types 100 | ~~~~~ 101 | 102 | .. autoclass:: Mapping 103 | 104 | .. autoclass:: Tuple 105 | 106 | .. autoclass:: Set 107 | 108 | .. autoclass:: List 109 | 110 | .. autoclass:: Sequence 111 | 112 | .. autoclass:: Seq 113 | 114 | .. autoclass:: String 115 | 116 | .. autoclass:: Str 117 | 118 | .. autoclass:: Integer 119 | 120 | .. autoclass:: Int 121 | 122 | .. autoclass:: Float 123 | 124 | .. autoclass:: Decimal 125 | 126 | .. autoclass:: Boolean 127 | 128 | .. autoclass:: Bool 129 | 130 | .. autoclass:: GlobalObject 131 | 132 | .. autoclass:: DateTime 133 | 134 | .. autoclass:: Date 135 | 136 | .. autoclass:: Time 137 | 138 | .. autoclass:: Enum 139 | 140 | Schema-Related 141 | ~~~~~~~~~~~~~~ 142 | 143 | .. autoclass:: SchemaNode 144 | :members: 145 | :inherited-members: 146 | 147 | .. automethod:: __delitem__ 148 | 149 | .. automethod:: __getitem__ 150 | 151 | .. automethod:: __iter__ 152 | 153 | .. autoclass:: Schema 154 | 155 | .. autoclass:: MappingSchema 156 | 157 | .. autoclass:: TupleSchema 158 | 159 | .. autoclass:: SequenceSchema 160 | 161 | .. autoclass:: deferred 162 | 163 | .. autoclass:: instantiate 164 | 165 | .. autodata:: null 166 | :annotation: 167 | 168 | .. autodata:: required 169 | :annotation: 170 | 171 | .. autodata:: drop 172 | :annotation: 173 | 174 | -------------------------------------------------------------------------------- /docs/binding.rst: -------------------------------------------------------------------------------- 1 | Schema Binding 2 | ============== 3 | 4 | .. note:: 5 | 6 | Schema binding is new in colander 0.8. 7 | 8 | Sometimes, when you define a schema at module-scope using a ``class`` 9 | statement, you simply don't have enough information to provide 10 | fully-resolved arguments to the :class:`colander.SchemaNode` 11 | constructor. For example, the ``validator`` of a schema node may 12 | depend on a set of values that are only available within the scope of 13 | some function that gets called much later in the process lifetime; 14 | definitely some time very much later than module-scope import. 15 | 16 | You needn't use schema binding at all to deal with this situation. 17 | You can instead mutate a cloned schema object by changing its 18 | attributes and assigning it values (such as widgets, validators, etc) 19 | within the function which has access to the missing values 20 | imperatively within the scope of that function. 21 | 22 | However, if you'd prefer, you can use "deferred" values as SchemaNode 23 | keyword arguments to a schema defined at module scope, and 24 | subsequently use "schema binding" to resolve them later. This can 25 | make your schema seem "more declarative": it allows you to group all 26 | the code that will be run when your schema is used together at module 27 | scope. 28 | 29 | What Is Schema Binding? 30 | ----------------------- 31 | 32 | - Any value passed as a keyword argument to a SchemaNode 33 | (e.g. ``description``, ``missing``, etc.) may be an instance of the 34 | ``colander.deferred`` class. Instances of the ``colander.deferred`` class 35 | are callables which accept two positional arguments: a ``node`` and a 36 | ``kw`` dictionary. 37 | 38 | - When a schema node is bound, it is cloned, and any ``colander.deferred`` 39 | values it has as attributes will be resolved by invoking the callable 40 | represented by the deferred value. 41 | 42 | - A ``colander.deferred`` value is a callable that accepts two 43 | positional arguments: the schema node being bound and a set of 44 | arbitrary keyword arguments. It should return a value appropriate 45 | for its usage (a widget, a missing value, a validator, etc). 46 | 47 | - Deferred values are not resolved until the schema is bound. 48 | 49 | - Schemas are bound via the :meth:`colander.SchemaNode.bind` method. 50 | For example: ``someschema.bind(a=1, b=2)``. The keyword values 51 | passed to ``bind`` are presented as the value ``kw`` to each 52 | ``colander.deferred`` value found. 53 | 54 | - The schema is bound recursively. Each of the schema node's children 55 | are also bound. 56 | 57 | An Example 58 | ---------- 59 | 60 | Let's take a look at an example: 61 | 62 | .. code-block:: python 63 | :linenos: 64 | 65 | import datetime 66 | import colander 67 | import deform 68 | 69 | @colander.deferred 70 | def deferred_date_validator(node, kw): 71 | max_date = kw.get('max_date') 72 | if max_date is None: 73 | max_date = datetime.date.today() 74 | return colander.Range(min=datetime.date.min, max=max_date) 75 | 76 | @colander.deferred 77 | def deferred_date_description(node, kw): 78 | max_date = kw.get('max_date') 79 | if max_date is None: 80 | max_date = datetime.date.today() 81 | return 'Blog post date (no earlier than %s)' % max_date.ctime() 82 | 83 | @colander.deferred 84 | def deferred_date_missing(node, kw): 85 | default_date = kw.get('default_date') 86 | if default_date is None: 87 | default_date = datetime.date.today() 88 | return default_date 89 | 90 | @colander.deferred 91 | def deferred_body_validator(node, kw): 92 | max_bodylen = kw.get('max_bodylen') 93 | if max_bodylen is None: 94 | max_bodylen = 1 << 18 95 | return colander.Length(max=max_bodylen) 96 | 97 | @colander.deferred 98 | def deferred_body_description(node, kw): 99 | max_bodylen = kw.get('max_bodylen') 100 | if max_bodylen is None: 101 | max_bodylen = 1 << 18 102 | return 'Blog post body (no longer than %s bytes)' % max_bodylen 103 | 104 | @colander.deferred 105 | def deferred_body_widget(node, kw): 106 | body_type = kw.get('body_type') 107 | if body_type == 'richtext': 108 | widget = deform.widget.RichTextWidget() 109 | else: 110 | widget = deform.widget.TextAreaWidget() 111 | return widget 112 | 113 | @colander.deferred 114 | def deferred_category_validator(node, kw): 115 | categories = kw.get('categories', []) 116 | return colander.OneOf([ x[0] for x in categories ]) 117 | 118 | @colander.deferred 119 | def deferred_category_widget(node, kw): 120 | categories = kw.get('categories', []) 121 | return deform.widget.RadioChoiceWidget(values=categories) 122 | 123 | @colander.deferred 124 | def deferred_author_node(node, kw): 125 | if kw.get('with_author'): 126 | return colander.SchemaNode( 127 | colander.String(), 128 | title='Author', 129 | description='Blog author', 130 | validator=colander.Length(min=3, max=100), 131 | widget=deform.widget.TextInputWidget(), 132 | ) 133 | 134 | class BlogPostSchema(colander.Schema): 135 | title = colander.SchemaNode( 136 | colander.String(), 137 | title='Title', 138 | description='Blog post title', 139 | validator=colander.Length(min=5, max=100), 140 | widget=deform.widget.TextInputWidget(), 141 | ) 142 | date = colander.SchemaNode( 143 | colander.Date(), 144 | title='Date', 145 | missing=deferred_date_missing, 146 | description=deferred_date_description, 147 | validator=deferred_date_validator, 148 | widget=deform.widget.DateInputWidget(), 149 | ) 150 | body = colander.SchemaNode( 151 | colander.String(), 152 | title='Body', 153 | description=deferred_body_description, 154 | validator=deferred_body_validator, 155 | widget=deferred_body_widget, 156 | ) 157 | category = colander.SchemaNode( 158 | colander.String(), 159 | title='Category', 160 | description='Blog post category', 161 | validator=deferred_category_validator, 162 | widget=deferred_category_widget, 163 | ) 164 | author = deferred_author_node 165 | 166 | schema = BlogPostSchema().bind( 167 | max_date=datetime.date.max, 168 | max_bodylen=5000, 169 | body_type='richtext', 170 | default_date=datetime.date.today(), 171 | categories=[('one', 'One'), ('two', 'Two')] 172 | with_author=True, 173 | ) 174 | 175 | We use ``colander.deferred`` in its preferred manner here: as a 176 | decorator to a function that takes two arguments. For a schema node 177 | value to be considered deferred, it must be an instance of 178 | ``colander.deferred`` and using that class as a decorator is the 179 | easiest way to ensure that this happens. 180 | 181 | To perform binding, the ``bind`` method of a schema node must be 182 | called. ``bind`` returns a *clone* of the schema node (and its 183 | children, recursively), with all ``colander.deferred`` values 184 | resolved. In the above example: 185 | 186 | - The ``date`` node's ``missing`` value will be ``datetime.date.today()``. 187 | 188 | - The ``date`` node's ``validator`` value will be a 189 | :class:`colander.Range` validator with a ``max`` of 190 | ``datetime.date.max``. 191 | 192 | - The ``date`` node's ``widget`` will be of the type ``DateInputWidget``. 193 | 194 | - The ``body`` node's ``description`` will be the string ``Blog post 195 | body (no longer than 5000 bytes)``. 196 | 197 | - The ``body`` node's ``validator`` value will be a 198 | :class:`colander.Length` validator with a ``max`` of 5000. 199 | 200 | - The ``body`` node's ``widget`` will be of the type ``RichTextWidget``. 201 | 202 | - The ``category`` node's ``validator`` will be of the type 203 | :class:`colander.OneOf`, and its ``choices`` value will be ``['one', 204 | 'two']``. 205 | 206 | - The ``category`` node's ``widget`` will be of the type 207 | ``RadioChoiceWidget``, and the values it will be provided will be 208 | ``[('one', 'One'), ('two', 'Two')]``. 209 | 210 | - The ``author`` node will only exist if the schema is bound 211 | with ``with_author=True``. 212 | 213 | ``after_bind`` 214 | -------------- 215 | 216 | Whenever a cloned schema node has had its values successfully bound, 217 | it can optionally call an ``after_bind`` callback attached to itself. 218 | This can be useful for adding and removing children from schema nodes: 219 | 220 | .. code-block:: python 221 | :linenos: 222 | 223 | def maybe_remove_date(node, kw): 224 | if not kw.get('use_date'): 225 | del node['date'] 226 | 227 | class BlogPostSchema(colander.Schema): 228 | title = colander.SchemaNode( 229 | colander.String(), 230 | title = 'Title', 231 | description = 'Blog post title', 232 | validator = colander.Length(min=5, max=100), 233 | widget = deform.widget.TextInputWidget(), 234 | ) 235 | date = colander.SchemaNode( 236 | colander.Date(), 237 | title = 'Date', 238 | description = 'Date', 239 | widget = deform.widget.DateInputWidget(), 240 | ) 241 | 242 | blog_schema = BlogPostSchema(after_bind=maybe_remove_date) 243 | blog_schema = blog_schema.bind(use_date=False) 244 | 245 | An ``after_bind`` callback is called after a clone of this node has 246 | bound all of its values successfully. The above example removes the 247 | ``date`` node if the ``use_date`` keyword in the binding keyword 248 | arguments is not true. 249 | 250 | The deepest nodes in the node tree are bound first, so the 251 | ``after_bind`` methods of the deepest nodes are called before the 252 | shallowest. 253 | 254 | An ``after_bind`` callback should should accept two values: ``node`` 255 | and ``kw``. ``node`` will be a clone of the bound node object, ``kw`` 256 | will be the set of keywords passed to the ``bind`` method. It usually 257 | operates on the ``node`` it is passed using the API methods described 258 | in :class:`SchemaNode`. 259 | 260 | Unbound Schemas With Deferreds 261 | ------------------------------ 262 | 263 | If you use a schema with deferred ``validator``, ``missing`` or 264 | ``default`` attributes, but you use it to perform serialization and 265 | deserialization without calling its ``bind`` method: 266 | 267 | - If ``validator`` is deferred, :meth:`~colander.SchemaNode.deserialize` will 268 | raise an :exc:`~colander.UnboundDeferredError`. 269 | 270 | - If ``missing`` is deferred, the field will be considered *required*. 271 | 272 | - If ``default`` is deferred, the serialization default will be 273 | assumed to be ``colander.null``. 274 | 275 | See Also 276 | -------- 277 | 278 | See also the :meth:`colander.SchemaNode.bind` method and the 279 | description of ``after_bind`` in the documentation of the 280 | :class:`colander.SchemaNode` constructor. 281 | 282 | -------------------------------------------------------------------------------- /docs/changes.rst: -------------------------------------------------------------------------------- 1 | ============== 2 | Change History 3 | ============== 4 | 5 | .. include:: ../CHANGES.rst 6 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # colander documentation build configuration file 4 | # 5 | # This file is execfile()d with the current directory set to its containing 6 | # dir. 7 | # 8 | # The contents of this file are pickled, so don't put values in the 9 | # namespace that aren't pickleable (module imports are okay, they're 10 | # removed automatically). 11 | # 12 | # All configuration values have a default value; values that are commented 13 | # out serve to show the default value. 14 | 15 | import sys, os, datetime 16 | import pkg_resources 17 | import pylons_sphinx_themes 18 | 19 | # General configuration 20 | # --------------------- 21 | 22 | # Add any Sphinx extension module names here, as strings. They can be 23 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. 24 | extensions = ['sphinx.ext.autodoc'] 25 | 26 | # Add any paths that contain templates here, relative to this directory. 27 | templates_path = ['.templates'] 28 | 29 | # The suffix of source filenames. 30 | source_suffix = '.rst' 31 | 32 | # The master toctree document. 33 | master_doc = 'index' 34 | 35 | # General substitutions. 36 | project = 'colander' 37 | thisyear = datetime.datetime.now().year 38 | copyright = '2012-%s, Agendaless Consulting ' % thisyear 39 | 40 | # The default replacements for |version| and |release|, also used in various 41 | # other places throughout the built documents. 42 | # 43 | # The short X.Y version. 44 | version = pkg_resources.get_distribution('colander').version 45 | # The full version, including alpha/beta/rc tags. 46 | release = version 47 | 48 | # There are two options for replacing |today|: either, you set today to 49 | # some non-false value, then it is used: 50 | #today = '' 51 | # Else, today_fmt is used as the format for a strftime call. 52 | today_fmt = '%B %d, %Y' 53 | 54 | # List of documents that shouldn't be included in the build. 55 | #unused_docs = ['_themes/README'] 56 | 57 | # List of directories, relative to source directories, that shouldn't be 58 | # searched for source files. 59 | #exclude_dirs = [] 60 | 61 | # The reST default role (used for this markup: `text`) to use for all 62 | # documents. 63 | #default_role = None 64 | 65 | # If true, '()' will be appended to :func: etc. cross-reference text. 66 | #add_function_parentheses = True 67 | 68 | # If true, the current module name will be prepended to all description 69 | # unit titles (such as .. function::). 70 | #add_module_names = True 71 | 72 | # If true, sectionauthor and moduleauthor directives will be shown in the 73 | # output. They are ignored by default. 74 | #show_authors = False 75 | 76 | # The name of the Pygments (syntax highlighting) style to use. 77 | pygments_style = 'sphinx' 78 | 79 | # Options for HTML output 80 | # ----------------------- 81 | # sys.path.append(os.path.abspath('_themes')) 82 | html_theme = 'pyramid' 83 | html_theme_path = pylons_sphinx_themes.get_html_themes_path() 84 | html_theme_options = dict(github_url='https://github.com/Pylons/colander') 85 | 86 | # The style sheet to use for HTML and HTML Help pages. A file of that name 87 | # must exist either in Sphinx' static/ path, or in one of the custom paths 88 | # given in html_static_path. 89 | #html_style = 'pylons.css' 90 | 91 | # The name for this set of Sphinx documents. If None, it defaults to 92 | # " v documentation". 93 | #html_title = None 94 | 95 | # A shorter title for the navigation bar. Default is the same as 96 | # html_title. 97 | #html_short_title = None 98 | 99 | # The name of an image file (within the static path) to place at the top of 100 | # the sidebar. 101 | #html_logo = '.static/logo_hi.gif' 102 | 103 | # The name of an image file (within the static path) to use as favicon of 104 | # the docs. This file should be a Windows icon file (.ico) being 16x16 or 105 | # 32x32 pixels large. 106 | #html_favicon = None 107 | 108 | # Add any paths that contain custom static files (such as style sheets) 109 | # here, relative to this directory. They are copied after the builtin 110 | # static files, so a file named "default.css" will overwrite the builtin 111 | # "default.css". 112 | #html_static_path = ['.static'] 113 | 114 | # If not '', a 'Last updated on:' timestamp is inserted at every page 115 | # bottom, using the given strftime format. 116 | html_last_updated_fmt = '%b %d, %Y' 117 | 118 | # Do not use smart quotes. 119 | smartquotes = False 120 | 121 | # Custom sidebar templates, maps document names to template names. 122 | # Control display of sidebars and include ethical ads from RTD 123 | html_sidebars = {'**': [ 124 | 'localtoc.html', 125 | 'ethicalads.html', 126 | 'relations.html', 127 | 'sourcelink.html', 128 | 'searchbox.html', 129 | ]} 130 | 131 | # Additional templates that should be rendered to pages, maps page names to 132 | # template names. 133 | #html_additional_pages = {} 134 | 135 | # If false, no module index is generated. 136 | #html_use_modindex = True 137 | 138 | # If false, no index is generated. 139 | #html_use_index = True 140 | 141 | # If true, the index is split into individual pages for each letter. 142 | #html_split_index = False 143 | 144 | # If true, the reST sources are included in the HTML build as 145 | # _sources/. 146 | #html_copy_source = True 147 | 148 | # If true, an OpenSearch description file will be output, and all pages 149 | # will contain a tag referring to it. The value of this option must 150 | # be the base URL from which the finished HTML is served. 151 | #html_use_opensearch = '' 152 | 153 | # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). 154 | #html_file_suffix = '' 155 | 156 | # Output file base name for HTML help builder. 157 | htmlhelp_basename = 'colanderdoc' 158 | 159 | 160 | # Options for LaTeX output 161 | # ------------------------ 162 | 163 | # The paper size ('letter' or 'a4'). 164 | #latex_paper_size = 'letter' 165 | 166 | # The font size ('10pt', '11pt' or '12pt'). 167 | #latex_font_size = '10pt' 168 | 169 | # Grouping the document tree into LaTeX files. List of tuples 170 | # (source start file, target name, title, 171 | # author, document class [howto/manual]). 172 | latex_documents = [ 173 | ('index', 'colander.tex', 'colander Documentation', 174 | 'Pylons Developers', 'manual'), 175 | ] 176 | 177 | # The name of an image file (relative to this directory) to place at the 178 | # top of the title page. 179 | #latex_logo = '.static/logo_hi.gif' 180 | 181 | # For "manual" documents, if this is true, then toplevel headings are 182 | # parts, not chapters. 183 | #latex_use_parts = False 184 | 185 | # Additional stuff for the LaTeX preamble. 186 | #latex_preamble = '' 187 | 188 | # Documents to append as an appendix to all manuals. 189 | #latex_appendices = [] 190 | 191 | # If false, no module index is generated. 192 | #latex_use_modindex = True 193 | 194 | #autoclass_content = 'both' 195 | -------------------------------------------------------------------------------- /docs/extending.rst: -------------------------------------------------------------------------------- 1 | Extending Colander 2 | ================== 3 | 4 | You can extend Colander by defining a new :term:`type` or by defining 5 | a new :term:`validator`. 6 | 7 | .. _defining_a_new_type: 8 | 9 | Defining a New Type 10 | ------------------- 11 | 12 | A type is a class that inherits from ``colander.SchemaType`` and implements 13 | these methods: 14 | 15 | - ``serialize``: converts a Python data structure (:term:`appstruct`) 16 | into a serialization (:term:`cstruct`). 17 | - ``deserialize``: converts a serialized value (:term:`cstruct`) into a 18 | Python data structure (:term:`appstruct`). 19 | - If it contains child nodes, it must also implement ``cstruct_children``, 20 | ``flatten``, ``unflatten``, ``set_value`` and ``get_value`` methods. It 21 | may inherit from ``Mapping``, ``Tuple``, ``Set``, ``List`` or ``Sequence`` 22 | to obtain these methods, but only if the expected behavior is the same. 23 | 24 | .. note:: 25 | 26 | See also: :class:`colander.interfaces.Type`. 27 | 28 | .. note:: 29 | 30 | The ``cstruct_children`` method became required in Colander 0.9.9. 31 | 32 | An Example 33 | ~~~~~~~~~~ 34 | 35 | Here's a type which implements boolean serialization and deserialization. It 36 | serializes a boolean to the string ``"true"`` or ``"false"`` or the special 37 | :attr:`colander.null` sentinel; it then deserializes a string (presumably 38 | ``"true"`` or ``"false"``, but allows some wiggle room for ``"t"``, ``"on"``, 39 | ``"yes"``, ``"y"``, and ``"1"``) to a boolean value. 40 | 41 | .. code-block:: python 42 | :linenos: 43 | 44 | from colander import SchemaType, Invalid, null 45 | 46 | class Boolean(SchemaType): 47 | def serialize(self, node, appstruct): 48 | if appstruct is null: 49 | return null 50 | if not isinstance(appstruct, bool): 51 | raise Invalid(node, '%r is not a boolean' % appstruct) 52 | return appstruct and 'true' or 'false' 53 | 54 | def deserialize(self, node, cstruct): 55 | if cstruct is null: 56 | return null 57 | if not isinstance(cstruct, basestring): 58 | raise Invalid(node, '%r is not a string' % cstruct) 59 | value = cstruct.lower() 60 | if value in ('true', 'yes', 'y', 'on', 't', '1'): 61 | return True 62 | return False 63 | 64 | Here's how you would use the resulting class as part of a schema: 65 | 66 | .. code-block:: python 67 | :linenos: 68 | 69 | import colander 70 | 71 | class Schema(colander.MappingSchema): 72 | interested = colander.SchemaNode(Boolean()) 73 | 74 | The above schema has a member named ``interested`` which will now be 75 | serialized and deserialized as a boolean, according to the logic defined in 76 | the ``Boolean`` type class. 77 | 78 | Method Specifications 79 | ~~~~~~~~~~~~~~~~~~~~~ 80 | 81 | ``serialize`` 82 | ^^^^^^^^^^^^^ 83 | 84 | Arguments: 85 | 86 | - ``node``: the ``SchemaNode`` associated with this type 87 | - ``appstruct``: the :term:`appstruct` value that needs to be serialized 88 | 89 | If ``appstruct`` is invalid, it should raise :exc:`colander.Invalid`, 90 | passing ``node`` as the first constructor argument. 91 | 92 | It must deal specially with the value :attr:`colander.null`. 93 | 94 | It must be able to make sense of any value generated by ``deserialize``. 95 | 96 | ``deserialize`` 97 | ^^^^^^^^^^^^^^^ 98 | 99 | Arguments: 100 | 101 | - ``node``: the ``SchemaNode`` associated with this type 102 | - ``cstruct``: the :term:`cstruct` value that needs to be deserialized 103 | 104 | If ``cstruct`` is invalid, it should raise :exc:`colander.Invalid`, 105 | passing ``node`` as the first constructor argument. 106 | 107 | It must deal specially with the value :attr:`colander.null`. 108 | 109 | It must be able to make sense of any value generated by ``serialize``. 110 | 111 | ``cstruct_children`` 112 | ^^^^^^^^^^^^^^^^^^^^ 113 | 114 | Arguments: 115 | 116 | - ``node``: the ``SchemaNode`` associated with this type 117 | - ``cstruct``: the :term:`cstruct` that the caller wants to obtain child values 118 | for 119 | 120 | You only need to define this method for complex types that have child nodes, 121 | such as mappings and sequences. 122 | 123 | ``cstruct_children`` should return a value based on ``cstruct`` for 124 | each child node in ``node`` (or an empty list if ``node`` has no children). If 125 | ``cstruct`` does not contain a value for a particular child, that child should 126 | be replaced with the ``colander.null`` value in the returned list. 127 | 128 | ``cstruct_children`` should *never* raise an exception, even if it is passed a 129 | nonsensical ``cstruct`` argument. In that case, it should return a sequence of 130 | as many ``colander.null`` values as there are child nodes. 131 | 132 | 133 | Constructor (``__init__``) 134 | ^^^^^^^^^^^^^^^^^^^^^^^^^^ 135 | 136 | `SchemaType` does not define a constructor, and user code (not Colander) 137 | instantiates type objects, so custom types may define this method and use it 138 | for their own purposes. 139 | 140 | 141 | Null Values 142 | ~~~~~~~~~~~ 143 | 144 | Both the ``serialize`` and ``deserialize`` methods must be able to 145 | receive :attr:`colander.null` values and handle them intelligently. This 146 | will happen whenever the data structure being serialized or deserialized 147 | does not provide a value for this node. In many cases, ``serialize`` or 148 | ``deserialize`` should just return :attr:`colander.null` when passed 149 | :attr:`colander.null`. 150 | 151 | A type might also choose to return :attr:`colander.null` if the value it 152 | receives is *logically* (but not literally) null. For example, 153 | :class:`colander.String` type converts the empty string to ``colander.null`` 154 | within its ``deserialize`` method. 155 | 156 | .. code-block:: python 157 | :linenos: 158 | 159 | def deserialize(self, node, cstruct): 160 | if not cstruct: 161 | return null 162 | 163 | 164 | .. _defining_a_new_validator: 165 | 166 | Defining a New Validator 167 | ------------------------ 168 | 169 | A validator is a callable which accepts two positional arguments: 170 | ``node`` and ``value``. It returns ``None`` if the value is valid. 171 | It raises a :class:`colander.Invalid` exception if the value is not 172 | valid. Here's a validator that checks if the value is a valid credit 173 | card number. 174 | 175 | .. code-block:: python 176 | :linenos: 177 | 178 | def luhnok(node, value): 179 | """ checks to make sure that the value passes a luhn mod-10 checksum """ 180 | sum = 0 181 | num_digits = len(value) 182 | oddeven = num_digits & 1 183 | 184 | for count in range(0, num_digits): 185 | digit = int(value[count]) 186 | 187 | if not (( count & 1 ) ^ oddeven ): 188 | digit = digit * 2 189 | if digit > 9: 190 | digit = digit - 9 191 | 192 | sum = sum + digit 193 | 194 | if not (sum % 10) == 0: 195 | raise Invalid(node, 196 | '%r is not a valid credit card number' % value) 197 | 198 | Here's how the resulting ``luhnok`` validator might be used in a 199 | schema: 200 | 201 | .. code-block:: python 202 | :linenos: 203 | 204 | import colander 205 | 206 | class Schema(colander.MappingSchema): 207 | cc_number = colander.SchemaNode(colander.String(), validator=lunhnok) 208 | 209 | Note that the validator doesn't need to check if the ``value`` is a 210 | string: this has already been done as the result of the type of the 211 | ``cc_number`` schema node being :class:`colander.String`. Validators 212 | are always passed the *deserialized* value when they are invoked. 213 | 214 | The ``node`` value passed to the validator is a schema node object; it 215 | must in turn be passed to the :exc:`colander.Invalid` exception 216 | constructor if one needs to be raised. 217 | 218 | For a more formal definition of a the interface of a validator, see 219 | :class:`colander.interfaces.Validator`. 220 | -------------------------------------------------------------------------------- /docs/glossary.rst: -------------------------------------------------------------------------------- 1 | .. _glossary: 2 | 3 | Glossary 4 | ======== 5 | 6 | .. glossary:: 7 | :sorted: 8 | 9 | cstruct 10 | A data structure generated by the 11 | :meth:`colander.SchemaNode.serialize` method, capable of being 12 | consumed by the :meth:`colander.SchemaNode.deserialize` method. 13 | 14 | appstruct 15 | A raw application data structure (a structure of complex Python 16 | objects), passed to the :meth:`colander.SchemaNode.serialize` 17 | method for serialization. The 18 | :meth:`colander.SchemaNode.deserialize` method accepts a 19 | :term:`cstruct` and returns an appstruct. 20 | 21 | schema 22 | A nested collection of :term:`schema node` objects representing 23 | an arrangement of data. 24 | 25 | schema node 26 | A schema node is an object which can serialize an 27 | :term:`appstruct` to a :term:`cstruct` and deserialize a 28 | :term:`appstruct` from a :term:`cstruct` an (object derived from 29 | :class:`colander.SchemaNode` or one of the colander Schema 30 | classes). 31 | 32 | type 33 | An object representing a particular type of data (mapping, 34 | boolean, string, etc) capable of serializing an :term:`appstruct` 35 | and of deserializing a :term:`cstruct`. Colander has various 36 | built-in types (:class:`colander.String`, 37 | :class:`colander.Mapping`, etc) and may be extended with 38 | additional types (see :ref:`defining_a_new_type`). 39 | 40 | validator 41 | A Colander validator callable. Accepts a ``node`` object and a 42 | ``value`` and either raises a :exc:`colander.Invalid` exception 43 | or returns ``None``. Used as the ``validator=`` argument to a 44 | schema node, ensuring that the input meets the requirements of 45 | the schema. Built-in validators exist in Colander 46 | (e.g. :class:`colander.OneOf`, :class:`colander.Range`, etc), and 47 | new validators can be defined to extend Colander (see 48 | :ref:`defining_a_new_validator`). 49 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | 2 | .. _overview: 3 | 4 | Colander 5 | ======== 6 | 7 | Colander is useful as a system for validating and deserializing data obtained 8 | via XML, JSON, an HTML form post or any other equally simple data 9 | serialization. 10 | It is tested on Python 2.7, 3.5, 3.6, 3.7, 3.8, 3.9, and 3.10, and PyPy 2.7 and 11 | PyPy 3.8. 12 | Colander can be used to: 13 | 14 | - Define a data schema. 15 | 16 | - Deserialize a data structure composed of strings, mappings, and 17 | lists into an arbitrary Python structure after validating the data 18 | structure against a data schema. 19 | 20 | - Serialize an arbitrary Python structure to a data structure composed 21 | of strings, mappings, and lists. 22 | 23 | Colander is a good basis for form generation systems, data 24 | description systems, and configuration systems. 25 | 26 | Out of the box, Colander can serialize and deserialize various types 27 | of objects, including: 28 | 29 | - A mapping object (e.g. dictionary). 30 | 31 | - A variable-length sequence of objects (each object is of the same 32 | type). 33 | 34 | - A fixed-length tuple of objects (each object is of a different 35 | type). 36 | 37 | - A string or Unicode object. 38 | 39 | - An integer. 40 | 41 | - A float. 42 | 43 | - A decimal float. 44 | 45 | - A boolean. 46 | 47 | - An importable Python object (to a dotted Python object path). 48 | 49 | - A Python ``datetime.datetime`` object. 50 | 51 | - A Python ``datetime.date`` object. 52 | 53 | - A Python ``enum.Enum`` object. 54 | 55 | Colander allows additional data structures to be serialized and 56 | deserialized by allowing a developer to define new "types". 57 | 58 | The error messages used by Colander's default types are 59 | internationalizable. 60 | 61 | .. toctree:: 62 | :maxdepth: 2 63 | 64 | basics.rst 65 | null_and_drop.rst 66 | extending.rst 67 | binding.rst 68 | manipulation.rst 69 | interfaces.rst 70 | api.rst 71 | glossary.rst 72 | changes.rst 73 | 74 | Indices and tables 75 | ------------------ 76 | 77 | * :ref:`genindex` 78 | * :ref:`modindex` 79 | * :ref:`search` 80 | 81 | -------------------------------------------------------------------------------- /docs/interfaces.rst: -------------------------------------------------------------------------------- 1 | Interfaces 2 | ---------- 3 | 4 | .. automodule:: colander.interfaces 5 | 6 | .. autofunction:: Preparer 7 | 8 | .. autofunction:: Validator 9 | 10 | .. autoclass:: Type 11 | :members: 12 | 13 | -------------------------------------------------------------------------------- /docs/manipulation.rst: -------------------------------------------------------------------------------- 1 | .. _manipulating_data_structures: 2 | 3 | Manipulating Data Structures 4 | ============================ 5 | 6 | Colander schemas have some utility functions which can be used to manipulate 7 | an :term:`appstruct` or a :term:`cstruct`. Nested data structures can be 8 | flattened into a single dictionary or a single flattened dictionary can be used 9 | to produce a nested data structure. Values of particular nodes can also be set 10 | or retrieved based on a flattened path spec. 11 | 12 | Flattening a Data Structure 13 | --------------------------- 14 | 15 | :meth:`colander.SchemaNode.flatten` can be used to convert a datastructure with 16 | nested dictionaries and/or lists into a single flattened dictionary where each 17 | key in the dictionary is a dotted name path to the node in the nested structure. 18 | 19 | Consider the following schema: 20 | 21 | .. code-block:: python 22 | :linenos: 23 | 24 | import colander 25 | 26 | class Friend(colander.TupleSchema): 27 | rank = colander.SchemaNode(colander.Int(), 28 | validator=colander.Range(0, 9999)) 29 | name = colander.SchemaNode(colander.String()) 30 | 31 | class Phone(colander.MappingSchema): 32 | location = colander.SchemaNode(colander.String(), 33 | validator=colander.OneOf(['home', 'work'])) 34 | number = colander.SchemaNode(colander.String()) 35 | 36 | class Friends(colander.SequenceSchema): 37 | friend = Friend() 38 | 39 | class Phones(colander.SequenceSchema): 40 | phone = Phone() 41 | 42 | class Person(colander.MappingSchema): 43 | name = colander.SchemaNode(colander.String()) 44 | age = colander.SchemaNode(colander.Int(), 45 | validator=colander.Range(0, 200)) 46 | friends = Friends() 47 | phones = Phones() 48 | 49 | Consider also a particular serialization of data using that schema: 50 | 51 | .. code-block:: python 52 | :linenos: 53 | 54 | appstruct = { 55 | 'name':'keith', 56 | 'age':20, 57 | 'friends':[(1, 'jim'),(2, 'bob'), (3, 'joe'), (4, 'fred')], 58 | 'phones':[{'location':'home', 'number':'555-1212'}, 59 | {'location':'work', 'number':'555-8989'},], 60 | } 61 | 62 | This data can be flattened: 63 | 64 | .. code-block:: python 65 | :linenos: 66 | 67 | schema = Person() 68 | fstruct = schema.flatten(appstruct) 69 | 70 | The resulting flattened structure would look like this: 71 | 72 | .. code-block:: python 73 | :linenos: 74 | 75 | { 76 | 'name': 'keith', 77 | 'age': 20, 78 | 'friends.0.rank': 1, 79 | 'friends.0.name': 'jim', 80 | 'friends.1.rank': 2, 81 | 'friends.1.name': 'bob', 82 | 'friends.2.rank': 3, 83 | 'friends.2.name': 'joe', 84 | 'friends.3.rank': 4, 85 | 'friends.3.name': 'fred', 86 | 'phones.0.location': 'home', 87 | 'phones.0.number': '555-1212', 88 | 'phones.1.location': 'work', 89 | 'phones.1.number': '555-8989', 90 | } 91 | 92 | The process can be reversed using :meth:`colander.SchemaNode.unflatten`: 93 | 94 | .. code-block:: python 95 | :linenos: 96 | 97 | appstruct = schema.unflatten(fstruct) 98 | 99 | Either an :term:`appstruct` or a :term:`cstruct` can be flattened or unflattened 100 | in this way. 101 | 102 | Accessing and Mutating Nodes in a Data Structure 103 | ------------------------------------------------ 104 | 105 | :attr:`colander.SchemaNode.get_value` and :attr:`colander.SchemaNode.set_value` 106 | can be used to access and mutate nodes in an :term:`appstruct` or 107 | :term:`cstruct`. Using the example from above: 108 | 109 | .. code-block:: python 110 | :linenos: 111 | 112 | # How much do I like Joe? 113 | rank = schema.get_value(appstruct, 'friends.2.rank') 114 | 115 | # Joe bought me beer. Let's promote Joe. 116 | schema.set_value(appstruct, 'friends.2.rank', rank + 5000) 117 | -------------------------------------------------------------------------------- /docs/null_and_drop.rst: -------------------------------------------------------------------------------- 1 | .. _null_and_drop: 2 | 3 | The Null and Drop Values 4 | ======================== 5 | 6 | :attr:`colander.null` is a sentinel value which may be passed to 7 | :meth:`colander.SchemaNode.serialize` during serialization or to 8 | :meth:`colander.SchemaNode.deserialize` during deserialization. 9 | 10 | :attr:`colander.drop` is a sentinel value which controls the 11 | behavior of collection-like :class:`colander.SchemaNode` subclasses. 12 | 13 | During serialization, the use of :attr:`colander.null` indicates that 14 | the :term:`appstruct` value corresponding to the node it's passed to 15 | is missing and the value of the ``default`` attribute of the 16 | corresponding node should be used instead. If the node's ``default`` 17 | attribute is :attr:`colander.drop`, the serializer will skip the node. 18 | 19 | During deserialization, the use of :attr:`colander.null` indicates 20 | that the :term:`cstruct` value corresponding to the node it's passed 21 | to is missing, and if possible, the value of the ``missing`` attribute 22 | of the corresponding node should be used instead. If the node's ``missing`` 23 | attribute is :attr:`colander.drop`, the deserializer will skip the node. 24 | 25 | Note that :attr:`colander.null` has no relationship to the built-in Python 26 | ``None`` value. ``colander.null`` is used instead of ``None`` because 27 | ``None`` is a potentially valid value for some serializations and 28 | deserializations, and using it as a sentinel would prevent ``None`` from 29 | being used in this way. 30 | 31 | .. _serializing_null: 32 | 33 | Serializing The Null Value 34 | -------------------------- 35 | 36 | A node will attempt to serialize its *default value* during 37 | :meth:`colander.SchemaNode.serialize` if the value it is passed as an 38 | ``appstruct`` argument is the :attr:`colander.null` sentinel value. 39 | 40 | The *default value* of a node is specified during schema creation as 41 | its ``default`` attribute / argument. For example, the ``hair_color`` 42 | node below has a default value of ``brown``: 43 | 44 | .. code-block:: python 45 | 46 | import colander 47 | 48 | class Person(colander.MappingSchema): 49 | name = colander.SchemaNode(colander.String()) 50 | age = colander.SchemaNode(colander.Int(), 51 | validator=colander.Range(0, 200)) 52 | hair_color = colander.SchemaNode(colander.String(), default='brown') 53 | 54 | Because the ``hair_color`` node is passed a ``default`` value, if the 55 | above schema is used to serialize a mapping that does not have a 56 | ``hair_color`` key, the default will be serialized: 57 | 58 | .. code-block:: python 59 | 60 | schema = Person() 61 | serialized = schema.serialize({'name':'Fred', 'age':20}) 62 | 63 | Even though we did not include the ``hair_color`` attribute in the 64 | appstruct we fed to ``serialize``, the value of ``serialized`` above 65 | will be ``{'name':'Fred, 'age':'20', 'hair_color':'brown'}``. This is 66 | because a ``default`` value of ``brown`` was provided during schema 67 | node construction for ``hair_color``. 68 | 69 | The same outcome would have been true had we fed the schema a mapping 70 | for serialization which had the :attr:`colander.null` sentinel as the 71 | ``hair_color`` value: 72 | 73 | .. code-block:: python 74 | 75 | import colander 76 | 77 | schema = Person() 78 | serialized = schema.serialize({'name':'Fred', 'age':20, 79 | 'hair_color':colander.null}) 80 | 81 | When the above is run, the value of ``serialized`` will be 82 | ``{'name':'Fred, 'age':'20', 'hair_color':'brown'}`` just as it was in 83 | the example where ``hair_color`` was not present in the mapping. 84 | 85 | As we can see, serializations may be done of partial data structures; 86 | the :attr:`colander.null` value is inserted into the serialization 87 | whenever a corresponding value in the data structure being serialized 88 | is missing. 89 | 90 | .. note:: The injection of the :attr:`colander.null` value into a 91 | serialization when a default doesn't exist for the corresponding 92 | node is not a behavior shared during both serialization and 93 | deserialization. While a *serialization* can be performed against 94 | a partial data structure without corresponding node defaults, a 95 | *deserialization* cannot be done to partial data without 96 | corresponding node ``missing`` values. When a value is missing 97 | from a data structure being deserialized, and no ``missing`` value 98 | exists for the node corresponding to the missing item in the data 99 | structure, a :class:`colander.Invalid` exception will be the 100 | result. 101 | 102 | If, during serialization, a value for the node is missing from the 103 | cstruct and the node does not possess an explicit *default value*, the 104 | :attr:`colander.null` sentinel value is passed to the type's 105 | ``serialize`` method directly, instructing the type to serialize a 106 | type-specific *null value*. 107 | 108 | Serialization of a null value is completely type-specific, meaning 109 | each type is free to serialize :attr:`colander.null` to a value that 110 | makes sense for that particular type. For example, the null 111 | serialization value of a :class:`colander.String` type is the empty 112 | string. 113 | 114 | For example: 115 | 116 | .. code-block:: python 117 | 118 | import colander 119 | 120 | class Person(colander.MappingSchema): 121 | name = colander.SchemaNode(colander.String()) 122 | age = colander.SchemaNode(colander.Int(), 123 | validator=colander.Range(0, 200)) 124 | hair_color = colander.SchemaNode(colander.String()) 125 | 126 | 127 | schema = Person() 128 | serialized = schema.serialize({'name':'Fred', 'age':20}) 129 | 130 | In the above example, the ``hair_color`` value is missing and the 131 | schema does *not* name a ``default`` value for ``hair_color``. 132 | However, when we attempt to serialize the data structure, an error is 133 | not raised. Instead, the value for ``serialized`` above will be 134 | ``{'name':'Fred, 'age':'20', 'hair_color':colander.null}``. 135 | 136 | Because we did not include the ``hair_color`` attribute in the data we 137 | fed to ``serialize``, and there was no ``default`` value associated 138 | with ``hair_color`` to fall back to, the :attr:`colander.null` value 139 | is passed as the ``appstruct`` value to the ``serialize`` method of 140 | the underlying type (:class:`colander.String`). The return value of 141 | that type's ``serialize`` method when :attr:`colander.null` is passed 142 | as the ``appstruct`` is placed into the serialization. 143 | :class:`colander.String` happens to *return* :attr:`colander.null` 144 | when it is passed :attr:`colander.null` as its appstruct argument, so 145 | this is what winds up in the resulting cstruct. 146 | 147 | The :attr:`colander.null` value will be passed to a type either 148 | directly or indirectly: 149 | 150 | - directly: because :attr:`colander.null` is passed directly to the 151 | ``serialize`` method of a node. 152 | 153 | - indirectly: because every schema node uses a :attr:`colander.null` 154 | value as its ``default`` attribute when no explicit default is 155 | provided. 156 | 157 | When a particular type cannot serialize the null value to anything 158 | sensible, that type's ``serialize`` method must return the null object 159 | itself as a serialization. For example, when the 160 | :class:`colander.Boolean` type is asked to serialize the 161 | :attr:`colander.null` value, its ``serialize`` method simply returns 162 | the :attr:`colander.null` value (because null is conceptually neither 163 | true nor false). 164 | 165 | Therefore, when :attr:`colander.null` is used as input to 166 | serialization, or as the default value of a schema node, it is 167 | possible that the :attr:`colander.null` value will placed into the 168 | serialized data structure. The consumer of the serialization must 169 | anticipate this and deal with the special :attr:`colander.null` value 170 | in the output however it sees fit. 171 | 172 | Serialization Combinations 173 | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 174 | 175 | Within this table, the ``Value`` column represents the value passed to 176 | the :meth:`colander.SchemaNode.serialize` method of a particular 177 | schema node, the ``Default`` column represents the ``default`` value 178 | of that schema node, and the ``Result`` column is a description of the 179 | result of invoking the :meth:`colander.SchemaNode.serialize` method of 180 | the schema node with the effective value. 181 | 182 | ===================== ===================== =========================== 183 | Value Default Result 184 | ===================== ===================== =========================== 185 | colander.null colander.null null serialized 186 | colander.null null serialized 187 | colander.null value value serialized 188 | colander.null null serialized 189 | null serialized 190 | value value serialized 191 | value colander.null value serialized 192 | value value serialized 193 | value_a value_b value_a serialized 194 | ===================== ===================== =========================== 195 | 196 | .. note:: 197 | 198 | ```` in the above table represents the circumstance in which a 199 | key present in a :class:`colander.MappingSchema` is not present in a 200 | mapping passed to its :meth:`colander.SchemaNode.serialize` method. In 201 | reality, ```` means exactly the same thing as 202 | :attr:`colander.null`, because the :class:`colander.Mapping` type does 203 | the equivalent of ``mapping.get(keyname, colander.null)`` to find a 204 | subvalue during serialization. 205 | 206 | .. _deserializing_null: 207 | 208 | Deserializing The Null Value 209 | ---------------------------- 210 | 211 | The data structure passed to :meth:`colander.SchemaNode.deserialize` 212 | may contain one or more :attr:`colander.null` sentinel markers. 213 | 214 | When a :attr:`colander.null` sentinel marker is passed to the 215 | :meth:`colander.SchemaNode.deserialize` method of a particular node in 216 | a schema, the node will take the following steps: 217 | 218 | - The *type* object's ``deserialize`` method will be called with the null 219 | value to allow the type to convert the null value to a type-specific 220 | default. The resulting "appstruct" is used instead of the value passed 221 | directly to :meth:`colander.SchemaNode.deserialize` in subsequent 222 | operations. Most types, when they receive the ``null`` value will simply 223 | return it, however. 224 | 225 | - If the appstruct value computed by the type's ``deserialize`` method is 226 | ``colander.null`` and the schema node has an explicit ``missing`` attribute 227 | (the node's constructor was supplied with an explicit ``missing`` 228 | argument), the ``missing`` value will be returned. Note that when this 229 | happens, the ``missing`` value is not validated by any schema node 230 | validator: it is simply returned. 231 | 232 | - If the appstruct value computed by the type's ``deserialize`` method is 233 | ``colander.null`` and the schema node does *not* have an explicitly 234 | provided ``missing`` attribute (the node's constructor was not supplied 235 | with an explicit ``missing`` value), a :exc:`colander.Invalid` exception 236 | will be raised with a message indicating that the field is required. 237 | 238 | .. note:: 239 | 240 | There are differences between serialization and deserialization involving 241 | the :attr:`colander.null` value. During serialization, if an 242 | :attr:`colander.null` value is encountered, and no valid ``default`` 243 | attribute exists on the node related to the value the *null value* for 244 | that node is returned. Deserialization, however, doesn't use the 245 | ``default`` attribute of the node to find a default deserialization value 246 | in the same circumstance; instead it uses the ``missing`` attribute 247 | instead. Also, if, during deserialization, an :attr:`colander.null` value 248 | is encountered as the value passed to the deserialize method, and no 249 | explicit ``missing`` value exists for the node, a :exc:`colander.Invalid` 250 | exception is raised (:attr:`colander.null` is not returned, as it is 251 | during serialization). 252 | 253 | Here's an example of a deserialization which uses a ``missing`` value 254 | in the schema as a deserialization default value: 255 | 256 | .. code-block:: python 257 | 258 | import colander 259 | 260 | class Person(colander.MappingSchema): 261 | name = colander.SchemaNode(colander.String()) 262 | age = colander.SchemaNode(colander.Int(), missing=None) 263 | 264 | schema = Person() 265 | deserialized = schema.deserialize({'name':'Fred', 'age':colander.null}) 266 | 267 | The value for ``deserialized`` above will be ``{'name':'Fred, 268 | 'age':None}``. 269 | 270 | Because the ``age`` schema node is provided a ``missing`` value of 271 | ``None``, if that schema is used to deserialize a mapping that has an 272 | an ``age`` key of :attr:`colander.null`, the ``missing`` value of 273 | ``None`` is serialized into the appstruct output for ``age``. 274 | 275 | .. note:: Note that ``None`` can be used for the ``missing`` schema 276 | node value as required, as in the above example. It's no different 277 | than any other value used as ``missing``. The empty string can 278 | also be used as the ``missing`` value if that is helpful. 279 | 280 | The :attr:`colander.null` value is also the default, so it needn't be 281 | specified in the cstruct. Therefore, the ``deserialized`` value of 282 | the below is equivalent to the above's: 283 | 284 | .. code-block:: python 285 | 286 | import colander 287 | 288 | class Person(colander.MappingSchema): 289 | name = colander.SchemaNode(colander.String()) 290 | age = colander.SchemaNode(colander.Int(), missing=None) 291 | 292 | schema = Person() 293 | deserialized = schema.deserialize({'name':'Fred'}) 294 | 295 | Deserialization Combinations 296 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 297 | 298 | Within this table, the ``Value`` column represents the value passed to 299 | the :meth:`colander.SchemaNode.deserialize` method of a particular 300 | schema node, the ``Missing`` column represents the ``missing`` value 301 | of that schema node, and the ``Result`` column is a description of the 302 | result of invoking the :meth:`colander.SchemaNode.deserialize` method 303 | of the schema node with the effective value. 304 | 305 | ===================== ===================== =========================== 306 | Value Missing Result 307 | ===================== ===================== =========================== 308 | colander.null colander.null colander.null used 309 | colander.null Invalid exception raised 310 | colander.null value value used 311 | colander.null colander.null used 312 | Invalid exception raised 313 | value value used 314 | value colander.null value used 315 | value value used 316 | value_a value_b value_a used 317 | ===================== ===================== =========================== 318 | 319 | .. note:: 320 | 321 | ```` in the above table represents the circumstance in which a 322 | key present in a :class:`colander.MappingSchema` is not present in a 323 | mapping passed to its :meth:`colander.SchemaNode.deserialize` method. In 324 | reality, ```` means exactly the same thing as 325 | :attr:`colander.null`, because the :class:`colander.Mapping` type does the 326 | equivalent of ``mapping.get(keyname, colander.null)`` to find a subvalue 327 | during deserialization. 328 | 329 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["setuptools >= 41", "wheel", "babel"] 3 | build-backend = "setuptools.build_meta" 4 | 5 | [tool.black] 6 | line-length = 79 7 | skip-string-normalization = true 8 | target_version = ["py37"] 9 | exclude = ''' 10 | /( 11 | \.git 12 | | \.mypy_cache 13 | | \.tox 14 | | \.venv 15 | | \.pytest_cache 16 | | dist 17 | | build 18 | | docs 19 | | env.* 20 | )/ 21 | ''' 22 | 23 | # This next section only exists for people that have their editors 24 | # automatically call isort, black already sorts entries on its own when run. 25 | [tool.isort] 26 | profile = "black" 27 | py_version = 3 28 | combine_as_imports = true 29 | line_length = 79 30 | force_sort_within_sections = true 31 | no_lines_before = "THIRDPARTY" 32 | sections = "FUTURE,THIRDPARTY,FIRSTPARTY,LOCALFOLDER" 33 | default_section = "THIRDPARTY" 34 | known_first_party = "colander" 35 | -------------------------------------------------------------------------------- /pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | python_files = test_*.py 3 | testpaths = 4 | tests 5 | -------------------------------------------------------------------------------- /rtd.txt: -------------------------------------------------------------------------------- 1 | -e .[docs] 2 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | name = colander 3 | version = 2.0 4 | description = A simple schema-based serialization and deserialization library 5 | long_description = file: README.rst, CHANGES.rst 6 | long_description_content_type = text/x-rst 7 | keywords = serialize deserialize validate schema validation 8 | license = BSD-derived (http://www.repoze.org/LICENSE.txt) 9 | license_files = 10 | LICENSE.txt 11 | classifiers = 12 | Development Status :: 6 - Mature 13 | Intended Audience :: Developers 14 | Programming Language :: Python 15 | Programming Language :: Python :: 3 16 | Programming Language :: Python :: 3.8 17 | Programming Language :: Python :: 3.9 18 | Programming Language :: Python :: 3.10 19 | Programming Language :: Python :: 3.11 20 | Programming Language :: Python :: 3.12 21 | Programming Language :: Python :: Implementation :: CPython 22 | Programming Language :: Python :: Implementation :: PyPy 23 | Operating System :: OS Independent 24 | License :: Repoze Public License 25 | url = https://github.com/Pylons/colander 26 | project_urls = 27 | Documentation = https://docs.pylonsproject.org/projects/colander/en/latest/index.html 28 | Changelog = https://docs.pylonsproject.org/projects/colander/en/latest/changes.html 29 | Issue Tracker = https://github.com/Pylons/colander/issues 30 | author = Agendaless Consulting 31 | author_email = pylons-discuss@googlegroups.com 32 | maintainer = Pylons Project 33 | maintainer_email = pylons-discuss@googlegroups.com 34 | 35 | [options] 36 | package_dir= 37 | =src 38 | packages=find_namespace: 39 | include_package_data = True 40 | python_requires = >=3.8 41 | install_requires = 42 | translationstring 43 | iso8601 44 | 45 | [options.packages.find] 46 | where=src 47 | 48 | [options.extras_require] 49 | testing = 50 | pytest 51 | pytest-cov 52 | coverage>=5.0 53 | babel 54 | 55 | docs = 56 | Sphinx>=1.8.1 57 | docutils 58 | pylons-sphinx-themes>=1.0.9 59 | setuptools 60 | 61 | [check-manifest] 62 | ignore-bad-ideas = 63 | src/colander/locale/**/*.mo 64 | 65 | [compile_catalog] 66 | directory = src/colander/locale 67 | domain = colander 68 | statistics = true 69 | 70 | [extract_messages] 71 | add_comments = TRANSLATORS: 72 | input_paths = src/colander 73 | output_file = src/colander/locale/colander.pot 74 | width = 80 75 | 76 | [init_catalog] 77 | domain = colander 78 | input_file = src/colander/locale/colander.pot 79 | output_dir = src/colander/locale 80 | 81 | [update_catalog] 82 | domain = colander 83 | input_file = src/colander/locale/colander.pot 84 | output_dir = src/colander/locale 85 | previous = true 86 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from babel.messages import frontend as babel 2 | from setuptools import setup 3 | 4 | setup( 5 | cmdclass={ 6 | 'compile_catalog': babel.compile_catalog, 7 | 'extract_messages': babel.extract_messages, 8 | 'init_catalog': babel.init_catalog, 9 | 'update_catalog': babel.update_catalog, 10 | } 11 | ) 12 | -------------------------------------------------------------------------------- /src/colander/interfaces.py: -------------------------------------------------------------------------------- 1 | def Preparer(value): 2 | """ 3 | A preparer is called after deserialization of a value but before 4 | that value is validated. 5 | 6 | Any modifications to ``value`` required should be made by 7 | returning the modified value rather than modifying in-place. 8 | 9 | If no modification is required, then ``value`` should be returned 10 | as-is. 11 | """ 12 | 13 | 14 | def Validator(node, value): 15 | """ 16 | A validator is called after preparation of the deserialized value. 17 | 18 | If ``value`` is not valid, raise a :class:`colander.Invalid` 19 | instance as an exception after. 20 | 21 | ``node`` is a :class:`colander.SchemaNode` instance, for use when 22 | raising a :class:`colander.Invalid` exception. 23 | """ 24 | 25 | 26 | class Type: 27 | def serialize(self, node, appstruct): 28 | """ 29 | Serialize the :term:`appstruct` represented by ``appstruct`` 30 | to a :term:`cstruct`. The serialization should be composed of 31 | one or more objects which can be deserialized by the 32 | :meth:`colander.interfaces.Type.deserialize` method of this 33 | type. 34 | 35 | ``node`` is a :class:`colander.SchemaNode` instance. 36 | 37 | ``appstruct`` is an :term:`appstruct`. 38 | 39 | If ``appstruct`` is the special value :attr:`colander.null`, 40 | the type should serialize a null value. 41 | 42 | If the object cannot be serialized for any reason, a 43 | :exc:`colander.Invalid` exception should be raised. 44 | """ 45 | 46 | def deserialize(self, node, cstruct): 47 | """ 48 | Deserialze the :term:`cstruct` represented by ``cstruct`` to 49 | an :term:`appstruct`. The deserialization should be composed 50 | of one or more objects which can be serialized by the 51 | :meth:`colander.interfaces.Type.serialize` method of this 52 | type. 53 | 54 | ``node`` is a :class:`colander.SchemaNode` instance. 55 | 56 | ``cstruct`` is a :term:`cstruct`. 57 | 58 | If the object cannot be deserialized for any reason, a 59 | :exc:`colander.Invalid` exception should be raised. 60 | """ 61 | -------------------------------------------------------------------------------- /src/colander/locale/colander.pot: -------------------------------------------------------------------------------- 1 | # Translations template for colander. 2 | # Copyright (C) 2023 ORGANIZATION 3 | # This file is distributed under the same license as the colander project. 4 | # FIRST AUTHOR , 2023. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: colander 2.0\n" 10 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 11 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=utf-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Generated-By: Babel 2.11.0\n" 19 | 20 | #: src/colander/__init__.py:319 21 | msgid "Invalid value" 22 | msgstr "" 23 | 24 | #: src/colander/__init__.py:375 25 | msgid "String does not match expected pattern" 26 | msgstr "" 27 | 28 | #: src/colander/__init__.py:405 29 | msgid "Invalid email address" 30 | msgstr "" 31 | 32 | #: src/colander/__init__.py:434 33 | msgid "Not a data URL" 34 | msgstr "" 35 | 36 | #: src/colander/__init__.py:435 37 | msgid "Invalid MIME type" 38 | msgstr "" 39 | 40 | #: src/colander/__init__.py:436 41 | msgid "Invalid Base64 encoded data" 42 | msgstr "" 43 | 44 | #: src/colander/__init__.py:494 45 | msgid "${val} is less than minimum value ${min}" 46 | msgstr "" 47 | 48 | #: src/colander/__init__.py:495 49 | msgid "${val} is greater than maximum value ${max}" 50 | msgstr "" 51 | 52 | #: src/colander/__init__.py:545 53 | msgid "Shorter than minimum length ${min}" 54 | msgstr "" 55 | 56 | #: src/colander/__init__.py:546 57 | msgid "Longer than maximum length ${max}" 58 | msgstr "" 59 | 60 | #: src/colander/__init__.py:569 61 | msgid "\"${val}\" is not one of ${choices}" 62 | msgstr "" 63 | 64 | #: src/colander/__init__.py:593 65 | msgid "\"${val}\" must not be one of ${choices}" 66 | msgstr "" 67 | 68 | #: src/colander/__init__.py:616 69 | msgid "One or more of the choices you made was not acceptable" 70 | msgstr "" 71 | 72 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 73 | msgid "\"${val}\" is not a valid credit card number" 74 | msgstr "" 75 | 76 | #: src/colander/__init__.py:720 77 | msgid "Must be a URL" 78 | msgstr "" 79 | 80 | #: src/colander/__init__.py:731 81 | msgid "Must be a file:// URI scheme" 82 | msgstr "" 83 | 84 | #: src/colander/__init__.py:737 85 | msgid "Invalid UUID string" 86 | msgstr "" 87 | 88 | #: src/colander/__init__.py:839 89 | msgid "\"${val}\" is not a mapping type: ${err}" 90 | msgstr "" 91 | 92 | #: src/colander/__init__.py:889 93 | msgid "Unrecognized keys in mapping: \"${val}\"" 94 | msgstr "" 95 | 96 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 97 | msgid "\"${val}\" is not iterable" 98 | msgstr "" 99 | 100 | #: src/colander/__init__.py:998 101 | msgid "\"${val}\" has an incorrect number of elements (expected ${exp}, was ${was})" 102 | msgstr "" 103 | 104 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 105 | msgid "${cstruct} is not iterable" 106 | msgstr "" 107 | 108 | #: src/colander/__init__.py:1462 109 | msgid "${val} cannot be serialized: ${err}" 110 | msgstr "" 111 | 112 | #: src/colander/__init__.py:1484 113 | msgid "${val} is not a string: ${err}" 114 | msgstr "" 115 | 116 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 117 | msgid "\"${val}\" is not a number" 118 | msgstr "" 119 | 120 | #: src/colander/__init__.py:1697 121 | msgid "${val} is not a string" 122 | msgstr "" 123 | 124 | #: src/colander/__init__.py:1709 125 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 126 | msgstr "" 127 | 128 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 129 | #: src/colander/__init__.py:1806 130 | msgid "relative name \"${val}\" irresolveable without package" 131 | msgstr "" 132 | 133 | #: src/colander/__init__.py:1843 134 | msgid "\"${val}\" has no __name__" 135 | msgstr "" 136 | 137 | #: src/colander/__init__.py:1852 138 | msgid "\"${val}\" is not a string" 139 | msgstr "" 140 | 141 | #: src/colander/__init__.py:1862 142 | msgid "The dotted name \"${name}\" cannot be imported" 143 | msgstr "" 144 | 145 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 146 | msgid "Invalid date" 147 | msgstr "" 148 | 149 | #: src/colander/__init__.py:1932 150 | msgid "\"${val}\" is not a datetime object" 151 | msgstr "" 152 | 153 | #: src/colander/__init__.py:2020 154 | msgid "\"${val}\" is not a date object" 155 | msgstr "" 156 | 157 | #: src/colander/__init__.py:2085 158 | msgid "Invalid time" 159 | msgstr "" 160 | 161 | #: src/colander/__init__.py:2096 162 | msgid "\"${val}\" is not a time object" 163 | msgstr "" 164 | 165 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 166 | msgid "\"${val}\" is not a valid \"${cls}\"" 167 | msgstr "" 168 | 169 | #: src/colander/__init__.py:2297 170 | msgid "Required" 171 | msgstr "" 172 | 173 | -------------------------------------------------------------------------------- /src/colander/locale/cs/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/cs/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/cs/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Czech translations for colander. 2 | # Copyright (C) 2010 ORGANIZATION 3 | # This file is distributed under the same license as the colander project. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: colander 0.8\n" 9 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 10 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 11 | "PO-Revision-Date: 2011-10-15 17:25+0300\n" 12 | "Last-Translator: Petr Viktorin \n" 13 | "Language: cs\n" 14 | "Language-Team: Petr Viktorin \n" 15 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " 16 | "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=utf-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Generated-By: Babel 2.11.0\n" 21 | 22 | #: src/colander/__init__.py:319 23 | msgid "Invalid value" 24 | msgstr "Neplatná hodnota" 25 | 26 | #: src/colander/__init__.py:375 27 | msgid "String does not match expected pattern" 28 | msgstr "Text neodpovídá očekávané struktuře" 29 | 30 | #: src/colander/__init__.py:405 31 | msgid "Invalid email address" 32 | msgstr "Neplatná e-mailová adresa" 33 | 34 | #: src/colander/__init__.py:434 35 | msgid "Not a data URL" 36 | msgstr "" 37 | 38 | # | msgid "Invalid date" 39 | # | msgid "Invalid time" 40 | #: src/colander/__init__.py:435 41 | #, fuzzy 42 | msgid "Invalid MIME type" 43 | msgstr "Neplatné datum" 44 | 45 | #: src/colander/__init__.py:436 46 | msgid "Invalid Base64 encoded data" 47 | msgstr "" 48 | 49 | #: src/colander/__init__.py:494 50 | msgid "${val} is less than minimum value ${min}" 51 | msgstr "${val} je menší než minimální hodnota, ${min}" 52 | 53 | #: src/colander/__init__.py:495 54 | msgid "${val} is greater than maximum value ${max}" 55 | msgstr "${val} je větší než maximální hodnota, ${max}" 56 | 57 | #: src/colander/__init__.py:545 58 | msgid "Shorter than minimum length ${min}" 59 | msgstr "Kratší než minimální délka, ${min}" 60 | 61 | #: src/colander/__init__.py:546 62 | msgid "Longer than maximum length ${max}" 63 | msgstr "Delší než maximální délka, ${max}" 64 | 65 | #: src/colander/__init__.py:569 66 | msgid "\"${val}\" is not one of ${choices}" 67 | msgstr "\"${val}\" není z ${choices}" 68 | 69 | # | msgid "\"${val}\" is not one of ${choices}" 70 | #: src/colander/__init__.py:593 71 | #, fuzzy 72 | msgid "\"${val}\" must not be one of ${choices}" 73 | msgstr "\"${val}\" není z ${choices}" 74 | 75 | #: src/colander/__init__.py:616 76 | msgid "One or more of the choices you made was not acceptable" 77 | msgstr "" 78 | 79 | # | msgid "\"${val}\" is not a number" 80 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 81 | #, fuzzy 82 | msgid "\"${val}\" is not a valid credit card number" 83 | msgstr "\"${val}\" není číslo" 84 | 85 | #: src/colander/__init__.py:720 86 | msgid "Must be a URL" 87 | msgstr "" 88 | 89 | #: src/colander/__init__.py:731 90 | msgid "Must be a file:// URI scheme" 91 | msgstr "" 92 | 93 | #: src/colander/__init__.py:737 94 | msgid "Invalid UUID string" 95 | msgstr "" 96 | 97 | #: src/colander/__init__.py:839 98 | msgid "\"${val}\" is not a mapping type: ${err}" 99 | msgstr "\"${val}\" není typu zobrazení: ${err}" 100 | 101 | #: src/colander/__init__.py:889 102 | msgid "Unrecognized keys in mapping: \"${val}\"" 103 | msgstr "Neznámé klíče v zobrazení: \"${val}\"" 104 | 105 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 106 | msgid "\"${val}\" is not iterable" 107 | msgstr "\"${val}\" není sekvence" 108 | 109 | #: src/colander/__init__.py:998 110 | msgid "" 111 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 112 | "${was})" 113 | msgstr "\"${val}\" má špatný počet položek (${was} místo ${exp})" 114 | 115 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 116 | msgid "${cstruct} is not iterable" 117 | msgstr "${cstruct} není sekvence" 118 | 119 | #: src/colander/__init__.py:1462 120 | msgid "${val} cannot be serialized: ${err}" 121 | msgstr "${val} nemůže být serializováno: ${err}" 122 | 123 | #: src/colander/__init__.py:1484 124 | msgid "${val} is not a string: ${err}" 125 | msgstr "${val} není řetězec: ${err}" 126 | 127 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 128 | msgid "\"${val}\" is not a number" 129 | msgstr "\"${val}\" není číslo" 130 | 131 | #: src/colander/__init__.py:1697 132 | msgid "${val} is not a string" 133 | msgstr "${val} není řetězec" 134 | 135 | #: src/colander/__init__.py:1709 136 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 137 | msgstr "" 138 | 139 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 140 | #: src/colander/__init__.py:1806 141 | msgid "relative name \"${val}\" irresolveable without package" 142 | msgstr "relativní jméno \"${val}\" je neplatné bez Pythonového balíčku" 143 | 144 | #: src/colander/__init__.py:1843 145 | msgid "\"${val}\" has no __name__" 146 | msgstr "\"${val}\" nemá __name__" 147 | 148 | #: src/colander/__init__.py:1852 149 | msgid "\"${val}\" is not a string" 150 | msgstr "\"${val}\" není řetězec" 151 | 152 | #: src/colander/__init__.py:1862 153 | msgid "The dotted name \"${name}\" cannot be imported" 154 | msgstr "Jméno \"${name}\" nemohlo být importováno" 155 | 156 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 157 | msgid "Invalid date" 158 | msgstr "Neplatné datum" 159 | 160 | #: src/colander/__init__.py:1932 161 | msgid "\"${val}\" is not a datetime object" 162 | msgstr "\"${val}\" není objekt s časem a datem" 163 | 164 | #: src/colander/__init__.py:2020 165 | msgid "\"${val}\" is not a date object" 166 | msgstr "\"${val}\" není objekt s datem" 167 | 168 | # | msgid "Invalid date" 169 | #: src/colander/__init__.py:2085 170 | #, fuzzy 171 | msgid "Invalid time" 172 | msgstr "Neplatné datum" 173 | 174 | # | msgid "\"${val}\" is not a datetime object" 175 | #: src/colander/__init__.py:2096 176 | #, fuzzy 177 | msgid "\"${val}\" is not a time object" 178 | msgstr "\"${val}\" není objekt s časem a datem" 179 | 180 | # | msgid "\"${val}\" is not one of ${choices}" 181 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 182 | #, fuzzy 183 | msgid "\"${val}\" is not a valid \"${cls}\"" 184 | msgstr "\"${val}\" není z ${choices}" 185 | 186 | #: src/colander/__init__.py:2297 187 | msgid "Required" 188 | msgstr "Povinné pole" 189 | 190 | -------------------------------------------------------------------------------- /src/colander/locale/de/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/de/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/de/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # German (Germany) translations for colander. 2 | # Copyright (C) 2010 ORGANIZATION 3 | # This file is distributed under the same license as the colander project. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: colander 0.5.2\n" 9 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 10 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 11 | "PO-Revision-Date: 2016-09-18 23:02+0200\n" 12 | "Last-Translator: Andreas Kaiser \n" 13 | "Language: de\n" 14 | "Language-Team: repoze developers \n" 15 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=utf-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Generated-By: Babel 2.11.0\n" 20 | 21 | #: src/colander/__init__.py:319 22 | msgid "Invalid value" 23 | msgstr "Ungültiger Wert" 24 | 25 | #: src/colander/__init__.py:375 26 | msgid "String does not match expected pattern" 27 | msgstr "Die Zeichenkette entspricht nicht dem erwarteten Muster" 28 | 29 | #: src/colander/__init__.py:405 30 | msgid "Invalid email address" 31 | msgstr "Ungültige E-Mail-Adresse" 32 | 33 | #: src/colander/__init__.py:434 34 | msgid "Not a data URL" 35 | msgstr "" 36 | 37 | # | msgid "Invalid time" 38 | #: src/colander/__init__.py:435 39 | #, fuzzy 40 | msgid "Invalid MIME type" 41 | msgstr "Ungültige Uhrzeit" 42 | 43 | #: src/colander/__init__.py:436 44 | msgid "Invalid Base64 encoded data" 45 | msgstr "" 46 | 47 | #: src/colander/__init__.py:494 48 | msgid "${val} is less than minimum value ${min}" 49 | msgstr "${val} ist kleiner als der erlaubte Mindestwert (${min})" 50 | 51 | #: src/colander/__init__.py:495 52 | msgid "${val} is greater than maximum value ${max}" 53 | msgstr "${val} ist größer als der erlaubte Höchstwert (${max})" 54 | 55 | #: src/colander/__init__.py:545 56 | msgid "Shorter than minimum length ${min}" 57 | msgstr "Kürzer als erlaubt, die Mindestlänge beträgt ${min}" 58 | 59 | #: src/colander/__init__.py:546 60 | msgid "Longer than maximum length ${max}" 61 | msgstr "Länger als erlaubt, die Maximallänge beträgt ${max}" 62 | 63 | #: src/colander/__init__.py:569 64 | msgid "\"${val}\" is not one of ${choices}" 65 | msgstr "\"${val}\" ist nicht in der Auswahl ${choices}" 66 | 67 | #: src/colander/__init__.py:593 68 | msgid "\"${val}\" must not be one of ${choices}" 69 | msgstr "\"${val}\" darf nichts von ${choices} sein" 70 | 71 | #: src/colander/__init__.py:616 72 | msgid "One or more of the choices you made was not acceptable" 73 | msgstr "Mindestens eine Auswahl war nicht akzeptabel" 74 | 75 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 76 | msgid "\"${val}\" is not a valid credit card number" 77 | msgstr "\"${val}\" ist keine gültige Kreditkartennummer" 78 | 79 | #: src/colander/__init__.py:720 80 | msgid "Must be a URL" 81 | msgstr "Muss eine URL sein" 82 | 83 | #: src/colander/__init__.py:731 84 | msgid "Must be a file:// URI scheme" 85 | msgstr "" 86 | 87 | #: src/colander/__init__.py:737 88 | msgid "Invalid UUID string" 89 | msgstr "Ungültige UUID Zeichenkette" 90 | 91 | #: src/colander/__init__.py:839 92 | msgid "\"${val}\" is not a mapping type: ${err}" 93 | msgstr "\"${val}\" ist kein Mapping: ${err}" 94 | 95 | #: src/colander/__init__.py:889 96 | msgid "Unrecognized keys in mapping: \"${val}\"" 97 | msgstr "Unbekannte Schlüssel im Mapping: ${val}" 98 | 99 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 100 | msgid "\"${val}\" is not iterable" 101 | msgstr "\"${val}\" ist nicht iterierbar" 102 | 103 | #: src/colander/__init__.py:998 104 | msgid "" 105 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 106 | "${was})" 107 | msgstr "Ungültige Anzahl von Elementen (${was}, erwartet: ${exp})" 108 | 109 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 110 | msgid "${cstruct} is not iterable" 111 | msgstr "${cstruct} ist nicht iterierbar" 112 | 113 | #: src/colander/__init__.py:1462 114 | msgid "${val} cannot be serialized: ${err}" 115 | msgstr "${val} kann nicht serialisiert werden: ${err}" 116 | 117 | #: src/colander/__init__.py:1484 118 | msgid "${val} is not a string: ${err}" 119 | msgstr "${val} ist keine Zeichenkette: ${err}" 120 | 121 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 122 | msgid "\"${val}\" is not a number" 123 | msgstr "\"${val}\" ist keine Zahl" 124 | 125 | #: src/colander/__init__.py:1697 126 | msgid "${val} is not a string" 127 | msgstr "${val} ist keine Zeichenkette" 128 | 129 | #: src/colander/__init__.py:1709 130 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 131 | msgstr "" 132 | "\"${val}\" ist weder in (${false_choices}) noch in (${true_choices}) " 133 | "enthalten" 134 | 135 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 136 | #: src/colander/__init__.py:1806 137 | msgid "relative name \"${val}\" irresolveable without package" 138 | msgstr "relativer Name \"${val}\" ist ohne Paket nicht auflösbar" 139 | 140 | #: src/colander/__init__.py:1843 141 | msgid "\"${val}\" has no __name__" 142 | msgstr "\"${val}\" hat kein __name__ Attribut" 143 | 144 | #: src/colander/__init__.py:1852 145 | msgid "\"${val}\" is not a string" 146 | msgstr "${val} ist keine Zeichenkette" 147 | 148 | #: src/colander/__init__.py:1862 149 | msgid "The dotted name \"${name}\" cannot be imported" 150 | msgstr "Der Dotted-Name \"${name}\" kann nicht importiert werden" 151 | 152 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 153 | msgid "Invalid date" 154 | msgstr "Ungültiges Datum" 155 | 156 | #: src/colander/__init__.py:1932 157 | msgid "\"${val}\" is not a datetime object" 158 | msgstr "\"${val}\" ist kein Datetime-Object" 159 | 160 | #: src/colander/__init__.py:2020 161 | msgid "\"${val}\" is not a date object" 162 | msgstr "\"${val}\" ist kein Date-Object" 163 | 164 | #: src/colander/__init__.py:2085 165 | msgid "Invalid time" 166 | msgstr "Ungültige Uhrzeit" 167 | 168 | #: src/colander/__init__.py:2096 169 | msgid "\"${val}\" is not a time object" 170 | msgstr "\"${val}\" ist kein Time-Objekt" 171 | 172 | # | msgid "\"${val}\" is not one of ${choices}" 173 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 174 | #, fuzzy 175 | msgid "\"${val}\" is not a valid \"${cls}\"" 176 | msgstr "\"${val}\" ist nicht in der Auswahl ${choices}" 177 | 178 | #: src/colander/__init__.py:2297 179 | msgid "Required" 180 | msgstr "Pflichtangabe" 181 | 182 | #~ msgid "fail ${val}" 183 | #~ msgstr "fehlgeschlagen" 184 | 185 | #~ msgid "${val}: ${choices}" 186 | #~ msgstr "\"${val}”: ${choices}" 187 | 188 | -------------------------------------------------------------------------------- /src/colander/locale/el/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/el/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/el/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Greek translations for colander. 2 | # Copyright (C) 2013 ORGANIZATION 3 | # This file is distributed under the same license as the colander project. 4 | # FIRST AUTHOR , 2013. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: colander 1.0b1\n" 9 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 10 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 11 | "PO-Revision-Date: 2015-03-04 10:03+0200\n" 12 | "Last-Translator: Daniel Dourvaris \n" 13 | "Language: el\n" 14 | "Language-Team: el \n" 15 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=utf-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Generated-By: Babel 2.11.0\n" 20 | 21 | #: src/colander/__init__.py:319 22 | msgid "Invalid value" 23 | msgstr "Λάθος στοιχείο" 24 | 25 | #: src/colander/__init__.py:375 26 | msgid "String does not match expected pattern" 27 | msgstr "Το κείμενο δέν αντιστοιχεί στην μακέτα" 28 | 29 | #: src/colander/__init__.py:405 30 | msgid "Invalid email address" 31 | msgstr "Λάθος διεύθηνση email" 32 | 33 | #: src/colander/__init__.py:434 34 | msgid "Not a data URL" 35 | msgstr "" 36 | 37 | # | msgid "Invalid time" 38 | #: src/colander/__init__.py:435 39 | #, fuzzy 40 | msgid "Invalid MIME type" 41 | msgstr "Λάθος ώρα" 42 | 43 | #: src/colander/__init__.py:436 44 | msgid "Invalid Base64 encoded data" 45 | msgstr "" 46 | 47 | #: src/colander/__init__.py:494 48 | msgid "${val} is less than minimum value ${min}" 49 | msgstr "${val} είναι λιγότερο απο το ελάχιστο ${min}" 50 | 51 | #: src/colander/__init__.py:495 52 | msgid "${val} is greater than maximum value ${max}" 53 | msgstr "${val} είναι μεγαλύτερο απο το μέγιστο ${max}" 54 | 55 | #: src/colander/__init__.py:545 56 | msgid "Shorter than minimum length ${min}" 57 | msgstr "Λιγότερο απο το ελάχιστο ${min} στοιχεία" 58 | 59 | #: src/colander/__init__.py:546 60 | msgid "Longer than maximum length ${max}" 61 | msgstr "Μεγαλύτερο απο το μέγιστο ${max} χαρακτήρες" 62 | 63 | #: src/colander/__init__.py:569 64 | msgid "\"${val}\" is not one of ${choices}" 65 | msgstr "\"${val}\" δέν είναι ενα απο ${choices}" 66 | 67 | # | msgid "\"${val}\" is not one of ${choices}" 68 | #: src/colander/__init__.py:593 69 | #, fuzzy 70 | msgid "\"${val}\" must not be one of ${choices}" 71 | msgstr "\"${val}\" δέν είναι ενα απο ${choices}" 72 | 73 | #: src/colander/__init__.py:616 74 | msgid "One or more of the choices you made was not acceptable" 75 | msgstr "Ενα η παραπάνω απο τις επιλογές δέν ήταν αποδεχτό" 76 | 77 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 78 | msgid "\"${val}\" is not a valid credit card number" 79 | msgstr "\"${val}\" δέν είναι έγκυρη πιστοτική κάρτα" 80 | 81 | #: src/colander/__init__.py:720 82 | msgid "Must be a URL" 83 | msgstr "Πρέπει να είναι URL" 84 | 85 | #: src/colander/__init__.py:731 86 | msgid "Must be a file:// URI scheme" 87 | msgstr "" 88 | 89 | #: src/colander/__init__.py:737 90 | msgid "Invalid UUID string" 91 | msgstr "" 92 | 93 | #: src/colander/__init__.py:839 94 | msgid "\"${val}\" is not a mapping type: ${err}" 95 | msgstr "\"${val}\" δέν είναι τύπου mapping: ${err}" 96 | 97 | #: src/colander/__init__.py:889 98 | msgid "Unrecognized keys in mapping: \"${val}\"" 99 | msgstr "Αγνωστα keys στο mapping: \"${val}\"" 100 | 101 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 102 | msgid "\"${val}\" is not iterable" 103 | msgstr "\"${val}\" δέν είναι λίστα" 104 | 105 | #: src/colander/__init__.py:998 106 | msgid "" 107 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 108 | "${was})" 109 | msgstr "\"${val}\" έχει λάθος νούμερο στοιχέιων (ήθελε ${exp}, έχει ${was})" 110 | 111 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 112 | msgid "${cstruct} is not iterable" 113 | msgstr "${cstruct} δέν είναι λίστα" 114 | 115 | #: src/colander/__init__.py:1462 116 | msgid "${val} cannot be serialized: ${err}" 117 | msgstr "${val} δέν μπορεί να γίνει serialize:${err}" 118 | 119 | #: src/colander/__init__.py:1484 120 | msgid "${val} is not a string: ${err}" 121 | msgstr "${val} δέν είναι κείμενο: ${err}" 122 | 123 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 124 | msgid "\"${val}\" is not a number" 125 | msgstr "\"${val}\" δέν είναι νούμερο" 126 | 127 | #: src/colander/__init__.py:1697 128 | msgid "${val} is not a string" 129 | msgstr "${val} δέν είναι κείμενο" 130 | 131 | #: src/colander/__init__.py:1709 132 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 133 | msgstr "\"${val}\" ούτε στο (${false_choices}) είναι, ούτε στο (${true_choices})" 134 | 135 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 136 | #: src/colander/__init__.py:1806 137 | msgid "relative name \"${val}\" irresolveable without package" 138 | msgstr "" 139 | 140 | #: src/colander/__init__.py:1843 141 | msgid "\"${val}\" has no __name__" 142 | msgstr "\"${val}\" δέν έχει __name__" 143 | 144 | #: src/colander/__init__.py:1852 145 | msgid "\"${val}\" is not a string" 146 | msgstr "\"${val}\" δέν είναι κείμενο" 147 | 148 | #: src/colander/__init__.py:1862 149 | msgid "The dotted name \"${name}\" cannot be imported" 150 | msgstr "" 151 | 152 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 153 | msgid "Invalid date" 154 | msgstr "Λάθος ημερομηνία" 155 | 156 | #: src/colander/__init__.py:1932 157 | msgid "\"${val}\" is not a datetime object" 158 | msgstr "\"${val}\" δέν είναι τύπου datetime" 159 | 160 | #: src/colander/__init__.py:2020 161 | msgid "\"${val}\" is not a date object" 162 | msgstr "\"${val}\" δέν είναι τύπου date" 163 | 164 | #: src/colander/__init__.py:2085 165 | msgid "Invalid time" 166 | msgstr "Λάθος ώρα" 167 | 168 | #: src/colander/__init__.py:2096 169 | msgid "\"${val}\" is not a time object" 170 | msgstr "\"${val}\" δέν είναι τύπου time" 171 | 172 | # | msgid "\"${val}\" is not one of ${choices}" 173 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 174 | #, fuzzy 175 | msgid "\"${val}\" is not a valid \"${cls}\"" 176 | msgstr "\"${val}\" δέν είναι ενα απο ${choices}" 177 | 178 | #: src/colander/__init__.py:2297 179 | msgid "Required" 180 | msgstr "Απαραίτητο" 181 | 182 | #~ msgid "fail ${val}" 183 | #~ msgstr "λάθος ${val}" 184 | 185 | #~ msgid "${val}: ${choices}" 186 | #~ msgstr "${val}: ${choices}" 187 | 188 | -------------------------------------------------------------------------------- /src/colander/locale/es/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/es/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/es/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Spanish translations for colander. 2 | # Copyright (C) 2010 ORGANIZATION 3 | # This file is distributed under the same license as the colander project. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: colander 0.5.2\n" 9 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 10 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 11 | "PO-Revision-Date: 2010-09-10 08:03-0600\n" 12 | "Last-Translator: Douglas Cerna \n" 13 | "Language: es\n" 14 | "Language-Team: repoze developers \n" 15 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=utf-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Generated-By: Babel 2.11.0\n" 20 | 21 | #: src/colander/__init__.py:319 22 | msgid "Invalid value" 23 | msgstr "Valor inválido" 24 | 25 | #: src/colander/__init__.py:375 26 | msgid "String does not match expected pattern" 27 | msgstr "La cadena no coincide con el patrón esperado" 28 | 29 | #: src/colander/__init__.py:405 30 | msgid "Invalid email address" 31 | msgstr "Dirección de correo electrónico inválida" 32 | 33 | #: src/colander/__init__.py:434 34 | msgid "Not a data URL" 35 | msgstr "" 36 | 37 | # | msgid "Invalid date" 38 | # | msgid "Invalid time" 39 | #: src/colander/__init__.py:435 40 | #, fuzzy 41 | msgid "Invalid MIME type" 42 | msgstr "Fecha inválida" 43 | 44 | #: src/colander/__init__.py:436 45 | msgid "Invalid Base64 encoded data" 46 | msgstr "" 47 | 48 | #: src/colander/__init__.py:494 49 | msgid "${val} is less than minimum value ${min}" 50 | msgstr "${val} es menor que el valor mínimo ${min}" 51 | 52 | #: src/colander/__init__.py:495 53 | msgid "${val} is greater than maximum value ${max}" 54 | msgstr "${val} es mayor que el valor máximo ${max}" 55 | 56 | #: src/colander/__init__.py:545 57 | msgid "Shorter than minimum length ${min}" 58 | msgstr "Más corto que la longitud mínima ${min}" 59 | 60 | #: src/colander/__init__.py:546 61 | msgid "Longer than maximum length ${max}" 62 | msgstr "Más largo que la longitud máxima ${max}" 63 | 64 | #: src/colander/__init__.py:569 65 | msgid "\"${val}\" is not one of ${choices}" 66 | msgstr "\"${val}\" no está en ${choices}" 67 | 68 | # | msgid "\"${val}\" is not one of ${choices}" 69 | #: src/colander/__init__.py:593 70 | #, fuzzy 71 | msgid "\"${val}\" must not be one of ${choices}" 72 | msgstr "\"${val}\" no está en ${choices}" 73 | 74 | #: src/colander/__init__.py:616 75 | msgid "One or more of the choices you made was not acceptable" 76 | msgstr "" 77 | 78 | # | msgid "\"${val}\" is not a number" 79 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 80 | #, fuzzy 81 | msgid "\"${val}\" is not a valid credit card number" 82 | msgstr "\"${val}\" no es un número" 83 | 84 | #: src/colander/__init__.py:720 85 | msgid "Must be a URL" 86 | msgstr "" 87 | 88 | #: src/colander/__init__.py:731 89 | msgid "Must be a file:// URI scheme" 90 | msgstr "" 91 | 92 | #: src/colander/__init__.py:737 93 | msgid "Invalid UUID string" 94 | msgstr "" 95 | 96 | #: src/colander/__init__.py:839 97 | msgid "\"${val}\" is not a mapping type: ${err}" 98 | msgstr "\"${val}\" no es un tipo de mapeo: ${err}" 99 | 100 | #: src/colander/__init__.py:889 101 | msgid "Unrecognized keys in mapping: \"${val}\"" 102 | msgstr "Claves no reconocidas en el mapeo: \"${val}\"" 103 | 104 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 105 | msgid "\"${val}\" is not iterable" 106 | msgstr "\"${val}\" no es iterable" 107 | 108 | #: src/colander/__init__.py:998 109 | msgid "" 110 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 111 | "${was})" 112 | msgstr "" 113 | "\"${val}\" tiene un número incorrecto de elementos (esperados ${exp}, " 114 | "obtenidos ${was})" 115 | 116 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 117 | msgid "${cstruct} is not iterable" 118 | msgstr "${cstruct} no es iterable" 119 | 120 | #: src/colander/__init__.py:1462 121 | msgid "${val} cannot be serialized: ${err}" 122 | msgstr "${val} no puede serializarse: ${err}" 123 | 124 | #: src/colander/__init__.py:1484 125 | msgid "${val} is not a string: ${err}" 126 | msgstr "${val} no es una cadena: ${err}" 127 | 128 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 129 | msgid "\"${val}\" is not a number" 130 | msgstr "\"${val}\" no es un número" 131 | 132 | #: src/colander/__init__.py:1697 133 | msgid "${val} is not a string" 134 | msgstr "${val} no es una cadena" 135 | 136 | #: src/colander/__init__.py:1709 137 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 138 | msgstr "" 139 | 140 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 141 | #: src/colander/__init__.py:1806 142 | msgid "relative name \"${val}\" irresolveable without package" 143 | msgstr "nombre relativo \"${val}\" no se puede resolver sin paquete" 144 | 145 | #: src/colander/__init__.py:1843 146 | msgid "\"${val}\" has no __name__" 147 | msgstr "\"${val}\" no tiene __name__" 148 | 149 | #: src/colander/__init__.py:1852 150 | msgid "\"${val}\" is not a string" 151 | msgstr "\"${val}\" no es una cadena" 152 | 153 | #: src/colander/__init__.py:1862 154 | msgid "The dotted name \"${name}\" cannot be imported" 155 | msgstr "El nombre con puntos \"${name}\" no pudo importarse" 156 | 157 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 158 | msgid "Invalid date" 159 | msgstr "Fecha inválida" 160 | 161 | #: src/colander/__init__.py:1932 162 | msgid "\"${val}\" is not a datetime object" 163 | msgstr "\"${val}\" no es un objeto datetime" 164 | 165 | #: src/colander/__init__.py:2020 166 | msgid "\"${val}\" is not a date object" 167 | msgstr "\"${val}\" no es un objeto date" 168 | 169 | # | msgid "Invalid date" 170 | #: src/colander/__init__.py:2085 171 | #, fuzzy 172 | msgid "Invalid time" 173 | msgstr "Fecha inválida" 174 | 175 | # | msgid "\"${val}\" is not a datetime object" 176 | #: src/colander/__init__.py:2096 177 | #, fuzzy 178 | msgid "\"${val}\" is not a time object" 179 | msgstr "\"${val}\" no es un objeto datetime" 180 | 181 | # | msgid "\"${val}\" is not one of ${choices}" 182 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 183 | #, fuzzy 184 | msgid "\"${val}\" is not a valid \"${cls}\"" 185 | msgstr "\"${val}\" no está en ${choices}" 186 | 187 | #: src/colander/__init__.py:2297 188 | msgid "Required" 189 | msgstr "Requerido" 190 | 191 | -------------------------------------------------------------------------------- /src/colander/locale/fi/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/fi/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/fi/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Finnish translations for colander. 2 | # Copyright (C) 2013 ORGANIZATION 3 | # This file is distributed under the same license as the colander project. 4 | # Antti Haapala , 2013. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: colander 1.0b1\n" 9 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 10 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 11 | "PO-Revision-Date: 2015-10-04 09:39+0200\n" 12 | "Last-Translator: Antti Haapala \n" 13 | "Language: fi\n" 14 | "Language-Team: Finnish\n" 15 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=utf-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Generated-By: Babel 2.11.0\n" 20 | 21 | #: src/colander/__init__.py:319 22 | msgid "Invalid value" 23 | msgstr "Epäkelpo arvo" 24 | 25 | #: src/colander/__init__.py:375 26 | msgid "String does not match expected pattern" 27 | msgstr "Merkkijono ei ole odotetun muotoinen" 28 | 29 | #: src/colander/__init__.py:405 30 | msgid "Invalid email address" 31 | msgstr "Epäkelpo sähköpostiosoite" 32 | 33 | #: src/colander/__init__.py:434 34 | msgid "Not a data URL" 35 | msgstr "" 36 | 37 | # | msgid "Invalid time" 38 | #: src/colander/__init__.py:435 39 | #, fuzzy 40 | msgid "Invalid MIME type" 41 | msgstr "Epäkelpo aika" 42 | 43 | #: src/colander/__init__.py:436 44 | msgid "Invalid Base64 encoded data" 45 | msgstr "" 46 | 47 | #: src/colander/__init__.py:494 48 | msgid "${val} is less than minimum value ${min}" 49 | msgstr "${val} on vähemmän kuin pienin arvo ${min}" 50 | 51 | #: src/colander/__init__.py:495 52 | msgid "${val} is greater than maximum value ${max}" 53 | msgstr "${val} on suurempi kuin suurin arvo ${max}" 54 | 55 | #: src/colander/__init__.py:545 56 | msgid "Shorter than minimum length ${min}" 57 | msgstr "Lyhyempi kuin pienin pituus ${min}" 58 | 59 | #: src/colander/__init__.py:546 60 | msgid "Longer than maximum length ${max}" 61 | msgstr "Pidempi kuin suurin pituus ${max}" 62 | 63 | #: src/colander/__init__.py:569 64 | msgid "\"${val}\" is not one of ${choices}" 65 | msgstr "\"${val}\" ei joukosta ${choices}" 66 | 67 | # | msgid "\"${val}\" is not one of ${choices}" 68 | #: src/colander/__init__.py:593 69 | #, fuzzy 70 | msgid "\"${val}\" must not be one of ${choices}" 71 | msgstr "\"${val}\" ei joukosta ${choices}" 72 | 73 | #: src/colander/__init__.py:616 74 | msgid "One or more of the choices you made was not acceptable" 75 | msgstr "Yksi tai useampi tekemistäsi valinnoista eivät olleet hyväksyttäviä" 76 | 77 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 78 | msgid "\"${val}\" is not a valid credit card number" 79 | msgstr "\"${val}\" ei ole kelpo luottokortinnumero" 80 | 81 | #: src/colander/__init__.py:720 82 | msgid "Must be a URL" 83 | msgstr "Pitää olla URL-osoite" 84 | 85 | #: src/colander/__init__.py:731 86 | msgid "Must be a file:// URI scheme" 87 | msgstr "" 88 | 89 | #: src/colander/__init__.py:737 90 | msgid "Invalid UUID string" 91 | msgstr "" 92 | 93 | #: src/colander/__init__.py:839 94 | msgid "\"${val}\" is not a mapping type: ${err}" 95 | msgstr "\"${val}\" ei ole assosiatiivistä tyyppiä (ts. mapping type): ${err}" 96 | 97 | #: src/colander/__init__.py:889 98 | msgid "Unrecognized keys in mapping: \"${val}\"" 99 | msgstr "Tunnistamattomia avaimia arvossa: \"${val}\"" 100 | 101 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 102 | msgid "\"${val}\" is not iterable" 103 | msgstr "\"${val}\" ei ole iteroitava" 104 | 105 | #: src/colander/__init__.py:998 106 | msgid "" 107 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 108 | "${was})" 109 | msgstr "Arvossa \"${val}\" on väärä määrä alkioita (odotettu ${exp}, oli ${was})" 110 | 111 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 112 | msgid "${cstruct} is not iterable" 113 | msgstr "${cstruct} ei ole iteroitava" 114 | 115 | #: src/colander/__init__.py:1462 116 | msgid "${val} cannot be serialized: ${err}" 117 | msgstr "${val} ei serialisoitunut: ${err}" 118 | 119 | #: src/colander/__init__.py:1484 120 | msgid "${val} is not a string: ${err}" 121 | msgstr "${val} ei ole merkkijono: ${err}" 122 | 123 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 124 | msgid "\"${val}\" is not a number" 125 | msgstr "\"${val}\" ei ole luku" 126 | 127 | #: src/colander/__init__.py:1697 128 | msgid "${val} is not a string" 129 | msgstr "${val} ei ole merkkijono" 130 | 131 | #: src/colander/__init__.py:1709 132 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 133 | msgstr "" 134 | "\"${val}\" yksikään joukosta (${false_choices}) tai joukosta " 135 | "(${true_choices})" 136 | 137 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 138 | #: src/colander/__init__.py:1806 139 | msgid "relative name \"${val}\" irresolveable without package" 140 | msgstr "Suhteellista nimeä \"${val}\" ei voi selvittää ilman pakettia" 141 | 142 | #: src/colander/__init__.py:1843 143 | msgid "\"${val}\" has no __name__" 144 | msgstr "Arvolla \"${val}\" ei ole attribuuttia __name__" 145 | 146 | #: src/colander/__init__.py:1852 147 | msgid "\"${val}\" is not a string" 148 | msgstr "\"${val}\" ei ole merkkijono" 149 | 150 | #: src/colander/__init__.py:1862 151 | msgid "The dotted name \"${name}\" cannot be imported" 152 | msgstr "Pisteellistä nimeä \"${name}\" ei voi tuoda" 153 | 154 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 155 | msgid "Invalid date" 156 | msgstr "Epäkelpo päivämäärä" 157 | 158 | #: src/colander/__init__.py:1932 159 | msgid "\"${val}\" is not a datetime object" 160 | msgstr "\"${val}\" ei ole datetime-luokan olio" 161 | 162 | #: src/colander/__init__.py:2020 163 | msgid "\"${val}\" is not a date object" 164 | msgstr "\"${val}\" ei ole date-luokan olio" 165 | 166 | #: src/colander/__init__.py:2085 167 | msgid "Invalid time" 168 | msgstr "Epäkelpo aika" 169 | 170 | #: src/colander/__init__.py:2096 171 | msgid "\"${val}\" is not a time object" 172 | msgstr "\"${val}\" ei ole time-luokan olio" 173 | 174 | # | msgid "\"${val}\" is not one of ${choices}" 175 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 176 | #, fuzzy 177 | msgid "\"${val}\" is not a valid \"${cls}\"" 178 | msgstr "\"${val}\" ei joukosta ${choices}" 179 | 180 | #: src/colander/__init__.py:2297 181 | msgid "Required" 182 | msgstr "Vaadittu" 183 | 184 | #~ msgid "fail ${val}" 185 | #~ msgstr "virhe ${val}" 186 | 187 | #~ msgid "${val}: ${choices}" 188 | #~ msgstr "${val}: ${choices}" 189 | 190 | -------------------------------------------------------------------------------- /src/colander/locale/fr/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/fr/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/fr/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # French translations for colander. 2 | # Copyright (C) 2010 ORGANIZATION 3 | # This file is distributed under the same license as the colander project. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: colander 0.8\n" 9 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 10 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 11 | "PO-Revision-Date: 2014-06-27 11:46+0100\n" 12 | "Last-Translator: Cédric Messiant \n" 13 | "Language: fr\n" 14 | "Language-Team: fr \n" 15 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=utf-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Generated-By: Babel 2.11.0\n" 20 | 21 | #: src/colander/__init__.py:319 22 | msgid "Invalid value" 23 | msgstr "Valeur incorrecte" 24 | 25 | #: src/colander/__init__.py:375 26 | msgid "String does not match expected pattern" 27 | msgstr "La chaîne de caractères ne correspond pas au modèle attendu" 28 | 29 | #: src/colander/__init__.py:405 30 | msgid "Invalid email address" 31 | msgstr "Adresse email invalide" 32 | 33 | #: src/colander/__init__.py:434 34 | msgid "Not a data URL" 35 | msgstr "" 36 | 37 | # | msgid "Invalid date" 38 | # | msgid "Invalid time" 39 | #: src/colander/__init__.py:435 40 | #, fuzzy 41 | msgid "Invalid MIME type" 42 | msgstr "Heure invalide" 43 | 44 | #: src/colander/__init__.py:436 45 | msgid "Invalid Base64 encoded data" 46 | msgstr "" 47 | 48 | #: src/colander/__init__.py:494 49 | msgid "${val} is less than minimum value ${min}" 50 | msgstr "${val} est plus petit que la valeur minimale autorisée (${min})" 51 | 52 | #: src/colander/__init__.py:495 53 | msgid "${val} is greater than maximum value ${max}" 54 | msgstr "${val} est plus grand que la valeur maximum autorisée (${max})" 55 | 56 | #: src/colander/__init__.py:545 57 | msgid "Shorter than minimum length ${min}" 58 | msgstr "La longueur est inférieure à la taille minimum autorisée (${min})" 59 | 60 | #: src/colander/__init__.py:546 61 | msgid "Longer than maximum length ${max}" 62 | msgstr "La longueur dépasse la taille maximum autorisée (${max})" 63 | 64 | #: src/colander/__init__.py:569 65 | msgid "\"${val}\" is not one of ${choices}" 66 | msgstr "\"${val}\" ne fait pas partie des choix suivants ${choices}" 67 | 68 | # | msgid "\"${val}\" is not one of ${choices}" 69 | #: src/colander/__init__.py:593 70 | #, fuzzy 71 | msgid "\"${val}\" must not be one of ${choices}" 72 | msgstr "\"${val}\" ne fait pas partie des choix suivants ${choices}" 73 | 74 | #: src/colander/__init__.py:616 75 | msgid "One or more of the choices you made was not acceptable" 76 | msgstr "Un ou plusieurs choix invalides" 77 | 78 | # | msgid "\"${val}\" is not a number" 79 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 80 | #, fuzzy 81 | msgid "\"${val}\" is not a valid credit card number" 82 | msgstr "\"${val}\" n'est pas un nombre" 83 | 84 | #: src/colander/__init__.py:720 85 | msgid "Must be a URL" 86 | msgstr "Doit être une URL valide" 87 | 88 | #: src/colander/__init__.py:731 89 | msgid "Must be a file:// URI scheme" 90 | msgstr "" 91 | 92 | #: src/colander/__init__.py:737 93 | msgid "Invalid UUID string" 94 | msgstr "" 95 | 96 | #: src/colander/__init__.py:839 97 | msgid "\"${val}\" is not a mapping type: ${err}" 98 | msgstr "" 99 | "\"${val}\" n'est pas du type table de correspondance (dictionnaire par " 100 | "exemple): ${err}" 101 | 102 | #: src/colander/__init__.py:889 103 | msgid "Unrecognized keys in mapping: \"${val}\"" 104 | msgstr "Clé inconnue dans dans la table de correspondance: \"${val}\"" 105 | 106 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 107 | msgid "\"${val}\" is not iterable" 108 | msgstr "\"${val}\" n'est pas itérable" 109 | 110 | #: src/colander/__init__.py:998 111 | msgid "" 112 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 113 | "${was})" 114 | msgstr "" 115 | "\"${val}\" possède un nombre incorrect d'éléments (attendu ${exp}, trouvé" 116 | " ${was})" 117 | 118 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 119 | msgid "${cstruct} is not iterable" 120 | msgstr "${cstruct} n'est pas itérable" 121 | 122 | #: src/colander/__init__.py:1462 123 | msgid "${val} cannot be serialized: ${err}" 124 | msgstr "${val} ne peut être sérialisé: ${err}" 125 | 126 | #: src/colander/__init__.py:1484 127 | msgid "${val} is not a string: ${err}" 128 | msgstr "${val} n'est pas une chaîne de caractères: ${err}" 129 | 130 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 131 | msgid "\"${val}\" is not a number" 132 | msgstr "\"${val}\" n'est pas un nombre" 133 | 134 | #: src/colander/__init__.py:1697 135 | msgid "${val} is not a string" 136 | msgstr "${val} n'est pas une chaîne de caractères" 137 | 138 | #: src/colander/__init__.py:1709 139 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 140 | msgstr "\"${val}\" ne fait partie ni de (${false_choices}) ni de (${true_choices})" 141 | 142 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 143 | #: src/colander/__init__.py:1806 144 | msgid "relative name \"${val}\" irresolveable without package" 145 | msgstr "le nom relatif \"${val}\" ne peut-être résolu sans son module intégré" 146 | 147 | #: src/colander/__init__.py:1843 148 | msgid "\"${val}\" has no __name__" 149 | msgstr "\"${val}\" ne possède pas l'attribut __name__" 150 | 151 | #: src/colander/__init__.py:1852 152 | msgid "\"${val}\" is not a string" 153 | msgstr "\"${val}\" n'est pas une chaîne de caractères" 154 | 155 | #: src/colander/__init__.py:1862 156 | msgid "The dotted name \"${name}\" cannot be imported" 157 | msgstr "Le symbole python \"${name}\" n'a pu être importé" 158 | 159 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 160 | msgid "Invalid date" 161 | msgstr "Date invalide" 162 | 163 | #: src/colander/__init__.py:1932 164 | msgid "\"${val}\" is not a datetime object" 165 | msgstr "\"${val}\" n'est pas un objet datetime" 166 | 167 | #: src/colander/__init__.py:2020 168 | msgid "\"${val}\" is not a date object" 169 | msgstr "\"${val}\" n'est pas un objet date" 170 | 171 | # | msgid "Invalid date" 172 | #: src/colander/__init__.py:2085 173 | msgid "Invalid time" 174 | msgstr "Heure invalide" 175 | 176 | # | msgid "\"${val}\" is not a datetime object" 177 | #: src/colander/__init__.py:2096 178 | msgid "\"${val}\" is not a time object" 179 | msgstr "\"${val}\" n'est pas un objet time" 180 | 181 | # | msgid "\"${val}\" is not one of ${choices}" 182 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 183 | #, fuzzy 184 | msgid "\"${val}\" is not a valid \"${cls}\"" 185 | msgstr "\"${val}\" ne fait pas partie des choix suivants ${choices}" 186 | 187 | #: src/colander/__init__.py:2297 188 | msgid "Required" 189 | msgstr "Requis" 190 | 191 | -------------------------------------------------------------------------------- /src/colander/locale/it/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/it/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/it/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Italian translations for colander. 2 | # Copyright (C) 2013 ORGANIZATION 3 | # This file is distributed under the same license as the colander project. 4 | # FIRST AUTHOR , 2013. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: colander 1.0a3\n" 9 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 10 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 11 | "PO-Revision-Date: 2013-05-19 14:57+0100\n" 12 | "Last-Translator: Lorenzo M. Catucci \n" 13 | "Language: it\n" 14 | "Language-Team: it \n" 15 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=utf-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Generated-By: Babel 2.11.0\n" 20 | 21 | #: src/colander/__init__.py:319 22 | msgid "Invalid value" 23 | msgstr "Valore non valido" 24 | 25 | #: src/colander/__init__.py:375 26 | msgid "String does not match expected pattern" 27 | msgstr "La stringa non corrisponde al modello atteso" 28 | 29 | #: src/colander/__init__.py:405 30 | msgid "Invalid email address" 31 | msgstr "Indirizzo di posta elettronica non valido" 32 | 33 | #: src/colander/__init__.py:434 34 | msgid "Not a data URL" 35 | msgstr "" 36 | 37 | # | msgid "Invalid time" 38 | #: src/colander/__init__.py:435 39 | #, fuzzy 40 | msgid "Invalid MIME type" 41 | msgstr "Orario non valido" 42 | 43 | #: src/colander/__init__.py:436 44 | msgid "Invalid Base64 encoded data" 45 | msgstr "" 46 | 47 | #: src/colander/__init__.py:494 48 | msgid "${val} is less than minimum value ${min}" 49 | msgstr "${val} è minore del valore minimo ${min}" 50 | 51 | #: src/colander/__init__.py:495 52 | msgid "${val} is greater than maximum value ${max}" 53 | msgstr "${val} è maggiore del valore massimo ${max}" 54 | 55 | #: src/colander/__init__.py:545 56 | msgid "Shorter than minimum length ${min}" 57 | msgstr "Lunghezza inferiore alla minima ammessa (${min})" 58 | 59 | #: src/colander/__init__.py:546 60 | msgid "Longer than maximum length ${max}" 61 | msgstr "Lunghezza superiore alla massima ammessa (${max})" 62 | 63 | #: src/colander/__init__.py:569 64 | msgid "\"${val}\" is not one of ${choices}" 65 | msgstr "\"${val}\" non è compreso in ${choices}" 66 | 67 | # | msgid "\"${val}\" is not one of ${choices}" 68 | #: src/colander/__init__.py:593 69 | #, fuzzy 70 | msgid "\"${val}\" must not be one of ${choices}" 71 | msgstr "\"${val}\" non è compreso in ${choices}" 72 | 73 | #: src/colander/__init__.py:616 74 | msgid "One or more of the choices you made was not acceptable" 75 | msgstr "Almeno una delle scelte non è accettabile" 76 | 77 | # | msgid "\"${val}\" is not a number" 78 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 79 | #, fuzzy 80 | msgid "\"${val}\" is not a valid credit card number" 81 | msgstr "\"${val}\" non è un numero" 82 | 83 | #: src/colander/__init__.py:720 84 | msgid "Must be a URL" 85 | msgstr "Deve essere un URL" 86 | 87 | #: src/colander/__init__.py:731 88 | msgid "Must be a file:// URI scheme" 89 | msgstr "" 90 | 91 | #: src/colander/__init__.py:737 92 | msgid "Invalid UUID string" 93 | msgstr "" 94 | 95 | #: src/colander/__init__.py:839 96 | msgid "\"${val}\" is not a mapping type: ${err}" 97 | msgstr "\"${val}\" non è un tipo di mapping: ${err}" 98 | 99 | #: src/colander/__init__.py:889 100 | msgid "Unrecognized keys in mapping: \"${val}\"" 101 | msgstr "Chiavi non riconosciute nella mappa \"${val}\"" 102 | 103 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 104 | msgid "\"${val}\" is not iterable" 105 | msgstr "\"${val}\" non è iterabile" 106 | 107 | #: src/colander/__init__.py:998 108 | msgid "" 109 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 110 | "${was})" 111 | msgstr "\"${val}\" contiene ${was} elementi anziché gli attesi ${exp}" 112 | 113 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 114 | msgid "${cstruct} is not iterable" 115 | msgstr "${cstruct} non è iterabile" 116 | 117 | #: src/colander/__init__.py:1462 118 | msgid "${val} cannot be serialized: ${err}" 119 | msgstr "impossibile rappresentare ${val}: ${err}" 120 | 121 | #: src/colander/__init__.py:1484 122 | msgid "${val} is not a string: ${err}" 123 | msgstr "${val} non è una stringa: ${err}" 124 | 125 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 126 | msgid "\"${val}\" is not a number" 127 | msgstr "\"${val}\" non è un numero" 128 | 129 | #: src/colander/__init__.py:1697 130 | msgid "${val} is not a string" 131 | msgstr "${val} non è una stringa" 132 | 133 | #: src/colander/__init__.py:1709 134 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 135 | msgstr "\"${val}\" non è contenuto né in ${false_choices} né in ${true_choices}" 136 | 137 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 138 | #: src/colander/__init__.py:1806 139 | msgid "relative name \"${val}\" irresolveable without package" 140 | msgstr "impossibile risolvere il nome relativo \"${val}\" in assenza di un package" 141 | 142 | #: src/colander/__init__.py:1843 143 | msgid "\"${val}\" has no __name__" 144 | msgstr "\"${val}\" non ha un __name__" 145 | 146 | #: src/colander/__init__.py:1852 147 | msgid "\"${val}\" is not a string" 148 | msgstr "\"${val}\" non è una stringa" 149 | 150 | #: src/colander/__init__.py:1862 151 | msgid "The dotted name \"${name}\" cannot be imported" 152 | msgstr "Impossibile importare l'oggetto corrispondente al nome \"${name}\"" 153 | 154 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 155 | msgid "Invalid date" 156 | msgstr "Data non valida" 157 | 158 | #: src/colander/__init__.py:1932 159 | msgid "\"${val}\" is not a datetime object" 160 | msgstr "\"${val}\" non è un oggetto «datetime»" 161 | 162 | #: src/colander/__init__.py:2020 163 | msgid "\"${val}\" is not a date object" 164 | msgstr "\"${val}\" non è un oggetto «date»" 165 | 166 | #: src/colander/__init__.py:2085 167 | msgid "Invalid time" 168 | msgstr "Orario non valido" 169 | 170 | #: src/colander/__init__.py:2096 171 | msgid "\"${val}\" is not a time object" 172 | msgstr "\"${val}\" non è un oggetto «time»" 173 | 174 | # | msgid "\"${val}\" is not one of ${choices}" 175 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 176 | #, fuzzy 177 | msgid "\"${val}\" is not a valid \"${cls}\"" 178 | msgstr "\"${val}\" non è compreso in ${choices}" 179 | 180 | #: src/colander/__init__.py:2297 181 | msgid "Required" 182 | msgstr "Richiesto" 183 | 184 | -------------------------------------------------------------------------------- /src/colander/locale/ja/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/ja/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/ja/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Japanese translations for colander. 2 | # Copyright (C) 2012 ORGANIZATION 3 | # This file is distributed under the same license as the colander project. 4 | # OCHIAI, Gouji , 2012-2013. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: colander 0.8\n" 9 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 10 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 11 | "PO-Revision-Date: 2013-11-16 14:30+0900\n" 12 | "Last-Translator: OCHIAI, Gouji \n" 13 | "Language: ja\n" 14 | "Language-Team: ja \n" 15 | "Plural-Forms: nplurals=1; plural=0;\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=utf-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Generated-By: Babel 2.11.0\n" 20 | 21 | #: src/colander/__init__.py:319 22 | msgid "Invalid value" 23 | msgstr "無効な値です" 24 | 25 | #: src/colander/__init__.py:375 26 | msgid "String does not match expected pattern" 27 | msgstr "文字列がパターンに一致しません" 28 | 29 | #: src/colander/__init__.py:405 30 | msgid "Invalid email address" 31 | msgstr "無効なメールアドレスです" 32 | 33 | #: src/colander/__init__.py:434 34 | msgid "Not a data URL" 35 | msgstr "" 36 | 37 | # | msgid "Invalid time" 38 | #: src/colander/__init__.py:435 39 | #, fuzzy 40 | msgid "Invalid MIME type" 41 | msgstr "無効な時刻です" 42 | 43 | #: src/colander/__init__.py:436 44 | msgid "Invalid Base64 encoded data" 45 | msgstr "" 46 | 47 | #: src/colander/__init__.py:494 48 | msgid "${val} is less than minimum value ${min}" 49 | msgstr "${val} は最小値 ${min} を下回っています" 50 | 51 | #: src/colander/__init__.py:495 52 | msgid "${val} is greater than maximum value ${max}" 53 | msgstr "${val} は最大値 ${max} を超過しています" 54 | 55 | #: src/colander/__init__.py:545 56 | msgid "Shorter than minimum length ${min}" 57 | msgstr "${min} 以上の長さが必要です" 58 | 59 | #: src/colander/__init__.py:546 60 | msgid "Longer than maximum length ${max}" 61 | msgstr "${max} より短くしてください" 62 | 63 | #: src/colander/__init__.py:569 64 | msgid "\"${val}\" is not one of ${choices}" 65 | msgstr "\"${val}\" は ${choices} のいずれかでなければなりません" 66 | 67 | # | msgid "\"${val}\" is not one of ${choices}" 68 | #: src/colander/__init__.py:593 69 | #, fuzzy 70 | msgid "\"${val}\" must not be one of ${choices}" 71 | msgstr "\"${val}\" は ${choices} のいずれかでなければなりません" 72 | 73 | #: src/colander/__init__.py:616 74 | msgid "One or more of the choices you made was not acceptable" 75 | msgstr "選択された値のいくつかが許容される値ではありません" 76 | 77 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 78 | msgid "\"${val}\" is not a valid credit card number" 79 | msgstr "\"${val}\" は妥当なクレジットカード番号ではありません" 80 | 81 | #: src/colander/__init__.py:720 82 | msgid "Must be a URL" 83 | msgstr "URLでなければなりません" 84 | 85 | #: src/colander/__init__.py:731 86 | msgid "Must be a file:// URI scheme" 87 | msgstr "" 88 | 89 | #: src/colander/__init__.py:737 90 | msgid "Invalid UUID string" 91 | msgstr "" 92 | 93 | #: src/colander/__init__.py:839 94 | msgid "\"${val}\" is not a mapping type: ${err}" 95 | msgstr "\"${val}\" はマップ型でなければなりません: ${err}" 96 | 97 | #: src/colander/__init__.py:889 98 | msgid "Unrecognized keys in mapping: \"${val}\"" 99 | msgstr "未定義のキーがマップに含まれています: \"${val}\"" 100 | 101 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 102 | msgid "\"${val}\" is not iterable" 103 | msgstr "\"${val}\" は iterable でなければなりません" 104 | 105 | #: src/colander/__init__.py:998 106 | msgid "" 107 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 108 | "${was})" 109 | msgstr "\"${val}\" の要素数が正しくありません (${exp} 個のはずが ${was} 個)" 110 | 111 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 112 | msgid "${cstruct} is not iterable" 113 | msgstr "${cstruct} は iterable でなければなりません" 114 | 115 | #: src/colander/__init__.py:1462 116 | msgid "${val} cannot be serialized: ${err}" 117 | msgstr "${val} が直列化できません: ${err}" 118 | 119 | #: src/colander/__init__.py:1484 120 | msgid "${val} is not a string: ${err}" 121 | msgstr "${val} は文字列ではありません: ${err}" 122 | 123 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 124 | msgid "\"${val}\" is not a number" 125 | msgstr "\"${val}\" は数値ではありません" 126 | 127 | #: src/colander/__init__.py:1697 128 | msgid "${val} is not a string" 129 | msgstr "${val} は文字列ではありません" 130 | 131 | #: src/colander/__init__.py:1709 132 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 133 | msgstr "\"${val}\" が (${false_choices}) にも (${true_choices}) にも該当しません" 134 | 135 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 136 | #: src/colander/__init__.py:1806 137 | msgid "relative name \"${val}\" irresolveable without package" 138 | msgstr "相対名 \"${val}\" はパッケージを指定しなければ名前解決できません" 139 | 140 | #: src/colander/__init__.py:1843 141 | msgid "\"${val}\" has no __name__" 142 | msgstr "\"${val}\" には __name__ が含まれていません" 143 | 144 | #: src/colander/__init__.py:1852 145 | msgid "\"${val}\" is not a string" 146 | msgstr "\"${val}\" は文字列ではありません" 147 | 148 | #: src/colander/__init__.py:1862 149 | msgid "The dotted name \"${name}\" cannot be imported" 150 | msgstr "ドット区切り名 \"${name}\" がインポートできませんでした" 151 | 152 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 153 | msgid "Invalid date" 154 | msgstr "無効な日付です" 155 | 156 | #: src/colander/__init__.py:1932 157 | msgid "\"${val}\" is not a datetime object" 158 | msgstr "\"${val}\" は datetime オブジェクトではありません" 159 | 160 | #: src/colander/__init__.py:2020 161 | msgid "\"${val}\" is not a date object" 162 | msgstr "\"${val}\" は date オブジェクトではありません" 163 | 164 | #: src/colander/__init__.py:2085 165 | msgid "Invalid time" 166 | msgstr "無効な時刻です" 167 | 168 | #: src/colander/__init__.py:2096 169 | msgid "\"${val}\" is not a time object" 170 | msgstr "\"${val}\" は time オブジェクトではありません" 171 | 172 | # | msgid "\"${val}\" is not one of ${choices}" 173 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 174 | #, fuzzy 175 | msgid "\"${val}\" is not a valid \"${cls}\"" 176 | msgstr "\"${val}\" は ${choices} のいずれかでなければなりません" 177 | 178 | #: src/colander/__init__.py:2297 179 | msgid "Required" 180 | msgstr "必須です" 181 | 182 | #~ msgid "fail ${val}" 183 | #~ msgstr "失敗 ${val}" 184 | 185 | #~ msgid "${val}: ${choices}" 186 | #~ msgstr "${val}: ${choices}" 187 | 188 | -------------------------------------------------------------------------------- /src/colander/locale/nl/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/nl/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/nl/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Dutch translations for colander. 2 | # Copyright (C) 2010 ORGANIZATION 3 | # This file is distributed under the same license as the colander project. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: colander 0.8\n" 9 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 10 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 11 | "PO-Revision-Date: 2011-06-03 00:22+0200\n" 12 | "Last-Translator: Tinne Cahy \n" 13 | "Language: nl\n" 14 | "Language-Team: nl \n" 15 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=utf-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Generated-By: Babel 2.11.0\n" 20 | 21 | #: src/colander/__init__.py:319 22 | msgid "Invalid value" 23 | msgstr "Ongeldige waarde" 24 | 25 | #: src/colander/__init__.py:375 26 | msgid "String does not match expected pattern" 27 | msgstr "Tekst is niet in het juiste formaat" 28 | 29 | #: src/colander/__init__.py:405 30 | msgid "Invalid email address" 31 | msgstr "Ongeldig e-mail adres" 32 | 33 | #: src/colander/__init__.py:434 34 | msgid "Not a data URL" 35 | msgstr "" 36 | 37 | # | msgid "Invalid time" 38 | #: src/colander/__init__.py:435 39 | #, fuzzy 40 | msgid "Invalid MIME type" 41 | msgstr "Geen geldige datum" 42 | 43 | #: src/colander/__init__.py:436 44 | msgid "Invalid Base64 encoded data" 45 | msgstr "" 46 | 47 | #: src/colander/__init__.py:494 48 | msgid "${val} is less than minimum value ${min}" 49 | msgstr "${val} is minder dan de minimum waarde ${min}" 50 | 51 | #: src/colander/__init__.py:495 52 | msgid "${val} is greater than maximum value ${max}" 53 | msgstr "${val} is groter dan de maximale toegestane waarde ${max}" 54 | 55 | #: src/colander/__init__.py:545 56 | msgid "Shorter than minimum length ${min}" 57 | msgstr "De minimale lengte is ${min}" 58 | 59 | #: src/colander/__init__.py:546 60 | msgid "Longer than maximum length ${max}" 61 | msgstr "De maximale lengte is ${max}" 62 | 63 | #: src/colander/__init__.py:569 64 | msgid "\"${val}\" is not one of ${choices}" 65 | msgstr "\"${val}\" is geen toegestane waarde. Kies één van ${choices}." 66 | 67 | # | msgid "\"${val}\" is not one of ${choices}" 68 | #: src/colander/__init__.py:593 69 | #, fuzzy 70 | msgid "\"${val}\" must not be one of ${choices}" 71 | msgstr "\"${val}\" is geen toegestane waarde. Kies één van ${choices}." 72 | 73 | #: src/colander/__init__.py:616 74 | msgid "One or more of the choices you made was not acceptable" 75 | msgstr "Één of meer van de keuzes die je maakte zijn niet aanvaardbaar" 76 | 77 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 78 | #, fuzzy 79 | msgid "\"${val}\" is not a valid credit card number" 80 | msgstr "\"${val}\" is geen geldige kredietkaartnummer" 81 | 82 | #: src/colander/__init__.py:720 83 | msgid "Must be a URL" 84 | msgstr "Moet een URL zijn" 85 | 86 | #: src/colander/__init__.py:731 87 | msgid "Must be a file:// URI scheme" 88 | msgstr "" 89 | 90 | #: src/colander/__init__.py:737 91 | msgid "Invalid UUID string" 92 | msgstr "" 93 | 94 | #: src/colander/__init__.py:839 95 | msgid "\"${val}\" is not a mapping type: ${err}" 96 | msgstr "\"${val}\" is geen mapping type: ${err}" 97 | 98 | #: src/colander/__init__.py:889 99 | msgid "Unrecognized keys in mapping: \"${val}\"" 100 | msgstr "Onbekende waardes in mapping: \"${val}\"" 101 | 102 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 103 | msgid "\"${val}\" is not iterable" 104 | msgstr "\"${val}\" is niet itereerbaar" 105 | 106 | #: src/colander/__init__.py:998 107 | msgid "" 108 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 109 | "${was})" 110 | msgstr "" 111 | "\"${val}\" bevat niet het juiste aantal elementen (${was} in plaats van " 112 | "${exp})" 113 | 114 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 115 | msgid "${cstruct} is not iterable" 116 | msgstr "${cstruct} is niet itereerbaar" 117 | 118 | #: src/colander/__init__.py:1462 119 | msgid "${val} cannot be serialized: ${err}" 120 | msgstr "${val} kan niet worden opgeslagen: ${err}" 121 | 122 | #: src/colander/__init__.py:1484 123 | msgid "${val} is not a string: ${err}" 124 | msgstr "${val} is geen tekst: ${err}" 125 | 126 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 127 | msgid "\"${val}\" is not a number" 128 | msgstr "\"${val}\" is geen getal" 129 | 130 | #: src/colander/__init__.py:1697 131 | msgid "${val} is not a string" 132 | msgstr "${val} is geen tekst" 133 | 134 | #: src/colander/__init__.py:1709 135 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 136 | msgstr "" 137 | "\"${val}\" is niet aanwezig in (${false_choices}) noch aanwezig in " 138 | "(${true_choices})" 139 | 140 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 141 | #: src/colander/__init__.py:1806 142 | msgid "relative name \"${val}\" irresolveable without package" 143 | msgstr "relatieve aanduiding \"${val}\" kan niet worden opgezocht zonder package" 144 | 145 | #: src/colander/__init__.py:1843 146 | msgid "\"${val}\" has no __name__" 147 | msgstr "\"${val}\" heeft geen __name__" 148 | 149 | #: src/colander/__init__.py:1852 150 | msgid "\"${val}\" is not a string" 151 | msgstr "\"${val}\" is geen tekst" 152 | 153 | #: src/colander/__init__.py:1862 154 | msgid "The dotted name \"${name}\" cannot be imported" 155 | msgstr "Kan \"${name}\" niet importeren" 156 | 157 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 158 | msgid "Invalid date" 159 | msgstr "Geen geldige datum" 160 | 161 | #: src/colander/__init__.py:1932 162 | msgid "\"${val}\" is not a datetime object" 163 | msgstr "\"${val}\" is geen datetime object" 164 | 165 | #: src/colander/__init__.py:2020 166 | msgid "\"${val}\" is not a date object" 167 | msgstr "\"${val}\" is geen date object" 168 | 169 | #: src/colander/__init__.py:2085 170 | #, fuzzy 171 | msgid "Invalid time" 172 | msgstr "Geen geldige datum" 173 | 174 | #: src/colander/__init__.py:2096 175 | #, fuzzy 176 | msgid "\"${val}\" is not a time object" 177 | msgstr "\"${val}\" is geen datetime object" 178 | 179 | # | msgid "\"${val}\" is not one of ${choices}" 180 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 181 | #, fuzzy 182 | msgid "\"${val}\" is not a valid \"${cls}\"" 183 | msgstr "\"${val}\" is geen toegestane waarde. Kies één van ${choices}." 184 | 185 | #: src/colander/__init__.py:2297 186 | msgid "Required" 187 | msgstr "Verplicht" 188 | 189 | #~ msgid "fail ${val}" 190 | #~ msgstr "faal ${val}" 191 | 192 | #~ msgid "${val}: ${choices}" 193 | #~ msgstr "\"${val}\" is geen toegestane waarde. Kies één van ${choices}." 194 | 195 | -------------------------------------------------------------------------------- /src/colander/locale/pl/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/pl/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/pl/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Polish translations for colander. 2 | # Copyright (C) 2011 3 | # This file is distributed under the same license as the colander project. 4 | # FIRST AUTHOR , 2011. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: colander 0.8\n" 9 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 10 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 11 | "PO-Revision-Date: 2011-03-17 19:05+0100\n" 12 | "Last-Translator: Jędrzej Nowak \n" 13 | "Language: pl\n" 14 | "Language-Team: pl \n" 15 | "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && " 16 | "(n%100<10 || n%100>=20) ? 1 : 2);\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=utf-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Generated-By: Babel 2.11.0\n" 21 | 22 | #: src/colander/__init__.py:319 23 | msgid "Invalid value" 24 | msgstr "Niepoprawna wartość" 25 | 26 | #: src/colander/__init__.py:375 27 | msgid "String does not match expected pattern" 28 | msgstr "Nie pasuje do oczekiwanego wzorca" 29 | 30 | #: src/colander/__init__.py:405 31 | msgid "Invalid email address" 32 | msgstr "Niepoprawny adres email" 33 | 34 | #: src/colander/__init__.py:434 35 | msgid "Not a data URL" 36 | msgstr "" 37 | 38 | # | msgid "Invalid date" 39 | # | msgid "Invalid time" 40 | #: src/colander/__init__.py:435 41 | #, fuzzy 42 | msgid "Invalid MIME type" 43 | msgstr "Niepoprawna data" 44 | 45 | #: src/colander/__init__.py:436 46 | msgid "Invalid Base64 encoded data" 47 | msgstr "" 48 | 49 | #: src/colander/__init__.py:494 50 | msgid "${val} is less than minimum value ${min}" 51 | msgstr "${val} jest mniejsza niż minimalna wartość ${min}" 52 | 53 | #: src/colander/__init__.py:495 54 | msgid "${val} is greater than maximum value ${max}" 55 | msgstr "${val} jest większa niż maksymalna wartość ${max}" 56 | 57 | #: src/colander/__init__.py:545 58 | msgid "Shorter than minimum length ${min}" 59 | msgstr "Krótsze niż minimalna długość ${min}" 60 | 61 | #: src/colander/__init__.py:546 62 | msgid "Longer than maximum length ${max}" 63 | msgstr "Dłuższa niż maksymalna długość ${max}" 64 | 65 | #: src/colander/__init__.py:569 66 | msgid "\"${val}\" is not one of ${choices}" 67 | msgstr "\"${val}\" nie jest żadnym z ${choices}" 68 | 69 | # | msgid "\"${val}\" is not one of ${choices}" 70 | #: src/colander/__init__.py:593 71 | #, fuzzy 72 | msgid "\"${val}\" must not be one of ${choices}" 73 | msgstr "\"${val}\" nie jest żadnym z ${choices}" 74 | 75 | #: src/colander/__init__.py:616 76 | msgid "One or more of the choices you made was not acceptable" 77 | msgstr "" 78 | 79 | # | msgid "\"${val}\" is not a number" 80 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 81 | #, fuzzy 82 | msgid "\"${val}\" is not a valid credit card number" 83 | msgstr "\"${val}\" nie jest liczbą" 84 | 85 | #: src/colander/__init__.py:720 86 | msgid "Must be a URL" 87 | msgstr "" 88 | 89 | #: src/colander/__init__.py:731 90 | msgid "Must be a file:// URI scheme" 91 | msgstr "" 92 | 93 | #: src/colander/__init__.py:737 94 | msgid "Invalid UUID string" 95 | msgstr "" 96 | 97 | #: src/colander/__init__.py:839 98 | msgid "\"${val}\" is not a mapping type: ${err}" 99 | msgstr "\"${val}\" nie jest zmapowanym typem: ${err}" 100 | 101 | #: src/colander/__init__.py:889 102 | msgid "Unrecognized keys in mapping: \"${val}\"" 103 | msgstr "Nieznane klucze w mapowaniu: \"${val}\"" 104 | 105 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 106 | msgid "\"${val}\" is not iterable" 107 | msgstr "\"${val}\" nie jest iterable" 108 | 109 | #: src/colander/__init__.py:998 110 | msgid "" 111 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 112 | "${was})" 113 | msgstr "\"${val}\" ma niepoprawną ilość elementów (oczekiwano ${exp}, było ${was})" 114 | 115 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 116 | msgid "${cstruct} is not iterable" 117 | msgstr "${cstruct} nie jest iterable" 118 | 119 | #: src/colander/__init__.py:1462 120 | msgid "${val} cannot be serialized: ${err}" 121 | msgstr "${val} nie może zostać zserializowana: ${err}" 122 | 123 | #: src/colander/__init__.py:1484 124 | msgid "${val} is not a string: ${err}" 125 | msgstr "${val} nie jest stringiem: ${err}" 126 | 127 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 128 | msgid "\"${val}\" is not a number" 129 | msgstr "\"${val}\" nie jest liczbą" 130 | 131 | #: src/colander/__init__.py:1697 132 | msgid "${val} is not a string" 133 | msgstr "${val} nie jest stringiem" 134 | 135 | #: src/colander/__init__.py:1709 136 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 137 | msgstr "" 138 | 139 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 140 | #: src/colander/__init__.py:1806 141 | msgid "relative name \"${val}\" irresolveable without package" 142 | msgstr "" 143 | 144 | #: src/colander/__init__.py:1843 145 | msgid "\"${val}\" has no __name__" 146 | msgstr "\"${val}\" nie ma __name__" 147 | 148 | #: src/colander/__init__.py:1852 149 | msgid "\"${val}\" is not a string" 150 | msgstr "\"${val}\" nie jest stringiem" 151 | 152 | #: src/colander/__init__.py:1862 153 | msgid "The dotted name \"${name}\" cannot be imported" 154 | msgstr "" 155 | 156 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 157 | msgid "Invalid date" 158 | msgstr "Niepoprawna data" 159 | 160 | #: src/colander/__init__.py:1932 161 | msgid "\"${val}\" is not a datetime object" 162 | msgstr "\"${val}\" nie jest obiektem datetime" 163 | 164 | #: src/colander/__init__.py:2020 165 | msgid "\"${val}\" is not a date object" 166 | msgstr "\"${val}\" nie jest obiektem date" 167 | 168 | # | msgid "Invalid date" 169 | #: src/colander/__init__.py:2085 170 | #, fuzzy 171 | msgid "Invalid time" 172 | msgstr "Niepoprawna data" 173 | 174 | # | msgid "\"${val}\" is not a datetime object" 175 | #: src/colander/__init__.py:2096 176 | #, fuzzy 177 | msgid "\"${val}\" is not a time object" 178 | msgstr "\"${val}\" nie jest obiektem datetime" 179 | 180 | # | msgid "\"${val}\" is not one of ${choices}" 181 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 182 | #, fuzzy 183 | msgid "\"${val}\" is not a valid \"${cls}\"" 184 | msgstr "\"${val}\" nie jest żadnym z ${choices}" 185 | 186 | #: src/colander/__init__.py:2297 187 | msgid "Required" 188 | msgstr "Wymagane" 189 | 190 | -------------------------------------------------------------------------------- /src/colander/locale/pt/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/pt/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/pt/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Portuguese translations for colander. 2 | # Copyright (C) 2012 3 | # This file is distributed under the same license as the colander project. 4 | # Nuno Teixeira , 2012. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: colander 0.9.7\n" 9 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 10 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 11 | "PO-Revision-Date: 2012-06-30 17:48+0100\n" 12 | "Last-Translator: Nuno Teixeira \n" 13 | "Language: pt\n" 14 | "Language-Team: pt \n" 15 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=utf-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Generated-By: Babel 2.11.0\n" 20 | 21 | #: src/colander/__init__.py:319 22 | msgid "Invalid value" 23 | msgstr "Valor inválido" 24 | 25 | #: src/colander/__init__.py:375 26 | msgid "String does not match expected pattern" 27 | msgstr "Os caracteres não seguem o padrão" 28 | 29 | #: src/colander/__init__.py:405 30 | msgid "Invalid email address" 31 | msgstr "E-mail inválido" 32 | 33 | #: src/colander/__init__.py:434 34 | msgid "Not a data URL" 35 | msgstr "" 36 | 37 | #: src/colander/__init__.py:435 38 | #, fuzzy 39 | #| msgid "Invalid time" 40 | msgid "Invalid MIME type" 41 | msgstr "Hora inválida" 42 | 43 | #: src/colander/__init__.py:436 44 | msgid "Invalid Base64 encoded data" 45 | msgstr "" 46 | 47 | #: src/colander/__init__.py:494 48 | msgid "${val} is less than minimum value ${min}" 49 | msgstr "${val} é menor que o valor mínimo ${min}" 50 | 51 | #: src/colander/__init__.py:495 52 | msgid "${val} is greater than maximum value ${max}" 53 | msgstr "${val} é maior que o valor máximo ${max}" 54 | 55 | #: src/colander/__init__.py:545 56 | msgid "Shorter than minimum length ${min}" 57 | msgstr "Menor que o tamanho mínimo ${min}" 58 | 59 | #: src/colander/__init__.py:546 60 | msgid "Longer than maximum length ${max}" 61 | msgstr "Maior que o tamanho máximo ${max}" 62 | 63 | #: src/colander/__init__.py:569 64 | msgid "\"${val}\" is not one of ${choices}" 65 | msgstr "\"${val}\" não se encontra em ${choices}" 66 | 67 | #: src/colander/__init__.py:593 68 | #, fuzzy 69 | #| msgid "\"${val}\" is not one of ${choices}" 70 | msgid "\"${val}\" must not be one of ${choices}" 71 | msgstr "\"${val}\" não se encontra em ${choices}" 72 | 73 | #: src/colander/__init__.py:616 74 | msgid "One or more of the choices you made was not acceptable" 75 | msgstr "" 76 | 77 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 78 | #, fuzzy 79 | #| msgid "\"${val}\" is not a number" 80 | msgid "\"${val}\" is not a valid credit card number" 81 | msgstr "\"${val}\" não é um número" 82 | 83 | #: src/colander/__init__.py:720 84 | msgid "Must be a URL" 85 | msgstr "" 86 | 87 | #: src/colander/__init__.py:731 88 | msgid "Must be a file:// URI scheme" 89 | msgstr "" 90 | 91 | #: src/colander/__init__.py:737 92 | msgid "Invalid UUID string" 93 | msgstr "" 94 | 95 | #: src/colander/__init__.py:839 96 | msgid "\"${val}\" is not a mapping type: ${err}" 97 | msgstr "\"${val}\" não suporta mapeamento: ${err}" 98 | 99 | #: src/colander/__init__.py:889 100 | msgid "Unrecognized keys in mapping: \"${val}\"" 101 | msgstr "Índice inexistente no mapeamento: \"${val}\"" 102 | 103 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 104 | msgid "\"${val}\" is not iterable" 105 | msgstr "\"${val}\" não é iterável" 106 | 107 | #: src/colander/__init__.py:998 108 | msgid "" 109 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 110 | "${was})" 111 | msgstr "" 112 | "\"${val}\" tem o número incorrecto de elementos (esperam-se ${exp}, mas " 113 | "mas existem ${was})" 114 | 115 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 116 | msgid "${cstruct} is not iterable" 117 | msgstr "${cstruct} não é iterável" 118 | 119 | #: src/colander/__init__.py:1462 120 | msgid "${val} cannot be serialized: ${err}" 121 | msgstr "${val} não pode ser serializado: ${err}" 122 | 123 | #: src/colander/__init__.py:1484 124 | msgid "${val} is not a string: ${err}" 125 | msgstr "${val} não é uma cadeia de caracteres: ${err}" 126 | 127 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 128 | msgid "\"${val}\" is not a number" 129 | msgstr "\"${val}\" não é um número" 130 | 131 | #: src/colander/__init__.py:1697 132 | msgid "${val} is not a string" 133 | msgstr "${val} não é uma cadeia de caracteres" 134 | 135 | #: src/colander/__init__.py:1709 136 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 137 | msgstr "" 138 | 139 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 140 | #: src/colander/__init__.py:1806 141 | msgid "relative name \"${val}\" irresolveable without package" 142 | msgstr "O nome relativo \"${val}\" não pode ser resolvido sem o nome do pacote" 143 | 144 | #: src/colander/__init__.py:1843 145 | msgid "\"${val}\" has no __name__" 146 | msgstr "\"${val}\" não contém __name___" 147 | 148 | #: src/colander/__init__.py:1852 149 | msgid "\"${val}\" is not a string" 150 | msgstr "\"${val}\" não é uma cadeia de caracteres" 151 | 152 | #: src/colander/__init__.py:1862 153 | msgid "The dotted name \"${name}\" cannot be imported" 154 | msgstr "O nome \"${name}\" não pode ser importado" 155 | 156 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 157 | msgid "Invalid date" 158 | msgstr "Data inválida" 159 | 160 | #: src/colander/__init__.py:1932 161 | msgid "\"${val}\" is not a datetime object" 162 | msgstr "\"${val}\" não é um objecto datetime" 163 | 164 | #: src/colander/__init__.py:2020 165 | msgid "\"${val}\" is not a date object" 166 | msgstr "\"${val}\" não é um objecto date" 167 | 168 | #: src/colander/__init__.py:2085 169 | msgid "Invalid time" 170 | msgstr "Hora inválida" 171 | 172 | #: src/colander/__init__.py:2096 173 | msgid "\"${val}\" is not a time object" 174 | msgstr "\"${val}\" não é um objecto time" 175 | 176 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 177 | #, fuzzy 178 | #| msgid "\"${val}\" is not one of ${choices}" 179 | msgid "\"${val}\" is not a valid \"${cls}\"" 180 | msgstr "\"${val}\" não se encontra em ${choices}" 181 | 182 | #: src/colander/__init__.py:2297 183 | msgid "Required" 184 | msgstr "Obrigatório" 185 | 186 | -------------------------------------------------------------------------------- /src/colander/locale/pt_BR/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/pt_BR/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/pt_BR/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Portuguese (Brazil) translations for colander. 2 | # Copyright (C) 2010 ORGANIZATION 3 | # This file is distributed under the same license as the colander project. 4 | # FIRST AUTHOR , 2010. 5 | # Nando Florestan , 2012. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: colander 0.5.2\n" 10 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 11 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 12 | "PO-Revision-Date: 2012-03-20 23:28-0300\n" 13 | "Last-Translator: Nando Florestan \n" 14 | "Language: pt_BR\n" 15 | "Language-Team: Portuguese <>\n" 16 | "Plural-Forms: nplurals=2; plural=(n!=1);\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=utf-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Generated-By: Babel 2.11.0\n" 21 | 22 | #: src/colander/__init__.py:319 23 | msgid "Invalid value" 24 | msgstr "Valor inválido" 25 | 26 | #: src/colander/__init__.py:375 27 | msgid "String does not match expected pattern" 28 | msgstr "Não corresponde ao padrão esperado" 29 | 30 | #: src/colander/__init__.py:405 31 | msgid "Invalid email address" 32 | msgstr "Endereço de email inválido" 33 | 34 | #: src/colander/__init__.py:434 35 | msgid "Not a data URL" 36 | msgstr "" 37 | 38 | #: src/colander/__init__.py:435 39 | #, fuzzy 40 | #| msgid "Invalid time" 41 | msgid "Invalid MIME type" 42 | msgstr "Hora inválida" 43 | 44 | #: src/colander/__init__.py:436 45 | msgid "Invalid Base64 encoded data" 46 | msgstr "" 47 | 48 | #: src/colander/__init__.py:494 49 | msgid "${val} is less than minimum value ${min}" 50 | msgstr "${val} é menor do que o mínimo ${min}" 51 | 52 | #: src/colander/__init__.py:495 53 | msgid "${val} is greater than maximum value ${max}" 54 | msgstr "${val} é maior do que o máximo ${max}" 55 | 56 | #: src/colander/__init__.py:545 57 | msgid "Shorter than minimum length ${min}" 58 | msgstr "Mais curto do que o comprimento mínimo ${min}" 59 | 60 | #: src/colander/__init__.py:546 61 | msgid "Longer than maximum length ${max}" 62 | msgstr "Mais longo do que o comprimento máximo ${max}" 63 | 64 | #: src/colander/__init__.py:569 65 | msgid "\"${val}\" is not one of ${choices}" 66 | msgstr "\"${val}\" não está entre ${choices}" 67 | 68 | #: src/colander/__init__.py:593 69 | #, fuzzy 70 | #| msgid "\"${val}\" is not one of ${choices}" 71 | msgid "\"${val}\" must not be one of ${choices}" 72 | msgstr "\"${val}\" não está entre ${choices}" 73 | 74 | #: src/colander/__init__.py:616 75 | msgid "One or more of the choices you made was not acceptable" 76 | msgstr "" 77 | 78 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 79 | #, fuzzy 80 | #| msgid "\"${val}\" is not a number" 81 | msgid "\"${val}\" is not a valid credit card number" 82 | msgstr "\"${val}\" não é um número" 83 | 84 | #: src/colander/__init__.py:720 85 | msgid "Must be a URL" 86 | msgstr "" 87 | 88 | #: src/colander/__init__.py:731 89 | msgid "Must be a file:// URI scheme" 90 | msgstr "" 91 | 92 | #: src/colander/__init__.py:737 93 | msgid "Invalid UUID string" 94 | msgstr "" 95 | 96 | #: src/colander/__init__.py:839 97 | msgid "\"${val}\" is not a mapping type: ${err}" 98 | msgstr "\"${val}\" não é um tipo de mapeamento: ${err}" 99 | 100 | #: src/colander/__init__.py:889 101 | msgid "Unrecognized keys in mapping: \"${val}\"" 102 | msgstr "Chaves desconhecidas no mapeamento: \"${val}\"" 103 | 104 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 105 | msgid "\"${val}\" is not iterable" 106 | msgstr "Iterações não podem ser feitas em \"${val}\"" 107 | 108 | #: src/colander/__init__.py:998 109 | msgid "" 110 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 111 | "${was})" 112 | msgstr "" 113 | "\"${val}\" tem um número incorreto de elementos (${exp} esperados, ${was}" 114 | " obtidos)" 115 | 116 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 117 | msgid "${cstruct} is not iterable" 118 | msgstr "Iterações não podem ser feitas em ${cstruct}" 119 | 120 | #: src/colander/__init__.py:1462 121 | msgid "${val} cannot be serialized: ${err}" 122 | msgstr "\"${val} não pode ser serializado: ${err}" 123 | 124 | #: src/colander/__init__.py:1484 125 | msgid "${val} is not a string: ${err}" 126 | msgstr "${val} não é uma string: %{err}" 127 | 128 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 129 | msgid "\"${val}\" is not a number" 130 | msgstr "\"${val}\" não é um número" 131 | 132 | #: src/colander/__init__.py:1697 133 | msgid "${val} is not a string" 134 | msgstr "${val} não é uma string" 135 | 136 | #: src/colander/__init__.py:1709 137 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 138 | msgstr "" 139 | 140 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 141 | #: src/colander/__init__.py:1806 142 | msgid "relative name \"${val}\" irresolveable without package" 143 | msgstr "O nome relativo \"${val}\" não pode ser resolvido sem o pacote" 144 | 145 | #: src/colander/__init__.py:1843 146 | msgid "\"${val}\" has no __name__" 147 | msgstr "\"${val}\" não tem __name__" 148 | 149 | #: src/colander/__init__.py:1852 150 | msgid "\"${val}\" is not a string" 151 | msgstr "\"${val}\" não é uma string" 152 | 153 | #: src/colander/__init__.py:1862 154 | msgid "The dotted name \"${name}\" cannot be imported" 155 | msgstr "O pacote \"${name}\" não pode ser importado" 156 | 157 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 158 | msgid "Invalid date" 159 | msgstr "Data inválida" 160 | 161 | #: src/colander/__init__.py:1932 162 | msgid "\"${val}\" is not a datetime object" 163 | msgstr "\"${val}\" não é um objeto datetime" 164 | 165 | #: src/colander/__init__.py:2020 166 | msgid "\"${val}\" is not a date object" 167 | msgstr "\"${val}\" não é um objeto date" 168 | 169 | #: src/colander/__init__.py:2085 170 | msgid "Invalid time" 171 | msgstr "Hora inválida" 172 | 173 | #: src/colander/__init__.py:2096 174 | msgid "\"${val}\" is not a time object" 175 | msgstr "\"${val}\" não é um objeto time" 176 | 177 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 178 | #, fuzzy 179 | #| msgid "\"${val}\" is not one of ${choices}" 180 | msgid "\"${val}\" is not a valid \"${cls}\"" 181 | msgstr "\"${val}\" não está entre ${choices}" 182 | 183 | #: src/colander/__init__.py:2297 184 | msgid "Required" 185 | msgstr "Obrigatório" 186 | 187 | -------------------------------------------------------------------------------- /src/colander/locale/ro/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/ro/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/ro/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Romanian (î/sînt) translations for colander. 2 | # Copyright (C) 2013 ORGANIZATION 3 | # This file is distributed under the same license as the colander project. 4 | # 5 | # Sergiu Bivol , 2016. 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: colander 1.0b1\n" 9 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 10 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 11 | "PO-Revision-Date: 2016-04-23 14:23+0300\n" 12 | "Last-Translator: Sergiu Bivol \n" 13 | "Language: ro\n" 14 | "Language-Team: Romanian \n" 15 | "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 " 16 | "< 20)) ? 1 : 2;\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=utf-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Generated-By: Babel 2.11.0\n" 21 | 22 | #: src/colander/__init__.py:319 23 | msgid "Invalid value" 24 | msgstr "Valoare nevalidă" 25 | 26 | #: src/colander/__init__.py:375 27 | msgid "String does not match expected pattern" 28 | msgstr "Șirul nu se potrivește cu modelul așteptat" 29 | 30 | #: src/colander/__init__.py:405 31 | msgid "Invalid email address" 32 | msgstr "Adresă email nevalidă" 33 | 34 | #: src/colander/__init__.py:434 35 | msgid "Not a data URL" 36 | msgstr "" 37 | 38 | #: src/colander/__init__.py:435 39 | #, fuzzy 40 | #| msgid "Invalid time" 41 | msgid "Invalid MIME type" 42 | msgstr "Oră nevalidă" 43 | 44 | #: src/colander/__init__.py:436 45 | msgid "Invalid Base64 encoded data" 46 | msgstr "" 47 | 48 | #: src/colander/__init__.py:494 49 | msgid "${val} is less than minimum value ${min}" 50 | msgstr "${val} e mai mică decît valoarea minimă ${min}" 51 | 52 | #: src/colander/__init__.py:495 53 | msgid "${val} is greater than maximum value ${max}" 54 | msgstr "${val} e mai mare decît valoarea maximă ${max}" 55 | 56 | #: src/colander/__init__.py:545 57 | msgid "Shorter than minimum length ${min}" 58 | msgstr "Mai scurt decît lungimea minimă ${min}" 59 | 60 | #: src/colander/__init__.py:546 61 | msgid "Longer than maximum length ${max}" 62 | msgstr "Mai lung decît lungimea maximă ${max}" 63 | 64 | #: src/colander/__init__.py:569 65 | msgid "\"${val}\" is not one of ${choices}" 66 | msgstr "„${val}” nu e una dintre ${choice}" 67 | 68 | #: src/colander/__init__.py:593 69 | #, fuzzy 70 | #| msgid "\"${val}\" is not one of ${choices}" 71 | msgid "\"${val}\" must not be one of ${choices}" 72 | msgstr "„${val}” nu e una dintre ${choice}" 73 | 74 | #: src/colander/__init__.py:616 75 | msgid "One or more of the choices you made was not acceptable" 76 | msgstr "Una sau mai multe dintre alegerile făcute nu erau acceptabile" 77 | 78 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 79 | msgid "\"${val}\" is not a valid credit card number" 80 | msgstr "„${val}” nu e număr valid de carte de credit" 81 | 82 | #: src/colander/__init__.py:720 83 | msgid "Must be a URL" 84 | msgstr "Trebuie să fie URL" 85 | 86 | #: src/colander/__init__.py:731 87 | msgid "Must be a file:// URI scheme" 88 | msgstr "" 89 | 90 | #: src/colander/__init__.py:737 91 | msgid "Invalid UUID string" 92 | msgstr "" 93 | 94 | #: src/colander/__init__.py:839 95 | msgid "\"${val}\" is not a mapping type: ${err}" 96 | msgstr "„${val}” nu e tip de corespondență: ${err}" 97 | 98 | #: src/colander/__init__.py:889 99 | msgid "Unrecognized keys in mapping: \"${val}\"" 100 | msgstr "Chei nerecunoscute în corespondență: „${val}”" 101 | 102 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 103 | msgid "\"${val}\" is not iterable" 104 | msgstr "„${val}” nu e iterabilă" 105 | 106 | #: src/colander/__init__.py:998 107 | msgid "" 108 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 109 | "${was})" 110 | msgstr "„${val}” are număr greșit de elemente (se așteptau ${exp}, erau ${was})" 111 | 112 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 113 | msgid "${cstruct} is not iterable" 114 | msgstr "${cstruct} nu e iterabilă" 115 | 116 | #: src/colander/__init__.py:1462 117 | msgid "${val} cannot be serialized: ${err}" 118 | msgstr "${val} nu poate fi serializată: ${err}" 119 | 120 | #: src/colander/__init__.py:1484 121 | msgid "${val} is not a string: ${err}" 122 | msgstr "${val} nu e șir: ${err}" 123 | 124 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 125 | msgid "\"${val}\" is not a number" 126 | msgstr "„${val}” nu e număr" 127 | 128 | #: src/colander/__init__.py:1697 129 | msgid "${val} is not a string" 130 | msgstr "${val} nu e șir" 131 | 132 | #: src/colander/__init__.py:1709 133 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 134 | msgstr "„${val}” nu e nici în (${false_choices}), nici în (${true_choices})" 135 | 136 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 137 | #: src/colander/__init__.py:1806 138 | msgid "relative name \"${val}\" irresolveable without package" 139 | msgstr "denumirea relativă „${val}” nu e rezolvabilă fără pachet" 140 | 141 | #: src/colander/__init__.py:1843 142 | msgid "\"${val}\" has no __name__" 143 | msgstr "„${val}” nu are __name__" 144 | 145 | #: src/colander/__init__.py:1852 146 | msgid "\"${val}\" is not a string" 147 | msgstr "„${val}” nu e șir" 148 | 149 | #: src/colander/__init__.py:1862 150 | msgid "The dotted name \"${name}\" cannot be imported" 151 | msgstr "Denumirea punctată „${name}” nu poate fi importată" 152 | 153 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 154 | msgid "Invalid date" 155 | msgstr "Dată nevalidă" 156 | 157 | #: src/colander/__init__.py:1932 158 | msgid "\"${val}\" is not a datetime object" 159 | msgstr "„${val}” nu e obiect „datetime”" 160 | 161 | #: src/colander/__init__.py:2020 162 | msgid "\"${val}\" is not a date object" 163 | msgstr "„${val}” nu e obiect „date”" 164 | 165 | #: src/colander/__init__.py:2085 166 | msgid "Invalid time" 167 | msgstr "Oră nevalidă" 168 | 169 | #: src/colander/__init__.py:2096 170 | msgid "\"${val}\" is not a time object" 171 | msgstr "„${val}” nu e obiect „time”" 172 | 173 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 174 | #, fuzzy 175 | #| msgid "\"${val}\" is not one of ${choices}" 176 | msgid "\"${val}\" is not a valid \"${cls}\"" 177 | msgstr "„${val}” nu e una dintre ${choice}" 178 | 179 | #: src/colander/__init__.py:2297 180 | msgid "Required" 181 | msgstr "Necesar" 182 | 183 | #~ msgid "fail ${val}" 184 | #~ msgstr "eșuează ${val}" 185 | 186 | #~ msgid "${val}: ${choices}" 187 | #~ msgstr "${val}: ${choices}" 188 | 189 | -------------------------------------------------------------------------------- /src/colander/locale/ru/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/ru/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/ru/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Russian translations for colander. 2 | # Copyright (C) 2010 ORGANIZATION 3 | # This file is distributed under the same license as the colander project. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: colander 0.5.2\n" 9 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 10 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 11 | "PO-Revision-Date: 2010-04-25 21:18-0400\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language: ru\n" 14 | "Language-Team: ru \n" 15 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " 16 | "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=utf-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Generated-By: Babel 2.11.0\n" 21 | 22 | #: src/colander/__init__.py:319 23 | msgid "Invalid value" 24 | msgstr "Неверное значение" 25 | 26 | #: src/colander/__init__.py:375 27 | msgid "String does not match expected pattern" 28 | msgstr "Строка не соответствует заданному шаблону" 29 | 30 | #: src/colander/__init__.py:405 31 | msgid "Invalid email address" 32 | msgstr "Неверный адрес электронной почты" 33 | 34 | #: src/colander/__init__.py:434 35 | msgid "Not a data URL" 36 | msgstr "" 37 | 38 | # | msgid "Invalid value" 39 | #: src/colander/__init__.py:435 40 | #, fuzzy 41 | #| msgid "Invalid time" 42 | msgid "Invalid MIME type" 43 | msgstr "Неверное значение" 44 | 45 | #: src/colander/__init__.py:436 46 | msgid "Invalid Base64 encoded data" 47 | msgstr "" 48 | 49 | #: src/colander/__init__.py:494 50 | msgid "${val} is less than minimum value ${min}" 51 | msgstr "${val} меньше чем ${min}" 52 | 53 | #: src/colander/__init__.py:495 54 | msgid "${val} is greater than maximum value ${max}" 55 | msgstr "${val} больше чем ${max}" 56 | 57 | #: src/colander/__init__.py:545 58 | msgid "Shorter than minimum length ${min}" 59 | msgstr "Меньше, чем минимальная длина {$min}" 60 | 61 | #: src/colander/__init__.py:546 62 | msgid "Longer than maximum length ${max}" 63 | msgstr "Больше, чем максимальная длина ${max}" 64 | 65 | #: src/colander/__init__.py:569 66 | msgid "\"${val}\" is not one of ${choices}" 67 | msgstr "\"${val}\" не является одним из ${choices}" 68 | 69 | #: src/colander/__init__.py:593 70 | #, fuzzy 71 | #| msgid "\"${val}\" is not one of ${choices}" 72 | msgid "\"${val}\" must not be one of ${choices}" 73 | msgstr "\"${val}\" не является одним из ${choices}" 74 | 75 | #: src/colander/__init__.py:616 76 | msgid "One or more of the choices you made was not acceptable" 77 | msgstr "" 78 | 79 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 80 | #, fuzzy 81 | #| msgid "\"${val}\" is not a number" 82 | msgid "\"${val}\" is not a valid credit card number" 83 | msgstr "\"${val}\" не является числом" 84 | 85 | #: src/colander/__init__.py:720 86 | msgid "Must be a URL" 87 | msgstr "" 88 | 89 | #: src/colander/__init__.py:731 90 | msgid "Must be a file:// URI scheme" 91 | msgstr "" 92 | 93 | #: src/colander/__init__.py:737 94 | msgid "Invalid UUID string" 95 | msgstr "" 96 | 97 | #: src/colander/__init__.py:839 98 | msgid "\"${val}\" is not a mapping type: ${err}" 99 | msgstr "\"${val}\" содержит неверный тип данных: ${err}" 100 | 101 | #: src/colander/__init__.py:889 102 | msgid "Unrecognized keys in mapping: \"${val}\"" 103 | msgstr "Неизвестные ключи: \"${val}\"" 104 | 105 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 106 | msgid "\"${val}\" is not iterable" 107 | msgstr "\"${val}\" не является итератором" 108 | 109 | #: src/colander/__init__.py:998 110 | msgid "" 111 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 112 | "${was})" 113 | msgstr "" 114 | "\"${val}\" содержит неверное число элементов (ожидалось ${exp}, но " 115 | "содержит ${was})" 116 | 117 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 118 | msgid "${cstruct} is not iterable" 119 | msgstr "${cstruct} не является итератором" 120 | 121 | #: src/colander/__init__.py:1462 122 | msgid "${val} cannot be serialized: ${err}" 123 | msgstr "${val} не может быть сериализовано в строку: ${err}" 124 | 125 | #: src/colander/__init__.py:1484 126 | msgid "${val} is not a string: ${err}" 127 | msgstr "${val} не является строкой: ${err}" 128 | 129 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 130 | msgid "\"${val}\" is not a number" 131 | msgstr "\"${val}\" не является числом" 132 | 133 | #: src/colander/__init__.py:1697 134 | msgid "${val} is not a string" 135 | msgstr "${val} не является строкой" 136 | 137 | #: src/colander/__init__.py:1709 138 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 139 | msgstr "" 140 | 141 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 142 | #: src/colander/__init__.py:1806 143 | msgid "relative name \"${val}\" irresolveable without package" 144 | msgstr "" 145 | 146 | #: src/colander/__init__.py:1843 147 | msgid "\"${val}\" has no __name__" 148 | msgstr "\"${val}\" не имеет аттрибута __name__" 149 | 150 | #: src/colander/__init__.py:1852 151 | msgid "\"${val}\" is not a string" 152 | msgstr "\"${val}\" не является строкой" 153 | 154 | #: src/colander/__init__.py:1862 155 | msgid "The dotted name \"${name}\" cannot be imported" 156 | msgstr "" 157 | 158 | # | msgid "Invalid value" 159 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 160 | #, fuzzy 161 | msgid "Invalid date" 162 | msgstr "Неверное значение" 163 | 164 | #: src/colander/__init__.py:1932 165 | msgid "\"${val}\" is not a datetime object" 166 | msgstr "\"${val}\" не является объектом datetime" 167 | 168 | #: src/colander/__init__.py:2020 169 | msgid "\"${val}\" is not a date object" 170 | msgstr "\"${val}\" не является объектом date" 171 | 172 | # | msgid "Invalid value" 173 | #: src/colander/__init__.py:2085 174 | #, fuzzy 175 | msgid "Invalid time" 176 | msgstr "Неверное значение" 177 | 178 | # | msgid "\"${val}\" is not a datetime object" 179 | #: src/colander/__init__.py:2096 180 | #, fuzzy 181 | msgid "\"${val}\" is not a time object" 182 | msgstr "\"${val}\" не является объектом datetime" 183 | 184 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 185 | #, fuzzy 186 | #| msgid "\"${val}\" is not one of ${choices}" 187 | msgid "\"${val}\" is not a valid \"${cls}\"" 188 | msgstr "\"${val}\" не является одним из ${choices}" 189 | 190 | #: src/colander/__init__.py:2297 191 | msgid "Required" 192 | msgstr "Требуется" 193 | 194 | -------------------------------------------------------------------------------- /src/colander/locale/sv/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/sv/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/sv/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Swedish translations for colander. 2 | # Copyright (C) 2010 ORGANIZATION 3 | # This file is distributed under the same license as the colander project. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: colander 0.8\n" 9 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 10 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 11 | "PO-Revision-Date: 2011-08-23 10:04+0200\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language: sv\n" 14 | "Language-Team: sv \n" 15 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=utf-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Generated-By: Babel 2.11.0\n" 20 | 21 | #: src/colander/__init__.py:319 22 | msgid "Invalid value" 23 | msgstr "Ogiltigt värde" 24 | 25 | #: src/colander/__init__.py:375 26 | msgid "String does not match expected pattern" 27 | msgstr "Strängen följer inte förväntat mönster" 28 | 29 | #: src/colander/__init__.py:405 30 | msgid "Invalid email address" 31 | msgstr "Ogiltig epostadress" 32 | 33 | #: src/colander/__init__.py:434 34 | msgid "Not a data URL" 35 | msgstr "" 36 | 37 | # | msgid "Invalid date" 38 | #: src/colander/__init__.py:435 39 | #, fuzzy 40 | #| msgid "Invalid time" 41 | msgid "Invalid MIME type" 42 | msgstr "Ogiltigt datum" 43 | 44 | #: src/colander/__init__.py:436 45 | msgid "Invalid Base64 encoded data" 46 | msgstr "" 47 | 48 | #: src/colander/__init__.py:494 49 | msgid "${val} is less than minimum value ${min}" 50 | msgstr "${val} är mindre än minimumvärdet ${min}" 51 | 52 | #: src/colander/__init__.py:495 53 | msgid "${val} is greater than maximum value ${max}" 54 | msgstr "${val} är större än maxvärdet ${max}" 55 | 56 | #: src/colander/__init__.py:545 57 | msgid "Shorter than minimum length ${min}" 58 | msgstr "Kortare än minimilängden ${min}" 59 | 60 | #: src/colander/__init__.py:546 61 | msgid "Longer than maximum length ${max}" 62 | msgstr "Längre än maxlängden ${max}" 63 | 64 | #: src/colander/__init__.py:569 65 | msgid "\"${val}\" is not one of ${choices}" 66 | msgstr "\"${val}\" är inte en av ${choices}" 67 | 68 | #: src/colander/__init__.py:593 69 | #, fuzzy 70 | #| msgid "\"${val}\" is not one of ${choices}" 71 | msgid "\"${val}\" must not be one of ${choices}" 72 | msgstr "\"${val}\" är inte en av ${choices}" 73 | 74 | #: src/colander/__init__.py:616 75 | msgid "One or more of the choices you made was not acceptable" 76 | msgstr "" 77 | 78 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 79 | #, fuzzy 80 | #| msgid "\"${val}\" is not a number" 81 | msgid "\"${val}\" is not a valid credit card number" 82 | msgstr "\"${val}\" är inte ett nummer" 83 | 84 | #: src/colander/__init__.py:720 85 | msgid "Must be a URL" 86 | msgstr "" 87 | 88 | #: src/colander/__init__.py:731 89 | msgid "Must be a file:// URI scheme" 90 | msgstr "" 91 | 92 | #: src/colander/__init__.py:737 93 | msgid "Invalid UUID string" 94 | msgstr "" 95 | 96 | #: src/colander/__init__.py:839 97 | msgid "\"${val}\" is not a mapping type: ${err}" 98 | msgstr "\"${val}\" är inte en \"mapping\"-typ: ${err}" 99 | 100 | #: src/colander/__init__.py:889 101 | msgid "Unrecognized keys in mapping: \"${val}\"" 102 | msgstr "Obekant nyckel i \"mapping\": \"${val}\"" 103 | 104 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 105 | msgid "\"${val}\" is not iterable" 106 | msgstr "\"${val}\" är inte itererbar" 107 | 108 | #: src/colander/__init__.py:998 109 | msgid "" 110 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 111 | "${was})" 112 | msgstr "\"${val}\" har fel antal element (förväntade ${exp}, var ${was})" 113 | 114 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 115 | msgid "${cstruct} is not iterable" 116 | msgstr "${cstruct} är inte itererbar" 117 | 118 | #: src/colander/__init__.py:1462 119 | msgid "${val} cannot be serialized: ${err}" 120 | msgstr "${val} kan inte serialiseras: ${err}" 121 | 122 | #: src/colander/__init__.py:1484 123 | msgid "${val} is not a string: ${err}" 124 | msgstr "${val} är inte en sträng: ${err}" 125 | 126 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 127 | msgid "\"${val}\" is not a number" 128 | msgstr "\"${val}\" är inte ett nummer" 129 | 130 | #: src/colander/__init__.py:1697 131 | msgid "${val} is not a string" 132 | msgstr "${val} är inte en sträng" 133 | 134 | #: src/colander/__init__.py:1709 135 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 136 | msgstr "" 137 | 138 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 139 | #: src/colander/__init__.py:1806 140 | msgid "relative name \"${val}\" irresolveable without package" 141 | msgstr "relativa namnet \"${val}\" kan inte slås upp utan paket" 142 | 143 | #: src/colander/__init__.py:1843 144 | msgid "\"${val}\" has no __name__" 145 | msgstr "\"${val}\" har ingen __name__" 146 | 147 | #: src/colander/__init__.py:1852 148 | msgid "\"${val}\" is not a string" 149 | msgstr "\"${val}\" är inte en sträng" 150 | 151 | #: src/colander/__init__.py:1862 152 | msgid "The dotted name \"${name}\" cannot be imported" 153 | msgstr "Punktade namnet \"${name}\" kan inte importeras" 154 | 155 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 156 | msgid "Invalid date" 157 | msgstr "Ogiltigt datum" 158 | 159 | #: src/colander/__init__.py:1932 160 | msgid "\"${val}\" is not a datetime object" 161 | msgstr "\"${val}\" är inte ett \"datetime\"-objekt" 162 | 163 | #: src/colander/__init__.py:2020 164 | msgid "\"${val}\" is not a date object" 165 | msgstr "\"${val}\" är inte ett \"date\"-objekt" 166 | 167 | # | msgid "Invalid date" 168 | #: src/colander/__init__.py:2085 169 | #, fuzzy 170 | msgid "Invalid time" 171 | msgstr "Ogiltigt datum" 172 | 173 | # | msgid "\"${val}\" is not a datetime object" 174 | #: src/colander/__init__.py:2096 175 | #, fuzzy 176 | msgid "\"${val}\" is not a time object" 177 | msgstr "\"${val}\" är inte ett \"datetime\"-objekt" 178 | 179 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 180 | #, fuzzy 181 | #| msgid "\"${val}\" is not one of ${choices}" 182 | msgid "\"${val}\" is not a valid \"${cls}\"" 183 | msgstr "\"${val}\" är inte en av ${choices}" 184 | 185 | #: src/colander/__init__.py:2297 186 | msgid "Required" 187 | msgstr "Krävd" 188 | 189 | -------------------------------------------------------------------------------- /src/colander/locale/zh_Hans/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/zh_Hans/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/zh_Hans/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Simplified Chinese translations for colander. 2 | # This file is distributed under the same license as the colander project. 3 | # 4 | msgid "" 5 | msgstr "" 6 | "Project-Id-Version: colander 0.8\n" 7 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 8 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 10 | "Last-Translator: FULL NAME \n" 11 | "Language: zh_Hans\n" 12 | "Language-Team: zh \n" 13 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=utf-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Generated-By: Babel 2.11.0\n" 18 | 19 | #: src/colander/__init__.py:319 20 | msgid "Invalid value" 21 | msgstr "无效值" 22 | 23 | #: src/colander/__init__.py:375 24 | msgid "String does not match expected pattern" 25 | msgstr "字符串和要求的模式不匹配" 26 | 27 | #: src/colander/__init__.py:405 28 | msgid "Invalid email address" 29 | msgstr "无效的邮件地址" 30 | 31 | #: src/colander/__init__.py:434 32 | msgid "Not a data URL" 33 | msgstr "" 34 | 35 | # | msgid "Invalid date" 36 | #: src/colander/__init__.py:435 37 | #, fuzzy 38 | #| msgid "Invalid time" 39 | msgid "Invalid MIME type" 40 | msgstr "无效日期" 41 | 42 | #: src/colander/__init__.py:436 43 | msgid "Invalid Base64 encoded data" 44 | msgstr "" 45 | 46 | #: src/colander/__init__.py:494 47 | msgid "${val} is less than minimum value ${min}" 48 | msgstr "${val} 低于最低限值 ${min}" 49 | 50 | #: src/colander/__init__.py:495 51 | msgid "${val} is greater than maximum value ${max}" 52 | msgstr "${val} 大于最高限值 ${max}" 53 | 54 | #: src/colander/__init__.py:545 55 | msgid "Shorter than minimum length ${min}" 56 | msgstr "短于最小长度 ${min}" 57 | 58 | #: src/colander/__init__.py:546 59 | msgid "Longer than maximum length ${max}" 60 | msgstr "长于最大长度 ${max}" 61 | 62 | #: src/colander/__init__.py:569 63 | msgid "\"${val}\" is not one of ${choices}" 64 | msgstr "\"${val}\" 不是这些值 ${choices} 中的一个" 65 | 66 | #: src/colander/__init__.py:593 67 | #, fuzzy 68 | #| msgid "\"${val}\" is not one of ${choices}" 69 | msgid "\"${val}\" must not be one of ${choices}" 70 | msgstr "\"${val}\" 不是这些值 ${choices} 中的一个" 71 | 72 | #: src/colander/__init__.py:616 73 | msgid "One or more of the choices you made was not acceptable" 74 | msgstr "" 75 | 76 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 77 | #, fuzzy 78 | #| msgid "\"${val}\" is not a number" 79 | msgid "\"${val}\" is not a valid credit card number" 80 | msgstr "\"${val}\" 不是数字" 81 | 82 | #: src/colander/__init__.py:720 83 | msgid "Must be a URL" 84 | msgstr "" 85 | 86 | #: src/colander/__init__.py:731 87 | msgid "Must be a file:// URI scheme" 88 | msgstr "" 89 | 90 | #: src/colander/__init__.py:737 91 | msgid "Invalid UUID string" 92 | msgstr "" 93 | 94 | #: src/colander/__init__.py:839 95 | msgid "\"${val}\" is not a mapping type: ${err}" 96 | msgstr "\"${val}\" 不是一个映射类型: ${err}" 97 | 98 | #: src/colander/__init__.py:889 99 | msgid "Unrecognized keys in mapping: \"${val}\"" 100 | msgstr "无法识别的键: \"${val}\"" 101 | 102 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 103 | msgid "\"${val}\" is not iterable" 104 | msgstr "\"${val}\" 不可遍历" 105 | 106 | #: src/colander/__init__.py:998 107 | msgid "" 108 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 109 | "${was})" 110 | msgstr "\"${val}\" 的元素个数不正确 (要求 ${exp}, 实际 ${was})" 111 | 112 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 113 | msgid "${cstruct} is not iterable" 114 | msgstr "${cstruct} 不可遍历" 115 | 116 | #: src/colander/__init__.py:1462 117 | msgid "${val} cannot be serialized: ${err}" 118 | msgstr "${val} 不可序列化: ${err}" 119 | 120 | #: src/colander/__init__.py:1484 121 | msgid "${val} is not a string: ${err}" 122 | msgstr "${val} 不是字符串: ${err}" 123 | 124 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 125 | msgid "\"${val}\" is not a number" 126 | msgstr "\"${val}\" 不是数字" 127 | 128 | #: src/colander/__init__.py:1697 129 | msgid "${val} is not a string" 130 | msgstr "${val} 不是字符串" 131 | 132 | #: src/colander/__init__.py:1709 133 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 134 | msgstr "" 135 | 136 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 137 | #: src/colander/__init__.py:1806 138 | msgid "relative name \"${val}\" irresolveable without package" 139 | msgstr "相关名字 \"${val}\" 无法找到" 140 | 141 | #: src/colander/__init__.py:1843 142 | msgid "\"${val}\" has no __name__" 143 | msgstr "\"${val}\" 没有 __name__" 144 | 145 | #: src/colander/__init__.py:1852 146 | msgid "\"${val}\" is not a string" 147 | msgstr "\"${val}\" 不是字符串" 148 | 149 | #: src/colander/__init__.py:1862 150 | msgid "The dotted name \"${name}\" cannot be imported" 151 | msgstr "点名字 \"${name}\" 无法导入" 152 | 153 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 154 | msgid "Invalid date" 155 | msgstr "无效日期" 156 | 157 | #: src/colander/__init__.py:1932 158 | msgid "\"${val}\" is not a datetime object" 159 | msgstr "\"${val}\" 不是一个时间日期对象" 160 | 161 | #: src/colander/__init__.py:2020 162 | msgid "\"${val}\" is not a date object" 163 | msgstr "\"${val}\" 不是一个日期对象" 164 | 165 | # | msgid "Invalid date" 166 | #: src/colander/__init__.py:2085 167 | #, fuzzy 168 | msgid "Invalid time" 169 | msgstr "无效日期" 170 | 171 | # | msgid "\"${val}\" is not a datetime object" 172 | #: src/colander/__init__.py:2096 173 | #, fuzzy 174 | msgid "\"${val}\" is not a time object" 175 | msgstr "\"${val}\" 不是一个时间日期对象" 176 | 177 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 178 | #, fuzzy 179 | #| msgid "\"${val}\" is not one of ${choices}" 180 | msgid "\"${val}\" is not a valid \"${cls}\"" 181 | msgstr "\"${val}\" 不是这些值 ${choices} 中的一个" 182 | 183 | #: src/colander/__init__.py:2297 184 | msgid "Required" 185 | msgstr "必需" 186 | 187 | -------------------------------------------------------------------------------- /src/colander/locale/zh_Hant/LC_MESSAGES/colander.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pylons/colander/4557c017658eb4f6a5dc289078af1a6f850f3f97/src/colander/locale/zh_Hant/LC_MESSAGES/colander.mo -------------------------------------------------------------------------------- /src/colander/locale/zh_Hant/LC_MESSAGES/colander.po: -------------------------------------------------------------------------------- 1 | # Chinese (Traditional) translations for colander. 2 | # While this is meant to be a traditional chinese translation, since it was 3 | # done 4 | # By someone from Taiwan, it might have regional specialites. 5 | # This file is distributed under the same license as the colander project. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: colander 0.8\n" 10 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 11 | "POT-Creation-Date: 2023-01-02 19:48-0600\n" 12 | "PO-Revision-Date: 2017-03-21 11:07+0100\n" 13 | "Last-Translator: \n" 14 | "Language: zh_Hant\n" 15 | "Language-Team: zh_Hant\n" 16 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=utf-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Generated-By: Babel 2.11.0\n" 21 | 22 | #: src/colander/__init__.py:319 23 | msgid "Invalid value" 24 | msgstr "無效值" 25 | 26 | #: src/colander/__init__.py:375 27 | msgid "String does not match expected pattern" 28 | msgstr "字符串和要求的模式不匹配" 29 | 30 | #: src/colander/__init__.py:405 31 | msgid "Invalid email address" 32 | msgstr "無效的郵件地址" 33 | 34 | #: src/colander/__init__.py:434 35 | msgid "Not a data URL" 36 | msgstr "" 37 | 38 | #: src/colander/__init__.py:435 39 | #, fuzzy 40 | #| msgid "Invalid time" 41 | msgid "Invalid MIME type" 42 | msgstr "時間無效" 43 | 44 | #: src/colander/__init__.py:436 45 | msgid "Invalid Base64 encoded data" 46 | msgstr "" 47 | 48 | #: src/colander/__init__.py:494 49 | msgid "${val} is less than minimum value ${min}" 50 | msgstr "${val} 低於最低限值 ${min}" 51 | 52 | #: src/colander/__init__.py:495 53 | msgid "${val} is greater than maximum value ${max}" 54 | msgstr "${val} 大於最高限值 ${max}" 55 | 56 | #: src/colander/__init__.py:545 57 | msgid "Shorter than minimum length ${min}" 58 | msgstr "短於最小長度 ${min}" 59 | 60 | #: src/colander/__init__.py:546 61 | msgid "Longer than maximum length ${max}" 62 | msgstr "長於最大長度 ${max}" 63 | 64 | #: src/colander/__init__.py:569 65 | msgid "\"${val}\" is not one of ${choices}" 66 | msgstr "\"${val}\" 不是這些值 ${choices} 中的一個" 67 | 68 | #: src/colander/__init__.py:593 69 | msgid "\"${val}\" must not be one of ${choices}" 70 | msgstr "\"${val}\" 不能是 ${choices}" 71 | 72 | #: src/colander/__init__.py:616 73 | msgid "One or more of the choices you made was not acceptable" 74 | msgstr "您做出的一個或多個選擇是不可接受的" 75 | 76 | #: src/colander/__init__.py:639 src/colander/__init__.py:648 77 | msgid "\"${val}\" is not a valid credit card number" 78 | msgstr "\"${val}\" 不是有效的信用卡號碼" 79 | 80 | #: src/colander/__init__.py:720 81 | msgid "Must be a URL" 82 | msgstr "必須是網址" 83 | 84 | #: src/colander/__init__.py:731 85 | msgid "Must be a file:// URI scheme" 86 | msgstr "" 87 | 88 | #: src/colander/__init__.py:737 89 | msgid "Invalid UUID string" 90 | msgstr "UUID 字符串無效" 91 | 92 | #: src/colander/__init__.py:839 93 | msgid "\"${val}\" is not a mapping type: ${err}" 94 | msgstr "\"${val}\" 不是一個映射類型: ${err}" 95 | 96 | #: src/colander/__init__.py:889 97 | msgid "Unrecognized keys in mapping: \"${val}\"" 98 | msgstr "無法識別的鍵: \"${val}\"" 99 | 100 | #: src/colander/__init__.py:990 src/colander/__init__.py:1230 101 | msgid "\"${val}\" is not iterable" 102 | msgstr "\"${val}\" 不可迭代" 103 | 104 | #: src/colander/__init__.py:998 105 | msgid "" 106 | "\"${val}\" has an incorrect number of elements (expected ${exp}, was " 107 | "${was})" 108 | msgstr "\"${val}\" 的元素個數不正確 (要求 ${exp}, 實際 ${was})" 109 | 110 | #: src/colander/__init__.py:1141 src/colander/__init__.py:1172 111 | msgid "${cstruct} is not iterable" 112 | msgstr "${cstruct} 不可迭代" 113 | 114 | #: src/colander/__init__.py:1462 115 | msgid "${val} cannot be serialized: ${err}" 116 | msgstr "${val} 不可序列化: ${err}" 117 | 118 | #: src/colander/__init__.py:1484 119 | msgid "${val} is not a string: ${err}" 120 | msgstr "${val} 不是字符串: ${err}" 121 | 122 | #: src/colander/__init__.py:1507 src/colander/__init__.py:1518 123 | msgid "\"${val}\" is not a number" 124 | msgstr "\"${val}\" 不是數字" 125 | 126 | #: src/colander/__init__.py:1697 127 | msgid "${val} is not a string" 128 | msgstr "${val} 不是字符串" 129 | 130 | #: src/colander/__init__.py:1709 131 | msgid "\"${val}\" is neither in (${false_choices}) nor in (${true_choices})" 132 | msgstr "" 133 | 134 | #: src/colander/__init__.py:1775 src/colander/__init__.py:1794 135 | #: src/colander/__init__.py:1806 136 | msgid "relative name \"${val}\" irresolveable without package" 137 | msgstr "相關名字 \"${val}\" 無法找到" 138 | 139 | #: src/colander/__init__.py:1843 140 | msgid "\"${val}\" has no __name__" 141 | msgstr "\"${val}\" 没有 __name__" 142 | 143 | #: src/colander/__init__.py:1852 144 | msgid "\"${val}\" is not a string" 145 | msgstr "\"${val}\" 不是字符串" 146 | 147 | #: src/colander/__init__.py:1862 148 | msgid "The dotted name \"${name}\" cannot be imported" 149 | msgstr "點名字 \"${name}\" 無法匯入" 150 | 151 | #: src/colander/__init__.py:1915 src/colander/__init__.py:2005 152 | msgid "Invalid date" 153 | msgstr "無效日期" 154 | 155 | #: src/colander/__init__.py:1932 156 | msgid "\"${val}\" is not a datetime object" 157 | msgstr "\"${val}\" 不是一個時間日期對象" 158 | 159 | #: src/colander/__init__.py:2020 160 | msgid "\"${val}\" is not a date object" 161 | msgstr "\"${val}\" 不是一個日期對象" 162 | 163 | #: src/colander/__init__.py:2085 164 | msgid "Invalid time" 165 | msgstr "時間無效" 166 | 167 | #: src/colander/__init__.py:2096 168 | msgid "\"${val}\" is not a time object" 169 | msgstr "\"${val}\" 不是時間對象" 170 | 171 | #: src/colander/__init__.py:2161 src/colander/__init__.py:2177 172 | #, fuzzy 173 | #| msgid "\"${val}\" is not one of ${choices}" 174 | msgid "\"${val}\" is not a valid \"${cls}\"" 175 | msgstr "\"${val}\" 不是這些值 ${choices} 中的一個" 176 | 177 | #: src/colander/__init__.py:2297 178 | msgid "Required" 179 | msgstr "" 180 | 181 | #~ msgid "fail ${val}" 182 | #~ msgstr "" 183 | 184 | #~ msgid "${val}: ${choices}" 185 | #~ msgstr "${val} ${choices}" 186 | 187 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | # package 2 | fixture = 1 3 | -------------------------------------------------------------------------------- /tests/relative.py: -------------------------------------------------------------------------------- 1 | # For the benefit of TestGlobalObject 2 | class ImportableClass: 3 | pass 4 | -------------------------------------------------------------------------------- /tests/test_interfaces.py: -------------------------------------------------------------------------------- 1 | def test_interfaces(): 2 | # improve coverage checks for interfaces.py 3 | from colander import interfaces # noqa: F401 4 | -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | envlist = 3 | lint, 4 | py38,py39,py310,py311,py312,pypy3, 5 | docs, 6 | coverage 7 | isolated_build = True 8 | 9 | [testenv] 10 | commands = 11 | python --version 12 | pytest --cov --cov-report= {posargs:} 13 | extras = 14 | testing 15 | setenv = 16 | COVERAGE_FILE=.coverage.{envname} 17 | 18 | [testenv:coverage] 19 | commands = 20 | coverage combine 21 | coverage report --fail-under 100 22 | deps = 23 | coverage 24 | setenv = 25 | COVERAGE_FILE=.coverage 26 | depends = py38,py39,py310,py311,py312,pypy3 27 | 28 | [testenv:docs] 29 | allowlist_externals = 30 | make 31 | commands = 32 | make -C docs html BUILDDIR={envdir} SPHINXOPTS="-W -E" 33 | extras = 34 | docs 35 | 36 | [testenv:lint] 37 | skip_install = True 38 | commands = 39 | isort --check-only --df src/colander tests setup.py 40 | black --check --diff src/colander tests setup.py 41 | flake8 src/colander tests setup.py 42 | check-manifest 43 | # build sdist/wheel 44 | python -m build . 45 | twine check dist/* 46 | deps = 47 | black 48 | build 49 | check-manifest 50 | flake8 51 | flake8-bugbear 52 | isort 53 | readme_renderer 54 | twine 55 | 56 | [testenv:format] 57 | skip_install = true 58 | commands = 59 | isort src/colander tests setup.py 60 | black src/colander tests setup.py 61 | deps = 62 | black 63 | isort 64 | 65 | [testenv:build] 66 | skip_install = true 67 | commands = 68 | # clean up build/ and dist/ folders 69 | python -c 'import shutil; shutil.rmtree("build", ignore_errors=True)' 70 | # Make sure we aren't forgetting anything 71 | check-manifest 72 | # build sdist/wheel 73 | python -m build . 74 | # Verify all is well 75 | twine check dist/* 76 | 77 | deps = 78 | build 79 | check-manifest 80 | readme_renderer 81 | twine 82 | --------------------------------------------------------------------------------